OpenDDS  Snapshot(2023/04/28-20:55)
Public Member Functions | Private Attributes | List of all members
DCPS_IR_Topic_Description Class Reference

Representative of a Topic Description. More...

#include <DCPS_IR_Topic_Description.h>

Inheritance diagram for DCPS_IR_Topic_Description:
Inheritance graph
[legend]
Collaboration diagram for DCPS_IR_Topic_Description:
Collaboration graph
[legend]

Public Member Functions

 DCPS_IR_Topic_Description (DCPS_IR_Domain *domain, const char *name, const char *dataTypeName)
 
 ~DCPS_IR_Topic_Description ()
 
int add_subscription_reference (DCPS_IR_Subscription *subscription, bool associate=true)
 
int remove_subscription_reference (DCPS_IR_Subscription *subscription)
 
int add_topic (DCPS_IR_Topic *topic)
 
int remove_topic (DCPS_IR_Topic *topic)
 
DCPS_IR_Topicget_first_topic ()
 Gets the first topic in the topic list. More...
 
void try_associate_publication (DCPS_IR_Publication *publication)
 
void try_associate_subscription (DCPS_IR_Subscription *subscription)
 
bool try_associate (DCPS_IR_Publication *publication, DCPS_IR_Subscription *subscription)
 
void associate (DCPS_IR_Publication *publication, DCPS_IR_Subscription *subscription)
 Associate the publication and subscription. More...
 
void reevaluate_associations (DCPS_IR_Publication *publication)
 
void reevaluate_associations (DCPS_IR_Subscription *subscription)
 
const char * get_name () const
 
const char * get_dataTypeName () const
 
CORBA::ULong get_number_topics () const
 Returns the number of topics. More...
 
std::string dump_to_string (const std::string &prefix, int depth) const
 

Private Attributes

ACE_CString name_
 
ACE_CString dataTypeName_
 
DCPS_IR_Domaindomain_
 
DCPS_IR_Subscription_Set subscriptionRefs_
 
DCPS_IR_Topic_Set topics_
 

Additional Inherited Members

- Protected Member Functions inherited from OpenDDS::DCPS::EnableContainerSupportedUniquePtr< DCPS_IR_Topic_Description >
 EnableContainerSupportedUniquePtr ()
 
void _add_ref ()
 
void _remove_ref ()
 
long ref_count () const
 

Detailed Description

Representative of a Topic Description.

Definition at line 43 of file DCPS_IR_Topic_Description.h.

Constructor & Destructor Documentation

◆ DCPS_IR_Topic_Description()

OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL DCPS_IR_Topic_Description::DCPS_IR_Topic_Description ( DCPS_IR_Domain domain,
const char *  name,
const char *  dataTypeName 
)

Definition at line 25 of file DCPS_IR_Topic_Description.cpp.

28  : name_(name),
29  dataTypeName_(dataTypeName),
30  domain_(domain)
31 {
32 }
const char *const name
Definition: debug.cpp:60

◆ ~DCPS_IR_Topic_Description()

DCPS_IR_Topic_Description::~DCPS_IR_Topic_Description ( )

Definition at line 34 of file DCPS_IR_Topic_Description.cpp.

35 {
36 }

Member Function Documentation

◆ add_subscription_reference()

int DCPS_IR_Topic_Description::add_subscription_reference ( DCPS_IR_Subscription subscription,
bool  associate = true 
)

Adds the subscription to the list of subscriptions Tries to associate with existing publications if successfully added 'associate' switch toggles association attempt. Returns 0 if added, 1 if already exists, -1 other failure

Definition at line 38 of file DCPS_IR_Topic_Description.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), ACE_String_Base< char >::c_str(), OpenDDS::DCPS::DCPS_debug_level, domain_, DCPS_IR_Subscription::get_id(), ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::insert(), LM_DEBUG, LM_ERROR, name_, DCPS_IR_Domain::publish_subscription_bit(), subscriptionRefs_, and try_associate_subscription().

Referenced by DCPS_IR_Topic::add_subscription_reference().

