DCPS_IR_Topic Class Reference

Representative of a Topic. More...

#include <DCPS_IR_Topic.h>

Collaboration diagram for DCPS_IR_Topic:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 DCPS_IR_Topic (const OpenDDS::DCPS::RepoId &id, const DDS::TopicQos &qos, DCPS_IR_Domain *domain, DCPS_IR_Participant *creator, DCPS_IR_Topic_Description *description)
 ~DCPS_IR_Topic ()
void release (bool removing)
int add_publication_reference (DCPS_IR_Publication *publication, bool associate=true)
int remove_publication_reference (DCPS_IR_Publication *publication)
int add_subscription_reference (DCPS_IR_Subscription *subscription, bool associate=true)
int remove_subscription_reference (DCPS_IR_Subscription *subscription)
void try_associate (DCPS_IR_Subscription *subscription)
void reevaluate_associations (DCPS_IR_Subscription *subscription)
OpenDDS::DCPS::RepoId get_id () const
OpenDDS::DCPS::RepoId get_participant_id () const
DCPS_IR_Topic_Descriptionget_topic_description ()
DDS::TopicQosget_topic_qos ()
bool set_topic_qos (const DDS::TopicQos &qos)
DDS::InstanceHandle_t get_handle ()
void set_handle (DDS::InstanceHandle_t handle)
CORBA::Boolean is_bit ()
void set_bit_status (CORBA::Boolean isBIT)
void reassociate_all_publications ()
std::string dump_to_string (const std::string &prefix, int depth) const

Private Attributes

OpenDDS::DCPS::RepoId id_
DDS::TopicQos qos_
DCPS_IR_Domaindomain_
DCPS_IR_Participantparticipant_
DCPS_IR_Topic_Descriptiondescription_
DDS::InstanceHandle_t handle_
CORBA::Boolean isBIT_
DCPS_IR_Publication_Set publicationRefs_
DCPS_IR_Subscription_Set subscriptionRefs_
bool removed_

Detailed Description

Representative of a Topic.

Definition at line 41 of file DCPS_IR_Topic.h.


Constructor & Destructor Documentation

DCPS_IR_Topic::DCPS_IR_Topic ( const OpenDDS::DCPS::RepoId id,
const DDS::TopicQos qos,
DCPS_IR_Domain domain,
DCPS_IR_Participant creator,
DCPS_IR_Topic_Description description 
)

Definition at line 23 of file DCPS_IR_Topic.cpp.

00028   : id_(id),
00029     qos_(qos),
00030     domain_(domain),
00031     participant_(creator),
00032     description_(description),
00033     handle_(0),
00034     isBIT_(0),
00035     removed_(false)
00036 {
00037 }

DCPS_IR_Topic::~DCPS_IR_Topic (  ) 

Definition at line 39 of file DCPS_IR_Topic.cpp.

References id_, publicationRefs_, and subscriptionRefs_.

00040 {
00041   // check for remaining publication references
00042   if (0 != publicationRefs_.size()) {
00043     DCPS_IR_Publication* pub = 0;
00044     DCPS_IR_Publication_Set::ITERATOR iter = publicationRefs_.begin();
00045     DCPS_IR_Publication_Set::ITERATOR end = publicationRefs_.end();
00046 
00047     OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00048     ACE_ERROR((LM_ERROR,
00049                ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::~DCPS_IR_Topic: ")
00050                ACE_TEXT("id %C has retained publications.\n"),
00051                std::string(topic_converter).c_str()));
00052 
00053     while (iter != end) {
00054       pub = *iter;
00055       ++iter;
00056 
00057       OpenDDS::DCPS::RepoIdConverter pub_converter(pub->get_id());
00058       ACE_ERROR((LM_ERROR,
00059                  ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::~DCPS_IR_Topic: ")
00060                  ACE_TEXT("topic %C retains publication id %C.\n"),
00061                  std::string(topic_converter).c_str(),
00062                  std::string(pub_converter).c_str()));
00063     }
00064   }
00065 
00066   if (0 != subscriptionRefs_.size()) {
00067     DCPS_IR_Subscription* sub = 0;
00068     DCPS_IR_Subscription_Set::ITERATOR iter = subscriptionRefs_.begin();
00069     DCPS_IR_Subscription_Set::ITERATOR end = subscriptionRefs_.end();
00070 
00071     OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00072     ACE_ERROR((LM_ERROR,
00073                ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::~DCPS_IR_Topic: ")
00074                ACE_TEXT("id %C has retained subscriptions.\n"),
00075                std::string(topic_converter).c_str()));
00076 
00077     while (iter != end) {
00078       sub = *iter;
00079       ++iter;
00080 
00081       OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id());
00082       ACE_ERROR((LM_ERROR,
00083                  ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::~DCPS_IR_Topic: ")
00084                  ACE_TEXT("topic %C retains subscription id %C.\n"),
00085                  std::string(topic_converter).c_str(),
00086                  std::string(sub_converter).c_str()));
00087     }
00088   }
00089 }


