Representative of a Publication. More...
#include <DCPS_IR_Publication.h>
Representative of a Publication.
Definition at line 41 of file DCPS_IR_Publication.h.
DCPS_IR_Publication h OPENDDS_BEGIN_VERSIONED_NAMESPACE_DECL DCPS_IR_Publication::DCPS_IR_Publication | ( | const OpenDDS::DCPS::RepoId & | id, | |
DCPS_IR_Participant * | participant, | |||
DCPS_IR_Topic * | topic, | |||
OpenDDS::DCPS::DataWriterRemote_ptr | writer, | |||
const DDS::DataWriterQos & | qos, | |||
const OpenDDS::DCPS::TransportLocatorSeq & | info, | |||
const DDS::PublisherQos & | publisherQos | |||
) |
Definition at line 26 of file DCPS_IR_Publication.cpp.
References OpenDDS::DCPS::IncompatibleQosStatus::count_since_last_send, incompatibleQosStatus_, OpenDDS::DCPS::IncompatibleQosStatus::total_count, and writer_.
00033 : id_(id), 00034 participant_(participant), 00035 topic_(topic), 00036 handle_(0), 00037 isBIT_(0), 00038 qos_(qos), 00039 info_(info), 00040 publisherQos_(publisherQos) 00041 { 00042 writer_ = OpenDDS::DCPS::DataWriterRemote::_duplicate(writer); 00043 00044 incompatibleQosStatus_.total_count = 0; 00045 incompatibleQosStatus_.count_since_last_send = 0; 00046 }
DCPS_IR_Publication::~DCPS_IR_Publication | ( | ) |
Definition at line 48 of file DCPS_IR_Publication.cpp.
int DCPS_IR_Publication::add_associated_subscription | ( | DCPS_IR_Subscription * | sub, | |
bool | active | |||
) |
Associate with the subscription Adds the subscription to the list of associated subscriptions and notifies datawriter if successfully added This method can mark the participant dead Returns 0 if added, 1 if already exists, -1 other failure
Definition at line 52 of file DCPS_IR_Publication.cpp.
References CORBA::Exception::_tao_print_exception(), ACE_TEXT(), associations_, OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::ReaderAssociation::exprParams, OpenDDS::DCPS::ReaderAssociation::filterClassName, OpenDDS::DCPS::ReaderAssociation::filterExpression, DCPS_IR_Subscription::get_datareader_qos(), DCPS_IR_Subscription::get_expr_params(), DCPS_IR_Subscription::get_filter_class_name(), DCPS_IR_Subscription::get_filter_expression(), DCPS_IR_Subscription::get_id(), DCPS_IR_Subscription::get_subscriber_qos(), DCPS_IR_Subscription::get_transportLocatorSeq(), id_, ACE_Unbounded_Set_Ex< T, C >::insert(), DCPS_IR_Participant::is_alive(), DCPS_IR_Participant::isOwner(), LM_DEBUG, LM_ERROR, DCPS_IR_Participant::mark_dead(), participant_, OpenDDS::DCPS::ReaderAssociation::readerId, OpenDDS::DCPS::ReaderAssociation::readerQos, OpenDDS::DCPS::ReaderAssociation::readerTransInfo, status, OpenDDS::DCPS::ReaderAssociation::subQos, and writer_.
Referenced by DCPS_IR_Topic_Description::associate().
00054 { 00055 // keep track of the association locally 00056 int status = associations_.insert(sub); 00057 00058 switch (status) { 00059 case 0: { 00060 // inform the datawriter about the association 00061 OpenDDS::DCPS::ReaderAssociation association; 00062 association.readerTransInfo = sub->get_transportLocatorSeq(); 00063 association.readerId = sub->get_id(); 00064 association.subQos = *(sub->get_subscriber_qos()); 00065 association.readerQos = *(sub->get_datareader_qos()); 00066 association.filterClassName = sub->get_filter_class_name().c_str(); 00067 association.filterExpression = sub->get_filter_expression().c_str(); 00068 association.exprParams = sub->get_expr_params(); 00069 00070 if (participant_->is_alive() && this->participant_->isOwner()) { 00071 try { 00072 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00073 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00074 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00075 ACE_DEBUG((LM_DEBUG, 00076 ACE_TEXT("(%P|%t) DCPS_IR_Publication::add_associated_subscription:") 00077 ACE_TEXT(" publication %C adding subscription %C.\n"), 00078 std::string(pub_converter).c_str(), 00079 std::string(sub_converter).c_str())); 00080 } 00081 00082 writer_->add_association(id_, association, active); 00083 00084 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00085 ACE_DEBUG((LM_DEBUG, 00086 ACE_TEXT("(%P|%t) DCPS_IR_Publication::add_associated_subscription: ") 00087 ACE_TEXT("successfully added subscription %x.\n"), 00088 sub)); 00089 } 00090 } catch (const CORBA::Exception& ex) { 00091 ex._tao_print_exception( 00092 "(%P|%t) ERROR: Exception caught in DCPS_IR_Publication::add_associated_subscription:"); 00093 participant_->mark_dead(); 00094 status = -1; 00095 } 00096 } 00097 } 00098 break; 00099 00100 case 1: { 00101 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00102 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00103 ACE_ERROR((LM_ERROR, 00104 ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Publication::add_associated_subscription: ") 00105 ACE_TEXT("publication %C attempted to re-add subscription %C.\n"), 00106 std::string(pub_converter).c_str(), 00107 std::string(sub_converter).c_str())); 00108 } 00109 break; 00110 00111 case -1: { 00112 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00113 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00114 ACE_ERROR((LM_ERROR, 00115 ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Publication::add_associated_subscription: ") 00116 ACE_TEXT("publication %C failed to add subscription %C.\n"), 00117 std::string(pub_converter).c_str(), 00118 std::string(sub_converter).c_str())); 00119 } 00120 }; 00121 00122 return status; 00123 }
void DCPS_IR_Publication::association_complete | ( | const OpenDDS::DCPS::RepoId & | remote | ) |
The service participant that contains this Publication has indicated that the assocation to peer "remote" is complete. This method will locate the Subscription object for "remote" in order to inform it of the completed association.
Definition at line 126 of file DCPS_IR_Publication.cpp.
References associations_, ACE_Unbounded_Set_Ex< T, C >::begin(), ACE_Unbounded_Set_Ex< T, C >::end(), and get_id().
Referenced by TAO_DDS_DCPSInfo_i::association_complete().
00127 { 00128 typedef DCPS_IR_Subscription_Set::ITERATOR iter_t; 00129 for (iter_t iter = associations_.begin(); iter != associations_.end(); ++iter) { 00130 if ((*iter)->get_id() == remote) { 00131 (*iter)->call_association_complete(get_id()); 00132 } 00133 } 00134 }
void DCPS_IR_Publication::call_association_complete | ( | const OpenDDS::DCPS::RepoId & | remote | ) |
Invoke the DataWriterRemote::association_complete() callback, passing the "remote" parameter (Subscription) to the service participant.
Definition at line 137 of file DCPS_IR_Publication.cpp.
References CORBA::Exception::_tao_print_exception(), OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Participant::mark_dead(), participant_, and writer_.
00138 { 00139 try { 00140 writer_->association_complete(remote); 00141 } catch (const CORBA::Exception& ex) { 00142 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00143 ex._tao_print_exception( 00144 "(%P|%t) ERROR: Exception caught in DCPS_IR_Publication::call_association_complete:"); 00145 } 00146 participant_->mark_dead(); 00147 } 00148 }
void DCPS_IR_Publication::disassociate_participant | ( | OpenDDS::DCPS::RepoId | id, | |
bool | reassociate = false | |||
) |
Remove any subscriptions whose participant has the id.
Definition at line 249 of file DCPS_IR_Publication.cpp.
References CORBA::Exception::_tao_print_exception(), ACE_TEXT(), associations_, ACE_Unbounded_Set_Ex< T, C >::begin(), OpenDDS::DCPS::DCPS_debug_level, defunct_, ACE_Unbounded_Set_Ex< T, C >::end(), DCPS_IR_Subscription::get_id(), DCPS_IR_Subscription::get_participant_id(), id_, ACE_Unbounded_Set_Ex< T, C >::insert(), DCPS_IR_Participant::is_alive(), DCPS_IR_Participant::isOwner(), LM_DEBUG, LM_ERROR, DCPS_IR_Participant::mark_dead(), participant_, DCPS_IR_Subscription::remove_associated_publication(), remove_associated_subscription(), send(), ACE_Unbounded_Set_Ex< T, C >::size(), and writer_.
00251 { 00252 DCPS_IR_Subscription* sub = 0; 00253 size_t numAssociations = associations_.size(); 00254 CORBA::Boolean send = 1; 00255 CORBA::Boolean dontSend = 0; 00256 long count = 0; 00257 00258 if (0 < numAssociations) { 00259 OpenDDS::DCPS::ReaderIdSeq idSeq(static_cast<CORBA::ULong>(numAssociations)); 00260 idSeq.length(static_cast<CORBA::ULong>(numAssociations)); 00261 00262 DCPS_IR_Subscription_Set::ITERATOR iter = associations_.begin(); 00263 DCPS_IR_Subscription_Set::ITERATOR end = associations_.end(); 00264 00265 while (iter != end) { 00266 sub = *iter; 00267 ++iter; 00268 00269 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00270 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00271 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00272 OpenDDS::DCPS::RepoIdConverter pub_part_converter(id); 00273 OpenDDS::DCPS::RepoIdConverter sub_part_converter(sub->get_participant_id()); 00274 ACE_DEBUG((LM_DEBUG, 00275 ACE_TEXT("(%P|%t) DCPS_IR_Publication::disassociate_participant: ") 00276 ACE_TEXT("publication %C testing if subscription %C particpant %C == %C.\n"), 00277 std::string(pub_converter).c_str(), 00278 std::string(sub_converter).c_str(), 00279 std::string(sub_part_converter).c_str(), 00280 std::string(pub_part_converter).c_str())); 00281 } 00282 00283 if (id == sub->get_participant_id()) { 00284 CORBA::Boolean dont_notify_lost = 0; 00285 sub->remove_associated_publication(this, send, dont_notify_lost); 00286 remove_associated_subscription(sub, dontSend, dont_notify_lost); 00287 00288 idSeq[count] = sub->get_id(); 00289 ++count; 00290 00291 if (reassociate && this->defunct_.insert(sub) != 0) { 00292 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00293 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00294 ACE_ERROR((LM_ERROR, 00295 ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Publication::disassociate_participant: ") 00296 ACE_TEXT("publication %C failed to reassociate subscription %C at %x.\n"), 00297 std::string(pub_converter).c_str(), 00298 std::string(sub_converter).c_str(), 00299 sub)); 00300 } 00301 } 00302 } 00303 00304 if (0 < count) { 00305 idSeq.length(count); 00306 00307 if (participant_->is_alive() && this->participant_->isOwner()) { 00308 try { 00309 CORBA::Boolean dont_notify_lost = 0; 00310 writer_->remove_associations(idSeq, dont_notify_lost); 00311 00312 } catch (const CORBA::Exception& ex) { 00313 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00314 ex._tao_print_exception( 00315 "(%P|%t) ERROR: Exception caught in DCPS_IR_Publication::disassociate_participant:"); 00316 } 00317 00318 participant_->mark_dead(); 00319 } 00320 } 00321 } 00322 } 00323 }
void DCPS_IR_Publication::disassociate_subscription | ( | OpenDDS::DCPS::RepoId | id, | |
bool | reassociate = false | |||
) |
Remove any subscriptions with the id.
Definition at line 389 of file DCPS_IR_Publication.cpp.
References CORBA::Exception::_tao_print_exception(), ACE_TEXT(), associations_, ACE_Unbounded_Set_Ex< T, C >::begin(), OpenDDS::DCPS::DCPS_debug_level, defunct_, ACE_Unbounded_Set_Ex< T, C >::end(), DCPS_IR_Subscription::get_id(), id_, ACE_Unbounded_Set_Ex< T, C >::insert(), DCPS_IR_Participant::is_alive(), DCPS_IR_Participant::isOwner(), LM_DEBUG, LM_ERROR, DCPS_IR_Participant::mark_dead(), participant_, DCPS_IR_Subscription::remove_associated_publication(), remove_associated_subscription(), send(), ACE_Unbounded_Set_Ex< T, C >::size(), and writer_.
Referenced by TAO_DDS_DCPSInfo_i::disassociate_publication().
00391 { 00392 DCPS_IR_Subscription* sub = 0; 00393 size_t numAssociations = associations_.size(); 00394 CORBA::Boolean send = 1; 00395 CORBA::Boolean dontSend = 0; 00396 long count = 0; 00397 00398 if (0 < numAssociations) { 00399 OpenDDS::DCPS::ReaderIdSeq idSeq(static_cast<CORBA::ULong>(numAssociations)); 00400 idSeq.length(static_cast<CORBA::ULong>(numAssociations)); 00401 00402 DCPS_IR_Subscription_Set::ITERATOR iter = associations_.begin(); 00403 DCPS_IR_Subscription_Set::ITERATOR end = associations_.end(); 00404 00405 while (iter != end) { 00406 sub = *iter; 00407 ++iter; 00408 00409 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00410 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00411 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00412 OpenDDS::DCPS::RepoIdConverter pub_sub_converter(id); 00413 ACE_DEBUG((LM_DEBUG, 00414 ACE_TEXT("(%P|%t) DCPS_IR_Publication::disassociate_subscription: ") 00415 ACE_TEXT("publication %C testing if subscription %C == %C.\n"), 00416 std::string(pub_converter).c_str(), 00417 std::string(sub_converter).c_str(), 00418 std::string(pub_sub_converter).c_str())); 00419 } 00420 00421 if (id == sub->get_id()) { 00422 CORBA::Boolean dont_notify_lost = 0; 00423 sub->remove_associated_publication(this, send, dont_notify_lost); 00424 remove_associated_subscription(sub, dontSend, dont_notify_lost); 00425 00426 idSeq[count] = sub->get_id(); 00427 ++count; 00428 00429 if (reassociate && this->defunct_.insert(sub) != 0) { 00430 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00431 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00432 ACE_ERROR((LM_ERROR, 00433 ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Publication::disassociate_subscription: ") 00434 ACE_TEXT("publication %C failed to reassociate subscription %C at %x.\n"), 00435 std::string(pub_converter).c_str(), 00436 std::string(sub_converter).c_str(), 00437 sub)); 00438 } 00439 } 00440 } 00441 00442 if (0 < count) { 00443 idSeq.length(count); 00444 00445 if (participant_->is_alive() && this->participant_->isOwner()) { 00446 try { 00447 CORBA::Boolean dont_notify_lost = 0; 00448 writer_->remove_associations(idSeq, dont_notify_lost); 00449 00450 } catch (const CORBA::Exception& ex) { 00451 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00452 ex._tao_print_exception( 00453 "(%P|%t) ERROR: Exception caught in DCPS_IR_Publication::remove_associations:"); 00454 } 00455 00456 participant_->mark_dead(); 00457 } 00458 } 00459 } 00460 } 00461 }
void DCPS_IR_Publication::disassociate_topic | ( | OpenDDS::DCPS::RepoId | id | ) |
Remove any subscriptions whose topic has the id.
Definition at line 325 of file DCPS_IR_Publication.cpp.
References CORBA::Exception::_tao_print_exception(), ACE_TEXT(), associations_, ACE_Unbounded_Set_Ex< T, C >::begin(), OpenDDS::DCPS::DCPS_debug_level, ACE_Unbounded_Set_Ex< T, C >::end(), DCPS_IR_Subscription::get_id(), DCPS_IR_Subscription::get_topic_id(), id_, DCPS_IR_Participant::is_alive(), DCPS_IR_Participant::isOwner(), LM_DEBUG, DCPS_IR_Participant::mark_dead(), participant_, DCPS_IR_Subscription::remove_associated_publication(), remove_associated_subscription(), send(), ACE_Unbounded_Set_Ex< T, C >::size(), and writer_.
00326 { 00327 DCPS_IR_Subscription* sub = 0; 00328 size_t numAssociations = associations_.size(); 00329 CORBA::Boolean send = 1; 00330 CORBA::Boolean dontSend = 0; 00331 long count = 0; 00332 00333 if (0 < numAssociations) { 00334 OpenDDS::DCPS::ReaderIdSeq idSeq(static_cast<CORBA::ULong>(numAssociations)); 00335 idSeq.length(static_cast<CORBA::ULong>(numAssociations)); 00336 00337 DCPS_IR_Subscription_Set::ITERATOR iter = associations_.begin(); 00338 DCPS_IR_Subscription_Set::ITERATOR end = associations_.end(); 00339 00340 while (iter != end) { 00341 sub = *iter; 00342 ++iter; 00343 00344 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00345 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00346 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00347 OpenDDS::DCPS::RepoIdConverter pub_topic_converter(id); 00348 OpenDDS::DCPS::RepoIdConverter sub_topic_converter(sub->get_topic_id()); 00349 ACE_DEBUG((LM_DEBUG, 00350 ACE_TEXT("(%P|%t) DCPS_IR_Publication::disassociate_topic: ") 00351 ACE_TEXT("publication %C testing if subscription %C topic %C == %C.\n"), 00352 std::string(pub_converter).c_str(), 00353 std::string(sub_converter).c_str(), 00354 std::string(sub_topic_converter).c_str(), 00355 std::string(pub_topic_converter).c_str())); 00356 } 00357 00358 if (id == sub->get_topic_id()) { 00359 CORBA::Boolean dont_notify_lost = 0; 00360 sub->remove_associated_publication(this, send, dont_notify_lost); 00361 remove_associated_subscription(sub, dontSend, dont_notify_lost); 00362 00363 idSeq[count] = sub->get_id(); 00364 ++count; 00365 } 00366 } 00367 00368 if (0 < count) { 00369 idSeq.length(count); 00370 00371 if (participant_->is_alive() && this->participant_->isOwner()) { 00372 try { 00373 CORBA::Boolean dont_notify_lost = 0; 00374 writer_->remove_associations(idSeq, dont_notify_lost); 00375 00376 } catch (const CORBA::Exception& ex) { 00377 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00378 ex._tao_print_exception( 00379 "(%P|%t) ERROR: Exception caught in DCPS_IR_Publication::remove_associations:"); 00380 } 00381 00382 participant_->mark_dead(); 00383 } 00384 } 00385 } 00386 } 00387 }
std::string DCPS_IR_Publication::dump_to_string | ( | const std::string & | prefix, | |
int | depth | |||
) | const |
Definition at line 749 of file DCPS_IR_Publication.cpp.
References associations_, ACE_Unbounded_Set_Ex< T, C >::begin(), defunct_, ACE_Unbounded_Set_Ex< T, C >::end(), id_, isBIT_, and str.
00750 { 00751 std::string str; 00752 #if !defined (OPENDDS_INFOREPO_REDUCED_FOOTPRINT) 00753 OpenDDS::DCPS::RepoIdConverter local_converter(id_); 00754 00755 for (int i=0; i < depth; i++) 00756 str += prefix; 00757 std::string indent = str + prefix; 00758 str += "DCPS_IR_Publication["; 00759 str += std::string(local_converter); 00760 str += "]"; 00761 if (isBIT_) 00762 str += " (BIT)"; 00763 str += "\n"; 00764 00765 str += indent + "Associations [ "; 00766 for (DCPS_IR_Subscription_Set::const_iterator assoc = associations_.begin(); 00767 assoc != associations_.end(); 00768 assoc++) 00769 { 00770 OpenDDS::DCPS::RepoIdConverter assoc_converter((*assoc)->get_id()); 00771 str += std::string(assoc_converter); 00772 str += " "; 00773 } 00774 str += "]\n"; 00775 00776 str += indent + "Defunct Associations [ "; 00777 for (DCPS_IR_Subscription_Set::const_iterator def = defunct_.begin(); 00778 def != defunct_.end(); 00779 def++) 00780 { 00781 OpenDDS::DCPS::RepoIdConverter def_converter((*def)->get_id()); 00782 str += std::string(def_converter); 00783 str += " "; 00784 } 00785 str += "]\n"; 00786 #endif // !defined (OPENDDS_INFOREPO_REDUCED_FOOTPRINT) 00787 return str; 00788 }
DDS::DataWriterQos * DCPS_IR_Publication::get_datawriter_qos | ( | ) |
Return pointer to the DataWriter qos Publication retains ownership
Definition at line 492 of file DCPS_IR_Publication.cpp.
References qos_.
Referenced by DCPS_IR_Subscription::add_associated_publication(), DCPS_IR_Domain::publish_publication_bit(), OpenDDS::Federator::ManagerImpl::pushState(), DCPS_IR_Subscription::reevaluate_association(), reevaluate_association(), and DCPS_IR_Topic_Description::try_associate().
00493 { 00494 return &qos_; 00495 }
DDS::InstanceHandle_t DCPS_IR_Publication::get_handle | ( | void | ) |
Definition at line 638 of file DCPS_IR_Publication.cpp.
References handle_.
Referenced by DCPS_IR_Domain::dispose_publication_bit().
00639 { 00640 return handle_; 00641 }
OpenDDS::DCPS::RepoId DCPS_IR_Publication::get_id | ( | void | ) |
Definition at line 613 of file DCPS_IR_Publication.cpp.
References id_.
Referenced by DCPS_IR_Subscription::add_associated_publication(), DCPS_IR_Topic::add_publication_reference(), DCPS_IR_Topic_Description::associate(), association_complete(), DCPS_IR_Subscription::disassociate_participant(), DCPS_IR_Subscription::disassociate_publication(), DCPS_IR_Subscription::disassociate_topic(), DCPS_IR_Domain::publish_publication_bit(), OpenDDS::Federator::ManagerImpl::pushState(), DCPS_IR_Subscription::reevaluate_defunct_associations(), DCPS_IR_Subscription::remove_associated_publication(), DCPS_IR_Topic::remove_publication_reference(), and DCPS_IR_Topic_Description::try_associate().
00614 { 00615 return id_; 00616 }
OpenDDS::DCPS::IncompatibleQosStatus * DCPS_IR_Publication::get_incompatibleQosStatus | ( | ) |
Return pointer to the incompatible qos status Publication retains ownership
Definition at line 608 of file DCPS_IR_Publication.cpp.
References incompatibleQosStatus_.
Referenced by DCPS_IR_Subscription::reevaluate_association(), reevaluate_association(), DCPS_IR_Topic_Description::try_associate(), DCPS_IR_Topic::try_associate(), and DCPS_IR_Topic_Description::try_associate_publication().
00609 { 00610 return &incompatibleQosStatus_; 00611 }
OpenDDS::DCPS::RepoId DCPS_IR_Publication::get_participant_id | ( | ) |
Definition at line 623 of file DCPS_IR_Publication.cpp.
References DCPS_IR_Participant::get_id(), and participant_.
Referenced by DCPS_IR_Subscription::disassociate_participant(), DCPS_IR_Domain::publish_publication_bit(), OpenDDS::Federator::ManagerImpl::pushState(), and DCPS_IR_Topic_Description::try_associate().
00624 { 00625 return participant_->get_id(); 00626 }
DDS::PublisherQos * DCPS_IR_Publication::get_publisher_qos | ( | ) |
Return pointer to the Publisher qos Publication retains ownership
Definition at line 598 of file DCPS_IR_Publication.cpp.
References publisherQos_.
Referenced by DCPS_IR_Subscription::add_associated_publication(), DCPS_IR_Domain::publish_publication_bit(), OpenDDS::Federator::ManagerImpl::pushState(), DCPS_IR_Subscription::reevaluate_association(), reevaluate_association(), and DCPS_IR_Topic_Description::try_associate().
00599 { 00600 return &publisherQos_; 00601 }
DCPS_IR_Topic * DCPS_IR_Publication::get_topic | ( | ) |
Definition at line 628 of file DCPS_IR_Publication.cpp.
References topic_.
Referenced by DCPS_IR_Domain::publish_publication_bit().
00629 { 00630 return topic_; 00631 }
DCPS_IR_Topic_Description * DCPS_IR_Publication::get_topic_description | ( | ) |
Definition at line 633 of file DCPS_IR_Publication.cpp.
References DCPS_IR_Topic::get_topic_description(), and topic_.
Referenced by DCPS_IR_Domain::publish_publication_bit().
00634 { 00635 return topic_->get_topic_description(); 00636 }
OpenDDS::DCPS::RepoId DCPS_IR_Publication::get_topic_id | ( | ) |
Definition at line 618 of file DCPS_IR_Publication.cpp.
References DCPS_IR_Topic::get_id(), and topic_.
Referenced by DCPS_IR_Subscription::disassociate_topic(), OpenDDS::Federator::ManagerImpl::pushState(), and DCPS_IR_Topic_Description::try_associate().
OpenDDS::DCPS::TransportLocatorSeq DCPS_IR_Publication::get_transportLocatorSeq | ( | ) | const |
Definition at line 603 of file DCPS_IR_Publication.cpp.
References info_.
Referenced by DCPS_IR_Subscription::add_associated_publication(), OpenDDS::Federator::ManagerImpl::pushState(), DCPS_IR_Subscription::reevaluate_association(), reevaluate_association(), and DCPS_IR_Topic_Description::try_associate().
00604 { 00605 return info_; 00606 }
CORBA::Boolean DCPS_IR_Publication::is_bit | ( | ) |
Definition at line 648 of file DCPS_IR_Publication.cpp.
References isBIT_.
Referenced by DCPS_IR_Domain::dispose_publication_bit().
00649 { 00650 return isBIT_; 00651 }
CORBA::Boolean DCPS_IR_Publication::is_subscription_ignored | ( | OpenDDS::DCPS::RepoId | partId, | |
OpenDDS::DCPS::RepoId | topicId, | |||
OpenDDS::DCPS::RepoId | subId | |||
) |
Check that none of the ids given are ones that this publication should ignore. returns 1 if one of these ids is an ignored id
Definition at line 480 of file DCPS_IR_Publication.cpp.
References DCPS_IR_Participant::is_participant_ignored(), DCPS_IR_Participant::is_subscription_ignored(), DCPS_IR_Participant::is_topic_ignored(), and participant_.
Referenced by DCPS_IR_Topic_Description::try_associate().
00483 { 00484 CORBA::Boolean ignored; 00485 ignored = (participant_->is_participant_ignored(partId) || 00486 participant_->is_topic_ignored(topicId) || 00487 participant_->is_subscription_ignored(subId)); 00488 00489 return ignored; 00490 }
bool DCPS_IR_Publication::reevaluate_association | ( | DCPS_IR_Subscription * | subscription | ) |
Definition at line 703 of file DCPS_IR_Publication.cpp.
References associations_, OpenDDS::DCPS::compatibleQOS(), ACE_Unbounded_Set_Ex< T, C >::find(), DCPS_IR_Subscription::get_datareader_qos(), get_datawriter_qos(), DCPS_IR_Subscription::get_incompatibleQosStatus(), get_incompatibleQosStatus(), get_publisher_qos(), DCPS_IR_Subscription::get_subscriber_qos(), DCPS_IR_Topic::get_topic_description(), DCPS_IR_Subscription::get_transportLocatorSeq(), get_transportLocatorSeq(), remove_associated_subscription(), status, topic_, and DCPS_IR_Topic_Description::try_associate().
Referenced by DCPS_IR_Topic_Description::reevaluate_associations(), DCPS_IR_Topic::reevaluate_associations(), reevaluate_defunct_associations(), and reevaluate_existing_associations().
00704 { 00705 int status = this->associations_.find(subscription); 00706 00707 if (status == 0) { 00708 // verify if they are still compatiable after change 00709 00710 00711 if (!OpenDDS::DCPS::compatibleQOS(this->get_incompatibleQosStatus(), 00712 subscription->get_incompatibleQosStatus(), 00713 this->get_transportLocatorSeq(), 00714 subscription->get_transportLocatorSeq(), 00715 this->get_datawriter_qos(), 00716 subscription->get_datareader_qos(), 00717 this->get_publisher_qos(), 00718 subscription->get_subscriber_qos())) { 00719 bool sendNotify = true; // inform datawriter 00720 bool notify_lost = true; // invoke listerner callback 00721 00722 this->remove_associated_subscription(subscription, sendNotify, notify_lost, true); 00723 } 00724 00725 } else { 00726 DCPS_IR_Topic_Description* description = this->topic_->get_topic_description(); 00727 return description->try_associate(this, subscription); 00728 } 00729 00730 return false; 00731 }
void DCPS_IR_Publication::reevaluate_defunct_associations | ( | ) |
Definition at line 665 of file DCPS_IR_Publication.cpp.
References ACE_TEXT(), ACE_Unbounded_Set_Ex< T, C >::begin(), defunct_, ACE_Unbounded_Set_Ex< T, C >::end(), DCPS_IR_Subscription::get_id(), id_, LM_ERROR, reevaluate_association(), and ACE_Unbounded_Set_Ex< T, C >::remove().
00666 { 00667 DCPS_IR_Subscription_Set::iterator it(this->defunct_.begin()); 00668 while (it != this->defunct_.end()) { 00669 DCPS_IR_Subscription* subscription = *it; 00670 ++it; 00671 00672 if (reevaluate_association(subscription)) { 00673 this->defunct_.remove(subscription); // no longer defunct 00674 00675 } else { 00676 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00677 OpenDDS::DCPS::RepoIdConverter sub_converter(subscription->get_id()); 00678 ACE_ERROR((LM_ERROR, 00679 ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Publication::reevaluate_defunct_associations: ") 00680 ACE_TEXT("publication %C failed to reassociate subscription %C at %x.\n"), 00681 std::string(pub_converter).c_str(), 00682 std::string(sub_converter).c_str(), 00683 subscription)); 00684 } 00685 } 00686 }
void DCPS_IR_Publication::reevaluate_existing_associations | ( | ) |
Definition at line 688 of file DCPS_IR_Publication.cpp.
References associations_, ACE_Unbounded_Set_Ex< T, C >::begin(), ACE_Unbounded_Set_Ex< T, C >::end(), and reevaluate_association().
Referenced by set_qos().
00689 { 00690 DCPS_IR_Subscription* sub = 0; 00691 DCPS_IR_Subscription_Set::ITERATOR iter = associations_.begin(); 00692 DCPS_IR_Subscription_Set::ITERATOR end = associations_.end(); 00693 00694 while (iter != end) { 00695 sub = *iter; 00696 ++iter; 00697 00698 this->reevaluate_association(sub); 00699 } 00700 }
int DCPS_IR_Publication::remove_associated_subscription | ( | DCPS_IR_Subscription * | sub, | |
CORBA::Boolean | sendNotify, | |||
CORBA::Boolean | notify_lost, | |||
bool | notify_both_side = false | |||
) |
Remove the associated subscription Removes the subscription from the list of associated subscriptions if return successful sendNotify indicates whether to tell the datawriter about removing the subscription The notify_lost parameter is passed to the remove_associations() The notify_both_side parameter indicates if it needs call sub to remove association as well. See the comments of remove_associations() in DataWriterRemote.idl or DataReaderRemote.idl. This method can mark the participant dead Returns 0 if successful
Definition at line 150 of file DCPS_IR_Publication.cpp.
References CORBA::Exception::_tao_print_exception(), ACE_TEXT(), associations_, OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Subscription::get_id(), id_, DCPS_IR_Participant::is_alive(), DCPS_IR_Participant::isOwner(), LM_DEBUG, LM_ERROR, DCPS_IR_Participant::mark_dead(), OPENDDS_STRING, participant_, ACE_Unbounded_Set_Ex< T, C >::remove(), DCPS_IR_Subscription::remove_associated_publication(), status, and writer_.
Referenced by DCPS_IR_Subscription::disassociate_participant(), disassociate_participant(), DCPS_IR_Subscription::disassociate_publication(), disassociate_subscription(), DCPS_IR_Subscription::disassociate_topic(), disassociate_topic(), reevaluate_association(), DCPS_IR_Subscription::remove_associated_publication(), DCPS_IR_Subscription::remove_associations(), and remove_associations().
00154 { 00155 bool marked_dead = false; 00156 00157 if (sendNotify) { 00158 if (participant_->is_alive() && this->participant_->isOwner()) { 00159 try { 00160 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00161 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00162 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00163 ACE_DEBUG((LM_DEBUG, 00164 ACE_TEXT("(%P|%t) DCPS_IR_Publication::remove_associated_subscription:") 00165 ACE_TEXT(" calling pub %C with sub %C\n"), 00166 OPENDDS_STRING(pub_converter).c_str(), 00167 OPENDDS_STRING(sub_converter).c_str())); 00168 } 00169 00170 OpenDDS::DCPS::ReaderIdSeq idSeq(1); 00171 idSeq.length(1); 00172 idSeq[0] = sub->get_id(); 00173 00174 writer_->remove_associations(idSeq, notify_lost); 00175 00176 if (notify_both_side) { 00177 sub->remove_associated_publication(this, sendNotify, notify_lost); 00178 } 00179 00180 } catch (const CORBA::Exception& ex) { 00181 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00182 ex._tao_print_exception( 00183 "(%P|%t) ERROR: Exception caught in DCPS_IR_Publication::remove_associated_subscription:"); 00184 } 00185 00186 participant_->mark_dead(); 00187 marked_dead = true; 00188 } 00189 } 00190 } 00191 00192 int status = associations_.remove(sub); 00193 00194 if (0 == status) { 00195 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00196 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00197 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00198 ACE_DEBUG((LM_DEBUG, 00199 ACE_TEXT("(%P|%t) DCPS_IR_Publication::remove_associated_subscription: ") 00200 ACE_TEXT("publication %C removed subscription %C at %x.\n"), 00201 std::string(pub_converter).c_str(), 00202 std::string(sub_converter).c_str(), 00203 sub)); 00204 } 00205 00206 } else { 00207 OpenDDS::DCPS::RepoIdConverter pub_converter(id_); 00208 OpenDDS::DCPS::RepoIdConverter sub_converter(sub->get_id()); 00209 ACE_ERROR((LM_ERROR, 00210 ACE_TEXT("(%P|%t) ERROR: DCPS_IR_Publication::remove_associated_subscription: ") 00211 ACE_TEXT("publication %C failed to remove subscription %C at %x.\n"), 00212 std::string(pub_converter).c_str(), 00213 std::string(sub_converter).c_str(), 00214 sub)); 00215 } // if (0 == status) 00216 00217 if (marked_dead) { 00218 return -1; 00219 00220 } else { 00221 return status; 00222 } 00223 }
int DCPS_IR_Publication::remove_associations | ( | CORBA::Boolean | notify_lost | ) |
Removes all the associated subscriptions This method can mark the participant dead The notify_lost flag true indicates this remove_associations is called when the InfoRepo detects this publication is lost because of the failure of invocation on this publication. Returns 0 if successful
Definition at line 225 of file DCPS_IR_Publication.cpp.
References associations_, ACE_Unbounded_Set_Ex< T, C >::begin(), defunct_, ACE_Unbounded_Set_Ex< T, C >::end(), DCPS_IR_Subscription::remove_associated_publication(), remove_associated_subscription(), ACE_Unbounded_Set_Ex< T, C >::reset(), send(), ACE_Unbounded_Set_Ex< T, C >::size(), and status.
00226 { 00227 int status = 0; 00228 DCPS_IR_Subscription* sub = 0; 00229 size_t numAssociations = associations_.size(); 00230 CORBA::Boolean dontSend = 0; 00231 CORBA::Boolean send = 1; 00232 00233 if (0 < numAssociations) { 00234 DCPS_IR_Subscription_Set::ITERATOR iter = associations_.begin(); 00235 DCPS_IR_Subscription_Set::ITERATOR end = associations_.end(); 00236 00237 while (iter != end) { 00238 sub = *iter; 00239 ++iter; 00240 sub->remove_associated_publication(this, send, notify_lost); 00241 remove_associated_subscription(sub, dontSend, notify_lost); 00242 } 00243 } 00244 this->defunct_.reset(); 00245 00246 return status; 00247 }
void DCPS_IR_Publication::set_bit_status | ( | CORBA::Boolean | isBIT | ) |
Definition at line 653 of file DCPS_IR_Publication.cpp.
References isBIT_.
Referenced by DCPS_IR_Participant::add_publication(), and DCPS_IR_Domain::publish_publication_bit().
00654 { 00655 isBIT_ = isBIT; 00656 }
void DCPS_IR_Publication::set_handle | ( | DDS::InstanceHandle_t | handle | ) |
Definition at line 643 of file DCPS_IR_Publication.cpp.
References handle_.
Referenced by DCPS_IR_Domain::publish_publication_bit().
00644 { 00645 handle_ = handle; 00646 }
void DCPS_IR_Publication::set_qos | ( | const DDS::PublisherQos & | qos | ) |
Update PublisherQos only.
Definition at line 529 of file DCPS_IR_Publication.cpp.
References DCPS_IR_Participant::get_domain_reference(), DCPS_IR_Topic::get_topic_description(), participant_, DCPS_IR_Domain::publish_publication_bit(), publisherQos_, DCPS_IR_Topic_Description::reevaluate_associations(), reevaluate_existing_associations(), OpenDDS::DCPS::should_check_association_upon_change(), ACE_OS::sleep(), and topic_.
00530 { 00531 if (false == (qos == this->publisherQos_)) { 00532 // Check if we should check while we have both values. 00533 bool check = OpenDDS::DCPS::should_check_association_upon_change(qos, this->publisherQos_); 00534 00535 // Store the new, compatible, value. 00536 this->publisherQos_ = qos; 00537 00538 if (check) { 00539 // This will remove any newly stale associations. 00540 this->reevaluate_existing_associations(); 00541 00542 // Sleep a while to let remove_association handled by DataWriter 00543 // before add_association. Otherwise, new association will have 00544 // trouble to connect each other. 00545 ACE_OS::sleep(ACE_Time_Value(0, 250000)); 00546 00547 // This will establish any newly made associations. 00548 DCPS_IR_Topic_Description* description 00549 = this->topic_->get_topic_description(); 00550 description->reevaluate_associations(this); 00551 } 00552 00553 this->participant_->get_domain_reference()->publish_publication_bit(this); 00554 } 00555 }
void DCPS_IR_Publication::set_qos | ( | const DDS::DataWriterQos & | qos | ) |
Update DataWriterQos only.
Definition at line 500 of file DCPS_IR_Publication.cpp.
References DCPS_IR_Participant::get_domain_reference(), DCPS_IR_Topic::get_topic_description(), participant_, DCPS_IR_Domain::publish_publication_bit(), qos_, DCPS_IR_Topic_Description::reevaluate_associations(), reevaluate_existing_associations(), OpenDDS::DCPS::should_check_association_upon_change(), ACE_OS::sleep(), and topic_.
00501 { 00502 if (false == (qos == this->qos_)) { 00503 // Check if we should check while we have both values. 00504 bool check = OpenDDS::DCPS::should_check_association_upon_change(qos, this->qos_); 00505 00506 // Store the new, compatible, value. 00507 this->qos_ = qos; 00508 00509 if (check) { 00510 // This will remove any newly stale associations. 00511 this->reevaluate_existing_associations(); 00512 00513 // Sleep a while to let remove_association handled by DataWriter 00514 // before add_association. Otherwise, new association will have 00515 // trouble to connect each other. 00516 ACE_OS::sleep(ACE_Time_Value(0, 250000)); 00517 00518 // This will establish any newly made associations. 00519 DCPS_IR_Topic_Description* description 00520 = this->topic_->get_topic_description(); 00521 description->reevaluate_associations(this); 00522 } 00523 00524 this->participant_->get_domain_reference()->publish_publication_bit(this); 00525 } 00526 }
bool DCPS_IR_Publication::set_qos | ( | const DDS::DataWriterQos & | qos, | |
const DDS::PublisherQos & | publisherQos, | |||
Update::SpecificQos & | specificQos | |||
) |
Update the DataWriter or Publisher qos and also publish the qos changes to datawriter BIT.
Definition at line 557 of file DCPS_IR_Publication.cpp.
References Update::DataWriterQos, DCPS_IR_Participant::get_domain_reference(), DCPS_IR_Topic::get_topic_description(), Update::NoQos, participant_, DCPS_IR_Domain::publish_publication_bit(), Update::PublisherQos, publisherQos_, qos_, DCPS_IR_Topic_Description::reevaluate_associations(), reevaluate_existing_associations(), OpenDDS::DCPS::should_check_association_upon_change(), and topic_.
Referenced by TAO_DDS_DCPSInfo_i::update_publication_qos().
00560 { 00561 bool need_evaluate = false; 00562 bool u_dw_qos = !(qos_ == qos); 00563 00564 if (u_dw_qos) { 00565 if (OpenDDS::DCPS::should_check_association_upon_change(qos_, qos)) { 00566 need_evaluate = true; 00567 } 00568 00569 qos_ = qos; 00570 } 00571 00572 bool u_pub_qos = !(publisherQos_ == publisherQos); 00573 00574 if (u_pub_qos) { 00575 if (OpenDDS::DCPS::should_check_association_upon_change(publisherQos_, publisherQos)) { 00576 need_evaluate = true; 00577 } 00578 00579 publisherQos_ = publisherQos; 00580 } 00581 00582 if (need_evaluate) { 00583 // Check if any existing association need be removed first. 00584 this->reevaluate_existing_associations(); 00585 00586 DCPS_IR_Topic_Description* description = this->topic_->get_topic_description(); 00587 description->reevaluate_associations(this); 00588 } 00589 00590 participant_->get_domain_reference()->publish_publication_bit(this); 00591 specificQos = u_dw_qos? Update::DataWriterQos: 00592 u_pub_qos? Update::PublisherQos: 00593 Update::NoQos; 00594 00595 return true; 00596 }
void DCPS_IR_Publication::update_expr_params | ( | OpenDDS::DCPS::RepoId | readerId, | |
const DDS::StringSeq & | params | |||
) |
Definition at line 734 of file DCPS_IR_Publication.cpp.
References CORBA::Exception::_tao_print_exception(), OpenDDS::DCPS::DCPS_debug_level, DCPS_IR_Participant::mark_dead(), participant_, and writer_.
00736 { 00737 try { 00738 writer_->update_subscription_params(readerId, params); 00739 } catch (const CORBA::SystemException& ex) { 00740 if (OpenDDS::DCPS::DCPS_debug_level) { 00741 ex._tao_print_exception("(%P|%t) ERROR: Exception caught in " 00742 "DCPS_IR_Publication::update_expr_params:"); 00743 } 00744 participant_->mark_dead(); 00745 } 00746 }
void DCPS_IR_Publication::update_incompatible_qos | ( | ) |
Notify the writer of incompatible qos status and reset the status' count_since_last_send to 0
Definition at line 463 of file DCPS_IR_Publication.cpp.
References CORBA::Exception::_tao_print_exception(), OpenDDS::DCPS::IncompatibleQosStatus::count_since_last_send, OpenDDS::DCPS::DCPS_debug_level, incompatibleQosStatus_, DCPS_IR_Participant::is_alive(), DCPS_IR_Participant::isOwner(), DCPS_IR_Participant::mark_dead(), participant_, and writer_.
Referenced by DCPS_IR_Topic::try_associate(), and DCPS_IR_Topic_Description::try_associate_publication().
00464 { 00465 if (participant_->is_alive() && this->participant_->isOwner()) { 00466 try { 00467 writer_->update_incompatible_qos(incompatibleQosStatus_); 00468 incompatibleQosStatus_.count_since_last_send = 0; 00469 } catch (const CORBA::Exception& ex) { 00470 if (OpenDDS::DCPS::DCPS_debug_level > 0) { 00471 ex._tao_print_exception( 00472 "(%P|%t) ERROR: Exception caught in DCPS_IR_Publication::update_incompatible_qos:"); 00473 } 00474 00475 participant_->mark_dead(); 00476 } 00477 } 00478 }
OpenDDS::DCPS::DataWriterRemote_ptr DCPS_IR_Publication::writer | ( | void | ) |
Definition at line 659 of file DCPS_IR_Publication.cpp.
References writer_.
Referenced by OpenDDS::Federator::ManagerImpl::pushState().
00660 { 00661 return OpenDDS::DCPS::DataWriterRemote::_duplicate(this->writer_.in()); 00662 }
Definition at line 195 of file DCPS_IR_Publication.h.
Referenced by add_associated_subscription(), association_complete(), disassociate_participant(), disassociate_subscription(), disassociate_topic(), dump_to_string(), reevaluate_association(), reevaluate_existing_associations(), remove_associated_subscription(), and remove_associations().
Definition at line 196 of file DCPS_IR_Publication.h.
Referenced by disassociate_participant(), disassociate_subscription(), dump_to_string(), reevaluate_defunct_associations(), and remove_associations().
Definition at line 186 of file DCPS_IR_Publication.h.
Referenced by get_handle(), and set_handle().
Definition at line 183 of file DCPS_IR_Publication.h.
Referenced by add_associated_subscription(), disassociate_participant(), disassociate_subscription(), disassociate_topic(), dump_to_string(), get_id(), reevaluate_defunct_associations(), and remove_associated_subscription().
Definition at line 198 of file DCPS_IR_Publication.h.
Referenced by DCPS_IR_Publication(), get_incompatibleQosStatus(), and update_incompatible_qos().
Definition at line 192 of file DCPS_IR_Publication.h.
Referenced by get_transportLocatorSeq().
CORBA::Boolean DCPS_IR_Publication::isBIT_ [private] |
Definition at line 187 of file DCPS_IR_Publication.h.
Referenced by dump_to_string(), is_bit(), and set_bit_status().
Definition at line 184 of file DCPS_IR_Publication.h.
Referenced by add_associated_subscription(), call_association_complete(), disassociate_participant(), disassociate_subscription(), disassociate_topic(), get_participant_id(), is_subscription_ignored(), remove_associated_subscription(), set_qos(), update_expr_params(), and update_incompatible_qos().
Definition at line 193 of file DCPS_IR_Publication.h.
Referenced by get_publisher_qos(), and set_qos().
DDS::DataWriterQos DCPS_IR_Publication::qos_ [private] |
Definition at line 191 of file DCPS_IR_Publication.h.
Referenced by get_datawriter_qos(), and set_qos().
DCPS_IR_Topic* DCPS_IR_Publication::topic_ [private] |
Definition at line 185 of file DCPS_IR_Publication.h.
Referenced by get_topic(), get_topic_description(), get_topic_id(), reevaluate_association(), and set_qos().
OpenDDS::DCPS::DataWriterRemote_var DCPS_IR_Publication::writer_ [private] |
the corresponding DataWriterRemote object
Definition at line 190 of file DCPS_IR_Publication.h.
Referenced by add_associated_subscription(), call_association_complete(), DCPS_IR_Publication(), disassociate_participant(), disassociate_subscription(), disassociate_topic(), remove_associated_subscription(), update_expr_params(), update_incompatible_qos(), and writer().