DDS::DataReader_ptr create_data_reader(DDS::DomainParticipant_ptr participant, DDS::Subscriber_ptr subscriber, const char* type_name, const char* topic_name, const DDS::DataReaderQos& dr_qos, DDS::DataReaderListener_ptr drl) { DDS::Topic_var topic = participant->create_topic(topic_name, type_name, TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(topic)) { ACE_DEBUG((LM_DEBUG, "create_data_reader(): Failed to create topic, name = %s\n", topic_name)); } DDS::DataReader_var reader = subscriber->create_datareader(topic.in(), dr_qos, drl, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(reader)) { ACE_DEBUG((LM_DEBUG, "create_data_reader(): Failed to create data reader\n")); } return reader._retn(); }
void DDS_Subscriber_Base_T<CCM_TYPE, TYPED_DDS_READER, VALUE_TYPE, SEQ_VALUE_TYPE>::configuration_complete ( ::DDS::Topic_ptr topic, ::DDS::Subscriber_ptr subscriber, const char * qos_profile, DDS_XML_QOS_PARSER_TYPE* qos_xml) { DDS4CCM_TRACE ("DDS_Subscriber_Base_T<CCM_TYPE, TYPED_DDS_READER, VALUE_TYPE, SEQ_VALUE_TYPE>::configuration_complete"); this->configuration_complete_ = true; ::DDS::DataReader_var dr = this->dds_read_->get_dds_reader (); if (::CORBA::is_nil (dr.in ())) { ::DDS::TopicDescription_var td; ::CCM_DDS::QueryFilter_var filter = this->cft_setting_->filter (); if (ACE_OS::strlen (filter->expression.in ()) > 0) { ::DDS::ContentFilteredTopic_var cft = this->cft_setting_->create_contentfilteredtopic (topic, subscriber); if (CORBA::is_nil (cft.in ())) { DDS4CCM_ERROR (DDS4CCM_LOG_LEVEL_ERROR, (LM_ERROR, "DDS_Subscriber_Base_T::configuration_complete: " "Error creating ContentFilteredTopic.\n")); throw ::CORBA::INTERNAL (); } td = ::DDS::TopicDescription::_narrow (cft.in ()); } else { td = ::DDS::TopicDescription::_narrow (topic); } #if (CIAO_DDS4CCM_NDDS==1) if (qos_profile) { dr = subscriber->create_datareader_with_profile ( td.in (), qos_profile, ::DDS::DataReaderListener::_nil (), 0); } else #endif { ::DDS::DataReaderQos drqos; DDS::ReturnCode_t const retcode = subscriber->get_default_datareader_qos (drqos); if (retcode != DDS::RETCODE_OK) { DDS4CCM_ERROR (DDS4CCM_LOG_LEVEL_ERROR, (LM_ERROR, DDS4CCM_INFO "DDS_Subscriber_Base_T::configuration_complete - " "Error: Unable to retrieve get_default_datareader_qos: <%C>\n", ::CIAO::DDS4CCM::translate_retcode (retcode))); throw ::CCM_DDS::InternalError (retcode, 0); } if (qos_profile && qos_xml) { CORBA::String_var name = topic->get_name (); DDS::ReturnCode_t const retcode_dr_qos = qos_xml->get_datareader_qos ( drqos, qos_profile, name.in ()); if (retcode_dr_qos != DDS::RETCODE_OK) { DDS4CCM_ERROR (DDS4CCM_LOG_LEVEL_ERROR, (LM_ERROR, DDS4CCM_INFO "DDS_Subscriber_Base_T::configuration_complete - " "Error: Unable to retrieve datawriter QOS from XML: <%C>\n", ::CIAO::DDS4CCM::translate_retcode (retcode_dr_qos))); throw ::CCM_DDS::InternalError (retcode_dr_qos, 0); } } #if defined GEN_OSTREAM_OPS if (DDS4CCM_debug_level >= DDS4CCM_LOG_LEVEL_DDS_STATUS) { std::stringstream output; output << drqos; std::string message = output.str(); DDS4CCM_DEBUG (DDS4CCM_LOG_LEVEL_DDS_STATUS, (LM_INFO, DDS4CCM_INFO ACE_TEXT ("DDS_Subscriber_Base_T::configuration_complete - ") ACE_TEXT ("Using datareader QOS <%C>\n"), message.c_str())); } #endif dr = subscriber->create_datareader ( td.in (), drqos, ::DDS::DataReaderListener::_nil (), 0); } if (!::CORBA::is_nil (dr.in ())) { DDS4CCM_DEBUG (DDS4CCM_LOG_LEVEL_ACTION, (LM_TRACE, DDS4CCM_INFO "DDS_Subscriber_Base_T::configuration_complete - " "Created DataReader " DDS_ENTITY_FORMAT_SPECIFIER " using subscriber " DDS_ENTITY_FORMAT_SPECIFIER "\n", DDS_ENTITY_LOG (dr.in ()), DDS_ENTITY_LOG (subscriber))); } else { DDS4CCM_ERROR (DDS4CCM_LOG_LEVEL_DDS_NIL_RETURN, (LM_ERROR, DDS4CCM_INFO "DDS_Subscriber_Base_T::configuration_complete - " "Error: DDS returned a nil datareader.\n")); throw ::CORBA::INTERNAL (); } this->dds_read_->set_dds_reader (dr.in (), &this->condition_manager_); this->ccm_data_reader_->set_dds_entity (dr.in ()); this->condition_manager_.set_dds_entity (dr.in ()); this->condition_manager_.init_readcondition (); DDS::ReturnCode_t const retcode = dr->enable (); if (retcode != ::DDS::RETCODE_OK) { DDS4CCM_ERROR (DDS4CCM_LOG_LEVEL_ERROR, (LM_ERROR, DDS4CCM_INFO "DDS_Subscriber_Base_T::configuration_complete - " "Error: Unable to enable the datareader: <%C>.\n", ::CIAO::DDS4CCM::translate_retcode (retcode))); throw ::CORBA::INTERNAL (); } } }