Member Function Documentation

int DCPS_IR_Topic::add_publication_reference ( DCPS_IR_Publication publication,
bool  associate = true 
)

Adds the publication to the list of publications Calls the topic description's try associate if successfully added 'associate' switch toggles association attempt. Returns 0 if added, 1 if already exists, -1 other failure

Definition at line 109 of file DCPS_IR_Topic.cpp.

References OpenDDS::DCPS::DCPS_debug_level, description_, domain_, id_, publicationRefs_, DCPS_IR_Domain::publish_publication_bit(), and DCPS_IR_Topic_Description::try_associate_publication().

Referenced by TAO_DDS_DCPSInfo_i::add_publication().

00111 {
00112   int status = publicationRefs_.insert(publication);
00113 
00114   switch (status) {
00115   case 0:
00116 
00117     // Publish the BIT information
00118     domain_->publish_publication_bit(publication);
00119 
00120     if (associate) {
00121       description_->try_associate_publication(publication);
00122       // Do not check incompatible qos here.  The check is done
00123       // in the DCPS_IR_Topic_Description::try_associate_publication method
00124     }
00125 
00126     if (OpenDDS::DCPS::DCPS_debug_level > 0) {
00127       OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00128       OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
00129       ACE_DEBUG((LM_DEBUG,
00130                  ACE_TEXT("(%P|%t) DCPS_IR_Topic::add_publication_reference: ")
00131                  ACE_TEXT("topic %C added publication %C at %x\n"),
00132                  std::string(topic_converter).c_str(),
00133                  std::string(pub_converter).c_str(),
00134                  publication));
00135     }
00136 
00137     break;
00138 
00139   case 1:
00140 
00141     if (OpenDDS::DCPS::DCPS_debug_level > 0) {
00142       OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00143       OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
00144       ACE_DEBUG((LM_WARNING,
00145                  ACE_TEXT("(%P|%t) WARNING: DCPS_IR_Topic::add_publication_reference: ")
00146                  ACE_TEXT("topic %C attempt to re-add publication %C.\n"),
00147                  std::string(topic_converter).c_str(),
00148                  std::string(pub_converter).c_str()));
00149     }
00150 
00151     break;
00152 
00153   case -1: {
00154     OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00155     OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
00156     ACE_ERROR((LM_ERROR,
00157                ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::add_publication_reference: ")
00158                ACE_TEXT("topic %C failed to add publication %C\n"),
00159                std::string(topic_converter).c_str(),
00160                std::string(pub_converter).c_str()));
00161   }
00162   };
00163 
00164   return status;
00165 }

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

Adds the subscription to the list of subscriptions and let description handle the association. Returns 0 if added, 1 if already exists, -1 other failure

Definition at line 195 of file DCPS_IR_Topic.cpp.

References DCPS_IR_Topic_Description::add_subscription_reference(), OpenDDS::DCPS::DCPS_debug_level, description_, DCPS_IR_Subscription::get_id(), id_, and subscriptionRefs_.

Referenced by TAO_DDS_DCPSInfo_i::add_subscription().

