int DCPS_IR_Subscription::remove_associations(CORBA::Boolean notify_lost) { int status = 0; DCPS_IR_Publication* pub = 0; size_t numAssociations = associations_.size(); CORBA::Boolean dontSend = 0; CORBA::Boolean send = 1; if (0 < numAssociations) { DCPS_IR_Publication_Set::ITERATOR iter = associations_.begin(); DCPS_IR_Publication_Set::ITERATOR end = associations_.end(); while (iter != end) { pub = *iter; ++iter; pub->remove_associated_subscription(this, send, notify_lost); CORBA::Boolean dont_notify_lost = 0; remove_associated_publication(pub, dontSend, dont_notify_lost); } } this->defunct_.reset(); return status; }
void DCPS_IR_Subscription::disassociate_publication(OpenDDS::DCPS::RepoId id, bool reassociate) { DCPS_IR_Publication* pub = 0; size_t numAssociations = associations_.size(); CORBA::Boolean dontSend = 0; CORBA::Boolean send = 1; long count = 0; if (0 < numAssociations) { OpenDDS::DCPS::WriterIdSeq idSeq(static_cast<CORBA::ULong>(numAssociations)); idSeq.length(static_cast<CORBA::ULong>(numAssociations)); DCPS_IR_Publication_Set::ITERATOR iter = associations_.begin(); DCPS_IR_Publication_Set::ITERATOR end = associations_.end(); while (iter != end) { pub = *iter; ++iter; if (OpenDDS::DCPS::DCPS_debug_level > 0) { OpenDDS::DCPS::RepoIdConverter sub_converter(id_); OpenDDS::DCPS::RepoIdConverter pub_converter(pub->get_id()); OpenDDS::DCPS::RepoIdConverter sub_pub_converter(id); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DCPS_IR_Subscription::disassociate_publication: ") ACE_TEXT("subscription %C testing if publication %C == %C.\n"), std::string(sub_converter).c_str(), std::string(pub_converter).c_str(), std::string(sub_pub_converter).c_str())); } if (id == pub->get_id()) { CORBA::Boolean dont_notify_lost = 0; pub->remove_associated_subscription(this, send, dont_notify_lost); remove_associated_publication(pub, dontSend, dont_notify_lost); idSeq[count] = pub->get_id(); ++count; if (reassociate && this->defunct_.insert(pub) != 0) { OpenDDS::DCPS::RepoIdConverter sub_converter(id_); OpenDDS::DCPS::RepoIdConverter pub_converter(pub->get_id()); ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Subscription::disassociate_publication: ") ACE_TEXT("subscription %C failed to reassociate publication %C at %x.\n"), std::string(sub_converter).c_str(), std::string(pub_converter).c_str(), pub)); } } } if (0 < count) { idSeq.length(count); if (participant_->is_alive() && this->participant_->isOwner()) { try { CORBA::Boolean dont_notify_lost = 0; reader_->remove_associations(idSeq, dont_notify_lost); } catch (const CORBA::Exception& ex) { if (OpenDDS::DCPS::DCPS_debug_level > 0) { ex._tao_print_exception( "(%P|%t) ERROR: Exception caught in DCPS_IR_Subscription::remove_associations:"); } participant_->mark_dead(); } } } } }