40 {
41  int status = subscriptionRefs_.insert(subscription);
42 
43  switch (status) {
44  case 0:
45 
46  // Publish the BIT information
47  domain_->publish_subscription_bit(subscription);
48 
49  if (associate) {
50  try_associate_subscription(subscription);
51  // Do not check incompatible qos here. The check is done
52  // in the DCPS_IR_Topic_Description::try_associate_subscription method
53  }
54 
56  OpenDDS::DCPS::RepoIdConverter converter(subscription->get_id());
57  ACE_DEBUG((LM_DEBUG,
58  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::add_subscription_reference: ")
59  ACE_TEXT("topic description %C added subscription %C at %x\n"),
60  this->name_.c_str(),
61  std::string(converter).c_str(),
62  subscription));
63  }
64 
65  break;
66 
67  case 1: {
68  OpenDDS::DCPS::RepoIdConverter converter(subscription->get_id());
69  ACE_ERROR((LM_ERROR,
70  ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic_Description::add_subscription_reference: ")
71  ACE_TEXT("topic description %C attempt to re-add subscription %C.\n"),
72  this->name_.c_str(),
73  std::string(converter).c_str()));
74  }
75  break;
76 
77  case -1: {
78  OpenDDS::DCPS::RepoIdConverter converter(subscription->get_id());
79  ACE_ERROR((LM_ERROR,
80  ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic_Description::add_subscription_reference: ")
81  ACE_TEXT("topic description %C failed to add subscription %C.\n"),
82  this->name_.c_str(),
83  std::string(converter).c_str()));
84  }
85  };
86 
87  return status;
88 }
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
const char * c_str(void) const
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
void publish_subscription_bit(DCPS_IR_Subscription *subscription)
Publish Subscription in the Subscription Built-In Topic.
DCPS_IR_Subscription_Set subscriptionRefs_
void try_associate_subscription(DCPS_IR_Subscription *subscription)
void associate(DCPS_IR_Publication *publication, DCPS_IR_Subscription *subscription)
Associate the publication and subscription.
OpenDDS::DCPS::GUID_t get_id()
ACE_TEXT("TCP_Factory")
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30

◆ add_topic()

int DCPS_IR_Topic_Description::add_topic ( DCPS_IR_Topic topic)

Add a topic Takes ownership of memory pointed to by topic Returns 0 if added, 1 if already exists, -1 other failure

Definition at line 116 of file DCPS_IR_Topic_Description.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), ACE_String_Base< char >::c_str(), OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Topic::get_id(), ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::insert(), LM_DEBUG, LM_ERROR, LM_WARNING, name_, and topics_.

Referenced by DCPS_IR_Domain::add_topic_i().

117 {
118  int status = topics_.insert(topic);
119 
120  switch (status) {
121  case 0:
122 
124  OpenDDS::DCPS::RepoIdConverter converter(topic->get_id());
125  ACE_DEBUG((LM_DEBUG,
126  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::add_topic: ")
127  ACE_TEXT("topic description %C added topic %C at %x.\n"),
128  this->name_.c_str(),
129  std::string(converter).c_str(),
130  topic));
131  }
132 
133  break;
134  case 1:
135 
137  OpenDDS::DCPS::RepoIdConverter converter(topic->get_id());
138  ACE_DEBUG((LM_WARNING,
139  ACE_TEXT("(%P|%t) WARNING: DCPS_IR_Topic_Description::add_topic: ")
140  ACE_TEXT("topic description %C attempt to re-add topic %C.\n"),
141  this->name_.c_str(),
142  std::string(converter).c_str()));
143  }
144 
145  break;
146  case -1: {
147  OpenDDS::DCPS::RepoIdConverter converter(topic->get_id());
148  ACE_ERROR((LM_ERROR,
149  ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic_Description::add_topic: ")
150  ACE_TEXT("topic description %C failed to add topic %C.\n"),
151  this->name_.c_str(),
152  std::string(converter).c_str()));
153  }
154  break;
155  };
156 
157  return status;
158 }
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
const char * c_str(void) const
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
OpenDDS::DCPS::GUID_t get_id() const
ACE_TEXT("TCP_Factory")
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30

◆ associate()

void DCPS_IR_Topic_Description::associate ( DCPS_IR_Publication publication,
DCPS_IR_Subscription subscription 
)

Associate the publication and subscription.

Definition at line 339 of file DCPS_IR_Topic_Description.cpp.