00197 {
00198   int status = subscriptionRefs_.insert(subscription);
00199 
00200   switch (status) {
00201   case 0:
00202 
00203     if (OpenDDS::DCPS::DCPS_debug_level > 0) {
00204       OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00205       OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
00206       ACE_DEBUG((LM_DEBUG,
00207                  ACE_TEXT("(%P|%t) DCPS_IR_Topic::add_subscription_reference: ")
00208                  ACE_TEXT("topic %C added subscription %C at %x.\n"),
00209                  std::string(topic_converter).c_str(),
00210                  std::string(sub_converter).c_str(),
00211                  subscription));
00212     }
00213 
00214     status = this->description_->add_subscription_reference(subscription, associate);
00215     break;
00216 
00217   case 1: {
00218     OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00219     OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
00220     ACE_ERROR((LM_ERROR,
00221                ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::add_subscription_reference: ")
00222                ACE_TEXT("topic %C attempt to re-add subscription %C.\n"),
00223                std::string(topic_converter).c_str(),
00224                std::string(sub_converter).c_str()));
00225   }
00226   break;
00227 
00228   case -1: {
00229     OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00230     OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
00231     ACE_ERROR((LM_ERROR,
00232                ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::add_subscription_reference: ")
00233                ACE_TEXT("topic %C failed to add subscription %C.\n"),
00234                std::string(topic_converter).c_str(),
00235                std::string(sub_converter).c_str()));
00236   }
00237   };
00238 
00239   return status;
00240 }

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

Definition at line 427 of file DCPS_IR_Topic.cpp.

References id_, isBIT_, publicationRefs_, and subscriptionRefs_.

00428 {
00429   std::string str;
00430 #if !defined (OPENDDS_INFOREPO_REDUCED_FOOTPRINT)
00431   OpenDDS::DCPS::RepoIdConverter local_converter(id_);
00432 
00433   for (int i=0; i < depth; i++)
00434     str += prefix;
00435   std::string indent = str + prefix;
00436   str += "DCPS_IR_Topic[";
00437   str += std::string(local_converter);
00438   str += "]";
00439   if (isBIT_)
00440     str += " (BIT)";
00441   str += "\n";
00442 
00443   str += indent + "Publications:\n";
00444   for (DCPS_IR_Publication_Set::const_iterator pub = publicationRefs_.begin();
00445        pub != publicationRefs_.end();
00446        pub++)
00447   {
00448     OpenDDS::DCPS::RepoIdConverter pub_converter((*pub)->get_id());
00449     str += indent + std::string(pub_converter);
00450     str += "\n";
00451 
00452   }
00453 
00454   str += indent + "Subscriptions:\n";
00455   for (DCPS_IR_Subscription_Set::const_iterator sub = subscriptionRefs_.begin();
00456        sub != subscriptionRefs_.end();
00457        sub++)
00458   {
00459     OpenDDS::DCPS::RepoIdConverter sub_converter((*sub)->get_id());
00460     str += indent + std::string(sub_converter);
00461     str += "\n";
00462   }
00463 #endif // !defined (OPENDDS_INFOREPO_REDUCED_FOOTPRINT)
00464   return str;
00465 }

DDS::InstanceHandle_t DCPS_IR_Topic::get_handle (  ) 

Definition at line 379 of file DCPS_IR_Topic.cpp.

References handle_.

Referenced by DCPS_IR_Domain::dispose_topic_bit().

00380 {
00381   return handle_;
00382 }

OpenDDS::DCPS::RepoId DCPS_IR_Topic::get_id (  )  const

Definition at line 272 of file DCPS_IR_Topic.cpp.

References id_.

Referenced by DCPS_IR_Topic_Description::add_topic(), DCPS_IR_Participant::add_topic_reference(), TAO_DDS_DCPSInfo_i::find_topic(), DCPS_IR_Domain::find_topic(), DCPS_IR_Topic_Description::get_first_topic(), DCPS_IR_Subscription::get_topic_id(), DCPS_IR_Publication::get_topic_id(), DCPS_IR_Domain::publish_topic_bit(), DCPS_IR_Topic_Description::remove_topic(), and DCPS_IR_Domain::remove_topic().

