Publisher::Publisher( const Options& options) : status_( 0), options_( options), participant_(0), publisher_(0), waiter_( new DDS::WaitSet) { DDS::DomainParticipantFactory_var dpf = TheParticipantFactory; // Create the DomainParticipant this->participant_ = dpf->create_participant( this->options_.domain(), PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->participant_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create a participant.\n") )); throw BadParticipantException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created participant in domain %d.\n"), this->options_.domain() )); } // Create and register the type support. DataTypeSupportImpl* testData = new DataTypeSupportImpl(); CORBA::String_var type_name = testData->get_type_name(); if( ::DDS::RETCODE_OK != testData->register_type( this->participant_.in(), 0)) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("unable to install type %C support.\n"), type_name.in() )); throw BadTypeSupportException (); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created type %C support.\n"), type_name.in() )); } // Create the topic. DDS::Topic_var topic = this->participant_->create_topic( this->options_.topicName().c_str(), type_name, TOPIC_QOS_DEFAULT, ::DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( topic.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create topic %C.\n"), this->options_.topicName().c_str() )); throw BadTopicException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created topic %C.\n"), this->options_.topicName().c_str() )); } // Create the publisher. this->publisher_ = this->participant_->create_publisher( PUBLISHER_QOS_DEFAULT, ::DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil(this->publisher_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create publisher.\n") )); throw BadPublisherException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created publisher.\n") )); } // Writer Qos policy values. ::DDS::DataWriterQos writerQos; this->publisher_->get_default_datawriter_qos( writerQos); writerQos.durability.kind = ::DDS::TRANSIENT_LOCAL_DURABILITY_QOS; writerQos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; writerQos.resource_limits.max_samples_per_instance = ::DDS::LENGTH_UNLIMITED; writerQos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("starting to create %d publications.\n"), this->options_.publications() )); } // Build as many publications as are specified. for( int index = 0; index < this->options_.publications(); ++index) { // Create the writer. DDS::DataWriter_var writer = this->publisher_->create_datawriter( topic.in(), writerQos, DDS::DataWriterListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( writer.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create writer.\n") )); throw BadWriterException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created publication %d.\n"), (1+index) )); } // Create a publication and store it. this->publications_.push_back( new Writer( writer.in(), index, this->options_.verbose()) ); // // Grab, enable and attach the status condition for test // synchronization of the current publication. // DDS::StatusCondition_var status = writer->get_statuscondition(); status->set_enabled_statuses( DDS::PUBLICATION_MATCHED_STATUS); this->waiter_->attach_condition( status.in()); if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created StatusCondition for publication %d.\n"), (1+index) )); } } }
Subscriber::Subscriber( const Options& options) : options_( options), listener_( 0), waiter_( new DDS::WaitSet) { DDS::DomainParticipantFactory_var dpf = TheParticipantFactory; // Create the DomainParticipant this->participant_ = dpf->create_participant( this->options_.domain(), PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->participant_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create a participant.\n") )); throw BadParticipantException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created participant in domain %d.\n"), this->options_.domain() )); } // Create the listener. this->listener_ = new DataReaderListener( this->options_.verbose()); this->safe_listener_ = this->listener_; ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created reader listener.\n") )); // Create and register the type support. DataTypeSupportImpl::_var_type testData = new DataTypeSupportImpl(); CORBA::String_var type_name = testData->get_type_name(); if( ::DDS::RETCODE_OK != testData->register_type( this->participant_.in(), 0)) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("unable to install type %C support.\n"), type_name.in() )); throw BadTypeSupportException (); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created type %C support.\n"), type_name.in() )); // Create the topic. this->topic_ = this->participant_->create_topic( this->options_.topicName().c_str(), type_name, TOPIC_QOS_DEFAULT, ::DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->topic_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create topic %C.\n"), this->options_.topicName().c_str() )); throw BadTopicException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created topic %C.\n"), this->options_.topicName().c_str() )); // Create the subscriber. this->subscriber_ = this->participant_->create_subscriber( SUBSCRIBER_QOS_DEFAULT, ::DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->subscriber_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create subscriber.\n") )); throw BadSubscriberException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created subscriber.\n") )); // Reader Qos policy values. ::DDS::DataReaderQos readerQos; this->subscriber_->get_default_datareader_qos( readerQos); // readerQos.durability.kind = ::DDS::TRANSIENT_LOCAL_DURABILITY_QOS; readerQos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; readerQos.history.depth = 1; readerQos.destination_order.kind = ::DDS::BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS; // readerQos.resource_limits.max_samples_per_instance = ::DDS::LENGTH_UNLIMITED; // Reliability varies with the transport implementation. switch( this->options_.transportType()) { case Options::TCP: case Options::MC: readerQos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; break; case Options::UDP: readerQos.reliability.kind = ::DDS::BEST_EFFORT_RELIABILITY_QOS; break; case Options::TRANSPORT_NONE: default: ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("unrecognized transport when setting up Qos policies.\n") )); throw BadQosException(); } // Create the reader. this->reader_ = this->subscriber_->create_datareader( this->topic_.in(), readerQos, DDS::DataReaderListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->reader_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create reader.\n") )); throw BadReaderException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created reader.\n") )); // Set the listener mask here so that we don't conflict with the // StatusCondition(s) that we want to wait on in the main thread. this->reader_->set_listener( this->listener_, DDS::DATA_AVAILABLE_STATUS); // Grab, enable and attach the status condition for test synchronization. this->status_ = this->reader_->get_statuscondition(); this->status_->set_enabled_statuses( DDS::SUBSCRIPTION_MATCHED_STATUS); if (this->waiter_->attach_condition( this->status_.in()) != DDS::RETCODE_OK) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to match subscription.\n") )); throw BadAttachException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created StatusCondition and WaitSet for test synchronization.\n") )); }
Publisher::Publisher( const Options& options) : options_( options), waiter_( new DDS::WaitSet) { DDS::DomainParticipantFactory_var dpf = TheParticipantFactory; // Create the DomainParticipant this->participant_ = dpf->create_participant( this->options_.domain(), PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->participant_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create a participant.\n") )); throw BadParticipantException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created participant in domain %d.\n"), this->options_.domain() )); } // Create the transport. OpenDDS::DCPS::TransportConfig_rch transport = TheTransportRegistry->get_config(this->options_.transportKey()); if (transport.is_nil()) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to get %C transport.\n"), this->options_.transportKey().c_str() )); throw BadTransportException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created %C transport.\n"), this->options_.transportKey().c_str() )); } // Create and register the type support. DataTypeSupportImpl* testData = new DataTypeSupportImpl(); if( ::DDS::RETCODE_OK != testData->register_type( this->participant_.in(), 0)) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("unable to install type %C support.\n"), testData->get_type_name() )); throw BadTypeSupportException (); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created type %C support.\n"), testData->get_type_name() )); } // Create the topic. this->topic_ = this->participant_->create_topic( this->options_.topicName().c_str(), testData->get_type_name(), TOPIC_QOS_DEFAULT, ::DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->topic_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create topic %C.\n"), this->options_.topicName().c_str() )); throw BadTopicException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created topic %C.\n"), this->options_.topicName().c_str() )); } // Create the publisher. this->publisher_ = this->participant_->create_publisher( PUBLISHER_QOS_DEFAULT, ::DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->publisher_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create publisher.\n") )); throw BadPublisherException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created publisher.\n") )); } TheTransportRegistry->bind_config(transport, this->publisher_); if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("attached transport to publisher.\n") )); } // Writer Qos policy values. ::DDS::DataWriterQos writerQos; this->publisher_->get_default_datawriter_qos( writerQos); writerQos.durability.kind = ::DDS::TRANSIENT_LOCAL_DURABILITY_QOS; writerQos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; writerQos.resource_limits.max_samples_per_instance = ::DDS::LENGTH_UNLIMITED; // Reliability varies with the transport implementation. switch( this->options_.transportType()) { case Options::TCP: case Options::MC: writerQos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; break; case Options::UDP: writerQos.reliability.kind = ::DDS::BEST_EFFORT_RELIABILITY_QOS; break; case Options::TRANSPORT_NONE: default: ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("unrecognized transport when setting up Qos policies.\n") )); throw BadQosException(); } if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("starting to create %d publications.\n"), this->options_.profiles().size() )); } // Build as many publications as are specified. for( unsigned int index = 0; index < this->options_.profiles().size(); ++index) { // This publications priority is needed when creating the writer. writerQos.transport_priority.value = this->options_.profiles()[ index]->priority(); // Create the writer. DDS::DataWriter_var writer = this->publisher_->create_datawriter( this->topic_.in(), writerQos, DDS::DataWriterListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( writer.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create writer.\n") )); throw BadWriterException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created writer for publication %C ") ACE_TEXT("with priority %d.\n"), this->options_.profiles()[ index]->name().c_str(), writerQos.transport_priority.value )); } // Create a publication and store it. this->publications_[ this->options_.profiles()[ index]->name()] = new Writer( writer.in(), *this->options_.profiles()[ index], this->options_.verbose() ); // // Grab, enable and attach the status condition for test // synchronization of the current publication. // DDS::StatusCondition_var status = writer->get_statuscondition(); status->set_enabled_statuses( DDS::PUBLICATION_MATCHED_STATUS); this->waiter_->attach_condition( status.in()); if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created StatusCondition for publication %C.\n"), this->options_.profiles()[ index]->name().c_str() )); } } }
Publisher::Publisher( const Options& options) : options_( options), waiter_( new DDS::WaitSet) { DDS::DomainParticipantFactory_var dpf = TheParticipantFactory; // Create the DomainParticipant this->participant_ = dpf->create_participant( this->options_.domain(), PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->participant_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create a participant.\n") )); throw BadParticipantException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created participant in domain %d.\n"), this->options_.domain() )); } // Create and register the type support. DataTypeSupportImpl::_var_type testData = new DataTypeSupportImpl(); CORBA::String_var type_name = testData->get_type_name(); if( ::DDS::RETCODE_OK != testData->register_type( this->participant_.in(), 0)) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("unable to install type %C support.\n"), type_name.in() )); throw BadTypeSupportException (); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created type %C support.\n"), type_name.in() )); } // Create the topic. this->topic_ = this->participant_->create_topic( this->options_.topicName().c_str(), type_name, TOPIC_QOS_DEFAULT, ::DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->topic_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create topic %C.\n"), this->options_.topicName().c_str() )); throw BadTopicException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created topic %C.\n"), this->options_.topicName().c_str() )); } // Create the publisher. this->publisher_ = this->participant_->create_publisher( PUBLISHER_QOS_DEFAULT, ::DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->publisher_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create publisher.\n") )); throw BadPublisherException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created publisher.\n") )); // Writer Qos policy values. ::DDS::DataWriterQos writerQos; this->publisher_->get_default_datawriter_qos( writerQos); // writerQos.durability.kind = ::DDS::TRANSIENT_LOCAL_DURABILITY_QOS; writerQos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; // this number is set to have a big enough queue of data to see that the higher priority // message is on its own queue, if tests start failing, then this number should be increased // or possibly sample0.baggage length increased writerQos.resource_limits.max_samples_per_instance = 100; writerQos.resource_limits.max_samples = 100; // Reliability varies with the transport implementation. writerQos.reliability.max_blocking_time.sec = 1; writerQos.reliability.max_blocking_time.nanosec = 0; switch( this->options_.transportType()) { case Options::TCP: case Options::MC: writerQos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; break; case Options::UDP: writerQos.reliability.kind = ::DDS::BEST_EFFORT_RELIABILITY_QOS; break; case Options::TRANSPORT_NONE: default: ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("unrecognized transport when setting up Qos policies.\n") )); throw BadQosException(); } // Create the writer. this->writer_[0] = this->publisher_->create_datawriter( this->topic_.in(), writerQos, DDS::DataWriterListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->writer_[0].in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create writer[0].\n") )); throw BadWriterException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created writer[0].\n") )); // Grab, enable and attach the status condition for test synchronization. this->status_[0] = this->writer_[0]->get_statuscondition(); this->status_[0]->set_enabled_statuses( DDS::PUBLICATION_MATCHED_STATUS); if (this->waiter_->attach_condition( this->status_[0].in()) != DDS::RETCODE_OK) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to match publication.\n") )); throw BadAttachException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created StatusCondition[0] for test synchronization.\n") )); // Actually set the priority finally. writerQos.transport_priority.value = this->options_.priority(); // Create the writer. this->writer_[1] = this->publisher_->create_datawriter( this->topic_.in(), writerQos, DDS::DataWriterListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->writer_[1].in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to create writer[1].\n") )); throw BadWriterException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created writer[1].\n") )); // Grab, enable and attach the status condition for test synchronization. this->status_[1] = this->writer_[1]->get_statuscondition(); this->status_[1]->set_enabled_statuses( DDS::PUBLICATION_MATCHED_STATUS); if (this->waiter_->attach_condition( this->status_[1].in()) != DDS::RETCODE_OK) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Publisher::Publisher() - ") ACE_TEXT("failed to match publication.\n") )); throw BadAttachException(); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Publisher::Publisher() - ") ACE_TEXT("created StatusCondition[1] for test synchronization.\n") )); }
Subscriber::Subscriber( const Options& options) : options_( options), waiter_( new DDS::WaitSet) { // Create the DomainParticipant this->participant_ = TheParticipantFactory->create_participant( this->options_.domain(), PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->participant_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create a participant.\n") )); throw BadParticipantException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created participant in domain %d.\n"), this->options_.domain() )); } // Create and register the type support. DataTypeSupportImpl* testData = new DataTypeSupportImpl(); if( ::DDS::RETCODE_OK != testData->register_type( this->participant_.in(), 0)) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("unable to install type %C support.\n"), testData->get_type_name() )); throw BadTypeSupportException (); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created type %C support.\n"), testData->get_type_name() )); } // Create the topic. DDS::Topic_var topic = this->participant_->create_topic( this->options_.topicName().c_str(), testData->get_type_name(), TOPIC_QOS_DEFAULT, ::DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( topic.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create topic %C.\n"), this->options_.topicName().c_str() )); throw BadTopicException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created topic %C.\n"), this->options_.topicName().c_str() )); } // Create the subscriber. DDS::Subscriber_var subscriber = this->participant_->create_subscriber( SUBSCRIBER_QOS_DEFAULT, ::DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( subscriber.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create subscriber.\n") )); throw BadSubscriberException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created subscriber.\n") )); } // Create the transport. OpenDDS::DCPS::TransportImpl_rch transport = TheTransportFactory->create_transport_impl( this->options_.transportKey(), OpenDDS::DCPS::AUTO_CONFIG ); if( transport.is_nil()) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create transport.\n") )); throw BadTransportException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created transport.\n") )); } // Attach the transport. if( ::OpenDDS::DCPS::ATTACH_OK != transport->attach( subscriber.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to attach subscriber to transport.\n") )); throw BadAttachException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("attached subscriber to transport.\n") )); } // Reader Qos policy values. ::DDS::DataReaderQos readerQos; subscriber->get_default_datareader_qos( readerQos); readerQos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; // Create the readers. for( int index = 0; index < 2; ++index) { ::DDS::DataReader_var reader = subscriber->create_datareader( topic.in(), readerQos, DDS::DataReaderListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( reader.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create reader.\n") )); throw BadReaderException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created reader.\n") )); } this->reader_[ index] = ::OpenDDS::DCPS::DataReaderEx::_narrow( reader.in()); if( CORBA::is_nil( this->reader_[ index].in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to narrow reader to extract statistics.\n") )); throw BadReaderException(); } // Grab, enable and attach the status condition for test synchronization. this->status_ = this->reader_[ index]->get_statuscondition(); this->status_->set_enabled_statuses( DDS::SUBSCRIPTION_MATCHED_STATUS); this->waiter_->attach_condition( this->status_.in()); if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created StatusCondition and WaitSet for test synchronization.\n") )); } } }
Subscriber::Subscriber( const Options& options) : options_( options), listener_( 0), waiter_( new DDS::WaitSet) { DDS::DomainParticipantFactory_var dpf = TheParticipantFactory; // Create the DomainParticipant this->participant_ = dpf->create_participant( this->options_.domain(), PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->participant_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create a participant.\n") )); throw BadParticipantException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created participant in domain %d.\n"), this->options_.domain() )); } // Create the transport. OpenDDS::DCPS::TransportConfig_rch transport = TheTransportRegistry->get_config(this->options_.transportKey()); if (transport.is_nil()) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to get %C transport.\n"), this->options_.transportKey().c_str() )); throw BadTransportException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created %C transport.\n"), this->options_.transportKey().c_str() )); } // Create the listener. this->listener_ = new DataReaderListener( this->options_.verbose()); this->safe_listener_ = this->listener_; if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created reader listener.\n") )); } // Create and register the type support. DataTypeSupportImpl* testData = new DataTypeSupportImpl(); if( ::DDS::RETCODE_OK != testData->register_type( this->participant_.in(), 0)) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("unable to install type %C support.\n"), testData->get_type_name() )); throw BadTypeSupportException (); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created type %C support.\n"), testData->get_type_name() )); } // Create the topic. this->topic_ = this->participant_->create_topic( this->options_.topicName().c_str(), testData->get_type_name(), TOPIC_QOS_DEFAULT, ::DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->topic_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create topic %C.\n"), this->options_.topicName().c_str() )); throw BadTopicException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created topic %C.\n"), this->options_.topicName().c_str() )); } // Create the subscriber. this->subscriber_ = this->participant_->create_subscriber( SUBSCRIBER_QOS_DEFAULT, ::DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( this->subscriber_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create subscriber.\n") )); throw BadSubscriberException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created subscriber.\n") )); } // Attach the transport to the subscriber. ::OpenDDS::DCPS::SubscriberImpl* servant = dynamic_cast< ::OpenDDS::DCPS::SubscriberImpl*>( this->subscriber_.in()); if( 0 == servant) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to narrow subscriber servant.\n") )); throw BadServantException(); } // Configure the raw data gathering. servant->raw_latency_buffer_size() = this->options_.raw_buffer_size(); servant->raw_latency_buffer_type() = this->options_.raw_buffer_type(); if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("configured to capture %d latency measurements of type %d ") ACE_TEXT("per writer to file %C.\n"), this->options_.raw_buffer_size(), this->options_.raw_buffer_type(), this->options_.rawOutputFilename().c_str() )); } TheTransportRegistry->bind_config(transport, servant); if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("attached transport to subscriber.\n") )); } // Reader Qos policy values. ::DDS::DataReaderQos readerQos; this->subscriber_->get_default_datareader_qos( readerQos); readerQos.durability.kind = ::DDS::TRANSIENT_LOCAL_DURABILITY_QOS; readerQos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; readerQos.resource_limits.max_samples_per_instance = ::DDS::LENGTH_UNLIMITED; // Reliability varies with the transport implementation. switch( this->options_.transportType()) { case Options::TCP: case Options::MC: readerQos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; break; case Options::UDP: readerQos.reliability.kind = ::DDS::BEST_EFFORT_RELIABILITY_QOS; break; case Options::TRANSPORT_NONE: default: ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("unrecognized transport when setting up Qos policies.\n") )); throw BadQosException(); } // Create the reader. ::DDS::DataReader_var reader = this->subscriber_->create_datareader( this->topic_.in(), readerQos, DDS::DataReaderListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK ); if( CORBA::is_nil( reader.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to create reader.\n") )); throw BadReaderException(); } else if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created reader.\n") )); } this->reader_ = ::OpenDDS::DCPS::DataReaderEx::_narrow( reader.in()); if( CORBA::is_nil( this->reader_.in())) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Subscriber::Subscriber() - ") ACE_TEXT("failed to narrow reader to extract statistics.\n") )); throw BadReaderException(); } // Clear and start statistics gathering. Ideally we would want to // configurably delay the start here to avoid edge effects. this->reader_->reset_latency_stats(); this->reader_->statistics_enabled( true); // Set the listener mask here so that we don't conflict with the // StatusCondition(s) that we want to wait on in the main thread. this->reader_->set_listener( this->listener_, DDS::DATA_AVAILABLE_STATUS); // Grab, enable and attach the status condition for test synchronization. this->status_ = this->reader_->get_statuscondition(); this->status_->set_enabled_statuses( DDS::SUBSCRIPTION_MATCHED_STATUS); this->waiter_->attach_condition( this->status_.in()); if( this->options_.verbose()) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) Subscriber::Subscriber() - ") ACE_TEXT("created StatusCondition and WaitSet for test synchronization.\n") )); } }