References ACE_DEBUG, ACE_TEXT(), DCPS_IR_Subscription::add_associated_publication(), DCPS_IR_Publication::add_associated_subscription(), ACE_String_Base< char >::c_str(), OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Publication::get_id(), DCPS_IR_Subscription::get_id(), LM_DEBUG, LM_INFO, and name_.

Referenced by try_associate().

341 {
343  OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
344  OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
345  ACE_DEBUG((LM_DEBUG,
346  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::associate: ")
347  ACE_TEXT("topic description %C associating ")
348  ACE_TEXT("publication %C with subscription %C.\n"),
349  this->name_.c_str(),
350  std::string(pub_converter).c_str(),
351  std::string(sub_converter).c_str()));
352  }
353 
354  // The publication must be told first because it will be the connector
355  // if a data link needs to be created.
356  // This is only required if the publication and subscription are being
357  // handed by the same process and thread. Order when there is
358  // another thread or process is not important.
359  // Note: the client thread may process the add_associations() oneway
360  // call instead of the ORB thread because it is currently
361  // in a two-way call to the Repo.
362  int error = publication->add_associated_subscription(subscription, true);
363 
364  // If there was no TAO error contacting the publication (This can happen if
365  // an old publisher has exited non-gracefully)
366  if (error != -1) {
367  // Associate the subscription with the publication
368  subscription->add_associated_publication(publication, false);
369  } else {
370  ACE_DEBUG((LM_INFO, ACE_TEXT("Invalid publication detected, NOT notifying subscription of association\n")));
371  }
372 }
#define ACE_DEBUG(X)
const char * c_str(void) const
OpenDDS::DCPS::GUID_t get_id()
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
int add_associated_subscription(DCPS_IR_Subscription *sub, bool active)
OpenDDS::DCPS::GUID_t get_id()
ACE_TEXT("TCP_Factory")
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
int add_associated_publication(DCPS_IR_Publication *pub, bool active)

◆ dump_to_string()

std::string DCPS_IR_Topic_Description::dump_to_string ( const std::string &  prefix,
int  depth 
) const

Definition at line 419 of file DCPS_IR_Topic_Description.cpp.

References ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::begin(), ACE_String_Base< char >::c_str(), dataTypeName_, ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::end(), name_, OPENDDS_END_VERSIONED_NAMESPACE_DECL, subscriptionRefs_, and topics_.

421 {
422  std::string str;
423 #if !defined (OPENDDS_INFOREPO_REDUCED_FOOTPRINT)
424  for (int i=0; i < depth; i++)
425  str += prefix;
426  std::string indent = str + prefix;
427  str += "DCPS_IR_Topic_Description [";
428  str += name_.c_str();
429  str += "][";
430  str += dataTypeName_.c_str();
431  str += "]\n";
432 
433  str += indent + "Subscription References [ ";
435  sub != subscriptionRefs_.end();
436  sub++)
437  {
438  OpenDDS::DCPS::RepoIdConverter sub_converter((*sub)->get_id());
439  str += std::string(sub_converter);
440  str += " ";
441  }
442  str += "]\n";
443 
444  str += indent + "Topics [ ";
446  top != topics_.end();
447  top++)
448  {
449  OpenDDS::DCPS::RepoIdConverter top_converter((*top)->get_id());
450  str += std::string(top_converter);
451  str += " ";
452  }
453  str += "]\n";
454 #endif // !defined (OPENDDS_INFOREPO_REDUCED_FOOTPRINT)
455  return str;
456 }
const char * c_str(void) const
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
DCPS_IR_Subscription_Set subscriptionRefs_

◆ get_dataTypeName()

const char * DCPS_IR_Topic_Description::get_dataTypeName ( ) const

◆ get_first_topic()

DCPS_IR_Topic * DCPS_IR_Topic_Description::get_first_topic ( )

Gets the first topic in the topic list.

Definition at line 186 of file DCPS_IR_Topic_Description.cpp.

References ACE_DEBUG, ACE_TEXT(), ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::begin(), ACE_String_Base< char >::c_str(), OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Topic::get_id(), LM_DEBUG, name_, ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::size(), and topics_.