00273 {
00274   return id_;
00275 }

OpenDDS::DCPS::RepoId DCPS_IR_Topic::get_participant_id (  )  const

Definition at line 277 of file DCPS_IR_Topic.cpp.

References DCPS_IR_Participant::get_id(), and participant_.

00278 {
00279   return participant_->get_id();
00280 }

DCPS_IR_Topic_Description * DCPS_IR_Topic::get_topic_description (  ) 

Return pointer to the Topic Description Domain retains ownership

Definition at line 374 of file DCPS_IR_Topic.cpp.

References description_.

Referenced by TAO_DDS_DCPSInfo_i::find_topic(), DCPS_IR_Subscription::get_topic_description(), DCPS_IR_Publication::get_topic_description(), DCPS_IR_Domain::publish_topic_bit(), DCPS_IR_Subscription::reevaluate_association(), DCPS_IR_Publication::reevaluate_association(), DCPS_IR_Domain::remove_topic(), DCPS_IR_Subscription::set_qos(), and DCPS_IR_Publication::set_qos().

00375 {
00376   return description_;
00377 }

DDS::TopicQos * DCPS_IR_Topic::get_topic_qos (  ) 

Return pointer to the Topic qos Topic retains ownership

Definition at line 282 of file DCPS_IR_Topic.cpp.

References qos_.

Referenced by TAO_DDS_DCPSInfo_i::find_topic(), DCPS_IR_Domain::publish_publication_bit(), DCPS_IR_Domain::publish_subscription_bit(), and DCPS_IR_Domain::publish_topic_bit().

00283 {
00284   return &qos_;
00285 }

CORBA::Boolean DCPS_IR_Topic::is_bit (  ) 

Definition at line 389 of file DCPS_IR_Topic.cpp.

References isBIT_.

Referenced by DCPS_IR_Domain::dispose_topic_bit().

00390 {
00391   return isBIT_;
00392 }

void DCPS_IR_Topic::reassociate_all_publications (  ) 

Try to associate all the current publications. This is used to reconnect Built in Topics after a persistent restart.

Definition at line 415 of file DCPS_IR_Topic.cpp.

References description_, publicationRefs_, and DCPS_IR_Topic_Description::try_associate_publication().

00416 {
00417   DCPS_IR_Publication_Set::ITERATOR iter = publicationRefs_.begin();
00418   DCPS_IR_Publication_Set::ITERATOR end = publicationRefs_.end();
00419 
00420   for ( ; iter != end; ++iter)
00421   {
00422     description_->try_associate_publication(*iter);
00423   }
00424 }

void DCPS_IR_Topic::reevaluate_associations ( DCPS_IR_Subscription subscription  ) 

Called by the DCPS_IR_Topic_Description to re-evaluate the association between the publications of this topic and the provided subscription.

Definition at line 399 of file DCPS_IR_Topic.cpp.

References publicationRefs_, DCPS_IR_Publication::reevaluate_association(), and DCPS_IR_Subscription::reevaluate_association().

Referenced by DCPS_IR_Topic_Description::reevaluate_associations().

00400 {
00401   DCPS_IR_Publication * pub = 0;
00402   DCPS_IR_Publication_Set::ITERATOR iter = publicationRefs_.begin();
00403   DCPS_IR_Publication_Set::ITERATOR end = publicationRefs_.end();
00404 
00405   while (iter != end) {
00406     pub = *iter;
00407     ++iter;
00408 
00409     subscription->reevaluate_association(pub);
00410     pub->reevaluate_association(subscription);
00411   }
00412 }

void DCPS_IR_Topic::release ( bool  removing  ) 

Delete the topic object upon last topic associated sub/pub and topic object deletion. It's kind of reference counting. The removing true indicates it's called upon delete_topic, otherwise it's upon remove_publication/remove_subcription.

Definition at line 91 of file DCPS_IR_Topic.cpp.

References publicationRefs_, removed_, and subscriptionRefs_.

Referenced by DCPS_IR_Participant::remove_all_dependents(), and DCPS_IR_Domain::remove_topic().

00092 {
00093   if (removing) {
00094     this->removed_ = true;
00095 
00096     if (publicationRefs_.size() == 0 && subscriptionRefs_.size() == 0) {
00097       this->domain_->remove_topic_id_mapping(this->id_);
00098       delete this;
00099     }
00100 
00101   } else if (this->removed_) {
00102     if (publicationRefs_.size() == 0 && subscriptionRefs_.size() == 0) {
00103       this->domain_->remove_topic_id_mapping(this->id_);
00104       delete this;
00105     }
00106   }
00107 }

int DCPS_IR_Topic::remove_publication_reference ( DCPS_IR_Publication publication  ) 

Removes the publication from the list of publications Returns 0 if successful

Definition at line 167 of file DCPS_IR_Topic.cpp.

References OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Publication::get_id(), id_, and publicationRefs_.

Referenced by DCPS_IR_Participant::remove_all_dependents().

00168 {
00169   int status = publicationRefs_.remove(publication);
00170 
00171   if (0 == status) {
00172     if (OpenDDS::DCPS::DCPS_debug_level > 0) {
00173       OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00174       OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
00175       ACE_DEBUG((LM_DEBUG,
00176                  ACE_TEXT("(%P|%t) DCPS_IR_Topic::remove_publication_reference: ")
00177                  ACE_TEXT("topic %C removed publication %C.\n"),
00178                  std::string(topic_converter).c_str(),
00179                  std::string(pub_converter).c_str()));
00180     }
00181 
00182   } else {
00183     OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00184     OpenDDS::DCPS::RepoIdConverter pub_converter(publication->get_id());
00185     ACE_ERROR((LM_ERROR,
00186                ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::remove_publication_reference: ")
00187                ACE_TEXT("topic %C failed to remove publication %C.\n"),
00188                std::string(topic_converter).c_str(),
00189                std::string(pub_converter).c_str()));
00190   }
00191 
00192   return status;
00193 }

int DCPS_IR_Topic::remove_subscription_reference ( DCPS_IR_Subscription subscription  ) 

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

Definition at line 242 of file DCPS_IR_Topic.cpp.

References OpenDDS::DCPS::DCPS_debug_level, description_, DCPS_IR_Subscription::get_id(), id_, DCPS_IR_Topic_Description::remove_subscription_reference(), and subscriptionRefs_.

Referenced by DCPS_IR_Participant::remove_all_dependents().

00243 {
00244   int status = subscriptionRefs_.remove(subscription);
00245 
00246   if (0 == status) {
00247     if (OpenDDS::DCPS::DCPS_debug_level > 0) {
00248       OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00249       OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
00250       ACE_DEBUG((LM_DEBUG,
00251                  ACE_TEXT("(%P|%t) DCPS_IR_Topic::remove_subscription_reference: ")
00252                  ACE_TEXT("topic %C removed subscription %C.\n"),
00253                  std::string(topic_converter).c_str(),
00254                  std::string(sub_converter).c_str()));
00255     }
00256 
00257     this->description_->remove_subscription_reference(subscription);
00258 
00259   } else {
00260     OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00261     OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
00262     ACE_ERROR((LM_ERROR,
00263                ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Topic::remove_subscription_reference: ")
00264                ACE_TEXT("topic %C failed to remove subscription %C.\n"),
00265                std::string(topic_converter).c_str(),
00266                std::string(sub_converter).c_str()));
00267   } // if (0 == status)
00268 
00269   return status;
00270 }

void DCPS_IR_Topic::set_bit_status ( CORBA::Boolean  isBIT  ) 

Definition at line 394 of file DCPS_IR_Topic.cpp.

References isBIT_.

Referenced by DCPS_IR_Participant::add_topic_reference(), and DCPS_IR_Domain::publish_topic_bit().

00395 {
00396   isBIT_ = isBIT;
00397 }

void DCPS_IR_Topic::set_handle ( DDS::InstanceHandle_t  handle  ) 

Definition at line 384 of file DCPS_IR_Topic.cpp.

References handle_.