187 {
188  DCPS_IR_Topic* topic = 0;
189 
190  if (0 < topics_.size()) {
192  topic = *iter;
193 
195  OpenDDS::DCPS::RepoIdConverter converter(topic->get_id());
196  ACE_DEBUG((LM_DEBUG,
197  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::get_first_topic: ")
198  ACE_TEXT("topic description %C first topic %C.\n"),
199  this->name_.c_str(),
200  std::string(converter).c_str()));
201  }
202  }
203 
204  return topic;
205 }
#define ACE_DEBUG(X)
const char * c_str(void) const
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
OpenDDS::DCPS::GUID_t get_id() const
Representative of a Topic.
Definition: DCPS_IR_Topic.h:43
ACE_TEXT("TCP_Factory")
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30

◆ get_name()

const char * DCPS_IR_Topic_Description::get_name ( void  ) const

◆ get_number_topics()

CORBA::ULong DCPS_IR_Topic_Description::get_number_topics ( ) const

Returns the number of topics.

Definition at line 413 of file DCPS_IR_Topic_Description.cpp.

References ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::size(), and topics_.

Referenced by DCPS_IR_Domain::remove_topic().

414 {
415  return static_cast<CORBA::ULong>(topics_.size());
416 }
ACE_CDR::ULong ULong

◆ reevaluate_associations() [1/2]

void DCPS_IR_Topic_Description::reevaluate_associations ( DCPS_IR_Publication publication)

Re-evaluate the association between the provided publication and the subscriptions it maintains.

Definition at line 389 of file DCPS_IR_Topic_Description.cpp.

References ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::begin(), ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::end(), DCPS_IR_Subscription::reevaluate_association(), DCPS_IR_Publication::reevaluate_association(), and subscriptionRefs_.

Referenced by DCPS_IR_Publication::set_qos(), and DCPS_IR_Subscription::set_qos().

390 {
391  DCPS_IR_Subscription * sub = 0;
394 
395  while (iter != end) {
396  sub = *iter;
397  ++iter;
398  publication->reevaluate_association(sub);
399  sub->reevaluate_association(publication);
400  }
401 }
DCPS_IR_Subscription_Set subscriptionRefs_
bool reevaluate_association(DCPS_IR_Subscription *subscription)
Representative of a Subscription.
bool reevaluate_association(DCPS_IR_Publication *publication)

◆ reevaluate_associations() [2/2]

void DCPS_IR_Topic_Description::reevaluate_associations ( DCPS_IR_Subscription subscription)

Re-evaluate the association between the provided subscription and the publications in all its maintained topics.

Definition at line 374 of file DCPS_IR_Topic_Description.cpp.

References ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::begin(), ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::end(), DCPS_IR_Topic::reevaluate_associations(), and topics_.

375 {
376  DCPS_IR_Topic* topic = 0;
377 
380 
381  while (iter != end) {
382  topic = *iter;
383  ++iter;
384 
385  topic->reevaluate_associations(subscription);
386  }
387 }
Representative of a Topic.
Definition: DCPS_IR_Topic.h:43
void reevaluate_associations(DCPS_IR_Subscription *subscription)

◆ remove_subscription_reference()

int DCPS_IR_Topic_Description::remove_subscription_reference ( DCPS_IR_Subscription subscription)

Removes the subscription from the list of subscriptions Returns 0 if successful

Definition at line 90 of file DCPS_IR_Topic_Description.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), ACE_String_Base< char >::c_str(), OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Subscription::get_id(), LM_DEBUG, LM_ERROR, name_, ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::remove(), and subscriptionRefs_.

Referenced by DCPS_IR_Topic::remove_subscription_reference().

91 {
92  int status = subscriptionRefs_.remove(subscription);
93 
94  if (0 == status) {
96  OpenDDS::DCPS::RepoIdConverter converter(subscription->get_id());
97  ACE_DEBUG((LM_DEBUG,
98  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::remove_subscription_reference: ")
99  ACE_TEXT("topic description %C removed subscription %C.\n"),
100  this->name_.c_str(),
101  std::string(converter).c_str()));
102  }
103 
104  } else {
105  OpenDDS::DCPS::RepoIdConverter converter(subscription->get_id());
106  ACE_ERROR((LM_ERROR,
107  ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic_Description::remove_subscription_reference: ")
108  ACE_TEXT("topic description %C failed to remove subscription %C.\n"),
109  this->name_.c_str(),
110  std::string(converter).c_str()));
111  } // if (0 == status)
112 
113  return status;
114 }
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
const char * c_str(void) const
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
DCPS_IR_Subscription_Set subscriptionRefs_
OpenDDS::DCPS::GUID_t get_id()
ACE_TEXT("TCP_Factory")
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30