Referenced by DCPS_IR_Domain::publish_topic_bit().

00385 {
00386   handle_ = handle;
00387 }

bool DCPS_IR_Topic::set_topic_qos ( const DDS::TopicQos qos  ) 

Reset topic qos and also propogate the qos change to related BITs that has the qos copy. Return false if the provided QoS makes the DataWriter and DataReader QoS incompatible. Currently supported changeable QoS in TopicQos do not affect.

Definition at line 287 of file DCPS_IR_Topic.cpp.

References domain_, publicationRefs_, DCPS_IR_Domain::publish_publication_bit(), DCPS_IR_Domain::publish_subscription_bit(), DCPS_IR_Domain::publish_topic_bit(), qos_, subscriptionRefs_, and DDS::TopicQos::topic_data.

Referenced by TAO_DDS_DCPSInfo_i::update_topic_qos().

00288 {
00289   // Do not need re-evaluate compatibility and associations when
00290   // TopicQos changes since only datareader and datawriter QoS
00291   // are evaludated during normal associations establishment.
00292   using OpenDDS::DCPS::operator==;
00293   bool pub_to_rd_wr = !(qos.topic_data == qos_.topic_data);
00294 
00295   qos_ = qos;
00296   domain_->publish_topic_bit(this);
00297 
00298   if (!pub_to_rd_wr)
00299     return true;
00300 
00301   // The only changeable TopicQos used by DataWriter and DataReader
00302   // is topic_data so we need publish it to DW/DR BIT to make they
00303   // are consistent.
00304 
00305   // Update qos in datawriter BIT for associated datawriters.
00306 
00307   {
00308     DCPS_IR_Publication_Set::ITERATOR iter = publicationRefs_.begin();
00309     DCPS_IR_Publication_Set::ITERATOR end = publicationRefs_.end();
00310 
00311     while (iter != end) {
00312       domain_->publish_publication_bit(*iter);
00313       ++iter;
00314     }
00315   }
00316 
00317   // Update qos in datareader BIT for associated datareader.
00318 
00319   {
00320     DCPS_IR_Subscription_Set::ITERATOR iter = subscriptionRefs_.begin();
00321     DCPS_IR_Subscription_Set::ITERATOR end = subscriptionRefs_.end();
00322 
00323     while (iter != end) {
00324       domain_->publish_subscription_bit(*iter);
00325       ++iter;
00326     }
00327   }
00328 
00329   return true;
00330 }

void DCPS_IR_Topic::try_associate ( DCPS_IR_Subscription subscription  ) 

Called by the DCPS_IR_Topic_Description Find any compatible publications and associate them using the DCPS_IR_Topic_Description's associate method. This method does not check the subscription's incompatible qos status.

Definition at line 332 of file DCPS_IR_Topic.cpp.

References OpenDDS::DCPS::IncompatibleQosStatus::count_since_last_send, OpenDDS::DCPS::DCPS_debug_level, description_, DCPS_IR_Subscription::get_id(), DCPS_IR_Publication::get_incompatibleQosStatus(), DCPS_IR_Subscription::get_participant_id(), DCPS_IR_Subscription::get_topic_id(), id_, DCPS_IR_Participant::is_participant_ignored(), DCPS_IR_Participant::is_subscription_ignored(), DCPS_IR_Participant::is_topic_ignored(), participant_, publicationRefs_, DCPS_IR_Topic_Description::try_associate(), and DCPS_IR_Publication::update_incompatible_qos().

Referenced by DCPS_IR_Topic_Description::try_associate_subscription().

00333 {
00334   // check if we should ignore this subscription
00335   if (participant_->is_subscription_ignored(subscription->get_id()) ||
00336       participant_->is_participant_ignored(subscription->get_participant_id()) ||
00337       participant_->is_topic_ignored(subscription->get_topic_id())) {
00338     if (OpenDDS::DCPS::DCPS_debug_level > 0) {
00339       OpenDDS::DCPS::RepoIdConverter topic_converter(id_);
00340       OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id());
00341       ACE_DEBUG((LM_DEBUG,
00342                  ACE_TEXT("(%P|%t) DCPS_IR_Topic::try_associate: ")
00343                  ACE_TEXT("topic %C ignoring subscription %C.\n"),
00344                  std::string(topic_converter).c_str(),
00345                  std::string(sub_converter).c_str()));
00346     }
00347 
00348   } else {
00349     // check all publications for compatibility
00350     DCPS_IR_Publication* pub = 0;
00351     OpenDDS::DCPS::IncompatibleQosStatus* qosStatus = 0;
00352 
00353     DCPS_IR_Publication_Set::ITERATOR iter = publicationRefs_.begin();
00354     DCPS_IR_Publication_Set::ITERATOR end = publicationRefs_.end();
00355 
00356     while (iter != end) {
00357       pub = *iter;
00358       ++iter;
00359       description_->try_associate(pub, subscription);
00360       // Check the publications QOS status
00361       qosStatus = pub->get_incompatibleQosStatus();
00362 
00363       if (0 < qosStatus->count_since_last_send) {
00364         pub->update_incompatible_qos();
00365       }
00366     } /* while (iter != end) */
00367 
00368     // The subscription QOS is not checked because
00369     // we don't know if the subscription is finished cycling
00370     // through topics.
00371   }
00372 }


Member Data Documentation

DCPS_IR_Topic_Description* DCPS_IR_Topic::description_ [private]

Definition at line 126 of file DCPS_IR_Topic.h.

Referenced by add_publication_reference(), add_subscription_reference(), get_topic_description(), reassociate_all_publications(), remove_subscription_reference(), and try_associate().

DCPS_IR_Domain* DCPS_IR_Topic::domain_ [private]

Definition at line 124 of file DCPS_IR_Topic.h.

Referenced by add_publication_reference(), and set_topic_qos().

DDS::InstanceHandle_t DCPS_IR_Topic::handle_ [private]

Definition at line 127 of file DCPS_IR_Topic.h.

Referenced by get_handle(), and set_handle().

OpenDDS::DCPS::RepoId DCPS_IR_Topic::id_ [private]

Definition at line 122 of file DCPS_IR_Topic.h.

Referenced by add_publication_reference(), add_subscription_reference(), dump_to_string(), get_id(), remove_publication_reference(), remove_subscription_reference(), try_associate(), and ~DCPS_IR_Topic().

CORBA::Boolean DCPS_IR_Topic::isBIT_ [private]

Definition at line 128 of file DCPS_IR_Topic.h.

Referenced by dump_to_string(), is_bit(), and set_bit_status().

DCPS_IR_Participant* DCPS_IR_Topic::participant_ [private]

Definition at line 125 of file DCPS_IR_Topic.h.

Referenced by get_participant_id(), and try_associate().

DCPS_IR_Publication_Set DCPS_IR_Topic::publicationRefs_ [private]

Definition at line 130 of file DCPS_IR_Topic.h.

Referenced by add_publication_reference(), dump_to_string(), reassociate_all_publications(), reevaluate_associations(), release(), remove_publication_reference(), set_topic_qos(), try_associate(), and ~DCPS_IR_Topic().

DDS::TopicQos DCPS_IR_Topic::qos_ [private]

Definition at line 123 of file DCPS_IR_Topic.h.

Referenced by get_topic_qos(), and set_topic_qos().

bool DCPS_IR_Topic::removed_ [private]

True means release() is called upon delete_topic, but topic object is not deleted because there are still pub/sub associated.

Definition at line 137 of file DCPS_IR_Topic.h.

Referenced by release().

DCPS_IR_Subscription_Set DCPS_IR_Topic::subscriptionRefs_ [private]

Keep track the subscriptions of this topic so the TopicQos change can be published for those subscriptions.

Definition at line 133 of file DCPS_IR_Topic.h.

Referenced by add_subscription_reference(), dump_to_string(), release(), remove_subscription_reference(), set_topic_qos(), and ~DCPS_IR_Topic().


The documentation for this class was generated from the following files:
Generated on Fri Feb 12 20:05:56 2016 for OpenDDS by  doxygen 1.4.7