◆ remove_topic()

int DCPS_IR_Topic_Description::remove_topic ( DCPS_IR_Topic topic)

Removes the topic from the list of topics Gives ownership of the memory pointed to by topic to the caller Returns 0 if successful

Definition at line 160 of file DCPS_IR_Topic_Description.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), ACE_String_Base< char >::c_str(), OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Topic::get_id(), LM_DEBUG, LM_ERROR, name_, ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::remove(), and topics_.

Referenced by DCPS_IR_Domain::add_topic_i(), and DCPS_IR_Domain::remove_topic().

161 {
162  int status = topics_.remove(topic);
163 
164  if (0 == status) {
166  OpenDDS::DCPS::RepoIdConverter converter(topic->get_id());
167  ACE_DEBUG((LM_DEBUG,
168  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::remove_topic: ")
169  ACE_TEXT("topic description %C removed topic %C.\n"),
170  this->name_.c_str(),
171  std::string(converter).c_str()));
172  }
173 
174  } else {
175  OpenDDS::DCPS::RepoIdConverter converter(topic->get_id());
176  ACE_ERROR((LM_ERROR,
177  ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic_Description::remove_topic: ")
178  ACE_TEXT("topic description failed to remove topic %C.\n"),
179  this->name_.c_str(),
180  std::string(converter).c_str()));
181  }
182 
183  return status;
184 }
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
const char * c_str(void) const
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
OpenDDS::DCPS::GUID_t get_id() const
ACE_TEXT("TCP_Factory")
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30

◆ try_associate()

bool DCPS_IR_Topic_Description::try_associate ( DCPS_IR_Publication publication,
DCPS_IR_Subscription subscription 
)

Checks to see if the publication and subscription can be associated.

Definition at line 274 of file DCPS_IR_Topic_Description.cpp.

References ACE_DEBUG, ACE_TEXT(), associate(), ACE_String_Base< char >::c_str(), OpenDDS::DCPS::compatibleQOS(), OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Subscription::get_datareader_qos(), DCPS_IR_Publication::get_datawriter_qos(), DCPS_IR_Publication::get_id(), DCPS_IR_Subscription::get_id(), DCPS_IR_Publication::get_incompatibleQosStatus(), DCPS_IR_Subscription::get_incompatibleQosStatus(), DCPS_IR_Publication::get_participant_id(), DCPS_IR_Subscription::get_participant_id(), DCPS_IR_Publication::get_publisher_qos(), DCPS_IR_Subscription::get_subscriber_qos(), DCPS_IR_Publication::get_topic_id(), DCPS_IR_Subscription::get_topic_id(), DCPS_IR_Publication::get_transportLocatorSeq(), DCPS_IR_Subscription::get_transportLocatorSeq(), DCPS_IR_Subscription::is_publication_ignored(), DCPS_IR_Publication::is_subscription_ignored(), LM_DEBUG, and name_.

Referenced by DCPS_IR_Subscription::reevaluate_association(), DCPS_IR_Publication::reevaluate_association(), DCPS_IR_Topic::try_associate(), and try_associate_publication().

276 {
277  if (publication->is_subscription_ignored(subscription->get_participant_id(),
278  subscription->get_topic_id(),
279  subscription->get_id())) {
281  OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
282  OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
283  ACE_DEBUG((LM_DEBUG,
284  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::try_associate: ")
285  ACE_TEXT("topic description %C publication %C ignores subscription %C.\n"),
286  this->name_.c_str(),
287  std::string(pub_converter).c_str(),
288  std::string(sub_converter).c_str()));
289  }
290  }
291 
292  else if (subscription->is_publication_ignored(publication->get_participant_id(),
293  publication->get_topic_id(),
294  publication->get_id())) {
296  OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
297  OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
298  ACE_DEBUG((LM_DEBUG,
299  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::try_associate: ")
300  ACE_TEXT("topic description %C subscription %C ignores publication %C.\n"),
301  this->name_.c_str(),
302  std::string(pub_converter).c_str(),
303  std::string(sub_converter).c_str()));
304  }
305 
306  } else {
308  OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
309  OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
310  ACE_DEBUG((LM_DEBUG,
311  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::try_associate: ")
312  ACE_TEXT("topic description %C checking compatibility of ")
313  ACE_TEXT("publication %C with subscription %C.\n"),
314  this->name_.c_str(),
315  std::string(pub_converter).c_str(),
316  std::string(sub_converter).c_str()));
317  }
318 
320  subscription->get_incompatibleQosStatus(),
321  publication->get_transportLocatorSeq(),
322  subscription->get_transportLocatorSeq(),
323  publication->get_datawriter_qos(),
324  subscription->get_datareader_qos(),
325  publication->get_publisher_qos(),
326  subscription->get_subscriber_qos())) {
327  associate(publication, subscription);
328  return true;
329  }
330 
331  // Dont notify that there is an incompatible qos here
332  // notify where we can distinguish which one is being added
333  // so we only send one response(with all incompatible qos) to it
334  }
335 
336  return false;
337 }
#define ACE_DEBUG(X)
const char * c_str(void) const
OpenDDS::DCPS::GUID_t get_participant_id()
OpenDDS::DCPS::GUID_t get_id()
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
bool compatibleQOS(OpenDDS::DCPS::IncompatibleQosStatus *writerStatus, OpenDDS::DCPS::IncompatibleQosStatus *readerStatus, const OpenDDS::DCPS::TransportLocatorSeq &pubTLS, const OpenDDS::DCPS::TransportLocatorSeq &subTLS, DDS::DataWriterQos const *const writerQos, DDS::DataReaderQos const *const readerQos, DDS::PublisherQos const *const pubQos, DDS::SubscriberQos const *const subQos)
Definition: DCPS_Utils.cpp:237
OpenDDS::DCPS::GUID_t get_topic_id()
OpenDDS::DCPS::IncompatibleQosStatus * get_incompatibleQosStatus()
OpenDDS::DCPS::TransportLocatorSeq get_transportLocatorSeq() const
void associate(DCPS_IR_Publication *publication, DCPS_IR_Subscription *subscription)
Associate the publication and subscription.
OpenDDS::DCPS::IncompatibleQosStatus * get_incompatibleQosStatus()
CORBA::Boolean is_subscription_ignored(OpenDDS::DCPS::GUID_t partId, OpenDDS::DCPS::GUID_t topicId, OpenDDS::DCPS::GUID_t subId)
DDS::PublisherQos * get_publisher_qos()
OpenDDS::DCPS::GUID_t get_id()
ACE_TEXT("TCP_Factory")
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
CORBA::Boolean is_publication_ignored(OpenDDS::DCPS::GUID_t partId, OpenDDS::DCPS::GUID_t topicId, OpenDDS::DCPS::GUID_t pubId)
OpenDDS::DCPS::GUID_t get_participant_id()
const DDS::SubscriberQos * get_subscriber_qos()
OpenDDS::DCPS::GUID_t get_topic_id()
OpenDDS::DCPS::TransportLocatorSeq get_transportLocatorSeq() const
DDS::DataWriterQos * get_datawriter_qos()
const DDS::DataReaderQos * get_datareader_qos()

◆ try_associate_publication()

void DCPS_IR_Topic_Description::try_associate_publication ( DCPS_IR_Publication publication)

Tries to associate the publication will each of the subscriptions in the subscription list

Definition at line 207 of file DCPS_IR_Topic_Description.cpp.

References ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::begin(), OpenDDS::DCPS::IncompatibleQosStatus::count_since_last_send, ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::end(), DCPS_IR_Publication::get_incompatibleQosStatus(), DCPS_IR_Subscription::get_incompatibleQosStatus(), subscriptionRefs_, try_associate(), DCPS_IR_Publication::update_incompatible_qos(), and DCPS_IR_Subscription::update_incompatible_qos().

Referenced by DCPS_IR_Topic::add_publication_reference(), and DCPS_IR_Topic::reassociate_all_publications().

208 {
209  // for each subscription check for compatibility
210  DCPS_IR_Subscription* subscription = 0;
212 
215 
216  while (iter != end) {
217  subscription = *iter;
218  ++iter;
219  try_associate(publication, subscription);
220 
221  // Check the subscriptions QOS status
222  qosStatus = subscription->get_incompatibleQosStatus();
223 
224  if (0 < qosStatus->count_since_last_send) {
225  subscription->update_incompatible_qos();
226  }
227  }
228 
229  // Check the publications QOS status
230  qosStatus = publication->get_incompatibleQosStatus();
231 
232  if (0 < qosStatus->count_since_last_send) {
233  publication->update_incompatible_qos();
234  }
235 }
DCPS_IR_Subscription_Set subscriptionRefs_
OpenDDS::DCPS::IncompatibleQosStatus * get_incompatibleQosStatus()
OpenDDS::DCPS::IncompatibleQosStatus * get_incompatibleQosStatus()
bool try_associate(DCPS_IR_Publication *publication, DCPS_IR_Subscription *subscription)
Representative of a Subscription.

◆ try_associate_subscription()

void DCPS_IR_Topic_Description::try_associate_subscription ( DCPS_IR_Subscription subscription)

Tries to associate the subscription will each of the publications in each topic in the topic list

Definition at line 237 of file DCPS_IR_Topic_Description.cpp.

References ACE_DEBUG, ACE_TEXT(), ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::begin(), ACE_String_Base< char >::c_str(), OpenDDS::DCPS::DCPS_debug_level, ACE_Unbounded_Set_Ex< T, ACE_Unbounded_Set_Default_Comparator< T > >::end(), DCPS_IR_Subscription::get_id(), DCPS_IR_Subscription::get_incompatibleQosStatus(), LM_DEBUG, name_, topics_, OpenDDS::DCPS::IncompatibleQosStatus::total_count, DCPS_IR_Topic::try_associate(), and DCPS_IR_Subscription::update_incompatible_qos().

Referenced by add_subscription_reference().

238 {
239  // check all topics for compatible publications
240 
241  DCPS_IR_Topic* topic = 0;
242 
245 
246  while (iter != end) {
247  topic = *iter;
248  ++iter;
249 
250  topic->try_associate(subscription);
251  }
252 
253  // Check the subscriptions QOS status
255  subscription->get_incompatibleQosStatus();
256 
257  if (0 < qosStatus->total_count) {
259  OpenDDS::DCPS::RepoIdConverter converter(subscription->get_id());
260  ACE_DEBUG((LM_DEBUG,
261  ACE_TEXT("(%P|%t) DCPS_IR_Topic_Description::try_associate_subscription: ")
262  ACE_TEXT("topic description %C has %d incompatible publications ")
263  ACE_TEXT("with subscription %C.\n"),
264  this->name_.c_str(),
265  qosStatus->total_count,
266  std::string(converter).c_str()));
267  }
268 
269  subscription->update_incompatible_qos();
270  }
271 }
#define ACE_DEBUG(X)
const char * c_str(void) const
Conversion processing and value testing utilities for DCPS Information Repository identifiers...
OpenDDS::DCPS::IncompatibleQosStatus * get_incompatibleQosStatus()
Representative of a Topic.
Definition: DCPS_IR_Topic.h:43
OpenDDS::DCPS::GUID_t get_id()
void try_associate(DCPS_IR_Subscription *subscription)
ACE_TEXT("TCP_Factory")
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30

Member Data Documentation

◆ dataTypeName_

ACE_CString DCPS_IR_Topic_Description::dataTypeName_
private

Definition at line 113 of file DCPS_IR_Topic_Description.h.

Referenced by dump_to_string(), and get_dataTypeName().

◆ domain_

DCPS_IR_Domain* DCPS_IR_Topic_Description::domain_
private

Definition at line 114 of file DCPS_IR_Topic_Description.h.

Referenced by add_subscription_reference().

◆ name_

ACE_CString DCPS_IR_Topic_Description::name_
private

◆ subscriptionRefs_

DCPS_IR_Subscription_Set DCPS_IR_Topic_Description::subscriptionRefs_
private

◆ topics_

DCPS_IR_Topic_Set DCPS_IR_Topic_Description::topics_
private

The documentation for this class was generated from the following files: