diff options
Diffstat (limited to 'modules/CIAO/connectors/dds4ccm/impl/dds')
151 files changed, 17227 insertions, 0 deletions
diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Coherent_Changes_Guard.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Coherent_Changes_Guard.cpp new file mode 100644 index 00000000000..2a2a0597606 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Coherent_Changes_Guard.cpp @@ -0,0 +1,19 @@ +// $Id$ +#include "dds4ccm/impl/dds/Coherent_Changes_Guard.h" + +CIAO::DDS4CCM::Coherent_Changes_Guard::Coherent_Changes_Guard (DDSPublisher* p, bool coherent_write) : p_ (p), coherent_write_ (coherent_write) +{ + if (this->coherent_write_) + { + p_->begin_coherent_changes (); + } +} + +CIAO::DDS4CCM::Coherent_Changes_Guard::~Coherent_Changes_Guard () +{ + if (this->coherent_write_) + { + this->p_->end_coherent_changes (); + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Coherent_Changes_Guard.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Coherent_Changes_Guard.h new file mode 100644 index 00000000000..d98cde63d1b --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Coherent_Changes_Guard.h @@ -0,0 +1,43 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef _CIAO_COHERENT_CHANGES_GUARD +#define _CIAO_COHERENT_CHANGES_GUARD + +#include "ace/Copy_Disabled.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +# include "dds/DdsDcpsC.h" +typedef ::DDS::Publisher DDSPublisher; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export Coherent_Changes_Guard : + private ACE_Copy_Disabled + { + public: + Coherent_Changes_Guard (::DDSPublisher* p, bool coherent_write); + ~Coherent_Changes_Guard (); + private: + ::DDSPublisher* p_; + bool const coherent_write_; + }; + } +} + +#endif /* _CIAO_COHERENT_CHANGES_GUARD */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ContentFilteredTopic.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/ContentFilteredTopic.cpp new file mode 100644 index 00000000000..c97ea2c28e8 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ContentFilteredTopic.cpp @@ -0,0 +1,144 @@ +// $Id$ + +#include "ContentFilteredTopic.h" +#include "Topic.h" + +#include "ndds/StringSeq.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_ContentFilteredTopic_i::CCM_DDS_ContentFilteredTopic_i ( + DDSContentFilteredTopic * dw) : impl_ (dw) + { + } + + CCM_DDS_ContentFilteredTopic_i::~CCM_DDS_ContentFilteredTopic_i (void) + { + } + + char * + CCM_DDS_ContentFilteredTopic_i::get_filter_expression (void) + { + DDS4CCM_TRACE ("CCM_DDS_ContentFilteredTopic_i::get_filter_expression"); + return CORBA::string_dup (this->impl ()->get_filter_expression ()); + } + + ::DDS::ReturnCode_t + CCM_DDS_ContentFilteredTopic_i::get_expression_parameters ( + ::DDS::StringSeq & expression_parameters) + { + DDS4CCM_TRACE ("CCM_DDS_ContentFilteredTopic_i::get_expression_parameters"); +#if (CIAO_DDS4CCM_NDDS==1) + DDS_StringSeq parameters; + ::DDS::ReturnCode_t retval = this->impl ()->get_expression_parameters ( + parameters); + expression_parameters <<= parameters; +#else + ::DDS::ReturnCode_t retval = + this->impl ()->get_expression_parameters (expression_parameters); +#endif + return retval; + } + + ::DDS::ReturnCode_t + CCM_DDS_ContentFilteredTopic_i::set_expression_parameters ( + const ::DDS::StringSeq & expression_parameters) + { + DDS4CCM_TRACE ("CCM_DDS_ContentFilteredTopic_i::set_expression_parameters"); + +#if (CIAO_DDS4CCM_NDDS==1) + DDS_StringSeq parameters; + parameters <<= expression_parameters; + return this->impl ()->set_expression_parameters (parameters); +#else + return this->impl ()->set_expression_parameters (expression_parameters); +#endif + } + + ::DDS::Topic_ptr + CCM_DDS_ContentFilteredTopic_i::get_related_topic (void) + { + DDS4CCM_TRACE ("CCM_DDS_ContentFilteredTopic_i::get_related_topic"); + + ::DDS::Topic_var retval = ::DDS::Topic::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSTopic *topic = this->impl ()->get_related_topic (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Topic_i (topic), + CORBA::NO_MEMORY ()); + return retval._retn (); +#else + ::DDS::Topic_var topic = this->impl ()->get_related_topic (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Topic_i (topic.in ()), + CORBA::NO_MEMORY ()); + return retval._retn (); +#endif + } + + char * + CCM_DDS_ContentFilteredTopic_i::get_type_name (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + return CORBA::string_dup (this->impl ()->get_type_name ()); +#else + return this->impl ()->get_type_name (); +#endif + } + + char * + CCM_DDS_ContentFilteredTopic_i::get_name (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + return CORBA::string_dup (this->impl ()->get_name ()); +#else + return this->impl ()->get_name (); +#endif + } + + ::DDS::DomainParticipant_ptr + CCM_DDS_ContentFilteredTopic_i::get_participant (void) + { + ::DDS::DomainParticipant_var retval = ::DDS::DomainParticipant::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSDomainParticipant* p = this->impl ()->get_participant (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p), + CORBA::NO_MEMORY ()); +#else + ::DDS::DomainParticipant_var p = this->impl ()->get_participant (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + DDSContentFilteredTopic * + CCM_DDS_ContentFilteredTopic_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_ContentFilteredTopic_i::set_impl (DDSContentFilteredTopic * dw) + { + this->impl_ = dw; + } + + DDSContentFilteredTopic * + CCM_DDS_ContentFilteredTopic_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ContentFilteredTopic.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ContentFilteredTopic.h new file mode 100644 index 00000000000..c5dc96c8a1e --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ContentFilteredTopic.h @@ -0,0 +1,71 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef CIAO_NDDS_CONTENFILTEREDTOPIC_H +#define CIAO_NDDS_CONTENFILTEREDTOPIC_H + +#include "DomainParticipant.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "tao/LocalObject.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::ContentFilteredTopic DDSContentFilteredTopic; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_ContentFilteredTopic_i : + public virtual ::DDS::CCM_ContentFilteredTopic, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_ContentFilteredTopic_i (DDSContentFilteredTopic * dw); + + /// Destructor + virtual ~CCM_DDS_ContentFilteredTopic_i (void); + + virtual char * get_filter_expression (void); + + virtual + ::DDS::ReturnCode_t get_expression_parameters ( + ::DDS::StringSeq & expression_parameters); + + virtual + ::DDS::ReturnCode_t set_expression_parameters ( + const ::DDS::StringSeq & expression_parameters); + + virtual + ::DDS::Topic_ptr get_related_topic (void); + + virtual + char * get_type_name (void); + + virtual + char * get_name (void); + + virtual + ::DDS::DomainParticipant_ptr get_participant (void); + + DDSContentFilteredTopic * get_impl (void); + + void set_impl (DDSContentFilteredTopic * dw); + + private: + DDSContentFilteredTopic * impl_; + + DDSContentFilteredTopic * impl (void); + }; + } +} + +#endif /* CIAO_NDDS_CONTENFILTEREDTOPIC_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS4CCM_Traits.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS4CCM_Traits.h new file mode 100644 index 00000000000..45022d7e9f1 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS4CCM_Traits.h @@ -0,0 +1,66 @@ +/** + * @file DDS4CCM_Traits.h + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * + * $Id$ + * + * Traits necessary for various bits and pieces of the DDS4CCM infrastructure. + */ + +#ifndef DDS4CCM_TRAITS_H +#define DDS4CCM_TRAITS_H + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename BASE_TYPE, + typename SEQ_TYPE, + typename WRITER_TYPE, + typename UPDATER_TYPE, + typename GETTER_TYPE, + typename READER_TYPE, + typename CONTEXT_TYPE, + typename LISTENER_TYPE, + typename STATELISTENER_TYPE, + typename CONNECTORSTATUSLISTENER_TYPE + > + + struct Connector_Traits + { + typedef BASE_TYPE base_type; + typedef SEQ_TYPE seq_type; + typedef WRITER_TYPE writer_type; + typedef UPDATER_TYPE updater_type; + typedef GETTER_TYPE getter_type; + typedef READER_TYPE reader_type; + typedef CONTEXT_TYPE context_type; + typedef LISTENER_TYPE listener_type; + typedef STATELISTENER_TYPE statelistener_type; + typedef CONNECTORSTATUSLISTENER_TYPE connectorstatuslistener_type; + }; + + /** + * @struct Type_Traits + * @brief Convenience traits struct. + * + * This is a convenience struct that is used by most of the + * DDS4CCM infrastructure; it is not necessary to use this exact + * struct, so long as all of the needed fields are filled in. + */ + template <typename VALUE_TYPE, + typename DDS_SEQ_TYPE, + typename TYPE_SUPPORT, + typename DATA_WRITER, + typename DATA_READER> + struct Type_Traits + { + typedef VALUE_TYPE value_type; + typedef DDS_SEQ_TYPE dds_seq_type; + typedef TYPE_SUPPORT type_support; + typedef DATA_WRITER data_writer; + typedef DATA_READER data_reader; + }; + } +} +#endif /* DDS4CCM_TRAITS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDSCallbackStatusHandler.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDSCallbackStatusHandler.cpp new file mode 100644 index 00000000000..e464fd0d680 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDSCallbackStatusHandler.cpp @@ -0,0 +1,263 @@ +// $Id$ + +#include "dds4ccm/impl/dds/Utils.h" +#include "dds4ccm/impl/dds/DDSCallbackStatusHandler.h" +#include "dds4ccm/impl/logger/Log_Macros.h" + +//============================================================ +// On_Unexpected_Status_Handler +//============================================================ +namespace CIAO +{ + namespace DDS4CCM + { + OnUnexpectedStatusHandler::OnUnexpectedStatusHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener, + ::DDS::Entity_ptr entity, + ::DDS::StatusKind status_kind) : + error_listener_ (::CCM_DDS::ConnectorStatusListener::_duplicate (error_listener)), + entity_ (::DDS::Entity::_duplicate (entity)), + status_kind_ (status_kind) + { + this->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); + } + + OnUnexpectedStatusHandler::~OnUnexpectedStatusHandler (void) + { + } + + int + OnUnexpectedStatusHandler::handle_exception (ACE_HANDLE) + { + try + { + this->error_listener_->on_unexpected_status (this->entity_, this->status_kind_); + } + catch (...) + { + } + return 0; + } + + //============================================================ + // OnRequestedOncompatibleQosHandler + //============================================================ + OnRequestedOncompatibleQosHandler::OnRequestedOncompatibleQosHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::DataReader_ptr dr, + const ::DDS::RequestedIncompatibleQosStatus &status) : + csl_ (::CCM_DDS::ConnectorStatusListener::_duplicate (csl)), + dr_ (::DDS::DataReader::_duplicate (dr)), + status_ (status) + { + this->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); + } + + OnRequestedOncompatibleQosHandler::~OnRequestedOncompatibleQosHandler (void) + { + } + + int + OnRequestedOncompatibleQosHandler::handle_exception (ACE_HANDLE) + { + try + { + this->csl_->on_requested_incompatible_qos (this->dr_, this->status_); + } + catch (...) + { + } + return 0; + } + + //============================================================ + // OnSampleRejectedHandler + //============================================================ + OnSampleRejectedHandler::OnSampleRejectedHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::DataReader_ptr dr, + const ::DDS::SampleRejectedStatus &status) : + csl_ (::CCM_DDS::ConnectorStatusListener::_duplicate (csl)), + dr_ (::DDS::DataReader::_duplicate (dr)), + status_ (status) + { + this->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); + } + + OnSampleRejectedHandler::~OnSampleRejectedHandler (void) + { + } + + int + OnSampleRejectedHandler::handle_exception (ACE_HANDLE) + { + try + { + this->csl_->on_sample_rejected (this->dr_, this->status_); + } + catch (...) + { + } + return 0; + } + + //============================================================ + // OnInconsistentTopicHandler + //============================================================ + OnInconsistentTopicHandler::OnInconsistentTopicHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::Topic_ptr tp, + const ::DDS::InconsistentTopicStatus &status) : + csl_ (::CCM_DDS::ConnectorStatusListener::_duplicate (csl)), + tp_ (::DDS::Topic::_duplicate (tp)), + status_ (status) + { + this->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); + } + + OnInconsistentTopicHandler::~OnInconsistentTopicHandler (void) + { + } + + int + OnInconsistentTopicHandler::handle_exception (ACE_HANDLE) + { + try + { + this->csl_->on_inconsistent_topic (this->tp_, this->status_); + } + catch (...) + { + } + return 0; + } + + //============================================================ + // OnOfferedDeadlineMissedHandler + //============================================================ + OnOfferedDeadlineMissedHandler::OnOfferedDeadlineMissedHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::DataWriter_ptr dw, + const ::DDS::OfferedDeadlineMissedStatus &status) : + csl_ (::CCM_DDS::ConnectorStatusListener::_duplicate (csl)), + dw_ (::DDS::DataWriter::_duplicate (dw)), + status_ (status) + { + this->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); + } + + OnOfferedDeadlineMissedHandler::~OnOfferedDeadlineMissedHandler (void) + { + } + + int + OnOfferedDeadlineMissedHandler::handle_exception (ACE_HANDLE) + { + try + { + this->csl_->on_offered_deadline_missed (this->dw_, this->status_); + } + catch (...) + { + } + return 0; + } + + //============================================================ + // OnOfferedIncompatibleQoSHandler + //============================================================ + OnOfferedIncompatibleQoSHandler::OnOfferedIncompatibleQoSHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::DataWriter_ptr dw, + const ::DDS::OfferedIncompatibleQosStatus &status) : + csl_ (::CCM_DDS::ConnectorStatusListener::_duplicate (csl)), + dw_ (::DDS::DataWriter::_duplicate (dw)), + status_ (status) + { + this->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); + } + + OnOfferedIncompatibleQoSHandler::~OnOfferedIncompatibleQoSHandler (void) + { + } + + int + OnOfferedIncompatibleQoSHandler::handle_exception (ACE_HANDLE) + { + try + { + this->csl_->on_offered_incompatible_qos (this->dw_, this->status_); + } + catch (...) + { + } + return 0; + } + + //============================================================ + // OnRequestedDeadlineMissedHandler + //============================================================ + OnRequestedDeadlineMissedHandler::OnRequestedDeadlineMissedHandler ( + ::CCM_DDS::PortStatusListener_ptr psl, + ::DDS::DataReader_ptr dr, + const ::DDS::RequestedDeadlineMissedStatus & status) : + psl_ (::CCM_DDS::PortStatusListener::_duplicate (psl)), + dr_ (::DDS::DataReader::_duplicate (dr)), + status_ (status) + { + } + + OnRequestedDeadlineMissedHandler::~OnRequestedDeadlineMissedHandler () + { + } + + int + OnRequestedDeadlineMissedHandler::handle_exception (ACE_HANDLE) + { + try + { + this->psl_->on_requested_deadline_missed (this->dr_, this->status_); + } + catch (...) + { + } + return 0; + } + + //============================================================ + // OnSampleLostHandler + //============================================================ + OnSampleLostHandler::OnSampleLostHandler ( + ::CCM_DDS::PortStatusListener_ptr psl, + ::DDS::DataReader_ptr dr, + const ::DDS::SampleLostStatus & status) : + psl_ (::CCM_DDS::PortStatusListener::_duplicate (psl)), + dr_ (::DDS::DataReader::_duplicate (dr)), + status_ (status) + { + } + + OnSampleLostHandler::~OnSampleLostHandler () + { + } + + int + OnSampleLostHandler::handle_exception (ACE_HANDLE) + { + try + { + this->psl_->on_sample_lost (this->dr_, this->status_); + } + catch (...) + { + } + return 0; + } + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDSCallbackStatusHandler.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDSCallbackStatusHandler.h new file mode 100644 index 00000000000..32d9701e738 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDSCallbackStatusHandler.h @@ -0,0 +1,155 @@ +// $Id$ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Eventhandler on orb thread, handling the + * received data from DDS. + */ + +#ifndef CIAO_DDS_CALLBACK_STATUS_HANDLER +#define CIAO_DDS_CALLBACK_STATUS_HANDLER + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/idl/dds4ccm_ConnectorStatusListenerC.h" +#include "dds4ccm/idl/dds4ccm_PortStatusListenerC.h" +#include "ace/Event_Handler.h" +#include "dds4ccm_dds_impl_export.h" + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export OnUnexpectedStatusHandler : + public ACE_Event_Handler + { + public: + OnUnexpectedStatusHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener, + ::DDS::Entity_ptr entity, + ::DDS::StatusKind status_kind); + virtual ~OnUnexpectedStatusHandler (); + + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + ::CCM_DDS::ConnectorStatusListener_var error_listener_; + ::DDS::Entity_var entity_; + ::DDS::StatusKind status_kind_; + }; + + class DDS4CCM_DDS_IMPL_Export OnRequestedOncompatibleQosHandler : + public ACE_Event_Handler + { + public: + OnRequestedOncompatibleQosHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::DataReader_ptr dr, + const ::DDS::RequestedIncompatibleQosStatus &status); + virtual ~OnRequestedOncompatibleQosHandler (); + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + ::CCM_DDS::ConnectorStatusListener_var csl_; + ::DDS::DataReader_var dr_; + ::DDS::RequestedIncompatibleQosStatus const status_; + }; + + class DDS4CCM_DDS_IMPL_Export OnSampleRejectedHandler : + public ACE_Event_Handler + { + public: + OnSampleRejectedHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::DataReader_ptr dr, + const ::DDS::SampleRejectedStatus &status); + virtual ~OnSampleRejectedHandler (); + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + ::CCM_DDS::ConnectorStatusListener_var csl_; + ::DDS::DataReader_var dr_; + ::DDS::SampleRejectedStatus const status_; + }; + + class DDS4CCM_DDS_IMPL_Export OnInconsistentTopicHandler : + public ACE_Event_Handler + { + public: + OnInconsistentTopicHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::Topic_ptr tp, + const ::DDS::InconsistentTopicStatus &status); + virtual ~OnInconsistentTopicHandler (); + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + ::CCM_DDS::ConnectorStatusListener_var csl_; + ::DDS::Topic_var tp_; + ::DDS::InconsistentTopicStatus const status_; + }; + + class DDS4CCM_DDS_IMPL_Export OnOfferedDeadlineMissedHandler : + public ACE_Event_Handler + { + public: + OnOfferedDeadlineMissedHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::DataWriter_ptr dw, + const ::DDS::OfferedDeadlineMissedStatus &status); + virtual ~OnOfferedDeadlineMissedHandler (); + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + ::CCM_DDS::ConnectorStatusListener_var csl_; + ::DDS::DataWriter_var dw_; + ::DDS::OfferedDeadlineMissedStatus const status_; + }; + + class DDS4CCM_DDS_IMPL_Export OnOfferedIncompatibleQoSHandler : + public ACE_Event_Handler + { + public: + OnOfferedIncompatibleQoSHandler ( + ::CCM_DDS::ConnectorStatusListener_ptr csl, + ::DDS::DataWriter_ptr dw, + const ::DDS::OfferedIncompatibleQosStatus &status); + virtual ~OnOfferedIncompatibleQoSHandler (); + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + ::CCM_DDS::ConnectorStatusListener_var csl_; + ::DDS::DataWriter_var dw_; + ::DDS::OfferedIncompatibleQosStatus const status_; + }; + + class DDS4CCM_DDS_IMPL_Export OnRequestedDeadlineMissedHandler : + public ACE_Event_Handler + { + public: + OnRequestedDeadlineMissedHandler ( + ::CCM_DDS::PortStatusListener_ptr psl, + ::DDS::DataReader_ptr dr, + const ::DDS::RequestedDeadlineMissedStatus &status); + virtual ~OnRequestedDeadlineMissedHandler (); + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + ::CCM_DDS::PortStatusListener_var psl_; + ::DDS::DataReader_var dr_; + ::DDS::RequestedDeadlineMissedStatus const status_; + }; + + class DDS4CCM_DDS_IMPL_Export OnSampleLostHandler : + public ACE_Event_Handler + { + public: + OnSampleLostHandler ( + ::CCM_DDS::PortStatusListener_ptr psl, + ::DDS::DataReader_ptr dr, + const ::DDS::SampleLostStatus &status); + virtual ~OnSampleLostHandler (); + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + ::CCM_DDS::PortStatusListener_var psl_; + ::DDS::DataReader_var dr_; + ::DDS::SampleLostStatus const status_; + }; + } +} + +#endif /* CIAO_DDS_CALLBACK_STATUS_HANDLER */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Base_Connector_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Base_Connector_T.cpp new file mode 100644 index 00000000000..10771a3c029 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Base_Connector_T.cpp @@ -0,0 +1,238 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds/DomainParticipantFactory.h" +#include "dds4ccm/impl/dds/DomainParticipant.h" +#include "ace/Tokenizer_T.h" +#include "ace/Env_Value_T.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::DDS_Base_Connector_T (void) + : domain_id_ (0) + , configuration_complete_ (false) + , library_name_ (0) + , profile_name_ (0) +{ + ACE_Env_Value<int> id (ACE_TEXT("DDS4CCM_DEFAULT_DOMAIN_ID"), this->domain_id_); + this->domain_id_ = id; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::~DDS_Base_Connector_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::DomainId_t +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::domain_id (void) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::domain_id"); + + return this->domain_id_; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::domain_id ( + ::DDS::DomainId_t domain_id) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::domain_id"); + + if (this->configuration_complete_) + { + throw ::CCM_DDS::NonChangeable (); + } + else + { + this->domain_id_ = domain_id; + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +char * +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::qos_profile (void) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::qos_profile"); + + return CORBA::string_dup (this->qos_profile_.in ()); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::qos_profile ( + const char * qos_profile) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::qos_profile"); + + if (this->configuration_complete_) + { + throw ::CCM_DDS::NonChangeable (); + } + else + { + this->qos_profile_ = qos_profile; + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::init_default_domain (void) +{ + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "DDS_Base_Connector_T::init_default_domain - " + "Configuring default domain <%d>\n", + this->domain_id_)); + try + { + ACE_Env_Value<int> verbosity (ACE_TEXT("DDS4CCM_NDDS_LOG_VERBOSITY"), + NDDS_CONFIG_LOG_VERBOSITY_SILENT); + + NDDS_Config_LogVerbosity n_verbosity = + static_cast <NDDS_Config_LogVerbosity> (verbosity.operator int()); + NDDSConfigLogger::get_instance()->set_verbosity (n_verbosity); + + // Generic code + if (this->qos_profile_.in ()) + { + char* buf = ACE_OS::strdup (this->qos_profile_.in ()); + ACE_Tokenizer_T<char> tok (buf); + tok.delimiter_replace ('#', 0); + for (char *p = tok.next (); p; p = tok.next ()) + { + if (!this->library_name_) + { + this->library_name_ = p; + } + else if (!this->profile_name_) + { + this->profile_name_ = p; + } + } + } + if (this->library_name_ && this->profile_name_) + { + DPFACTORY->set_default_participant_qos_with_profile ( + this->library_name_, + this->profile_name_); + this->domain_participant_ = + DPFACTORY->create_participant_with_profile ( + this->domain_id_, + this->library_name_, + this->profile_name_, + ::DDS::DomainParticipantListener::_nil (), + 0); + } + else + { + ::DDS::DomainParticipantQos qos; + this->domain_participant_ = + DPFACTORY->create_participant ( + this->domain_id_, + qos, + ::DDS::DomainParticipantListener::_nil (), + 0); + } + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_Base_Connector_T::init_default_domain: " + "Caught unexpected exception while configuring default domain <%d>\n", + this->domain_id_)); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::set_session_context ( + ::Components::SessionContext_ptr ctx) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::set_session_context"); + + typename CCM_TYPE::context_type::_var_type lctx = + CCM_TYPE::context_type::_narrow (ctx); + + if (::CORBA::is_nil (lctx.in ())) + { + throw ::CORBA::INTERNAL (); + } + + this->context_ = lctx; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::configuration_complete (void) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::configuration_complete"); + this->init_default_domain (); + this->configuration_complete_ = true; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_activate (void) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_activate"); + try + { + if (::CORBA::is_nil (this->domainparticipantlistener_.in ())) + { + ACE_NEW_THROW_EX (this->domainparticipantlistener_, + DomainParticipantListener( + this->context_-> + get_connection_error_listener ()), + CORBA::NO_MEMORY ()); + } + this->domain_participant_->set_listener ( + this->domainparticipantlistener_.in (), + DomainParticipantListener::get_mask ()); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_Base_Connector_T::ccm_activate: " + "Caught unexpected exception while configuring default domain\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_passivate (void) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_passivate"); + try + { + this->domain_participant_->set_listener ( + ::DDS::DomainParticipantListener::_nil (), + 0); + this->domainparticipantlistener_ = ::DDS::DomainParticipantListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_Base_Connector_T::ccm_passivate: " + "Caught unexpected exception while configuring default domain\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_remove (void) +{ + DDS4CCM_TRACE ("DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_remove"); + + ::DDS::ReturnCode_t const retcode = DPFACTORY->delete_participant ( + this->domain_participant_.in ()); + if (retcode != ::DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_Base_Connector_T::ccm_remove - " + "Unable to delete participant: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retcode))); + throw CORBA::INTERNAL (); + } + + + this->domain_participant_ = ::DDS::DomainParticipant::_nil (); +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Base_Connector_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Base_Connector_T.h new file mode 100644 index 00000000000..77466a88097 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Base_Connector_T.h @@ -0,0 +1,57 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + */ +#ifndef DDS_BASE_CONNECTOR_T_H +#define DDS_BASE_CONNECTOR_T_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" +#include "tao/LocalObject.h" +#include "dds4ccm/impl/dds/DomainParticipantListener_T.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +class DDS_Base_Connector_T + : public virtual CCM_TYPE::base_type, + public virtual ::CORBA::LocalObject, + private virtual ACE_Copy_Disabled +{ +public: + DDS_Base_Connector_T (void); + virtual ~DDS_Base_Connector_T (void); + + virtual ::DDS::DomainId_t domain_id (void); + + virtual void domain_id (::DDS::DomainId_t domain_id); + + virtual char *qos_profile (void); + + virtual void qos_profile (const char * qos_profile); + + virtual void set_session_context (::Components::SessionContext_ptr ctx); + + virtual void configuration_complete (void); + virtual void ccm_remove (void); + virtual void ccm_activate (void); + virtual void ccm_passivate (void); + +protected: + void init_default_domain (void); + + DDS::DomainId_t domain_id_; + CORBA::String_var qos_profile_; + bool configuration_complete_; + const char* library_name_; + const char* profile_name_; + + ::DDS::DomainParticipant_var domain_participant_; + ::DDS::DomainParticipantListener_var domainparticipantlistener_; + typename CCM_TYPE::context_type::_var_type context_; + + typedef ::CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE> DomainParticipantListener; +}; + +#include "dds4ccm/impl/dds/DDS_Base_Connector_T.cpp" + +#endif /* CONNECTOR_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Event_Connector_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Event_Connector_T.cpp new file mode 100644 index 00000000000..3c37ed761bb --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Event_Connector_T.cpp @@ -0,0 +1,261 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/dds/DataReaderListener_T.h" +#include "dds4ccm/impl/dds/DataWriterListener_T.h" +#include "dds4ccm/impl/dds/Writer_T.h" +#include "dds4ccm/impl/dds/Getter_T.h" +#include "dds4ccm/impl/dds/Reader_T.h" +#include "dds4ccm/impl/dds/DataListenerControl_T.h" +#include "dds4ccm/impl/dds/PortStatusListener_T.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::DDS_Event_Connector_T (void) : + TopicBaseConnector (), + supplier_obtained_ (false), + push_consumer_obtained_ (false), + pull_consumer_obtained_ (false) + +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::~DDS_Event_Connector_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::writer_type::_ptr_type +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_supplier_data (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_supplier_data"); + + this->supplier_obtained_ = true; + return this->supplier_.get_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataWriter_ptr +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_supplier_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_supplier_dds_entity"); + + this->supplier_obtained_ = true; + return this->supplier_.get_dds_entity (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::getter_type::_ptr_type +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_consumer_fresh_data (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_consumer_fresh_data"); + + this->pull_consumer_obtained_ = true; + return this->pull_consumer_.get_fresh_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_consumer_data (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_consumer_data"); + + this->push_consumer_obtained_ = true; + return this->push_consumer_.get_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_consumer_data (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_consumer_data"); + + this->pull_consumer_obtained_ = true; + return this->pull_consumer_.get_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::CCM_DDS::CCM_DataListenerControl_ptr +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_consumer_data_control (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_consumer_data_control"); + + this->push_consumer_obtained_ = true; + return this->push_consumer_.get_data_control (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_consumer_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_consumer_dds_entity"); + + this->pull_consumer_obtained_ = true; + return this->pull_consumer_.get_dds_entity (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_consumer_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_consumer_dds_entity"); + + this->push_consumer_obtained_ = true; + return this->push_consumer_.get_dds_entity (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete"); + + TopicBaseConnector::configuration_complete (); + + this->push_consumer_obtained_ |= + ! ::CORBA::is_nil (this->context_->get_connection_push_consumer_data_listener ()); + + ::CCM_DDS::PortStatusListener_var push_consumer_psl = + this->context_->get_connection_push_consumer_status (); + this->push_consumer_obtained_ |= ! ::CORBA::is_nil (push_consumer_psl.in ()); + + ::CCM_DDS::PortStatusListener_var pull_consumer_psl = + this->context_->get_connection_pull_consumer_status (); + this->pull_consumer_obtained_ |= + ! ::CORBA::is_nil (pull_consumer_psl.in ()); + + if (this->push_consumer_obtained_) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete - " + "Creating push consumer port.\n")); + this->push_consumer_.configuration_complete ( + this->topic_.in (), + this->subscriber_.in (), + this->library_name_, + this->profile_name_); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete - " + "No need to create push consumer port.\n")); + } + + if (this->supplier_obtained_) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete - " + "Creating supplier port.\n")); + this->supplier_.configuration_complete( + this->topic_.in (), + this->publisher_.in (), + this->library_name_, + this->profile_name_); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete - " + "No need to create supplier port.\n")); + } + + if (this->pull_consumer_obtained_) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete - " + "Creating pull consumer port.\n")); + this->pull_consumer_.configuration_complete ( + this->topic_.in (), + this->subscriber_.in (), + this->library_name_, + this->profile_name_); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete - " + "No need to create pull consumer port.\n")); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_activate (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_activate"); + ACE_Reactor* reactor = 0; +#if (CIAO_DDS4CCM_CONTEXT_SWITCH == 1) + reactor = this->context_->get_CCM_object()->_get_orb ()->orb_core ()->reactor (); +#endif + TopicBaseConnector::ccm_activate (reactor); + + if (this->push_consumer_obtained_) + { + this->push_consumer_.activate ( + this->context_->get_connection_push_consumer_data_listener (), + this->context_->get_connection_push_consumer_status (), + reactor); + } + + if (this->supplier_obtained_) + { + this->supplier_.activate (); + } + + if (this->pull_consumer_obtained_) + { + this->pull_consumer_.activate ( + this->context_->get_connection_pull_consumer_status (), + reactor); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_passivate (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_passivate"); + + if (this->push_consumer_obtained_) + { + this->push_consumer_.passivate (); + } + + if (this->supplier_obtained_) + { + this->supplier_.passivate (); + } + + if (this->pull_consumer_obtained_) + { + this->pull_consumer_.passivate (); + } + TopicBaseConnector::ccm_passivate (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_remove (void) +{ + DDS4CCM_TRACE ("DDS_Event_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_remove"); + + if (this->push_consumer_obtained_) + { + this->push_consumer_.remove (this->subscriber_.in ()); + } + + if (this->supplier_obtained_) + { + this->supplier_.remove (this->publisher_.in ()); + } + + if (this->pull_consumer_obtained_) + { + this->pull_consumer_.remove (this->subscriber_.in ()); + } + TopicBaseConnector::ccm_remove (); +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Event_Connector_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Event_Connector_T.h new file mode 100644 index 00000000000..cc6783ea175 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Event_Connector_T.h @@ -0,0 +1,95 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_EVENT_CONNECTOR_T_H_ +#define DDS_EVENT_CONNECTOR_T_H_ + +#include "dds4ccm/impl/dds/DDS_TopicBase_Connector_T.h" +#include "dds4ccm/impl/dds/DDS_Get_T.h" +#include "dds4ccm/impl/dds/DDS_Write_T.h" +#include "dds4ccm/impl/dds/DDS_Listen_T.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +class DDS_Event_Connector_T + : public virtual DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE> +{ +public: + DDS_Event_Connector_T (void); + virtual ~DDS_Event_Connector_T (void); + + /** + * @name DDS_Write + * DDS_Write operations + */ + //@{ + virtual typename CCM_TYPE::writer_type::_ptr_type get_supplier_data (void); + + virtual ::DDS::CCM_DataWriter_ptr get_supplier_dds_entity (void); + //@} + + /** + * @name DDS_Get + * DDS_Get operations + */ + //@{ + virtual typename CCM_TYPE::reader_type::_ptr_type get_pull_consumer_data (void); + + virtual typename CCM_TYPE::getter_type::_ptr_type get_pull_consumer_fresh_data (void); + + virtual ::DDS::CCM_DataReader_ptr get_pull_consumer_dds_entity (void); + //@} + + /** + * @name DDS_Listen + * DDS_Listen operations + */ + //@{ + virtual typename CCM_TYPE::reader_type::_ptr_type get_push_consumer_data (void); + + virtual ::CCM_DDS::CCM_DataListenerControl_ptr get_push_consumer_data_control (void); + + virtual ::DDS::CCM_DataReader_ptr get_push_consumer_dds_entity (void); + //@} + + virtual void configuration_complete (void); + + virtual void ccm_activate (void); + virtual void ccm_passivate (void); + virtual void ccm_remove (void); + +private: + bool supplier_obtained_; + bool push_consumer_obtained_; + bool pull_consumer_obtained_; + + /** + * DDS_Write supplier + */ + //@{ + DDS_Write_T <DDS_TYPE, CCM_TYPE> supplier_; + //@} + + /** + * DDS_Listen push_consumer + */ + //@{ + DDS_Listen_T <DDS_TYPE, CCM_TYPE, FIXED> push_consumer_; + //@} + + /** + * DDS_Get pull_consumer + */ + //@{ + DDS_Get_T <DDS_TYPE, CCM_TYPE, FIXED> pull_consumer_; + //@} + + typedef DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE> TopicBaseConnector; +}; + +#include "dds4ccm/impl/dds/DDS_Event_Connector_T.cpp" + +#endif /* DDS_EVENT_CONNECTOR_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Get_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Get_T.cpp new file mode 100644 index 00000000000..2d7bb7c6ae3 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Get_T.cpp @@ -0,0 +1,190 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/dds/DataReaderListener_T.h" +#include "dds4ccm/impl/dds/DataWriterListener_T.h" +#include "dds4ccm/impl/dds/Reader_T.h" +#include "dds4ccm/impl/dds/DataListenerControl_T.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::DDS_Get_T (void) : + ccm_dds_reader_ (0) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::~DDS_Get_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Subscriber_ptr subscriber, + const char* library_name, + const char* profile_name) +{ + DDS4CCM_TRACE ("DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete"); + + try + { + if (!this->ccm_dds_reader_.get_impl ()) + { + ::DDS::DataReader_var reader; + if (profile_name && library_name) + { + reader = subscriber->create_datareader_with_profile ( + topic, + library_name, + profile_name, + ::DDS::DataReaderListener::_nil (), + 0); + } + else + { + ::DDS::DataReaderQos drqos; + reader = subscriber->create_datareader ( + topic, + drqos, + ::DDS::DataReaderListener::_nil (), + 0); + } + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i *rd = + dynamic_cast < ::CIAO::DDS4CCM::CCM_DDS_DataReader_i *> (reader.in ()); + this->ccm_dds_reader_.set_impl (rd->get_impl ()); + this->dds_get_.set_impl (&this->ccm_dds_reader_); + this->dds_read_.set_impl (&this->ccm_dds_reader_); + this->dds_read_.set_contentfilteredtopic_data (library_name, + profile_name, + &this->dds_get_); + } + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Get_T::configuration_complete: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::activate ( + ::CCM_DDS::PortStatusListener_ptr listener, + ACE_Reactor* reactor) +{ + DDS4CCM_TRACE ("DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::activate"); + try + { + if (::CORBA::is_nil (this->status_.in ())) + { + ACE_NEW_THROW_EX (this->status_, + PortStatusListener (listener, reactor), + CORBA::NO_MEMORY ()); + } + this->ccm_dds_reader_.set_listener ( + this->status_.in (), + PortStatusListener::get_mask (listener)); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Get_T::activate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate (void) +{ + DDS4CCM_TRACE ("DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate"); + try + { + DDS_ReturnCode_t retcode = this->dds_get_.passivate (); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_Get_T::passivate - " + "Unable to passivate Getter: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retcode))); + throw CORBA::INTERNAL (); + } + retcode = this->dds_read_.passivate (); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_Get_T::passivate - " + "Unable to passivate Reader: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retcode))); + throw CORBA::INTERNAL (); + } + this->ccm_dds_reader_.set_listener ( + ::DDS::DataReaderListener::_nil (), + 0); + this->status_ = ::DDS::DataReaderListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Get_T::passivate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::remove ( + ::DDS::Subscriber_ptr subscriber) +{ + DDS4CCM_TRACE ("DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::remove"); + try + { + DDS::ReturnCode_t const retval = + subscriber->delete_datareader (&this->ccm_dds_reader_); + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_Get_T::remove - " + "Unable to delete DataReader: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retval))); + throw CORBA::INTERNAL (); + } + this->dds_get_.set_impl (0); + this->dds_read_.set_impl (0); + this->ccm_dds_reader_.set_impl (0); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Get_T::remove: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::getter_type::_ptr_type +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::get_fresh_data (void) +{ + DDS4CCM_TRACE ("DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::get_fresh_data"); + + return &this->dds_get_; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data (void) +{ + DDS4CCM_TRACE ("DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data"); + + return &this->dds_read_; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::get_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_Get_T<DDS_TYPE, CCM_TYPE, FIXED>::get_dds_entity"); + + return &this->ccm_dds_reader_; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Get_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Get_T.h new file mode 100644 index 00000000000..19abbfeb397 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Get_T.h @@ -0,0 +1,65 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_GET_T_H_ +#define DDS_GET_T_H_ + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/Reader_T.h" +#include "dds4ccm/impl/dds/Getter_T.h" +#include "dds4ccm/impl/dds/PortStatusListener_T.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +class DDS_Get_T +{ +public: + DDS_Get_T (void); + ~DDS_Get_T (void); + + /** + * @name DDS_Get + * DDS_Get operations + */ + //@{ + typename CCM_TYPE::reader_type::_ptr_type get_data (void); + + typename CCM_TYPE::getter_type::_ptr_type get_fresh_data (void); + + ::DDS::CCM_DataReader_ptr get_dds_entity (void); + //@} + + void configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Subscriber_ptr subscriber, + const char* library_name, + const char* profile_name); + + void activate ( + ::CCM_DDS::PortStatusListener_ptr listener, + ACE_Reactor* reactor); + + void passivate (void); + + void remove (::DDS::Subscriber_ptr subscriber); + +private: + /** + * DDS_Get + */ + //@{ + ::DDS::DataReaderListener_var status_; + ::CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, FIXED> dds_get_; + ::CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED> dds_read_; + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i ccm_dds_reader_; + //@} + + typedef ::CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE> PortStatusListener; +}; + +#include "dds4ccm/impl/dds/DDS_Get_T.cpp" + +#endif /* DDS_GET_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Listen_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Listen_T.cpp new file mode 100644 index 00000000000..97cf9aa08da --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Listen_T.cpp @@ -0,0 +1,181 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/dds/DataReaderListener_T.h" +#include "dds4ccm/impl/dds/DataWriterListener_T.h" +#include "dds4ccm/impl/dds/Writer_T.h" +#include "dds4ccm/impl/dds/Getter_T.h" +#include "dds4ccm/impl/dds/Reader_T.h" +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/dds/Topic.h" +#include "dds4ccm/impl/dds/DataListenerControl_T.h" +#include "dds4ccm/impl/dds/PortStatusListener_T.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::DDS_Listen_T (void) : + data_control_ (new CCM_DDS_DataListenerControl_T + < ::CCM_DDS::CCM_DataListenerControl> ()), + ccm_dds_reader_ (0) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::~DDS_Listen_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Subscriber_ptr subscriber, + const char* library_name, + const char* profile_name) +{ + DDS4CCM_TRACE ("DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete"); + + try + { + if (!this->ccm_dds_reader_.get_impl ()) + { + ::DDS::DataReader_var reader; + if (library_name && profile_name) + { + reader = subscriber->create_datareader_with_profile ( + topic, + library_name, + profile_name, + ::DDS::DataReaderListener::_nil (), + 0); + } + else + { + ::DDS::DataReaderQos drqos; + reader = subscriber->create_datareader ( + topic, + drqos, + ::DDS::DataReaderListener::_nil (), + 0); + } + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i *rd = + dynamic_cast < ::CIAO::DDS4CCM::CCM_DDS_DataReader_i *> (reader.in ()); + this->ccm_dds_reader_.set_impl (rd->get_impl ()); + this->dds_read_.set_impl (&this->ccm_dds_reader_); + this->dds_read_.set_contentfilteredtopic_data (library_name, profile_name); + } + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Listen_T::configuration_complete: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::activate ( + typename CCM_TYPE::listener_type::_ptr_type listener, + ::CCM_DDS::PortStatusListener_ptr status, + ACE_Reactor* reactor) +{ + DDS4CCM_TRACE ("DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::activate"); + try + { + if (::CORBA::is_nil (this->data_listener_.in ())) + { + ACE_NEW_THROW_EX (this->data_listener_, + DataReaderListener ( + listener, + status, + this->data_control_.in (), + reactor), + CORBA::NO_MEMORY ()); + } + this->ccm_dds_reader_.set_listener ( + this->data_listener_.in (), + DataReaderListener::get_mask (listener)); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Listen_T::activate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate () +{ + DDS4CCM_TRACE ("DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate"); + try + { + this->ccm_dds_reader_.set_listener ( + ::DDS::DataReaderListener::_nil (), + 0); + this->data_listener_= ::DDS::DataReaderListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Listen_T::passivate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::remove ( + ::DDS::Subscriber_ptr subscriber) +{ + DDS4CCM_TRACE ("DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::remove"); + try + { + DDS::ReturnCode_t retval = + subscriber->delete_datareader (&this->ccm_dds_reader_); + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_Listen_T::remove - " + "Unable to delete DataReader: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retval))); + throw CORBA::INTERNAL (); + } + this->ccm_dds_reader_.set_impl (0); + this->dds_read_.set_impl (0); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Listen_T::remove: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data (void) +{ + DDS4CCM_TRACE ("DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data"); + + return &this->dds_read_; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_dds_entity"); + + return &this->ccm_dds_reader_; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::CCM_DDS::CCM_DataListenerControl_ptr +DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data_control (void) +{ + DDS4CCM_TRACE ("DDS_Listen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data_control"); + + return ::CCM_DDS::CCM_DataListenerControl::_duplicate (this->data_control_.in ()); +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Listen_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Listen_T.h new file mode 100644 index 00000000000..9c8288a416b --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Listen_T.h @@ -0,0 +1,65 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_LISTEN_T_H_ +#define DDS_LISTEN_T_H_ + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL +class ACE_Reactor; +ACE_END_VERSIONED_NAMESPACE_DECL + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +class DDS_Listen_T +{ +public: + DDS_Listen_T (void); + ~DDS_Listen_T (void); + + /** + * @name DDS_Listen + * DDS_Listen operations + */ + //@{ + typename CCM_TYPE::reader_type::_ptr_type get_data (void); + + ::CCM_DDS::CCM_DataListenerControl_ptr get_data_control (void); + + ::DDS::CCM_DataReader_ptr get_dds_entity (void); + //@} + + void configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Subscriber_ptr subscriber, + const char* library_name, + const char* profile_name); + + void activate ( + typename CCM_TYPE::listener_type::_ptr_type listener, + ::CCM_DDS::PortStatusListener_ptr status, + ACE_Reactor* reactor); + + void passivate (void); + + void remove ( + ::DDS::Subscriber_ptr subscriber); + +private: + /** + * DDS_Listen + */ + //@{ + ::CCM_DDS::CCM_DataListenerControl_var data_control_; + ::DDS::DataReaderListener_var data_listener_; + ::CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED> dds_read_; + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i ccm_dds_reader_; + //@} + typedef ::CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE> DataReaderListener; +}; + +#include "dds4ccm/impl/dds/DDS_Listen_T.cpp" + +#endif /* DDS_LISTEN_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Read_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Read_T.cpp new file mode 100644 index 00000000000..f3a5d061913 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Read_T.cpp @@ -0,0 +1,162 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/dds/DataReaderListener_T.h" +#include "dds4ccm/impl/dds/DataWriterListener_T.h" +#include "dds4ccm/impl/dds/Writer_T.h" +#include "dds4ccm/impl/dds/Reader_T.h" +#include "dds4ccm/impl/dds/DataListenerControl_T.h" +#include "dds4ccm/impl/dds/PortStatusListener_T.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::DDS_Read_T (void) : + ccm_dds_reader_ (0) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::~DDS_Read_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Subscriber_ptr subscriber, + const char* library_name, + const char* profile_name) +{ + DDS4CCM_TRACE ("DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete"); + + try + { + if (!this->ccm_dds_reader_.get_impl ()) + { + ::DDS::DataReader_var reader; + if (profile_name && library_name) + { + reader = subscriber->create_datareader_with_profile ( + topic, + library_name, + profile_name, + ::DDS::DataReaderListener::_nil (), + 0); + } + else + { + ::DDS::DataReaderQos drqos; + reader = subscriber->create_datareader ( + topic, + drqos, + ::DDS::DataReaderListener::_nil (), + 0); + } + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i *rd = + dynamic_cast < ::CIAO::DDS4CCM::CCM_DDS_DataReader_i *> (reader.in ()); + this->ccm_dds_reader_.set_impl (rd->get_impl ()); + this->dds_read_.set_impl (&this->ccm_dds_reader_); + this->dds_read_.set_contentfilteredtopic_data (library_name, profile_name); + } + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Read_T::configuration_complete: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::activate ( + ::CCM_DDS::PortStatusListener_ptr listener, + ACE_Reactor* reactor) +{ + DDS4CCM_TRACE ("DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::activate"); + + try + { + if (::CORBA::is_nil (this->status_.in ())) + { + ACE_NEW_THROW_EX (this->status_, + PortStatusListener (listener, reactor), + CORBA::NO_MEMORY ()); + } + this->ccm_dds_reader_.set_listener ( + this->status_.in (), + PortStatusListener::get_mask (listener)); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Read_T::activate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate () +{ + DDS4CCM_TRACE ("DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate"); + + try + { + this->ccm_dds_reader_.set_listener (::DDS::DataReaderListener::_nil (), 0); + this->status_ = ::DDS::DataReaderListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Read_T::passivate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::remove ( + ::DDS::Subscriber_ptr subscriber) +{ + DDS4CCM_TRACE ("DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::remove"); + + try + { + DDS::ReturnCode_t const retval = + subscriber->delete_datareader (&this->ccm_dds_reader_); + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_Read_T::remove - " + "Unable to delete DataReader: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retval))); + throw CORBA::INTERNAL (); + } + this->ccm_dds_reader_.set_impl (0); + this->dds_read_.set_impl (0); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Read_T::remove: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data (void) +{ + DDS4CCM_TRACE ("DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data"); + + return &this->dds_read_; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::get_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_Read_T<DDS_TYPE, CCM_TYPE, FIXED>::get_dds_entity"); + + return &this->ccm_dds_reader_; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Read_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Read_T.h new file mode 100644 index 00000000000..db987a36e3f --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Read_T.h @@ -0,0 +1,59 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_READ_T_H_ +#define DDS_READ_T_H_ + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +class DDS_Read_T +{ +public: + DDS_Read_T (void); + ~DDS_Read_T (void); + + /** + * @name DDS_Read + * DDS_Read operations + */ + //@{ + typename CCM_TYPE::reader_type::_ptr_type get_data (void); + + ::DDS::CCM_DataReader_ptr get_dds_entity (void); + //@} + + void configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Subscriber_ptr subscriber, + const char* library_name, + const char* profile_name); + + void activate ( + ::CCM_DDS::PortStatusListener_ptr listener, + ACE_Reactor* reactor); + + void passivate (void); + + void remove ( + ::DDS::Subscriber_ptr subscriber); + +private: + /** + * DDS_Read + */ + //@{ + ::DDS::DataReaderListener_var status_; + ::CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED> dds_read_; + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i ccm_dds_reader_; + //@} + typedef ::CIAO::DDS4CCM::PortStatusListener_T <DDS_TYPE, CCM_TYPE> PortStatusListener; +}; + +#include "dds4ccm/impl/dds/DDS_Read_T.cpp" + +#endif /* DDS_READ_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_StateListen_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_StateListen_T.cpp new file mode 100644 index 00000000000..f6b1521b202 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_StateListen_T.cpp @@ -0,0 +1,177 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/dds/DataReaderStateListener_T.h" +#include "dds4ccm/impl/dds/Reader_T.h" +#include "dds4ccm/impl/dds/StateListenerControl_T.h" +#include "dds4ccm/impl/dds/PortStatusListener_T.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::DDS_StateListen_T (void) : + data_control_ (new CCM_DDS_StateListenerControl_T + < ::CCM_DDS::CCM_StateListenerControl> ()), + ccm_dds_reader_ (0) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::~DDS_StateListen_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Subscriber_ptr subscriber, + const char* library_name, + const char* profile_name) +{ + DDS4CCM_TRACE ("DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete"); + + try + { + if (!this->ccm_dds_reader_.get_impl ()) + { + ::DDS::DataReader_var reader; + if (library_name && profile_name) + { + reader = subscriber->create_datareader_with_profile ( + topic, + library_name, + profile_name, + ::DDS::DataReaderListener::_nil (), + 0); + } + else + { + ::DDS::DataReaderQos drqos; + reader = subscriber->create_datareader ( + topic, + drqos, + ::DDS::DataReaderListener::_nil (), + 0); + } + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i *rd = + dynamic_cast < ::CIAO::DDS4CCM::CCM_DDS_DataReader_i *> (reader.in ()); + this->ccm_dds_reader_.set_impl (rd->get_impl ()); + this->dds_read_.set_impl (&this->ccm_dds_reader_); + this->dds_read_.set_contentfilteredtopic_data (library_name, profile_name); + } + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_StateListen_T::configuration_complete: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::activate ( + typename CCM_TYPE::statelistener_type::_ptr_type listener, + ::CCM_DDS::PortStatusListener_ptr status, + ACE_Reactor* reactor) +{ + DDS4CCM_TRACE ("DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::activate"); + + try + { + if (::CORBA::is_nil (this->data_listener_.in ())) + { + ACE_NEW_THROW_EX (this->data_listener_, + DataReaderStateListener ( + listener, + status, + this->data_control_.in (), + reactor), + CORBA::NO_MEMORY ()); + } + this->ccm_dds_reader_.set_listener ( + this->data_listener_.in (), + DataReaderStateListener::get_mask (listener)); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_StateListen_T::activate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate (void) +{ + DDS4CCM_TRACE ("DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate"); + try + { + this->ccm_dds_reader_.set_listener ( + ::DDS::DataReaderListener::_nil (), + 0); + this->data_listener_ = ::DDS::DataReaderListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_StateListen_T::passivate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::remove ( + ::DDS::Subscriber_ptr subscriber) +{ + DDS4CCM_TRACE ("DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::remove"); + try + { + DDS::ReturnCode_t retval = + subscriber->delete_datareader (&this->ccm_dds_reader_); + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_StateListen_T::remove - " + "Unable to delete DataReader: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retval))); + throw CORBA::INTERNAL (); + } + this->ccm_dds_reader_.set_impl (0); + this->dds_read_.set_impl (0); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_StateListen_T::remove: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data (void) +{ + DDS4CCM_TRACE ("DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data"); + + return &this->dds_read_; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_dds_entity"); + + return &this->ccm_dds_reader_; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::CCM_DDS::CCM_StateListenerControl_ptr +DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data_control (void) +{ + DDS4CCM_TRACE ("DDS_StateListen_T<DDS_TYPE, CCM_TYPE, FIXED>::get_data_control"); + + return ::CCM_DDS::CCM_StateListenerControl::_duplicate ( + this->data_control_.in ()); +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_StateListen_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_StateListen_T.h new file mode 100644 index 00000000000..368b4c52ead --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_StateListen_T.h @@ -0,0 +1,62 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_STATELISTEN_T_H_ +#define DDS_STATELISTEN_T_H_ + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +class DDS_StateListen_T +{ +public: + DDS_StateListen_T (void); + ~DDS_StateListen_T (void); + + /** + * @name DDS_Listen + * DDS_Listen operations + */ + //@{ + typename CCM_TYPE::reader_type::_ptr_type get_data (void); + + ::CCM_DDS::CCM_StateListenerControl_ptr get_data_control (void); + + ::DDS::CCM_DataReader_ptr get_dds_entity (void); + //@} + + void configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Subscriber_ptr subscriber, + const char* library_name, + const char* profile_name); + + void activate ( + typename CCM_TYPE::statelistener_type::_ptr_type listener, + ::CCM_DDS::PortStatusListener_ptr status, + ACE_Reactor* reactor); + + void passivate (void); + + void remove ( + ::DDS::Subscriber_ptr subscriber); + + +private: + /** + * DDS_Listen + */ + //@{ + ::CCM_DDS::CCM_StateListenerControl_var data_control_; + ::DDS::DataReaderListener_var data_listener_; + ::CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED> dds_read_; + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i ccm_dds_reader_; + //@} + typedef ::CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE> DataReaderStateListener; +}; + +#include "dds4ccm/impl/dds/DDS_StateListen_T.cpp" + +#endif /* DDS_STATELISTEN_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_State_Connector_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_State_Connector_T.cpp new file mode 100644 index 00000000000..6961e2a438c --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_State_Connector_T.cpp @@ -0,0 +1,352 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/dds/DataReaderStateListener_T.h" +#include "dds4ccm/impl/dds/DataWriterListener_T.h" +#include "dds4ccm/impl/dds/Updater_T.h" +#include "dds4ccm/impl/dds/Reader_T.h" +#include "dds4ccm/impl/dds/PublisherListener_T.h" +#include "dds4ccm/impl/dds/SubscriberListener_T.h" +#include "dds4ccm/impl/dds/DataListenerControl_T.h" +#include "dds4ccm/impl/dds/StateListenerControl_T.h" +#include "dds4ccm/impl/dds/PortStatusListener_T.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::DDS_State_Connector_T (void) : + TopicBaseConnector (), + observable_obtained_ (false), + passive_observer_obtained_ (false), + pull_observer_obtained_ (false), + push_observer_obtained_ (false), + push_state_observer_obtained_ (false) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::~DDS_State_Connector_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::updater_type::_ptr_type +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_observable_data (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_observable_data"); + + this->observable_obtained_ = true; + return this->observable_.get_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataWriter_ptr +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_observable_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_observable_dds_entity"); + + this->observable_obtained_ = true; + return this->observable_.get_dds_entity (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_passive_observer_data (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_passive_observer_data"); + + this->passive_observer_obtained_ = true; + return this->passive_observer_.get_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_passive_observer_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_passive_observer_dds_entity"); + + this->passive_observer_obtained_ = true; + return this->passive_observer_.get_dds_entity (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_observer_data (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_observer_data"); + + this->pull_observer_obtained_ = true; + return this->pull_observer_.get_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::getter_type::_ptr_type +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_observer_fresh_data (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_observer_fresh_data"); + + this->pull_observer_obtained_ = true; + return this->pull_observer_.get_fresh_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_observer_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_pull_observer_dds_entity"); + + return this->pull_observer_.get_dds_entity (); + this->pull_observer_obtained_ = true; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_observer_data (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_observer_data"); + + this->push_observer_obtained_ = true; + return this->push_observer_.get_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::CCM_DDS::CCM_DataListenerControl_ptr +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_observer_data_control (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_observer_data_control"); + + this->push_observer_obtained_ = true; + return this->push_observer_.get_data_control (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_observer_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_observer_dds_entity"); + + this->push_observer_obtained_ = true; + return this->push_observer_.get_dds_entity (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename CCM_TYPE::reader_type::_ptr_type +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_state_observer_data (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_state_observer_data"); + + this->push_state_observer_obtained_ = true; + return this->push_state_observer_.get_data (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::CCM_DDS::CCM_StateListenerControl_ptr +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_state_observer_data_control (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_state_observer_data_control"); + + this->push_state_observer_obtained_ = true; + return this->push_state_observer_.get_data_control (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +::DDS::CCM_DataReader_ptr +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_state_observer_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::get_push_state_observer_dds_entity"); + + this->push_state_observer_obtained_ = true; + return this->push_state_observer_.get_dds_entity (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::configuration_complete"); + + TopicBaseConnector::configuration_complete (); + + ::CCM_DDS::PortStatusListener_var push_observer_psl = + this->context_->get_connection_push_observer_status (); + typename CCM_TYPE::listener_type::_var_type push_observer_dl = + this->context_->get_connection_push_observer_data_listener (); + this->push_observer_obtained_ |= ! ::CORBA::is_nil (push_observer_psl.in ()); + this->push_observer_obtained_ |= ! ::CORBA::is_nil (push_observer_dl.in ()); + + ::CCM_DDS::PortStatusListener_var push_state_observer_psl = + this->context_->get_connection_push_state_observer_status (); + typename CCM_TYPE::statelistener_type::_var_type push_state_observer_dl = + this->context_->get_connection_push_state_observer_data_listener (); + this->push_state_observer_obtained_ |= ! ::CORBA::is_nil (push_state_observer_psl.in ()); + this->push_state_observer_obtained_ |= ! ::CORBA::is_nil (push_state_observer_dl.in ()); + + ::CCM_DDS::PortStatusListener_var pull_observer_psl = + this->context_->get_connection_pull_observer_status (); + this->pull_observer_obtained_ |= ! ::CORBA::is_nil (pull_observer_psl.in ()); + + ::CCM_DDS::PortStatusListener_var passive_observer_psl = + this->context_->get_connection_passive_observer_status (); + this->passive_observer_obtained_ |= ! ::CORBA::is_nil (passive_observer_psl.in ()); + + if (this->observable_obtained_) + { + this->observable_.configuration_complete ( + this->topic_.in (), + this->publisher_.in (), + this->library_name_, + this->profile_name_); + } + + if (this->push_observer_obtained_) + { + this->push_observer_.configuration_complete ( + this->topic_.in (), + this->subscriber_.in (), + this->library_name_, + this->profile_name_); + } + + if (this->push_state_observer_obtained_) + { + this->push_state_observer_.configuration_complete ( + this->topic_.in (), + this->subscriber_.in (), + this->library_name_, + this->profile_name_); + } + + if (this->pull_observer_obtained_) + { + this->pull_observer_.configuration_complete ( + this->topic_.in (), + this->subscriber_.in (), + this->library_name_, + this->profile_name_); + } + + if (this->passive_observer_obtained_) + { + this->passive_observer_.configuration_complete ( + this->topic_.in (), + this->subscriber_.in (), + this->library_name_, + this->profile_name_); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_activate (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_activate"); + + ACE_Reactor* reactor = 0; +#if (CIAO_DDS4CCM_CONTEXT_SWITCH == 1) + reactor = this->context_->get_CCM_object()->_get_orb ()->orb_core ()->reactor (); +#endif + TopicBaseConnector::ccm_activate (reactor); + + if (this->observable_obtained_) + { + this->observable_.activate (); + } + + if (this->push_observer_obtained_) + { + this->push_observer_.activate ( + this->context_->get_connection_push_observer_data_listener (), + this->context_->get_connection_push_observer_status (), + reactor); + } + + if (this->push_state_observer_obtained_) + { + this->push_state_observer_.activate ( + this->context_->get_connection_push_state_observer_data_listener (), + this->context_->get_connection_push_state_observer_status (), + reactor); + } + + if (this->pull_observer_obtained_) + { + this->pull_observer_.activate ( + this->context_->get_connection_pull_observer_status (), + reactor); + } + + if (this->passive_observer_obtained_) + { + this->passive_observer_.activate ( + this->context_->get_connection_passive_observer_status (), + reactor); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_passivate (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_passivate"); + if (this->observable_obtained_) + { + this->observable_.passivate (); + } + + if (this->push_observer_obtained_) + { + this->push_observer_.passivate (); + } + + if (this->push_state_observer_obtained_) + { + this->push_state_observer_.passivate (); + } + + if (this->pull_observer_obtained_) + { + this->pull_observer_.passivate (); + } + + if (this->passive_observer_obtained_) + { + this->passive_observer_.passivate (); + } + + TopicBaseConnector::ccm_passivate (); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_remove (void) +{ + DDS4CCM_TRACE ("DDS_State_Connector_T<DDS_TYPE, CCM_TYPE, FIXED>::ccm_remove"); + + if (this->observable_obtained_) + { + this->observable_.remove (this->publisher_.in ()); + } + + if (this->push_observer_obtained_) + { + this->push_observer_.remove (this->subscriber_.in ()); + } + + if (this->push_state_observer_obtained_) + { + this->push_state_observer_.remove (this->subscriber_.in ()); + } + + if (this->pull_observer_obtained_) + { + this->pull_observer_.remove (this->subscriber_.in ()); + } + + if (this->passive_observer_obtained_) + { + this->passive_observer_.remove (this->subscriber_.in ()); + } + TopicBaseConnector::ccm_remove (); +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_State_Connector_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_State_Connector_T.h new file mode 100644 index 00000000000..5b7c0baaf47 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_State_Connector_T.h @@ -0,0 +1,118 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_STATE_CONNECTOR_T_H_ +#define DDS_STATE_CONNECTOR_T_H_ + +#include "dds4ccm/impl/dds/DDS_TopicBase_Connector_T.h" +#include "dds4ccm/impl/dds/DDS_Get_T.h" +#include "dds4ccm/impl/dds/DDS_Listen_T.h" +#include "dds4ccm/impl/dds/DDS_StateListen_T.h" +#include "dds4ccm/impl/dds/DDS_Update_T.h" +#include "dds4ccm/impl/dds/DDS_Read_T.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +class DDS_State_Connector_T + : public virtual DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE> +{ +public: + DDS_State_Connector_T (void); + virtual ~DDS_State_Connector_T (void); + + virtual typename CCM_TYPE::updater_type::_ptr_type + get_observable_data (void); + + virtual ::DDS::CCM_DataWriter_ptr + get_observable_dds_entity (void); + + virtual typename CCM_TYPE::reader_type::_ptr_type + get_passive_observer_data (void); + + virtual ::DDS::CCM_DataReader_ptr + get_passive_observer_dds_entity (void); + + virtual typename CCM_TYPE::reader_type::_ptr_type + get_pull_observer_data (void); + + virtual typename CCM_TYPE::getter_type::_ptr_type + get_pull_observer_fresh_data (void); + + virtual ::DDS::CCM_DataReader_ptr + get_pull_observer_dds_entity (void); + + virtual typename CCM_TYPE::reader_type::_ptr_type + get_push_observer_data (void); + + virtual ::CCM_DDS::CCM_DataListenerControl_ptr + get_push_observer_data_control (void); + + virtual ::DDS::CCM_DataReader_ptr + get_push_observer_dds_entity (void); + + virtual typename CCM_TYPE::reader_type::_ptr_type + get_push_state_observer_data (void); + + virtual ::CCM_DDS::CCM_StateListenerControl_ptr + get_push_state_observer_data_control (void); + + virtual ::DDS::CCM_DataReader_ptr + get_push_state_observer_dds_entity (void); + + virtual void configuration_complete (void); + + virtual void ccm_activate (void); + virtual void ccm_passivate (void); + virtual void ccm_remove (void); + +private: + bool observable_obtained_; + bool passive_observer_obtained_; + bool pull_observer_obtained_; + bool push_observer_obtained_; + bool push_state_observer_obtained_; + + /** + * DDS_Update observable + */ + //@{ + DDS_Update_T <DDS_TYPE, CCM_TYPE> observable_; + //@} + + /** + * DDS_Read passive_observer + */ + //@{ + DDS_Read_T <DDS_TYPE, CCM_TYPE, FIXED> passive_observer_; + //@} + + /** + * DDS_Get pull_observer + */ + //@{ + DDS_Get_T <DDS_TYPE, CCM_TYPE, FIXED> pull_observer_; + //@} + + /** + * DDS_Listen push_observer + */ + //@{ + DDS_Listen_T <DDS_TYPE, CCM_TYPE, FIXED> push_observer_; + //@} + + /** + * DDS_StateListen push_state_observer + */ + //@{ + DDS_StateListen_T <DDS_TYPE, CCM_TYPE, FIXED> push_state_observer_; + //@} + +typedef DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE> TopicBaseConnector; +}; + +#include "dds4ccm/impl/dds/DDS_State_Connector_T.cpp" + +#endif /* DDS_STATE_CONNECTOR_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_TopicBase_Connector_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_TopicBase_Connector_T.cpp new file mode 100644 index 00000000000..619ce7cd49d --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_TopicBase_Connector_T.cpp @@ -0,0 +1,473 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::DDS_TopicBase_Connector_T (void) : + BaseConnector () +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::~DDS_TopicBase_Connector_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::configuration_complete (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::configuration_complete"); + BaseConnector::configuration_complete (); + this->init_default_topic (); + this->init_subscriber (); + this->init_publisher (); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_activate (ACE_Reactor* reactor) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_activate"); + BaseConnector::ccm_activate (); + this->activate_default_topic (reactor); + this->activate_subscriber (reactor); + this->activate_publisher (reactor); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_passivate (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_passivate"); + this->passivate_default_topic (); + this->passivate_subscriber (); + this->passivate_publisher (); + BaseConnector::ccm_passivate (); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_remove (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::ccm_remove"); + this->remove_default_topic (); + this->remove_subscriber (); + this->remove_publisher (); + BaseConnector::ccm_remove (); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +char * +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::topic_name (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::topic_name"); + return CORBA::string_dup (this->topic_name_.in ()); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::topic_name ( + const char * topic_name) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::topic_name"); + if (this->configuration_complete_) + { + throw ::CCM_DDS::NonChangeable (); + } + else + { + this->topic_name_ = topic_name; + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::key_fields ( + const ::DDS::StringSeq & key_fields) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::key_fields"); + if (this->configuration_complete_) + { + throw ::CCM_DDS::NonChangeable (); + } + else + { + this->key_fields_.length (key_fields.length ()); + for (CORBA::ULong i = 0; i < key_fields.length (); ++i) + { + this->key_fields_.operator [](i) = CORBA::string_dup (key_fields[i]); + } + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StringSeq * +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::key_fields (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::key_fields"); +/* + For future use, DDS_TYPE doesn't have get_typecode yet + ::DDS_TypeCode* ptr = ::DDS_TYPE::type_support::get_typecode (); + DDS_ExceptionCode_t ex; + DDS_UnsignedLong const number = ptr->member_count (ex); + for (DDS_UnsignedLong i = 0; i < number; i++) + { + if (ptr->is_member_key (i, ex)) + { + const char* name = ptr->member_name (i, ex); + printf ("Name: %s\n", name); + } + } + */ + ::DDS::StringSeq_var retval = 0; + ACE_NEW_THROW_EX (retval, + ::DDS::StringSeq (this->key_fields_.length ()), + CORBA::NO_MEMORY ()); + retval->length (this->key_fields_.length ()); + + for (CORBA::ULong i = 0; i < this->key_fields_.length (); ++i) + { + (*retval)[i] = CORBA::string_dup (this->key_fields_[i]); + } + return retval._retn (); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::init_default_topic (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::init_default_topic"); + + if (::CORBA::is_nil (this->topic_.in ())) + { + try + { + CIAO::DDS4CCM::CCM_DDS_DomainParticipant_i *part = + dynamic_cast< CIAO::DDS4CCM::CCM_DDS_DomainParticipant_i * > ( + this->domain_participant_.in ()); + DDS_ReturnCode_t const retcode = DDS_TYPE::type_support::register_type( + part->get_impl (), DDS_TYPE::type_support::get_type_name ()); + + if (retcode == DDS_RETCODE_OK) + { + if (this->library_name_ && this->profile_name_) + { + this->topic_ = + this->domain_participant_->create_topic_with_profile ( + this->topic_name_.in (), + DDS_TYPE::type_support::get_type_name (), + this->library_name_, + this->profile_name_, + ::DDS::TopicListener::_nil (), + 0); + } + else + { + ::DDS::TopicQos tqos; + this->topic_ = + this->domain_participant_->create_topic ( + this->topic_name_.in (), + DDS_TYPE::type_support::get_type_name (), + tqos, + ::DDS::TopicListener::_nil (), + 0); + } + } + else + { + throw CCM_DDS::InternalError (retcode, 0); + } + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::init_default_topic: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::init_subscriber (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::init_subscriber"); + + if (::CORBA::is_nil (this->subscriber_.in ())) + { + try + { + if (this->library_name_ && this->profile_name_) + { + this->subscriber_ = this->domain_participant_-> + create_subscriber_with_profile ( + this->library_name_, + this->profile_name_, + ::DDS::SubscriberListener::_nil (), + 0); + } + else + { + ::DDS::SubscriberQos sqos; + this->subscriber_ = this->domain_participant_-> + create_subscriber ( + sqos, + ::DDS::SubscriberListener::_nil (), + 0); + } + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::init_subscriber: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::init_publisher (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::init_publisher"); + + if (::CORBA::is_nil (this->publisher_.in ())) + { + if (this->library_name_ && this->profile_name_) + { + this->publisher_ = this->domain_participant_-> + create_publisher_with_profile ( + this->library_name_, + this->profile_name_, + ::DDS::PublisherListener::_nil (), + 0); + } + else + { + ::DDS::PublisherQos pqos; + this->publisher_ = this->domain_participant_-> + create_publisher ( + pqos, + ::DDS::PublisherListener::_nil (), + 0); + } + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::activate_default_topic (ACE_Reactor* reactor) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::activate_default_topic"); + try + { + if (::CORBA::is_nil (this->topiclistener_.in ())) + { + ACE_NEW_THROW_EX (this->topiclistener_, + TopicListener ( + this->context_->get_connection_error_listener (), + reactor), + CORBA::NO_MEMORY ()); + } + this->topic_->set_listener ( + this->topiclistener_.in (), + TopicListener::get_mask ( + this->context_->get_connection_error_listener ())); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::activate_default_topic: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::activate_subscriber (ACE_Reactor* reactor) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::activate_subscriber"); + + try + { + if (::CORBA::is_nil (this->subscriber_listener_.in ())) + { + ACE_NEW_THROW_EX (this->subscriber_listener_, + SubscriberListener ( + this->context_->get_connection_error_listener (), + reactor), + CORBA::NO_MEMORY ()); + } + this->subscriber_->set_listener ( + this->subscriber_listener_.in (), + SubscriberListener::get_mask ( + this->context_->get_connection_error_listener ())); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::activate_subscriber: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::activate_publisher (ACE_Reactor* reactor) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::activate_publisher"); + + try + { + if (::CORBA::is_nil (this->publisher_listener_.in ())) + { + ACE_NEW_THROW_EX (this->publisher_listener_, + PublisherListener ( + this->context_->get_connection_error_listener (), + reactor), + CORBA::NO_MEMORY ()); + } + this->publisher_->set_listener ( + this->publisher_listener_.in (), + PublisherListener::get_mask ( + this->context_->get_connection_error_listener ())); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::activate_publisher: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::passivate_default_topic (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::passivate_default_topic"); + + try + { + this->topic_->set_listener ( + ::DDS::TopicListener::_nil (), + 0); + + this->topiclistener_ = ::DDS::TopicListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::passivate_default_topic: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::passivate_subscriber (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::passivate_subscriber"); + + try + { + this->subscriber_->set_listener ( + ::DDS::SubscriberListener::_nil (), + 0); + this->subscriber_listener_ = ::DDS::SubscriberListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::passivate_subscriber: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::passivate_publisher (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::passivate_publisher"); + + try + { + this->publisher_->set_listener ( + ::DDS::PublisherListener::_nil (), + 0); + this->publisher_listener_ = ::DDS::PublisherListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::passivate_default_topic: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::remove_default_topic (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::remove_default_topic"); + + try + { + DDS::ReturnCode_t retval = + this->domain_participant_->delete_topic (this->topic_.in ()); + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_TopicBase_Connector_T::remove - " + "Unable to delete Topic: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retval))); + throw CORBA::INTERNAL (); + } + this->topic_ = ::DDS::Topic::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::remove_default_topic: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::remove_subscriber (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::remove_subscriber"); + + try + { + this->domain_participant_->delete_subscriber (this->subscriber_.in ()); + this->subscriber_ = ::DDS::Subscriber::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::remove_subscriber: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_TopicBase_Connector_T<DDS_TYPE, CCM_TYPE>::remove_publisher (void) +{ + DDS4CCM_TRACE ("DDS_TopicBase_Connector_T::remove_publisher"); + + try + { + this->domain_participant_->delete_publisher (this->publisher_.in ()); + this->publisher_ = ::DDS::Publisher::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_ERROR, "DDS_TopicBase_Connector_T::remove_publisher: " + "Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_TopicBase_Connector_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_TopicBase_Connector_T.h new file mode 100644 index 00000000000..19c91c8f034 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_TopicBase_Connector_T.h @@ -0,0 +1,75 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_TOPIC_BASE_CONNECTOR_H +#define DDS_TOPIC_BASE_CONNECTOR_H + +#include "ace/Copy_Disabled.h" +#include "dds4ccm/impl/dds/DDS_Base_Connector_T.h" +#include "dds4ccm/impl/dds/TopicListener_T.h" +#include "dds4ccm/impl/dds/PublisherListener_T.h" +#include "dds4ccm/impl/dds/SubscriberListener_T.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +class DDS_TopicBase_Connector_T + : public virtual DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE> +{ +public: + DDS_TopicBase_Connector_T (void); + virtual ~DDS_TopicBase_Connector_T (void); + + virtual char *topic_name (void); + + virtual void topic_name (const char * topic_name); + + virtual ::DDS::StringSeq *key_fields (void); + + virtual void key_fields (const ::DDS::StringSeq & key_fields); + + virtual void configuration_complete (void); + virtual void ccm_remove (void); + virtual void ccm_activate (ACE_Reactor* reactor); + virtual void ccm_passivate (void); + +protected: + void init_default_topic (void); + void init_publisher (void); + void init_subscriber (void); + + void activate_default_topic (ACE_Reactor* reactor); + void activate_publisher (ACE_Reactor* reactor); + void activate_subscriber (ACE_Reactor* reactor); + + void passivate_default_topic (void); + void passivate_publisher (void); + void passivate_subscriber (void); + + void remove_default_topic (void); + void remove_publisher (void); + void remove_subscriber (void); + + CORBA::String_var topic_name_; + DDS::StringSeq key_fields_; + + ::DDS::Topic_var topic_; + ::DDS::TopicListener_var topiclistener_; + + ::DDS::Publisher_var publisher_; + ::DDS::PublisherListener_var publisher_listener_; + ::DDS::Subscriber_var subscriber_; + ::DDS::SubscriberListener_var subscriber_listener_; + +typedef ::CIAO::DDS4CCM::TopicListener_T<DDS_TYPE, CCM_TYPE> TopicListener; +typedef ::CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE> SubscriberListener; +typedef ::CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE> PublisherListener; +typedef DDS_Base_Connector_T<DDS_TYPE, CCM_TYPE> BaseConnector; + +}; + +#include "dds4ccm/impl/dds/DDS_TopicBase_Connector_T.cpp" + +#endif /* DDS_TOPIC_BASE_CONNECTOR_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Update_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Update_T.cpp new file mode 100644 index 00000000000..fae108a1faa --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Update_T.cpp @@ -0,0 +1,151 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/dds/DataReaderStateListener_T.h" +#include "dds4ccm/impl/dds/DataWriterListener_T.h" +#include "dds4ccm/impl/dds/Updater_T.h" +#include "dds4ccm/impl/dds/DataWriter.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_Update_T<DDS_TYPE, CCM_TYPE>::DDS_Update_T (void) : + ccm_dds_writer_ (0) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_Update_T<DDS_TYPE, CCM_TYPE>::~DDS_Update_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Update_T<DDS_TYPE, CCM_TYPE>::configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Publisher_ptr publisher, + const char* library_name, + const char* profile_name) +{ + DDS4CCM_TRACE ("DDS_Update_T<DDS_TYPE, CCM_TYPE>::configuration_complete"); + if (!this->ccm_dds_writer_.get_impl ()) + { + try + { + ::DDS::DataWriter_var dwv_tmp; + if (library_name && profile_name) + { + dwv_tmp = publisher->create_datawriter_with_profile ( + topic, + library_name, + profile_name, + ::DDS::DataWriterListener::_nil (), + 0); + } + else + { + ::DDS::DataWriterQos dwqos; + dwv_tmp = publisher->create_datawriter ( + topic, + dwqos, + ::DDS::DataWriterListener::_nil (), + 0); + } + ::CIAO::DDS4CCM::CCM_DDS_DataWriter_i *rw = + dynamic_cast < ::CIAO::DDS4CCM::CCM_DDS_DataWriter_i *> (dwv_tmp.in ()); + this->ccm_dds_writer_.set_impl (rw->get_impl ()); + this->dds_update_.set_impl (&this->ccm_dds_writer_); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Update_T::configuration_complete: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Update_T<DDS_TYPE, CCM_TYPE>::activate () +{ + DDS4CCM_TRACE ("DDS_Update_T<DDS_TYPE, CCM_TYPE>::activate"); + try + { + if (::CORBA::is_nil (this->data_listener_.in ())) + { + ACE_NEW_THROW_EX (this->data_listener_, + DataWriterListener (), + CORBA::NO_MEMORY ()); + } + this->ccm_dds_writer_.set_listener ( + this->data_listener_.in (), + DataWriterListener::get_mask ()); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Update_T::activate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Update_T<DDS_TYPE, CCM_TYPE>::passivate () +{ + DDS4CCM_TRACE ("DDS_Update_T<DDS_TYPE, CCM_TYPE>::passivate"); + try + { + this->ccm_dds_writer_.set_listener ( + ::DDS::DataWriterListener::_nil (), + 0); + this->data_listener_ = ::DDS::DataWriterListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Update_T::passivate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Update_T<DDS_TYPE, CCM_TYPE>::remove ( + ::DDS::Publisher_ptr publisher) +{ + DDS4CCM_TRACE ("DDS_Update_T<DDS_TYPE, CCM_TYPE>::remove"); + try + { + DDS::ReturnCode_t retval = + publisher->delete_datawriter (&this->ccm_dds_writer_); + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_Update_T::remove - " + "Unable to delete DataWriter: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retval))); + throw CORBA::INTERNAL (); + } + this->ccm_dds_writer_.set_impl (0); + this->dds_update_.set_impl (0); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Update_T::remove: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +typename CCM_TYPE::updater_type::_ptr_type +DDS_Update_T<DDS_TYPE, CCM_TYPE>::get_data (void) +{ + return &this->dds_update_; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::CCM_DataWriter_ptr +DDS_Update_T<DDS_TYPE, CCM_TYPE>::get_dds_entity (void) +{ + return &this->ccm_dds_writer_; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Update_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Update_T.h new file mode 100644 index 00000000000..11912ec8606 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Update_T.h @@ -0,0 +1,51 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_UPDATE_T_H +#define DDS_UPDATE_T_H + +#include "dds4ccm/impl/dds/Updater_T.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +class DDS_Update_T +{ +public: + DDS_Update_T (void); + ~DDS_Update_T (void); + + typename CCM_TYPE::updater_type::_ptr_type get_data (void); + + ::DDS::CCM_DataWriter_ptr get_dds_entity (void); + + void configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Publisher_ptr publisher, + const char* library_name, + const char* profile_name); + + void activate (void); + + void passivate (void); + + void remove ( + ::DDS::Publisher_ptr publisher); + +private: + /** + * DDS_Update + */ + //@{ + ::DDS::DataWriterListener_var data_listener_; + ::CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE> dds_update_; + ::CIAO::DDS4CCM::CCM_DDS_DataWriter_i ccm_dds_writer_; + //@} + typedef ::CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE> DataWriterListener; +}; + +#include "dds4ccm/impl/dds/DDS_Update_T.cpp" + +#endif /* DDS_UPDATE_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Write_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Write_T.cpp new file mode 100644 index 00000000000..92e0178495a --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Write_T.cpp @@ -0,0 +1,156 @@ +// -*- C++ -*- +// $Id$ + +#include "dds4ccm/impl/dds/DataReaderListener_T.h" +#include "dds4ccm/impl/dds/DataWriterListener_T.h" +#include "dds4ccm/impl/dds/DataListenerControl_T.h" +#include "dds4ccm/impl/dds/PortStatusListener_T.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_Write_T<DDS_TYPE, CCM_TYPE>::DDS_Write_T (void) : + ccm_dds_writer_ (0) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_Write_T<DDS_TYPE, CCM_TYPE>::~DDS_Write_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Write_T<DDS_TYPE, CCM_TYPE>::configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Publisher_ptr publisher, + const char* library_name, + const char* profile_name) +{ + DDS4CCM_TRACE ("DDS_Write_T<DDS_TYPE, CCM_TYPE>::configuration_complete"); + + try + { + if (!this->ccm_dds_writer_.get_impl ()) + { + ::DDS::DataWriter_var dwv_tmp; + if (library_name && profile_name) + { + dwv_tmp = publisher->create_datawriter_with_profile ( + topic, + library_name, + profile_name, + ::DDS::DataWriterListener::_nil (), + 0); + } + else + { + ::DDS::DataWriterQos dwqos; + dwv_tmp = publisher->create_datawriter ( + topic, + dwqos, + ::DDS::DataWriterListener::_nil (), + 0); + } + ::CIAO::DDS4CCM::CCM_DDS_DataWriter_i *rw = + dynamic_cast < ::CIAO::DDS4CCM::CCM_DDS_DataWriter_i *> (dwv_tmp.in ()); + this->ccm_dds_writer_.set_impl (rw->get_impl ()); + this->writer_t_.set_impl (&this->ccm_dds_writer_); + } + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Write_T::configuration_complete: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Write_T<DDS_TYPE, CCM_TYPE>::activate () +{ + DDS4CCM_TRACE ("DDS_Write_T<DDS_TYPE, CCM_TYPE>::activate"); + try + { + if (::CORBA::is_nil (this->data_listener_.in ())) + { + ACE_NEW_THROW_EX (this->data_listener_, + DataWriterListener (), + CORBA::NO_MEMORY ()); + } + this->ccm_dds_writer_.set_listener ( + this->data_listener_.in (), + DataWriterListener::get_mask ()); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Write_T::activate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Write_T<DDS_TYPE, CCM_TYPE>::passivate () +{ + DDS4CCM_TRACE ("DDS_Write_T<DDS_TYPE, CCM_TYPE>::passivate"); + try + { + this->ccm_dds_writer_.set_listener ( + ::DDS::DataWriterListener::_nil (), + 0); + this->data_listener_ = ::DDS::DataWriterListener::_nil (); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Write_T::passivate: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +DDS_Write_T<DDS_TYPE, CCM_TYPE>::remove ( + ::DDS::Publisher_ptr publisher) +{ + DDS4CCM_TRACE ("DDS_Write_T<DDS_TYPE, CCM_TYPE>::remove"); + try + { + DDS::ReturnCode_t const retval = + publisher->delete_datawriter (&this->ccm_dds_writer_); + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "DDS_Write_T::remove - " + "Unable to delete DataWriter: <%C>\n", + ::CIAO::DDS4CCM::translate_retcode (retval))); + throw CORBA::INTERNAL (); + } + this->ccm_dds_writer_.set_impl (0); + this->writer_t_.set_impl (0); + } + catch (...) + { + DDS4CCM_ERROR (1, (LM_EMERGENCY, "DDS_Write_T::remove: Caught unexpected exception.\n")); + throw CORBA::INTERNAL (); + } +} + + +template <typename DDS_TYPE, typename CCM_TYPE> +typename CCM_TYPE::writer_type::_ptr_type +DDS_Write_T<DDS_TYPE, CCM_TYPE>::get_data (void) +{ + DDS4CCM_TRACE ("DDS_Write_T<DDS_TYPE, CCM_TYPE>::get_data"); + + return &this->writer_t_; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::CCM_DataWriter_ptr +DDS_Write_T<DDS_TYPE, CCM_TYPE>::get_dds_entity (void) +{ + DDS4CCM_TRACE ("DDS_Write_T<DDS_TYPE, CCM_TYPE>::get_dds_entity"); + + return &this->ccm_dds_writer_; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Write_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Write_T.h new file mode 100644 index 00000000000..fb503da1947 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DDS_Write_T.h @@ -0,0 +1,59 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_WRITE_T_H_ +#define DDS_WRITE_T_H_ + +#include "dds4ccm/impl/dds/DDS_TopicBase_Connector_T.h" +#include "dds4ccm/impl/dds/Writer_T.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +class DDS_Write_T +{ +public: + DDS_Write_T (void); + ~DDS_Write_T (void); + + /** + * @name DDS_Write + * DDS_Write operations + */ + //@{ + typename CCM_TYPE::writer_type::_ptr_type get_data (void); + + ::DDS::CCM_DataWriter_ptr get_dds_entity (void); + //@} + + void configuration_complete ( + ::DDS::Topic_ptr topic, + ::DDS::Publisher_ptr publisher, + const char* library_name, + const char* profile_name); + + void activate (void); + + void passivate (void); + + void remove ( + ::DDS::Publisher_ptr publisher); + +private: + /** + * DDS_Write + */ + //@{ + ::DDS::DataWriterListener_var data_listener_; + ::CIAO::DDS4CCM::Writer_T<DDS_TYPE, CCM_TYPE> writer_t_; + ::CIAO::DDS4CCM::CCM_DDS_DataWriter_i ccm_dds_writer_; + //@} + + typedef ::CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE> DataWriterListener; +}; + +#include "dds4ccm/impl/dds/DDS_Write_T.cpp" + +#endif /* DDS_WRITE_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataListenerControl_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataListenerControl_T.cpp new file mode 100644 index 00000000000..627cec340b4 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataListenerControl_T.cpp @@ -0,0 +1,50 @@ +// -*- C++ -*- +// $Id$ + +template <typename BASE_TYPE> +CCM_DDS_DataListenerControl_T<BASE_TYPE>::CCM_DDS_DataListenerControl_T (void) : + mode_ (::CCM_DDS::NOT_ENABLED), + max_delivered_data_ (0) +{ + DDS4CCM_TRACE ("CCM_DDS_DataListenerControl_T::CCM_DDS_DataListenerControl_T"); +} + +template <typename BASE_TYPE> +CCM_DDS_DataListenerControl_T<BASE_TYPE>::~CCM_DDS_DataListenerControl_T (void) +{ + DDS4CCM_TRACE ("CCM_DDS_DataListenerControl_T::~CCM_DDS_DataListenerControl_T"); +} + +template <typename BASE_TYPE> +::CCM_DDS::ListenerMode +CCM_DDS_DataListenerControl_T<BASE_TYPE>::mode (void) +{ + DDS4CCM_TRACE ("CCM_DDS_DataListenerControl_T::mode"); + return this->mode_.value (); +} + +template <typename BASE_TYPE> +void +CCM_DDS_DataListenerControl_T<BASE_TYPE>::mode (::CCM_DDS::ListenerMode mode) +{ + DDS4CCM_TRACE ("CCM_DDS_DataListenerControl_T::mode"); + this->mode_ = mode; +} + +template <typename BASE_TYPE> +::CCM_DDS::DataNumber_t +CCM_DDS_DataListenerControl_T<BASE_TYPE>::max_delivered_data (void) +{ + DDS4CCM_TRACE ("CCM_DDS_DataListenerControl_T::max_delivered_data"); + return this->max_delivered_data_.value (); +} + +template <typename BASE_TYPE> +void +CCM_DDS_DataListenerControl_T<BASE_TYPE>::max_delivered_data ( + ::CCM_DDS::DataNumber_t max_delivered_data) +{ + DDS4CCM_TRACE ("CCM_DDS_DataListenerControl_T::max_delivered_data"); + this->max_delivered_data_ = max_delivered_data; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataListenerControl_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataListenerControl_T.h new file mode 100644 index 00000000000..50630e7221a --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataListenerControl_T.h @@ -0,0 +1,48 @@ +// -*- C++ -*- +// $Id$ + +#ifndef DDS4CCM_DATALISTENERCONTROLI_H_ +#define DDS4CCM_DATALISTENERCONTROLI_H_ + +#include "dds4ccm/idl/dds4ccm_DataListenerControlEC.h" +#include "tao/LocalObject.h" +#include "ace/Copy_Disabled.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +template <typename BASE_TYPE> +class CCM_DDS_DataListenerControl_T + : public virtual BASE_TYPE, + public virtual ::CORBA::LocalObject, + private ACE_Copy_Disabled +{ +public: + /// Constructor + CCM_DDS_DataListenerControl_T (void); + + /// Destructor + virtual ~CCM_DDS_DataListenerControl_T (void); + + /// Set the mode + virtual ::CCM_DDS::ListenerMode mode (void); + + /// Get the mode + virtual void mode (::CCM_DDS::ListenerMode mode); + + /// Set the max_delivered_data + virtual ::CCM_DDS::DataNumber_t max_delivered_data (void); + + /// Get the max_delivered_data + virtual void max_delivered_data (::CCM_DDS::DataNumber_t max_delivered_data); + +protected: + ACE_Atomic_Op <TAO_SYNCH_MUTEX, ::CCM_DDS::ListenerMode> mode_; + ACE_Atomic_Op <TAO_SYNCH_MUTEX, ::CCM_DDS::DataNumber_t> max_delivered_data_; +}; + +#include "dds4ccm/impl/dds/DataListenerControl_T.cpp" + +#endif /* DDS4CCM_DATALISTENERCONTROLI_H_ */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReader.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReader.cpp new file mode 100644 index 00000000000..32af7c110fa --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReader.cpp @@ -0,0 +1,457 @@ +// $Id$ + +#include "DataReader.h" +#include "DataReaderListener.h" +#include "StatusCondition.h" +#include "ReadCondition.h" +#include "QueryCondition.h" +#include "Subscriber.h" +#include "TopicDescription.h" +#include "Topic.h" +#include "ContentFilteredTopic.h" + +#include "ndds/SampleLostStatus.h" +#include "ndds/SubscriptionMatchedStatus.h" +#include "ndds/RequestedDeadlineMissedStatus.h" +#include "ndds/SampleRejectedStatus.h" +#include "ndds/LivelinessChangedStatus.h" +#include "ndds/PublicationBuiltinTopicData.h" +#include "ndds/RequestedIncompatibleQosStatus.h" +#include "ndds/Duration_t.h" +#include "ndds/InstanceHandle_t.h" +#include "ndds/InstanceHandleSeq.h" +#include "ndds/DataReaderQos.h" +#include "ndds/StringSeq.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_DataReader_i::CCM_DDS_DataReader_i (DDSDataReader * dr) + : impl_ (dr) + { + } + + CCM_DDS_DataReader_i::~CCM_DDS_DataReader_i (void) + { + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::enable (void) + { + return this->impl ()->enable (); + } + + ::DDS::StatusCondition_ptr + CCM_DDS_DataReader_i::get_statuscondition (void) + { + ::DDS::StatusCondition_var retval = ::DDS::StatusCondition::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSStatusCondition* sc = this->impl ()->get_statuscondition (); + if (sc) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::StatusCondition_var sc = this->impl ()->get_statuscondition (); + if (! ::CORBA::is_nil (sc.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + ::DDS::StatusMask + CCM_DDS_DataReader_i::get_status_changes (void) + { + return this->impl ()->get_status_changes (); + } + + DDS_INSTANCE_HANDLE_T_RETN + CCM_DDS_DataReader_i::get_instance_handle (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t const rtihandle = this->impl ()->get_instance_handle (); + ::DDS::InstanceHandle_t handle; + handle <<= rtihandle; + return handle; +#else + return this->impl ()->get_instance_handle (); +#endif + } + + ::DDS::ReadCondition_ptr + CCM_DDS_DataReader_i::create_readcondition ( + ::DDS::SampleStateMask sample_states, + ::DDS::ViewStateMask view_states, + ::DDS::InstanceStateMask instance_states) + { + ::DDS::ReadCondition_var retval = ::DDS::ReadCondition::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSReadCondition* rc = this->impl ()->create_readcondition (sample_states, view_states, instance_states); + if (rc) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_ReadCondition_i (rc), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::ReadCondition_var rc = this->impl ()->create_readcondition (sample_states, view_states, instance_states); + if (! ::CORBA::is_nil (rc.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + ::DDS::QueryCondition_ptr + CCM_DDS_DataReader_i::create_querycondition ( + ::DDS::SampleStateMask sample_states, + ::DDS::ViewStateMask view_states, + ::DDS::InstanceStateMask instance_states, + const char * query_expression, + const ::DDS::StringSeq & query_parameters) + { + ::DDS::QueryCondition_var retval = ::DDS::QueryCondition::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDS_StringSeq parameters; + parameters <<= query_parameters; + DDSQueryCondition* qc = this->impl ()->create_querycondition ( + sample_states, + view_states, + instance_states, + query_expression, + parameters); + + if (qc) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_QueryCondition_i (qc), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::QueryCondition_var qc = this->impl ()->create_querycondition ( + sample_states, + view_states, + instance_states, + query_expression, + query_parameters); + + if (! ::CORBA::is_nil (qc.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_QueryCondition_i (qc.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::delete_readcondition ( + ::DDS::ReadCondition_ptr a_condition) + { +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_ReadCondition_i *rc = dynamic_cast< CCM_DDS_ReadCondition_i *> (a_condition); + if (!rc) + { + return ::DDS::RETCODE_BAD_PARAMETER; + } + return this->impl ()->delete_readcondition (rc->get_impl ()); +#else + return this->impl ()->delete_readcondition (a_condition); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::delete_contained_entities (void) + { + return this->impl ()->delete_contained_entities (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::set_qos ( + const ::DDS::DataReaderQos &qos) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataReaderQos ddsqos; + ddsqos <<= qos; + return this->impl ()->set_qos (ddsqos); +#else + return this->impl ()->set_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_qos ( + ::DDS::DataReaderQos &qos) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataReaderQos ddsqos; + ::DDS_ReturnCode_t const retval = this->impl ()->get_qos (ddsqos); + qos <<= ddsqos; + return retval; +#else + return this->impl ()->get_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::set_listener ( + ::DDS::DataReaderListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_DataReader_i::set_listener"); + +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_DataReaderListener_i *ccm_dds_drl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_drl, + CCM_DDS_DataReaderListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + return this->impl ()->set_listener (ccm_dds_drl, mask); +#else + return this->impl ()->set_listener (a_listener, mask); +#endif + } + + ::DDS::DataReaderListener_ptr + CCM_DDS_DataReader_i::get_listener (void) + { + DDS4CCM_TRACE ("CCM_DDS_DataReader_i::get_listener"); + +#if (CIAO_DDS4CCM_NDDS==1) + DDSDataReaderListener *drl = this->impl ()->get_listener (); + CCM_DDS_DataReaderListener_i *ccm_dds_drl = dynamic_cast <CCM_DDS_DataReaderListener_i *> (drl); + if (!ccm_dds_drl) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, "CCM_DDS_DataReader_i::get_listener - " + "DDS returned a NIL listener.\n")); + return ::DDS::DataReaderListener::_nil (); + } + return ccm_dds_drl->get_datareaderlistener (); +#else + return this->impl ()->get_listener (); +#endif + } + + ::DDS::TopicDescription_ptr + CCM_DDS_DataReader_i::get_topicdescription (void) + { + ::DDS::TopicDescription_var dds_td = ::DDS::TopicDescription::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDSTopicDescription* td = this->impl ()->get_topicdescription (); + ::DDSTopic * tp = ::DDSTopic::narrow (td); + if (tp) + { + ACE_NEW_THROW_EX (dds_td, + CCM_DDS_Topic_i (tp), + CORBA::NO_MEMORY ()); + } + else + { + ::DDSContentFilteredTopic * cft = + DDSContentFilteredTopic::narrow (td); + if (cft) + { + ACE_NEW_THROW_EX (dds_td, + CCM_DDS_ContentFilteredTopic_i (cft), + CORBA::NO_MEMORY ()); + } + } +#else + ::DDS::TopicDescription_var td = this->impl ()->get_topicdescription (); + ACE_NEW_THROW_EX (dds_td, + CCM_DDS_TopicDescription_i (td.in ()), + CORBA::NO_MEMORY ()); +#endif + return dds_td._retn (); + } + + ::DDS::Subscriber_ptr + CCM_DDS_DataReader_i::get_subscriber (void) + { + ::DDS::Subscriber_var dds_td = ::DDS::Subscriber::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDSSubscriber* subscriber = this->impl ()->get_subscriber (); + ACE_NEW_THROW_EX (dds_td, + CCM_DDS_Subscriber_i (subscriber), + CORBA::NO_MEMORY ()); +#else + ::DDSSubscriber_var subscriber = this->impl ()->get_subscriber (); + ACE_NEW_THROW_EX (dds_td, + CCM_DDS_Subscriber_i (subscriber.in ()), + CORBA::NO_MEMORY ()); +#endif + return dds_td._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_sample_rejected_status ( + ::DDS::SampleRejectedStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_SampleRejectedStatus ddsstatus; + ::DDS::ReturnCode_t const retval = this->impl ()->get_sample_rejected_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_sample_rejected_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_liveliness_changed_status ( + ::DDS::LivelinessChangedStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_LivelinessChangedStatus ddsstatus; + ::DDS::ReturnCode_t const retval = this->impl ()->get_liveliness_changed_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_liveliness_changed_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_requested_deadline_missed_status ( + ::DDS::RequestedDeadlineMissedStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_RequestedDeadlineMissedStatus ddsstatus; + ::DDS::ReturnCode_t const retval = this->impl ()->get_requested_deadline_missed_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_requested_deadline_missed_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_requested_incompatible_qos_status ( + ::DDS::RequestedIncompatibleQosStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_RequestedIncompatibleQosStatus ddsstatus; + ::DDS::ReturnCode_t const retval = this->impl ()->get_requested_incompatible_qos_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_requested_incompatible_qos_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_subscription_matched_status ( + ::DDS::SubscriptionMatchedStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_SubscriptionMatchedStatus ddsstatus; + ::DDS::ReturnCode_t const retval = this->impl ()->get_subscription_matched_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_subscription_matched_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_sample_lost_status ( + ::DDS::SampleLostStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_SampleLostStatus ddsstatus; + ::DDS::ReturnCode_t const retval = this->impl ()->get_sample_lost_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_sample_lost_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::wait_for_historical_data ( + const ::DDS::Duration_t & max_wait) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_Duration_t rtiduration; + rtiduration <<= max_wait; + return this->impl ()->wait_for_historical_data (rtiduration); +#else + return this->impl ()->wait_for_historical_data (max_wait); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_matched_publications ( + ::DDS::InstanceHandleSeq & publication_handles) + { + DDS4CCM_TRACE ("CCM_DDS_DataReader_i::get_matched_publications"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandleSeq rtiseq; + ::DDS::ReturnCode_t const retval = this->impl ()->get_matched_publications (rtiseq); + publication_handles <<= rtiseq; + return retval; +#else + return this->impl ()->get_matched_publications (publication_handles); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataReader_i::get_matched_publication_data ( + ::DDS::PublicationBuiltinTopicData & publication_data, + DDS_INSTANCE_HANDLE_T_IN publication_handle) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_PublicationBuiltinTopicData ccm_dds_pub_data; + ::DDS_InstanceHandle_t ccm_dds_pub_handle; + + ccm_dds_pub_data <<= publication_data; + ccm_dds_pub_handle <<= publication_handle; + ::DDS::ReturnCode_t const retcode = this->impl()-> + get_matched_publication_data (ccm_dds_pub_data, + ccm_dds_pub_handle); + publication_data <<= ccm_dds_pub_data; + return retcode; +#else + return this->impl ()->get_matched_publication_data (publication_data, publication_handle); +#endif + } + + DDSDataReader * + CCM_DDS_DataReader_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_DataReader_i::set_impl (DDSDataReader * dr) + { + this->impl_ = dr; + } + + DDSDataReader * + CCM_DDS_DataReader_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReader.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReader.h new file mode 100644 index 00000000000..88805eb70e2 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReader.h @@ -0,0 +1,134 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DATAREADER_H +#define DDS4CCM_DATAREADER_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" +#include "dds4ccm/impl/dds/ndds/InstanceHandle_t.h" +#include "tao/LocalObject.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DataReader DDSDataReader; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_DataReader_i + : public virtual ::DDS::CCM_DataReader, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_DataReader_i (DDSDataReader *dr); + + /// Destructor + virtual ~CCM_DDS_DataReader_i (void); + + virtual ::DDS::ReturnCode_t enable (void); + + virtual ::DDS::StatusCondition_ptr get_statuscondition (void); + + virtual ::DDS::StatusMask get_status_changes (void); + + virtual DDS_INSTANCE_HANDLE_T_RETN get_instance_handle (void); + + virtual ::DDS::ReadCondition_ptr + create_readcondition ( + ::DDS::SampleStateMask sample_states, + ::DDS::ViewStateMask view_states, + ::DDS::InstanceStateMask instance_states); + + virtual ::DDS::QueryCondition_ptr + create_querycondition ( + ::DDS::SampleStateMask sample_states, + ::DDS::ViewStateMask view_states, + ::DDS::InstanceStateMask instance_states, + const char * query_expression, + const ::DDS::StringSeq & query_parameters); + + virtual ::DDS::ReturnCode_t + delete_readcondition ( + ::DDS::ReadCondition_ptr a_condition); + + virtual ::DDS::ReturnCode_t delete_contained_entities (void); + + virtual ::DDS::ReturnCode_t set_qos (const ::DDS::DataReaderQos & qos); + + virtual ::DDS::ReturnCode_t get_qos (::DDS::DataReaderQos & qos); + + virtual ::DDS::ReturnCode_t + set_listener ( + ::DDS::DataReaderListener_ptr a_listener, + ::DDS::StatusMask mask); + + virtual ::DDS::DataReaderListener_ptr get_listener (void); + + virtual ::DDS::TopicDescription_ptr get_topicdescription (void); + + virtual ::DDS::Subscriber_ptr get_subscriber (void); + + virtual ::DDS::ReturnCode_t + get_sample_rejected_status (::DDS::SampleRejectedStatus & status); + + virtual ::DDS::ReturnCode_t + get_liveliness_changed_status ( + ::DDS::LivelinessChangedStatus & status); + + virtual ::DDS::ReturnCode_t + get_requested_deadline_missed_status ( + ::DDS::RequestedDeadlineMissedStatus & status); + + virtual ::DDS::ReturnCode_t + get_requested_incompatible_qos_status ( + ::DDS::RequestedIncompatibleQosStatus & status); + + virtual ::DDS::ReturnCode_t + get_subscription_matched_status ( + ::DDS::SubscriptionMatchedStatus & status); + + virtual ::DDS::ReturnCode_t + get_sample_lost_status (::DDS::SampleLostStatus & status); + + virtual ::DDS::ReturnCode_t + wait_for_historical_data (const ::DDS::Duration_t & max_wait); + + virtual ::DDS::ReturnCode_t + get_matched_publications ( + ::DDS::InstanceHandleSeq & publication_handles); + + virtual ::DDS::ReturnCode_t + get_matched_publication_data ( + ::DDS::PublicationBuiltinTopicData & publication_data, + DDS_INSTANCE_HANDLE_T_IN publication_handle); + + DDSDataReader * get_impl (void); + + void set_impl (DDSDataReader * dr); + + private: + DDSDataReader * impl_; + + DDSDataReader * impl (void); + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderHandler_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderHandler_T.cpp new file mode 100644 index 00000000000..c7f51f3a2d6 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderHandler_T.cpp @@ -0,0 +1,67 @@ +// $Id$ + +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/logger/Log_Macros.h" + + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataReaderHandler_T<DDS_TYPE, CCM_TYPE>::DataReaderHandler_T ( + typename CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE>* drl, + ::DDS::DataReader_ptr dr) + : drl_ (drl), + dr_ (::DDS::DataReader::_duplicate (dr)) +{ + this->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataReaderHandler_T<DDS_TYPE, CCM_TYPE>::~DataReaderHandler_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +int +CIAO::DDS4CCM::DataReaderHandler_T<DDS_TYPE, CCM_TYPE>::handle_exception (ACE_HANDLE) +{ + try + { + this->drl_->on_data_available_i (this->dr_.in ()); + } + catch (...) + { + } + return 0; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataReaderStateHandler_T<DDS_TYPE, CCM_TYPE>::DataReaderStateHandler_T ( + typename CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE>* drl, + ::DDS::DataReader_ptr dr) + : drl_ (drl), + dr_ (::DDS::DataReader::_duplicate (dr)) +{ + this->reference_counting_policy ().value + (ACE_Event_Handler::Reference_Counting_Policy::ENABLED); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataReaderStateHandler_T<DDS_TYPE, CCM_TYPE>::~DataReaderStateHandler_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +int +CIAO::DDS4CCM::DataReaderStateHandler_T<DDS_TYPE, CCM_TYPE>::handle_exception (ACE_HANDLE) +{ + try + { + this->drl_->on_data_available_i (this->dr_.in ()); + } + catch (...) + { + } + return 0; +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderHandler_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderHandler_T.h new file mode 100644 index 00000000000..44d96bc24c2 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderHandler_T.h @@ -0,0 +1,63 @@ +// $Id$ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Eventhandler on orb thread, handling the + * received data from DDS. + */ + +#ifndef DDS4CCM_DATAREADERHANDLER_T_H +#define DDS4CCM_DATAREADERHANDLER_T_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Event_Handler.h" + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class DataReaderListener_T; + + template <typename DDS_TYPE, typename CCM_TYPE> + class DataReaderHandler_T : + public ACE_Event_Handler + { + public: + DataReaderHandler_T ( + typename CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE>* drl, + ::DDS::DataReader_ptr dr); + virtual ~DataReaderHandler_T (); + + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + typename CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE>* drl_; + ::DDS::DataReader_var dr_; + }; + + template <typename DDS_TYPE, typename CCM_TYPE> + class DataReaderStateListener_T; + + template <typename DDS_TYPE, typename CCM_TYPE> + class DataReaderStateHandler_T : + public ACE_Event_Handler + { + public: + DataReaderStateHandler_T ( + typename CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE>* drl, + ::DDS::DataReader_ptr dr); + virtual ~DataReaderStateHandler_T (); + + virtual int handle_exception (ACE_HANDLE fc = ACE_INVALID_HANDLE); + private: + typename CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE>* drl_; + ::DDS::DataReader_var dr_; + }; + } +} + +#include "dds4ccm/impl/dds/DataReaderHandler_T.cpp" + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener.cpp new file mode 100644 index 00000000000..2b6983ec63b --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener.cpp @@ -0,0 +1,159 @@ +// $Id$ + +#include "DataReaderListener.h" +#include "DataReader.h" + +#include "ndds/SampleLostStatus.h" +#include "ndds/SubscriptionMatchedStatus.h" +#include "ndds/RequestedDeadlineMissedStatus.h" +#include "ndds/SampleRejectedStatus.h" +#include "ndds/LivelinessChangedStatus.h" +#include "ndds/RequestedIncompatibleQosStatus.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_DataReaderListener_i::CCM_DDS_DataReaderListener_i (::DDS::DataReaderListener_ptr p) + : impl_ (::DDS::DataReaderListener::_duplicate (p)) + { + } + + CCM_DDS_DataReaderListener_i::~CCM_DDS_DataReaderListener_i (void) + { + } + + void + CCM_DDS_DataReaderListener_i::on_requested_deadline_missed ( + ::DDSDataReader* the_reader, + const ::DDS_RequestedDeadlineMissedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_DataReaderListener_i::on_requested_deadline_missed"); + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::RequestedDeadlineMissedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_requested_deadline_missed (dds_reader.in (), ddsstatus); +#else + this->impl_->on_requested_deadline_missed (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_DataReaderListener_i::on_requested_incompatible_qos ( + ::DDSDataReader* the_reader, + const ::DDS_RequestedIncompatibleQosStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_DataReaderListener_i::on_requested_incompatible_qos"); + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::RequestedIncompatibleQosStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_requested_incompatible_qos (dds_reader.in (), ddsstatus); +#else + this->impl_->on_requested_incompatible_qos (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_DataReaderListener_i::on_sample_rejected ( + ::DDSDataReader* the_reader, + const ::DDS_SampleRejectedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_DataReaderListener_i::on_sample_rejected"); + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::SampleRejectedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_sample_rejected (dds_reader.in (), ddsstatus); +#else + this->impl_->on_sample_rejected (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_DataReaderListener_i::on_liveliness_changed ( + ::DDSDataReader* the_reader, + const ::DDS_LivelinessChangedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_DataReaderListener_i::on_liveliness_changed"); + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::LivelinessChangedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_liveliness_changed (dds_reader.in (), ddsstatus); +#else + this->impl_->on_liveliness_changed (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_DataReaderListener_i::on_data_available(::DDSDataReader *the_reader) + { + DDS4CCM_TRACE ("CCM_DDS_DataReaderListener_i::on_data_available"); + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + this->impl_->on_data_available (dds_reader.in ()); +#else + this->impl_->on_data_available (dds_reader.in ()); +#endif + } + + void + CCM_DDS_DataReaderListener_i::on_subscription_matched ( + ::DDSDataReader* the_reader, + const ::DDS_SubscriptionMatchedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_DataReaderListener_i::on_subscription_matched"); + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::SubscriptionMatchedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_subscription_matched (dds_reader.in (), ddsstatus); +#else + this->impl_->on_subscription_matched (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_DataReaderListener_i::on_sample_lost ( + ::DDSDataReader* the_reader, + const ::DDS_SampleLostStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_DataReaderListener_i::on_sample_lost"); + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::SampleLostStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_sample_lost (dds_reader.in (), ddsstatus); +#else + this->impl_->on_sample_lost (dds_reader.in (), status); +#endif + } + + ::DDS::DataReaderListener_ptr + CCM_DDS_DataReaderListener_i::get_datareaderlistener (void) + { + return ::DDS::DataReaderListener::_duplicate (this->impl_.in ()); + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener.h new file mode 100644 index 00000000000..4a63e5a3571 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener.h @@ -0,0 +1,74 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DATAREADERLISTENER_H +#define DDS4CCM_DATAREADERLISTENER_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DataReaderListener DDSDataReaderListener; +typedef ::DDS::DataReader DDSDataReader; +typedef ::DDS::RequestedDeadlineMissedStatus DDS_RequestedDeadlineMissedStatus; +typedef ::DDS::LivelinessChangedStatus DDS_LivelinessChangedStatus; +typedef ::DDS::RequestedIncompatibleQosStatus DDS_RequestedIncompatibleQosStatus; +typedef ::DDS::SampleRejectedStatus DDS_SampleRejectedStatus; +typedef ::DDS::SubscriptionMatchedStatus DDS_SubscriptionMatchedStatus; +typedef ::DDS::SampleLostStatus DDS_SampleLostStatus; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_DataReaderListener_i : + public virtual ::DDSDataReaderListener + { + public: + /// Constructor + CCM_DDS_DataReaderListener_i (::DDS::DataReaderListener_ptr p); + + /// Destructor + virtual ~CCM_DDS_DataReaderListener_i (void); + + virtual void on_requested_deadline_missed(::DDSDataReader* reader, + const ::DDS_RequestedDeadlineMissedStatus& status); + + virtual void on_liveliness_changed(::DDSDataReader* reader, + const ::DDS_LivelinessChangedStatus& status); + + virtual void on_requested_incompatible_qos(::DDSDataReader* reader, + const ::DDS_RequestedIncompatibleQosStatus& status); + + virtual void on_sample_rejected(::DDSDataReader* reader, + const ::DDS_SampleRejectedStatus& status); + + virtual void on_data_available(::DDSDataReader* reader); + + virtual void on_sample_lost(::DDSDataReader* reader, + const ::DDS_SampleLostStatus& status); + + virtual void on_subscription_matched(::DDSDataReader* reader, + const ::DDS_SubscriptionMatchedStatus& status); + + ::DDS::DataReaderListener_ptr get_datareaderlistener (void); + private: + ::DDS::DataReaderListener_var impl_; + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener_T.cpp new file mode 100644 index 00000000000..e05f3dacaac --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener_T.cpp @@ -0,0 +1,179 @@ +// $Id$ +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "ace/Reactor.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE>::DataReaderListener_T ( + typename CCM_TYPE::listener_type::_ptr_type listener, + ::CCM_DDS::PortStatusListener_ptr port_status_listener, + ::CCM_DDS::DataListenerControl_ptr control, + ACE_Reactor* reactor) + : PortStatusListener_T <DDS_TYPE, CCM_TYPE> (port_status_listener, reactor) , + listener_ (CCM_TYPE::listener_type::_duplicate (listener)), + control_ (::CCM_DDS::DataListenerControl::_duplicate (control)) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataReaderListener_T::DataReaderListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE>::~DataReaderListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataReaderListener_T::~DataReaderListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE>::on_data_available(::DDS::DataReader_ptr rdr) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataReaderListener_T::on_data_available"); + + if (! ::CORBA::is_nil (this->control_.in ()) && this->control_->mode () != ::CCM_DDS::NOT_ENABLED) + { + if (this->reactor_) + { + drh* rh = 0; + ACE_NEW (rh, drh (this, rdr)); + + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("DataReaderListener_T::failed to use reactor.\n"))); + } + } + else + { + this->on_data_available_i (rdr); + } + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE>::on_data_available_i (::DDS::DataReader_ptr rdr) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataReaderListener_T::on_data_available_i"); + + if (::CORBA::is_nil (this->control_.in ()) || this->control_->mode () == ::CCM_DDS::NOT_ENABLED) + { + return; + } + + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i* rd = + dynamic_cast < ::CIAO::DDS4CCM::CCM_DDS_DataReader_i*>(rdr); + if (!rd) + { + /* In this specific case, this will never fail */ + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("DataReaderListener_T::dynamic_cast failed.\n"))); + return; + } + + typename DDS_TYPE::data_reader * reader = + dynamic_cast< typename DDS_TYPE::data_reader * > ((rd->get_impl ())); + + if (!reader) + { + /* In this specific case, this will never fail */ + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("DataReaderListener_T::narrow failed.\n"))); + return; + } + + typename DDS_TYPE::dds_seq_type data; + DDS_SampleInfoSeq sample_info; + ::DDS::ReturnCode_t const result = reader->take ( + data, + sample_info, + DDS_LENGTH_UNLIMITED, + DDS_NOT_READ_SAMPLE_STATE, + DDS_NEW_VIEW_STATE | DDS_NOT_NEW_VIEW_STATE, + DDS_ANY_INSTANCE_STATE); + if (result == DDS_RETCODE_NO_DATA) + { + return; + } + else if (result != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("Unable to take data from data reader, error %C.\n"), translate_retcode (result))); + return; + } + + if (this->control_->mode () == ::CCM_DDS::ONE_BY_ONE) + { + for (::DDS_Long i = 0; i < data.length (); ++i) + { + if (sample_info[i].valid_data) + { + ::CCM_DDS::ReadInfo info; + info <<= sample_info[i]; + this->listener_->on_one_data (data[i], info); + } + } + } + else + { + CORBA::ULong nr_of_samples = 0; + for (::DDS_Long i = 0 ; i < sample_info.length(); i++) + { + if (sample_info[i].valid_data) + { + ++nr_of_samples; + } + } + + if (nr_of_samples > 0) + { + typename CCM_TYPE::seq_type * inst_seq = 0; + ACE_NEW (inst_seq, + typename CCM_TYPE::seq_type (nr_of_samples)); + + ::CCM_DDS::ReadInfoSeq * infoseq = 0; + ACE_NEW (infoseq, + ::CCM_DDS::ReadInfoSeq (nr_of_samples)); + + infoseq->length (nr_of_samples); + inst_seq->length (nr_of_samples); + + // Copy the valid samples + CORBA::ULong ix = 0; + for (::DDS_Long i = 0 ; i < sample_info.length(); i++) + { + if(sample_info[i].valid_data) + { + (*infoseq)[ix] <<= sample_info[i]; + (*inst_seq)[ix] = data[i]; + ++ix; + } + } + this->listener_->on_many_data (*inst_seq, *infoseq); + } + } + + // Return the loan + DDS_ReturnCode_t const retval = reader->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DataReaderListener_T::on_data_available_i - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StatusMask +CIAO::DDS4CCM::DataReaderListener_T<DDS_TYPE, CCM_TYPE>::get_mask ( + typename CCM_TYPE::listener_type::_ptr_type listener) +{ + if (! ::CORBA::is_nil (listener) || CIAO_debug_level >= 10) + { + return ::DDS::DATA_AVAILABLE_STATUS | + ::DDS::REQUESTED_DEADLINE_MISSED_STATUS | + ::DDS::SAMPLE_LOST_STATUS; + } + else + { + return 0; + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener_T.h new file mode 100644 index 00000000000..07f63e29529 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderListener_T.h @@ -0,0 +1,58 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DATAREADERLISTENER_T_H +#define DDS4CCM_DATAREADERLISTENER_T_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" + +#include "dds4ccm/impl/dds/PortStatusListener_T.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL +class ACE_Reactor; +ACE_END_VERSIONED_NAMESPACE_DECL + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class DataReaderListener_T : + public PortStatusListener_T <DDS_TYPE, CCM_TYPE> + { + public: + /// Constructor + DataReaderListener_T ( + typename CCM_TYPE::listener_type::_ptr_type listener, + ::CCM_DDS::PortStatusListener_ptr port_status_listener, + ::CCM_DDS::DataListenerControl_ptr control, + ACE_Reactor* reactor); + + /// Destructor + virtual ~DataReaderListener_T (void); + + virtual void on_data_available( ::DDS::DataReader *rdr); + + static ::DDS::StatusMask get_mask ( + typename CCM_TYPE::listener_type::_ptr_type listener); + + void on_data_available_i ( ::DDS::DataReader *rdr); + + private: + typename CCM_TYPE::listener_type::_var_type listener_; + ::CCM_DDS::DataListenerControl_var control_; + + typedef ::CIAO::DDS4CCM::DataReaderHandler_T<DDS_TYPE, CCM_TYPE> drh; + }; + } +} + +#include "dds4ccm/impl/dds/DataReaderListener_T.cpp" + +#endif /* DDS4CCM_DATAREADERLISTENER_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderStateListener_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderStateListener_T.cpp new file mode 100644 index 00000000000..a110cff07ed --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderStateListener_T.cpp @@ -0,0 +1,251 @@ +// $Id$ +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds/DataReaderHandler_T.h" +#include "tao/ORB_Core.h" + +#include <vector> + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE>::DataReaderStateListener_T ( + typename CCM_TYPE::statelistener_type::_ptr_type listener, + ::CCM_DDS::PortStatusListener_ptr port_status_listener, + ::CCM_DDS::StateListenerControl_ptr control, + ACE_Reactor* reactor) + : PortStatusListener_T <DDS_TYPE, CCM_TYPE> (port_status_listener, reactor) , + listener_ (CCM_TYPE::statelistener_type::_duplicate (listener)), + control_ (::CCM_DDS::StateListenerControl::_duplicate (control)) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataReaderStateListener_T::DataReaderStateListener_T"); +} + +// Implementation skeleton destructor +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE>::~DataReaderStateListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataReaderStateListener_T::~DataReaderStateListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE>::on_data_available(::DDS::DataReader_ptr rdr) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataReaderStateListener_T::on_data_available"); + if (::CORBA::is_nil (this->control_.in ()) || this->control_->mode () == ::CCM_DDS::NOT_ENABLED) + return; + else + { + if (this->reactor_) + { + drsh* rh = 0; + ACE_NEW (rh, drsh (this, rdr)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("DataReaderStateHandler_T::failed to use reactor.\n"))); + } + } + else + { + this->on_data_available_i (rdr); + } + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE>::on_data_available_i (::DDS::DataReader_ptr rdr) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataReaderStateListener_T::on_data_available_i"); + + if (::CORBA::is_nil (this->control_.in ()) || this->control_->mode () == ::CCM_DDS::NOT_ENABLED) + return; + + ::CIAO::DDS4CCM::CCM_DDS_DataReader_i* rd = + dynamic_cast < ::CIAO::DDS4CCM::CCM_DDS_DataReader_i*>(rdr); + if (!rd) + { + /* In this specific case, this will never fail */ + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("DataReaderStateListener_T::dynamic_cast failed.\n"))); + return; + } + + typename DDS_TYPE::data_reader * reader = + dynamic_cast< typename DDS_TYPE::data_reader * > ((rd->get_impl ())); + + if (!reader) + { + /* In this specific case, this will never fail */ + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("DataReaderStateListener_T::narrow failed.\n"))); + return; + } + + try + { + typename DDS_TYPE::dds_seq_type data; + DDS_SampleInfoSeq sample_info; + ::DDS_Long max_samples = 0; + + this->control_->mode () == ::CCM_DDS::ONE_BY_ONE + ? max_samples = DDS_LENGTH_UNLIMITED + : this->control_->max_delivered_data() == 0 + ? max_samples = DDS_LENGTH_UNLIMITED + : max_samples = this->control_->max_delivered_data (); + + ::DDS::ReturnCode_t const result = reader->take ( + data, + sample_info, + max_samples, + DDS_NOT_READ_SAMPLE_STATE, + DDS_NEW_VIEW_STATE | DDS_NOT_NEW_VIEW_STATE, + DDS_ANY_INSTANCE_STATE); + if (result == DDS_RETCODE_NO_DATA) + return; + else if (result != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("Unable to take data from data reader, error %d.\n"), result)); + } + if (this->control_->mode () == ::CCM_DDS::ONE_BY_ONE) + { + for (::DDS_Long i = 0; i < data.length (); ++i) + { + // Sample data may not be valid anymore when + // deleted so don't check the valid_data flag + // here. + if (sample_info[i].instance_state == + ::DDS_NOT_ALIVE_DISPOSED_INSTANCE_STATE) + { + ::CCM_DDS::ReadInfo readinfo; + readinfo <<= sample_info[i]; + this->listener_->on_deletion (data[i], readinfo); + } + if (sample_info[i].valid_data) + { + if (sample_info[i].view_state == ::DDS_NEW_VIEW_STATE) + { + ::CCM_DDS::ReadInfo readinfo; + readinfo <<= sample_info[i]; + this->listener_->on_creation (data[i], readinfo); + } + else + { + ::CCM_DDS::ReadInfo info; + info <<= sample_info[i]; + this->listener_->on_one_update (data[i], info); + } + } + } + } + else if (this->control_->mode () == ::CCM_DDS::MANY_BY_MANY) + { + typedef std::vector<DDS_Long> Updates; + Updates updates; + + CORBA::ULong nr_of_updates = 0; + + for (::DDS_Long i = 0 ; i < sample_info.length(); i++) + { + if ((sample_info[i].valid_data && + sample_info[i].view_state == ::DDS_NEW_VIEW_STATE) || + sample_info[i].instance_state == ::DDS_NOT_ALIVE_DISPOSED_INSTANCE_STATE) + { + // Sample_new or sample_delete found -> first send out the + // updated samples in one go + typename CCM_TYPE::seq_type * inst_seq = 0; + ACE_NEW (inst_seq, typename CCM_TYPE::seq_type); + ::CCM_DDS::ReadInfoSeq * infoseq = 0; + ACE_NEW (infoseq, ::CCM_DDS::ReadInfoSeq); + + infoseq->length (nr_of_updates); + inst_seq->length (nr_of_updates); + CORBA::ULong ix = 0; + for(Updates::iterator iter = updates.begin(); + iter != updates.end(); + ++iter) + { + (*infoseq)[ix] <<= sample_info[*iter]; + (*inst_seq)[ix] = data[*iter]; + ++ix; + } + this->listener_->on_many_updates (*inst_seq, *infoseq); + // Now invoke on_creation or on_deletion + if (sample_info[i].valid_data && + sample_info[i].view_state == ::DDS_NEW_VIEW_STATE) + { + ::CCM_DDS::ReadInfo readinfo; + readinfo <<= sample_info[i]; + this->listener_->on_creation (data[i], readinfo); + } + else if (sample_info[i].instance_state == + ::DDS_NOT_ALIVE_DISPOSED_INSTANCE_STATE) + { + ::CCM_DDS::ReadInfo readinfo; + readinfo <<= sample_info[i]; + this->listener_->on_deletion (data[i], readinfo); + } + // Clean up + updates.clear (); + nr_of_updates = 0; + } + else if (sample_info[i].valid_data) + { + ++nr_of_updates; + updates.push_back (i); + } + } + // Send the latest updates. + if (updates.size () > 0) + { + typename CCM_TYPE::seq_type * inst_seq = 0; + ACE_NEW (inst_seq, typename CCM_TYPE::seq_type); + ::CCM_DDS::ReadInfoSeq * infoseq = 0; + ACE_NEW (infoseq, ::CCM_DDS::ReadInfoSeq); + + infoseq->length (nr_of_updates); + inst_seq->length (nr_of_updates); + CORBA::ULong ix = 0; + for(Updates::iterator iter = updates.begin(); + iter != updates.end(); + ++iter) + { + (*infoseq)[ix] <<= sample_info[*iter]; + (*inst_seq)[ix] = data[*iter]; + ++ix; + } + this->listener_->on_many_updates (*inst_seq, *infoseq); + } + } + // Return the loan + DDS_ReturnCode_t const retval = reader->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DataReaderStateListener_T::on_data_available_i - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + } + catch (...) + { + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StatusMask +CIAO::DDS4CCM::DataReaderStateListener_T<DDS_TYPE, CCM_TYPE>::get_mask ( + typename CCM_TYPE::statelistener_type::_ptr_type listener) +{ + if (! ::CORBA::is_nil (listener) || CIAO_debug_level >= 10) + { + return ::DDS::DATA_AVAILABLE_STATUS | + ::DDS::REQUESTED_DEADLINE_MISSED_STATUS | + ::DDS::SAMPLE_LOST_STATUS; + } + else + { + return 0; + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderStateListener_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderStateListener_T.h new file mode 100644 index 00000000000..18e1cf4bb3d --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataReaderStateListener_T.h @@ -0,0 +1,53 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DATAREADERSTATELISTENER_T_H +#define DDS4CCM_DATAREADERSTATELISTENER_T_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class DataReaderStateListener_T : + public PortStatusListener_T <DDS_TYPE, CCM_TYPE> + { + public: + /// Constructor + DataReaderStateListener_T ( + typename CCM_TYPE::statelistener_type::_ptr_type listener, + ::CCM_DDS::PortStatusListener_ptr port_status_listener, + ::CCM_DDS::StateListenerControl_ptr control, + ACE_Reactor* reactor); + + /// Destructor + virtual ~DataReaderStateListener_T (void); + + virtual void on_data_available (::DDS::DataReader_ptr rdr); + + static ::DDS::StatusMask get_mask ( + typename CCM_TYPE::statelistener_type::_ptr_type listener); + + void on_data_available_i (::DDS::DataReader_ptr rdr); + + private: + typename CCM_TYPE::statelistener_type::_var_type listener_; + ::CCM_DDS::StateListenerControl_var control_; + + typedef ::CIAO::DDS4CCM::DataReaderStateHandler_T<DDS_TYPE, CCM_TYPE> drsh; + }; + } +} + +#include "dds4ccm/impl/dds/DataReaderStateListener_T.cpp" + +#endif /* DDS4CCM_DATAREADERSTATELISTENER_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriter.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriter.cpp new file mode 100644 index 00000000000..36ac76acaf3 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriter.cpp @@ -0,0 +1,301 @@ +// $Id$ + +#include "DataWriter.h" +#include "StatusCondition.h" +#include "Publisher.h" +#include "DataWriterListener.h" +#include "Topic.h" + +#include "ndds/Duration_t.h" +#include "ndds/InstanceHandle_t.h" +#include "ndds/PublicationMatchedStatus.h" +#include "ndds/LivelinessLostStatus.h" +#include "ndds/OfferedIncompatibleQosStatus.h" +#include "ndds/OfferedDeadlineMissedStatus.h" +#include "ndds/InstanceHandleSeq.h" +#include "ndds/DataWriterQos.h" +#include "ndds/SubscriptionBuiltinTopicData.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_DataWriter_i::CCM_DDS_DataWriter_i (DDSDataWriter * dw) + : impl_ (dw) + { + } + + CCM_DDS_DataWriter_i::~CCM_DDS_DataWriter_i (void) + { + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::set_qos (const ::DDS::DataWriterQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_DataWriter_i::set_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataWriterQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl()->set_qos (ccm_dds_qos); +#else + return this->impl ()->set_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::get_qos (::DDS::DataWriterQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_DataWriter_i::get_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataWriterQos ccm_dds_qos; + ccm_dds_qos <<= qos; + ::DDS::ReturnCode_t retcode = this->impl()->get_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl ()->get_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::set_listener (::DDS::DataWriterListener_ptr a_listener, + ::DDS::StatusMask mask) + { + CCM_DDS_DataWriterListener_i* ccm_dds_impl_list = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_impl_list, + CCM_DDS_DataWriterListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + return this->impl ()->set_listener (ccm_dds_impl_list, mask); + } + + ::DDS::DataWriterListener_ptr + CCM_DDS_DataWriter_i::get_listener (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDSDataWriterListener *wr = this->impl ()->get_listener (); + CCM_DDS_DataWriterListener_i *list_proxy = dynamic_cast <CCM_DDS_DataWriterListener_i *> (wr); + if (!list_proxy) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, "CCM_DDS_DataWriter_i::get_listener - " + "DDS returned a NIL listener.\n")); + return ::DDS::DataWriterListener::_nil (); + } + return list_proxy->get_datawriterlistener (); +#else + return this->impl ()->get_listener (); +#endif + } + + ::DDS::Topic_ptr + CCM_DDS_DataWriter_i::get_topic (void) + { + ::DDS::Topic_var retval = ::DDS::Topic::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSTopic* t = this->impl ()->get_topic (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Topic_i (t), + CORBA::NO_MEMORY ()); +#else + ::DDS::Topic_var t = this->impl ()->get_topic (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Topic_i (t.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + ::DDS::Publisher_ptr + CCM_DDS_DataWriter_i::get_publisher (void) + { + ::DDS::Publisher_var retval = ::DDS::Publisher::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSPublisher* p = this->impl ()->get_publisher (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Publisher_i (p), + CORBA::NO_MEMORY ()); +#else + ::DDS::Publisher_var p = this->impl ()->get_publisher (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Publisher_i (p.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::wait_for_acknowledgments (const ::DDS::Duration_t & max_wait) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_Duration_t rtiduration; + rtiduration <<= max_wait; + return this->impl ()->wait_for_acknowledgments (rtiduration); +#else + return this->impl ()->wait_for_acknowledgments (max_wait); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::get_liveliness_lost_status (::DDS::LivelinessLostStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_LivelinessLostStatus ddsstatus; + ddsstatus <<= status; + ::DDS::ReturnCode_t const retval = this->impl ()->get_liveliness_lost_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_liveliness_lost_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::get_offered_deadline_missed_status (::DDS::OfferedDeadlineMissedStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_OfferedDeadlineMissedStatus ddsstatus; + ddsstatus <<= status; + ::DDS::ReturnCode_t const retval = this->impl ()->get_offered_deadline_missed_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_offered_deadline_missed_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::get_offered_incompatible_qos_status (::DDS::OfferedIncompatibleQosStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_OfferedIncompatibleQosStatus ddsstatus; + ddsstatus <<= status; + ::DDS::ReturnCode_t const retval = this->impl ()->get_offered_incompatible_qos_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_offered_incompatible_qos_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::get_publication_matched_status (::DDS::PublicationMatchedStatus & status) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_PublicationMatchedStatus ddsstatus; + ddsstatus <<= status; + ::DDS::ReturnCode_t const retval = this->impl ()->get_publication_matched_status (ddsstatus); + status <<= ddsstatus; + return retval; +#else + return this->impl ()->get_publication_matched_status (status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::assert_liveliness (void) + { + return this->impl ()->assert_liveliness (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::get_matched_subscriptions (::DDS::InstanceHandleSeq & subscription_handles) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandleSeq rtiseq; + rtiseq <<= subscription_handles; + ::DDS::ReturnCode_t const retval = this->impl ()->get_matched_subscriptions (rtiseq); + subscription_handles <<= rtiseq; + return retval; +#else + return this->impl ()->get_matched_subscriptions (subscription_handles); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::get_matched_subscription_data (::DDS::SubscriptionBuiltinTopicData & subscription_data, + DDS_INSTANCE_HANDLE_T_IN subscription_handle) + { + DDS4CCM_TRACE ("CCM_DDS_DataWriter_i::get_matched_subscription_data"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_SubscriptionBuiltinTopicData ccm_dds_sub_data; + ::DDS_InstanceHandle_t ccm_dds_sub_handle; + ccm_dds_sub_handle <<= subscription_handle; + ::DDS::ReturnCode_t const retval = this->impl ()->get_matched_subscription_data (ccm_dds_sub_data, + ccm_dds_sub_handle); + subscription_data <<= ccm_dds_sub_data; + return retval; +#else + return this->impl ()->get_matched_subscription_data (subscription_data, subscription_handle); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DataWriter_i::enable (void) + { + return this->impl ()->enable (); + } + + ::DDS::StatusCondition_ptr + CCM_DDS_DataWriter_i::get_statuscondition (void) + { + ::DDS::StatusCondition_var retval = ::DDS::StatusCondition::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSStatusCondition* sc = this->impl ()->get_statuscondition (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc), + CORBA::NO_MEMORY ()); +#else + ::DDS::StatusCondition_var sc = this->impl ()->get_statuscondition (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + ::DDS::StatusMask + CCM_DDS_DataWriter_i::get_status_changes (void) + { + return this->impl ()->get_status_changes (); + } + + DDS_INSTANCE_HANDLE_T_RETN + CCM_DDS_DataWriter_i::get_instance_handle (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t const rtihandle = this->impl ()->get_instance_handle (); + ::DDS::InstanceHandle_t handle; + handle <<= rtihandle; + return handle; +#else + return this->impl ()->get_instance_handle (); +#endif + } + + DDSDataWriter * + CCM_DDS_DataWriter_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_DataWriter_i::set_impl (DDSDataWriter * dw) + { + this->impl_ = dw; + } + + DDSDataWriter * + CCM_DDS_DataWriter_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriter.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriter.h new file mode 100644 index 00000000000..fee440bf112 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriter.h @@ -0,0 +1,113 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DATAWRITER_H +#define DDS4CCM_DATAWRITER_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds/ndds/InstanceHandle_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" +#include "tao/LocalObject.h" + +#if (CIAO_DDS4CCM_NDDS==1) +#include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DataWriter DDSDataWriter; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_DataWriter_i + : public virtual ::DDS::CCM_DataWriter, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_DataWriter_i (DDSDataWriter * dw); + + /// Destructor + virtual ~CCM_DDS_DataWriter_i (void); + + virtual + ::DDS::ReturnCode_t set_qos (const ::DDS::DataWriterQos & qos); + + virtual + ::DDS::ReturnCode_t get_qos (::DDS::DataWriterQos & qos); + + virtual + ::DDS::ReturnCode_t set_listener (::DDS::DataWriterListener_ptr a_listener, + ::DDS::StatusMask mask); + + virtual + ::DDS::DataWriterListener_ptr get_listener (void); + + virtual + ::DDS::Topic_ptr get_topic (void); + + virtual + ::DDS::Publisher_ptr get_publisher (void); + + virtual + ::DDS::ReturnCode_t wait_for_acknowledgments (const ::DDS::Duration_t & max_wait); + + virtual + ::DDS::ReturnCode_t get_liveliness_lost_status (::DDS::LivelinessLostStatus & status); + + virtual + ::DDS::ReturnCode_t get_offered_deadline_missed_status (::DDS::OfferedDeadlineMissedStatus & status); + + virtual + ::DDS::ReturnCode_t get_offered_incompatible_qos_status (::DDS::OfferedIncompatibleQosStatus & status); + + virtual + ::DDS::ReturnCode_t get_publication_matched_status (::DDS::PublicationMatchedStatus & status); + + virtual + ::DDS::ReturnCode_t assert_liveliness (void); + + virtual + ::DDS::ReturnCode_t get_matched_subscriptions (::DDS::InstanceHandleSeq & subscription_handles); + + virtual + ::DDS::ReturnCode_t get_matched_subscription_data (::DDS::SubscriptionBuiltinTopicData & subscription_data, + DDS_INSTANCE_HANDLE_T_IN subscription_handle); + + virtual + ::DDS::ReturnCode_t enable (void); + + virtual + ::DDS::StatusCondition_ptr get_statuscondition (void); + + virtual + ::DDS::StatusMask get_status_changes (void); + + virtual + DDS_INSTANCE_HANDLE_T_RETN get_instance_handle (void); + + DDSDataWriter * get_impl (void); + + void set_impl (DDSDataWriter * dw); + + private: + DDSDataWriter * impl_; + + DDSDataWriter * impl (void); + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener.cpp new file mode 100644 index 00000000000..13416d987e7 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener.cpp @@ -0,0 +1,108 @@ +// $Id$ + +#include "DataWriterListener.h" +#include "DataWriter.h" +#include "ndds/PublicationMatchedStatus.h" +#include "ndds/LivelinessLostStatus.h" +#include "ndds/OfferedIncompatibleQosStatus.h" +#include "ndds/OfferedDeadlineMissedStatus.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_DataWriterListener_i::CCM_DDS_DataWriterListener_i (::DDS::DataWriterListener_ptr s) + : impl_ (::DDS::DataWriterListener::_duplicate (s)) + { + } + + CCM_DDS_DataWriterListener_i::~CCM_DDS_DataWriterListener_i (void) + { + } + + void + CCM_DDS_DataWriterListener_i::on_offered_deadline_missed ( + ::DDSDataWriter *the_writer, + const ::DDS_OfferedDeadlineMissedStatus & status) + { + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::OfferedDeadlineMissedStatus ddsstatus; + ddsstatus <<= status; + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (the_writer)); + this->impl_->on_offered_deadline_missed (dds_writer.in (), ddsstatus); +#else + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (the_writer)); + this->impl_->on_offered_deadline_missed (dds_writer.in (), status); +#endif + } + + void + CCM_DDS_DataWriterListener_i::on_offered_incompatible_qos ( + ::DDSDataWriter *the_writer, + const ::DDS_OfferedIncompatibleQosStatus & status) + { + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::OfferedIncompatibleQosStatus ddsstatus; + ddsstatus <<= status; + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (the_writer)); + this->impl_->on_offered_incompatible_qos (dds_writer.in (), ddsstatus); +#else + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (the_writer)); + this->impl_->on_offered_incompatible_qos (dds_writer.in (), status); +#endif + } + + void + CCM_DDS_DataWriterListener_i::on_liveliness_lost ( + ::DDSDataWriter *the_writer, + const ::DDS_LivelinessLostStatus & status) + { + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::LivelinessLostStatus ddsstatus; + ddsstatus <<= status; + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (the_writer)); + this->impl_->on_liveliness_lost (dds_writer.in (), ddsstatus); +#else + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (the_writer)); + this->impl_->on_liveliness_lost (dds_writer.in (), status); +#endif + } + + void + CCM_DDS_DataWriterListener_i::on_publication_matched ( + ::DDSDataWriter *the_writer, + const ::DDS_PublicationMatchedStatus & status) + { + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::PublicationMatchedStatus ddsstatus; + ddsstatus <<= status; + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (the_writer)); + this->impl_->on_publication_matched (dds_writer.in (), ddsstatus); +#else + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (the_writer)); + this->impl_->on_publication_matched (dds_writer.in (), status); +#endif + } + + ::DDS::DataWriterListener_ptr + CCM_DDS_DataWriterListener_i::get_datawriterlistener (void) + { + return ::DDS::DataWriterListener::_duplicate (this->impl_.in ()); + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener.h new file mode 100644 index 00000000000..3947cdf04da --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener.h @@ -0,0 +1,71 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DATAWRITERLISTENER_H +#define DDS4CCM_DATAWRITERLISTENER_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DataWriterListener DDSDataWriterListener; +typedef ::DDS::DataWriter DDSDataWriter; +typedef ::DDS::OfferedDeadlineMissedStatus DDS_OfferedDeadlineMissedStatus; +typedef ::DDS::OfferedIncompatibleQosStatus DDS_OfferedIncompatibleQosStatus; +typedef ::DDS::LivelinessLostStatus DDS_LivelinessLostStatus; +typedef ::DDS::PublicationMatchedStatus DDS_PublicationMatchedStatus; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_DataWriterListener_i : + public virtual ::DDSDataWriterListener + { + public: + /// Constructor + CCM_DDS_DataWriterListener_i (::DDS::DataWriterListener_ptr p); + + /// Destructor + virtual ~CCM_DDS_DataWriterListener_i (void); + + virtual void on_offered_deadline_missed ( + ::DDSDataWriter *the_writer, + const ::DDS_OfferedDeadlineMissedStatus & status); + + virtual void on_offered_incompatible_qos ( + ::DDSDataWriter *the_writer, + const ::DDS_OfferedIncompatibleQosStatus & status); + + virtual void on_liveliness_lost ( + ::DDSDataWriter *the_writer, + const ::DDS_LivelinessLostStatus & status); + + virtual void on_publication_matched ( + ::DDSDataWriter *the_writer, + const ::DDS_PublicationMatchedStatus & status); + + ::DDS::DataWriterListener_ptr get_datawriterlistener (void); + private: + ::DDS::DataWriterListener_var impl_; + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener_T.cpp new file mode 100644 index 00000000000..967058bfae5 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener_T.cpp @@ -0,0 +1,76 @@ +// $Id$ +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/DataWriter.h" +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::DataWriterListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataWriterListener_T::DataWriterListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::~DataWriterListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataWriterListener_T::~DataWriterListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::on_offered_deadline_missed ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedDeadlineMissedStatus &) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::on_offered_incompatible_qos ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedIncompatibleQosStatus &) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::on_liveliness_lost ( + ::DDS::DataWriter_ptr , + const ::DDS::LivelinessLostStatus &) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::on_publication_matched ( + ::DDS::DataWriter_ptr , + const ::DDS::PublicationMatchedStatus &) +{ +} + +#if (CIAO_DDS4CCM_NDDS==1) +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::on_reliable_writer_cache_changed ( + ::DDS::DataWriter_ptr , + const ::DDS::ReliableWriterCacheChangedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::on_reliable_reader_activity_changed ( + ::DDS::DataWriter_ptr , + const ::DDS::ReliableReaderActivityChangedStatus &) +{ +} +#endif + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StatusMask +CIAO::DDS4CCM::DataWriterListener_T<DDS_TYPE, CCM_TYPE>::get_mask (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DataWriterListener_T::get_mask"); + return 0; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener_T.h new file mode 100644 index 00000000000..d6ec727260a --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DataWriterListener_T.h @@ -0,0 +1,72 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_DATAWRITERLISTENER_T +#define DDS_DATAWRITERLISTENER_T + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#include "ace/Copy_Disabled.h" + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class DataWriterListener_T : + public ::DDS::DataWriterListener, + private ACE_Copy_Disabled + { + public: + /// Constructor + DataWriterListener_T (void); + + /// Destructor + virtual ~DataWriterListener_T (void); + + virtual void + on_offered_deadline_missed ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedDeadlineMissedStatus & ); + + virtual void + on_offered_incompatible_qos ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedIncompatibleQosStatus & ); + + virtual void + on_liveliness_lost ( + ::DDS::DataWriter_ptr , + const ::DDS::LivelinessLostStatus & ); + + virtual void + on_publication_matched ( + ::DDS::DataWriter_ptr , + const ::DDS::PublicationMatchedStatus & ); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual void + on_reliable_writer_cache_changed ( + ::DDS::DataWriter_ptr , + const ::DDS::ReliableWriterCacheChangedStatus & ); + + virtual void + on_reliable_reader_activity_changed ( + ::DDS::DataWriter_ptr , + const ::DDS::ReliableReaderActivityChangedStatus & ); +#endif + + static ::DDS::StatusMask get_mask (void); + }; + } +} + +#include "dds4ccm/impl/dds/DataWriterListener_T.cpp" + +#endif /* DDS_DATAWRITERLISTENER_T */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipant.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipant.cpp new file mode 100644 index 00000000000..a30cdb58125 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipant.cpp @@ -0,0 +1,1132 @@ +// $Id$ + +#include "DomainParticipant.h" +#include "Subscriber.h" +#include "Publisher.h" +#include "ContentFilteredTopic.h" +#include "Topic.h" +#include "TopicDescription.h" +#include "Utils.h" +#include "StatusCondition.h" +#include "PublisherListener.h" +#include "SubscriberListener.h" +#include "TopicListener.h" +#include "DomainParticipantListener.h" + +#include "ndds/PublisherQos.h" +#include "ndds/SubscriberQos.h" +#include "ndds/TopicQos.h" +#include "ndds/DomainParticipantQos.h" +#include "ndds/InstanceHandle_t.h" +#include "ndds/Duration_t.h" +#include "ndds/Time_t.h" +#include "ndds/InstanceHandleSeq.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_DomainParticipant_i::CCM_DDS_DomainParticipant_i ( + DDSDomainParticipant * dp) : impl_ (dp) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipant_i::CCM_DDS_DomainParticipant_i"); + } + + CCM_DDS_DomainParticipant_i::~CCM_DDS_DomainParticipant_i (void) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipant_i::~CCM_DDS_DomainParticipant_i"); + } + +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::Publisher_ptr + CCM_DDS_DomainParticipant_i::create_publisher_with_profile ( + const char* library_name, + const char *profile_name, + ::DDS::PublisherListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::create_publisher_with_profile"); + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::create_publisher_with_profile - " + "Creating Publisher\n")); + CCM_DDS_PublisherListener_i *ccm_dds_pl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_pl, + CCM_DDS_PublisherListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + DDSPublisher * ccm_dds_pub = + this->impl ()->create_publisher_with_profile (library_name, + profile_name, + ccm_dds_pl, + mask); + + if (!ccm_dds_pub) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::create_publisher_with_profile - " + "Error: Unable to create Publisher\n")); + delete ccm_dds_pl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + ::DDS::Publisher_var retval = ::DDS::Publisher::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Publisher_i (ccm_dds_pub), + CORBA::NO_MEMORY ()); + + + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_DomainParticipant_i::create_publisher_with_profile - " + "Successfully created a DDSPublisher\n")); + + ccm_dds_pub->enable (); + return retval._retn (); + } +#endif + + ::DDS::Publisher_ptr + CCM_DDS_DomainParticipant_i::create_publisher ( + const ::DDS::PublisherQos & qos, + ::DDS::PublisherListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::create_publisher"); +#if (CIAO_DDS4CCM_NDDS==1) + ACE_UNUSED_ARG (qos); + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::create_publisher - " + "Creating Publisher\n")); + + DDS_PublisherQos ccm_dds_qos = DDS_PUBLISHER_QOS_DEFAULT; + + CCM_DDS_PublisherListener_i *ccm_dds_pl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_pl, + CCM_DDS_PublisherListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + + DDSPublisher * ccm_dds_pub = + this->impl ()->create_publisher (ccm_dds_qos, + ccm_dds_pl, + mask); + + if (!ccm_dds_pub) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::create_publisher - " + "Error: Unable to create Publisher\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + ::DDS::Publisher_var retval = ::DDS::Publisher::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Publisher_i (ccm_dds_pub), + CORBA::NO_MEMORY ()); + + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_DomainParticipant_i::create_publisher - " + "Successfully created a DDSPublisher\n")); + + ccm_dds_pub->enable (); + return retval._retn (); +#else + return this->impl ()->create_publisher (qos, a_listener, mask); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::delete_publisher (::DDS::Publisher_ptr p) + { + CCM_DDS_Publisher_i *ccm_dds_pub = dynamic_cast < CCM_DDS_Publisher_i * > (p); + + if (!ccm_dds_pub) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::delete_publisher - " + "Unable to cast provided object reference to servant pointer.\n")); + return ::DDS::RETCODE_ERROR; + } + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::delete_publisher - " + "Successfully casted provided object reference to CCM_DDS_Publisher_i\n")); + + DDS_ReturnCode_t const retval = this->impl ()->delete_publisher (ccm_dds_pub->get_impl ()); + + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::delete_publisher - " + "Error: RTI delete_publisher returned non-ok error code %C\n", + translate_retcode (retval))); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_DomainParticipant_i::delete_publisher - " + "Provided publisher successfully deleted\n")); + } + + return retval; + } + +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::Subscriber_ptr + CCM_DDS_DomainParticipant_i::create_subscriber_with_profile ( + const char* library_name, + const char *profile_name, + ::DDS::SubscriberListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::create_subscriber_with_profile"); + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::create_subscriber_with_profile - " + "Creating Subscriber\n")); + + CCM_DDS_SubscriberListener_i *ccm_dds_sl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_sl, + CCM_DDS_SubscriberListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + DDSSubscriber * ccm_dds_sub = + this->impl ()->create_subscriber_with_profile ( + library_name, + profile_name, + ccm_dds_sl, + mask); + + if (!ccm_dds_sub) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::create_subscriber_with_profile - " + "Error: Unable to create Subscriber\n")); + delete ccm_dds_sl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + ::DDS::Subscriber_var retval = ::DDS::Subscriber::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Subscriber_i (ccm_dds_sub), + CORBA::NO_MEMORY ()); + + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_DomainParticipant_i::create_subscriber_with_profile - " + "Successfully created a DDSSubscriber\n")); + + ccm_dds_sub->enable (); + return retval._retn (); + } +#endif + + ::DDS::Subscriber_ptr + CCM_DDS_DomainParticipant_i::create_subscriber (const ::DDS::SubscriberQos & qos, + ::DDS::SubscriberListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::create_subscriber"); + +#if (CIAO_DDS4CCM_NDDS==1) + ACE_UNUSED_ARG (qos); + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::create_subscriber - " + "Creating Subscriber\n")); + + CCM_DDS_SubscriberListener_i *ccm_dds_sl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_sl, + CCM_DDS_SubscriberListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + + DDS_SubscriberQos ccm_dds_qos = DDS_SUBSCRIBER_QOS_DEFAULT; + DDSSubscriber * ccm_dds_sub = + this->impl ()->create_subscriber (ccm_dds_qos, + ccm_dds_sl, + mask); + + if (!ccm_dds_sub) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::create_subscriber - " + "Error: Unable to create Subscriber\n")); + delete ccm_dds_sl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + ::DDS::Subscriber_var retval = ::DDS::Subscriber::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Subscriber_i (ccm_dds_sub), + CORBA::NO_MEMORY ()); + + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_DomainParticipant_i::create_subscriber - " + "Successfully created a DDSSubscriber\n")); + + ccm_dds_sub->enable (); + return retval._retn (); +#else + return this->impl ()->create_subscriber (qos, a_listener, mask); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::delete_subscriber (::DDS::Subscriber_ptr s) + { +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_Subscriber_i *ccm_dds_sub = dynamic_cast < CCM_DDS_Subscriber_i * > (s); + + if (!ccm_dds_sub) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::delete_subscriber - " + "Unable to cast provided object reference to servant pointer.\n")); + return ::DDS::RETCODE_ERROR; + } + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::delete_subscriber - " + "Successfully casted provided object reference to CCM_DDS_Subscriber_i\n")); + + DDS_ReturnCode_t const retval = this->impl ()->delete_subscriber (ccm_dds_sub->get_impl ()); + + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::delete_subscriber - " + "Error: RTI delete_subscriber returned non-ok error code %C\n", + translate_retcode (retval))); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_DomainParticipant_i::delete_subscriber - " + "Provided subscriber successfully deleted\n")); + } + + return retval; +#else + return this->impl ()->delete_subscriber (s); +#endif + } + + ::DDS::Subscriber_ptr + CCM_DDS_DomainParticipant_i::get_builtin_subscriber (void) + { + ::DDS::Subscriber_var retval = ::DDS::Subscriber::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSSubscriber* sub = this->impl ()->get_builtin_subscriber (); + if (sub) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_Subscriber_i (sub), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::Subscriber_var sub = this->impl ()->get_builtin_subscriber (); + if (! ::CORBA::is_nil (sub.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_Subscriber_i (sub.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + ::DDS::Topic_ptr + CCM_DDS_DomainParticipant_i::create_topic (const char * impl_name, + const char * type_name, + const ::DDS::TopicQos & qos, + ::DDS::TopicListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::create_topic"); + +#if (CIAO_DDS4CCM_NDDS==1) + ACE_UNUSED_ARG (qos); + + if (impl_name == 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "DDS_DomainParticipant_i::create_topic - " + "Error: provided nil topic name\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_BAD_PARAMETER, + 0); + } + + if (type_name == 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "DDS_DomainParticipant_i::create_topic - " + "Error: provided nil type name\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_BAD_PARAMETER, + 0); + } + + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "DDS_DomainParticipant_i::create_topic - " + "Attempting to create topic with name %C and type %C\n", + impl_name, type_name)); + + CCM_DDS_TopicListener_i *ccm_dds_tl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_tl, + CCM_DDS_TopicListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + + DDS_TopicQos ccm_dds_qos = DDS_TOPIC_QOS_DEFAULT; + + ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, _guard, + this->tps_mutex_, CORBA::INTERNAL ()); + { + CCM_DDS_Topic_i *ccm_dds_tp = this->tps_[impl_name]; + + if (!ccm_dds_tp) + { + DDSTopic *dds_topic = this->impl ()->create_topic (impl_name, + type_name, + ccm_dds_qos, + ccm_dds_tl, + mask); + + if (dds_topic == 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "DDS_DomainParticipant_i::create_topic - " + "Error: RTI DDS returned a nil topic\n")); + delete ccm_dds_tl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + ::DDS::Topic_var retval = ::DDS::Topic::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Topic_i (dds_topic), + CORBA::NO_MEMORY ()); + + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "DDS_DomainParticipant_i::create_topic - " + "Successfully created topic with name %C and type %C\n", + impl_name, type_name)); + + ccm_dds_tp = dynamic_cast < CCM_DDS_Topic_i *> (retval.in ()); + ccm_dds_tp->set_impl (dds_topic); + + this->tps_[impl_name] = ccm_dds_tp; + + return retval._retn (); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "DDS_DomainParticipant_i::create_topic_with_profile - " + "Re-using topic with name %C and type %C.\n", + impl_name, type_name)); + + return ::DDS::Topic::_duplicate (ccm_dds_tp); + } + } +#else + return this->impl ()->create_topic (impl_name, + type_name, + qos, + a_listener, + mask); +#endif + } + +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::Topic_ptr + CCM_DDS_DomainParticipant_i::create_topic_with_profile ( + const char *impl_name, + const char *type_name, + const char *library_name, + const char *profile_name, + ::DDS::TopicListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::create_topic_with_profile"); + + if (impl_name == 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "DDS_DomainParticipant_i::create_topic_with_profile - " + "Error: provided nil topic name\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_BAD_PARAMETER, 0); + } + + if (type_name == 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "DDS_DomainParticipant_i::create_topic_with_profile - " + "Error: provided nil type name\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_BAD_PARAMETER, 0); + } + + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "DDS_DomainParticipant_i::create_topic_with_profile - " + "Attempting to create topic with name %C and type %C\n", + impl_name, type_name)); + + CCM_DDS_TopicListener_i *ccm_dds_tl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_tl, + CCM_DDS_TopicListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + + ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, _guard, + this->tps_mutex_, CORBA::INTERNAL ()); + { + CCM_DDS_Topic_i *ccm_dds_tp = this->tps_[impl_name]; + + if (!ccm_dds_tp) + { + DDSTopic *dds_topic = this->impl ()->create_topic_with_profile ( + impl_name, + type_name, + library_name, + profile_name, + ccm_dds_tl, + mask); + + if (dds_topic == 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "DDS_DomainParticipant_i::create_topic_with_profile - " + "Error: RTI DDS returned a nil topic\n")); + delete ccm_dds_tl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + ::DDS::Topic_var retval = ::DDS::Topic::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_Topic_i (dds_topic), + CORBA::NO_MEMORY ()); + + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "DDS_DomainParticipant_i::create_topic_with_profile - " + "Successfully created topic with name %C and type %C\n", + impl_name, type_name)); + + ccm_dds_tp = dynamic_cast < CCM_DDS_Topic_i *> (retval.in ()); + ccm_dds_tp->set_impl (dds_topic); + + this->tps_[impl_name] = ccm_dds_tp; + + return retval._retn (); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "DDS_DomainParticipant_i::create_topic_with_profile - " + "Re-using topic with name %C and type %C.\n", + impl_name, type_name)); + return ::DDS::Topic::_duplicate (ccm_dds_tp); + } + } + } +#endif + + bool + CCM_DDS_DomainParticipant_i::remove_topic (CCM_DDS_Topic_i * topic) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipant_i::remove_topic"); + + ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, _guard, + this->tps_mutex_, CORBA::INTERNAL ()); + + if (topic->_refcount_value () == 1) + { + Topics::iterator pos; + for (pos = this->tps_.begin(); pos != this->tps_.end(); ++pos) + { + if (pos->second == topic) + { + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::remove_topic - " + "Removing topic for %C from list.\n", + pos->first.c_str ())); + this->tps_.erase (pos->first); + break; + } + } + } + else + { + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::remove_topic - " + "Don't delete topic %C since it's still used - ref_count <%d>\n", + topic->get_name (), + topic->_refcount_value ())); + return false; + } + return true; + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::delete_topic (::DDS::Topic_ptr a_topic) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::delete_topic"); + const char * topic_name = a_topic->get_name (); + CCM_DDS_Topic_i *top = this->tps_[topic_name]; + + if (!top) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::delete_topic <%C> - " + "Unable to cast provided object reference to servant.\n", + topic_name)); + return ::DDS::RETCODE_BAD_PARAMETER; + } + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipant_i::delete_topic <%C> - " + "Successfully casted provided object reference to servant.\n", + topic_name)); + + ::DDS::ReturnCode_t retval = DDS::RETCODE_OK; + if (this->remove_topic (top)) + { + ::DDS::TopicDescription_var td = + lookup_topicdescription (ACE_TEXT ("DDS4CCMContentFilteredTopic")); + if (! ::CORBA::is_nil (td.in ())) + { + ::DDS::ContentFilteredTopic_var cft = ::DDS::ContentFilteredTopic::_narrow (td.in ()); + if (! ::CORBA::is_nil (cft.in ())) + { + ::DDS::ReturnCode_t const ret = this->delete_contentfilteredtopic (cft.in ()); + if (ret != ::DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::delete_topic <%C> - " + "Unable to delete ContentFilteredTopic. Retval is %C.\n", + topic_name, + translate_retcode (ret))); + } + } + } + retval = this->impl ()->delete_topic (top->get_impl ()); + + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::delete_topic <%C> - " + "Error: RTI delete_topic returned non-ok error code %C\n", + topic_name, + translate_retcode (retval))); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_DomainParticipant_i::delete_topic <%C> - " + "Provided topic successfully deleted\n", + topic_name)); + } + } + return retval; + } + + ::DDS::Topic_ptr + CCM_DDS_DomainParticipant_i::find_topic (const char * impl_name, + const ::DDS::Duration_t & timeout) + { + ::DDS::Topic_var retval = ::DDS::Topic::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_Duration_t ddstimeout; + ddstimeout <<= timeout; + ::DDSTopic* topic = this->impl ()->find_topic (impl_name, ddstimeout); + if (topic) + { + ACE_NEW_RETURN (retval, + CCM_DDS_Topic_i (topic), + ::DDS::Topic::_nil ()); + } +#else + ::DDS::Topic_var topic = this->impl ()->find_topic (impl_name, timeout); + if (! ::CORBA::is_nil (topic.in ()) + { + ACE_NEW_RETURN (retval, + CCM_DDS_Topic_i (topic.in ()), + ::DDS::Topic::_nil ()); + } +#endif + return retval._retn (); + } + + ::DDS::TopicDescription_ptr + CCM_DDS_DomainParticipant_i::lookup_topicdescription (const char * name) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipant_i::lookup_topicdescription"); + + DDS4CCM_DEBUG (7, (LM_DEBUG, CLINFO "Looking up topic: name <%C>\n", + name)); + + ::DDS::TopicDescription_var retval = ::DDS::TopicDescription::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDSTopicDescription* topic = this->impl ()->lookup_topicdescription (name); + if (topic) + { + // Check the entity: is it a Topic or a ContentFilteredTopic + ::DDSTopic * tp = dynamic_cast < ::DDSTopic *> (topic); + if (tp) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_Topic_i (tp), + CORBA::NO_MEMORY ()); + } + else + { + ::DDSContentFilteredTopic * cftp = + dynamic_cast < ::DDSContentFilteredTopic *>(topic); + if (cftp) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_ContentFilteredTopic_i (cftp), + CORBA::NO_MEMORY ()); + } + } + } +#else + ::DDSTopicDescription_var topic = this->impl ()->lookup_topicdescription (name); + if (!CORBA::is_ni (topic.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_TopicDescription_i (topic.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + ::DDS::ContentFilteredTopic_ptr + CCM_DDS_DomainParticipant_i::create_contentfilteredtopic (const char * name, + ::DDS::Topic_ptr related_topic, + const char * filter_expression, + const ::DDS::StringSeq & expression_parameters) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::create_contentfilteredtopic"); + +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_Topic_i *top = dynamic_cast< CCM_DDS_Topic_i *> (related_topic); + if (!top) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::create_contentfilteredtopic - " + "Unable to cast provided topic.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + const char** parameterlist = 0; + ACE_NEW_THROW_EX (parameterlist, + const char*[expression_parameters.length ()], + CORBA::NO_MEMORY ()); + + for (CORBA::ULong i = 0; i < expression_parameters.length (); ++i) + { + parameterlist[i] = expression_parameters[i].in (); + } + DDS_StringSeq parameters (expression_parameters.length ()); + parameters.from_array (parameterlist, expression_parameters.length ()); + + DDSContentFilteredTopic * ccm_dds_cft = this->impl ()->create_contentfilteredtopic ( + name, + top->get_impl (), + filter_expression, + parameters); + delete [] parameterlist; + if (!ccm_dds_cft) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::create_contentfilteredtopic - " + "RTI DDS returned a nil ContentFilteredTopic.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + ::DDS::ContentFilteredTopic_var retval = ::DDS::ContentFilteredTopic::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_ContentFilteredTopic_i (ccm_dds_cft), + CORBA::NO_MEMORY ()); + + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "DDS_DomainParticipant_i::create_contentfilteredtopic - " + "Successfully created topic with name <%C> and filter expression <%C>\n", + name, filter_expression)); + + return retval._retn (); +#else + return this->impl ()->create_contentfilteredtopic ( + name, + related_topic, + filter_expression, + expression_parameters); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::delete_contentfilteredtopic (::DDS::ContentFilteredTopic_ptr a_contentfilteredtopic) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::delete_contentfilteredtopic"); +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_ContentFilteredTopic_i *ccm_dds_cft = + dynamic_cast < CCM_DDS_ContentFilteredTopic_i *> (a_contentfilteredtopic); + if (!ccm_dds_cft) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipant_i::delete_contentfilteredtopic - " + "Unable to cast provided ContentFilteredTopic.\n")); + return ::DDS::RETCODE_BAD_PARAMETER; + } + return this->impl ()->delete_contentfilteredtopic (ccm_dds_cft->get_impl ()); +#else + return this->impl ()->delete_contentfilteredtopic (a_contentfilteredtopic); +#endif + } + + ::DDS::MultiTopic_ptr + CCM_DDS_DomainParticipant_i::create_multitopic (const char * /*name*/, + const char * /*type_name*/, + const char * /*subscription_expression*/, + const ::DDS::StringSeq & /*expression_parameters*/) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::create_multitopic"); + throw CORBA::NO_IMPLEMENT (); + + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::delete_multitopic (::DDS::MultiTopic_ptr /*a_multitopic*/) + { + //this->impl ()->delete_multitopic ( + DDS4CCM_TRACE ("DDS_DomainParticipant_i::delete_multitopic"); + throw CORBA::NO_IMPLEMENT (); + + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::delete_contained_entities (void) + { + return this->impl ()->delete_contained_entities (); + + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::set_qos (const ::DDS::DomainParticipantQos & qos) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::set_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DomainParticipantQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl()->set_qos (ccm_dds_qos); +#else + return this->impl()->set_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_qos (::DDS::DomainParticipantQos & qos) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::get_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DomainParticipantQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = this->impl()-> get_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl()->get_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::set_listener (::DDS::DomainParticipantListener_ptr a_listener, + ::DDS::StatusMask mask) + { +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_DomainPublisherListener_i* ccm_dds_impl_list = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_impl_list, + CCM_DDS_DomainPublisherListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + return this->impl_->set_listener (ccm_dds_impl_list, mask); +#else + return this->impl_->set_listener (a_listener, mask); +#endif + } + + ::DDS::DomainParticipantListener_ptr + CCM_DDS_DomainParticipant_i::get_listener (void) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::get_listener"); + +#if (CIAO_DDS4CCM_NDDS==1) + DDSDomainParticipantListener *ccm_dds_dp_list = this->impl ()->get_listener (); + CCM_DDS_DomainPublisherListener_i *list_proxy = dynamic_cast <CCM_DDS_DomainPublisherListener_i *> (ccm_dds_dp_list); + if (!list_proxy) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, "CCM_DDS_DomainParticipant_i::get_listener - " + "DDS returned a NIL listener.\n")); + return ::DDS::DomainParticipantListener::_nil (); + } + return list_proxy->get_domainparticipantlistener (); +#else + return this->impl ()->get_listener (); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::ignore_participant (DDS_INSTANCE_HANDLE_T_IN handle) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t ccm_dds_handle; + ccm_dds_handle <<= handle; + return this->impl ()->ignore_participant (ccm_dds_handle); +#else + return this->impl ()->ignore_participant (handle); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::ignore_topic (DDS_INSTANCE_HANDLE_T_IN handle) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t ccm_dds_handle; + ccm_dds_handle <<= handle; + return this->impl ()->ignore_topic (ccm_dds_handle); +#else + return this->impl ()->ignore_topic (handle); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::ignore_publication (DDS_INSTANCE_HANDLE_T_IN handle) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t ccm_dds_handle; + ccm_dds_handle <<= handle; + return this->impl ()->ignore_publication (ccm_dds_handle); +#else + return this->impl ()->ignore_publication (handle); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::ignore_subscription (DDS_INSTANCE_HANDLE_T_IN handle) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t ccm_dds_handle; + ccm_dds_handle <<= handle; + return this->impl ()->ignore_subscription (ccm_dds_handle); +#else + return this->impl ()->ignore_subscription (handle); +#endif + } + + ::DDS::DomainId_t + CCM_DDS_DomainParticipant_i::get_domain_id (void) + { + return this->impl ()->get_domain_id (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::assert_liveliness (void) + { + return this->impl ()->assert_liveliness (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::set_default_publisher_qos (const ::DDS::PublisherQos & qos) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::set_default_publisher_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_PublisherQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl()->set_default_publisher_qos (ccm_dds_qos); +#else + return this->impl()->set_default_publisher_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_default_publisher_qos (::DDS::PublisherQos & qos) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::get_default_publisher_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_PublisherQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = this->impl()-> get_default_publisher_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl()->get_default_publisher_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::set_default_subscriber_qos (const ::DDS::SubscriberQos & qos) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::set_default_subscriber_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_SubscriberQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl()->set_default_subscriber_qos (ccm_dds_qos); +#else + return this->impl()->set_default_subscriber_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_default_subscriber_qos (::DDS::SubscriberQos & qos) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::get_default_subscriber_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_SubscriberQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = + this->impl()-> get_default_subscriber_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl()->get_default_subscriber_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::set_default_topic_qos (const ::DDS::TopicQos & qos) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::set_default_topic_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_TopicQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl()->set_default_topic_qos (ccm_dds_qos); +#else + return this->impl()->set_default_topic_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_default_topic_qos (::DDS::TopicQos & qos) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::get_default_topic_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_TopicQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = + this->impl()-> get_default_topic_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl()->get_default_topic_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_discovered_participants (::DDS::InstanceHandleSeq & impl_handles) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandleSeq rtiseq; + ::DDS::ReturnCode_t const retval = this->impl ()->get_discovered_participants (rtiseq); + impl_handles <<= rtiseq; + return retval; +#else + return this->impl ()->get_discovered_participants (impl_handles); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_discovered_participant_data (::DDS::ParticipantBuiltinTopicData & /*impl_data*/, + DDS_INSTANCE_HANDLE_T_IN /*impl_handle*/) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::get_discovered_participant_data"); + throw CORBA::NO_IMPLEMENT (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_discovered_topics (::DDS::InstanceHandleSeq & impl_handles) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandleSeq rtiseq; + ::DDS::ReturnCode_t const retval = this->impl ()->get_discovered_topics (rtiseq); + impl_handles <<= rtiseq; + return retval; +#else + return this->impl ()->get_discovered_topics (impl_handles); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_discovered_topic_data (::DDS::TopicBuiltinTopicData & /*impl_data*/, + DDS_INSTANCE_HANDLE_T_IN /*impl_handle*/) + { + DDS4CCM_TRACE ("DDS_DomainParticipant_i::get_discovered_topic_data"); + throw CORBA::NO_IMPLEMENT (); + } + + ::CORBA::Boolean + CCM_DDS_DomainParticipant_i::contains_entity (DDS_INSTANCE_HANDLE_T_IN a_handle) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t ccm_dds_handle; + ccm_dds_handle <<= a_handle; + return this->impl ()->contains_entity (ccm_dds_handle); +#else + return this->impl ()->contains_entity (a_handle); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::get_current_time (::DDS::Time_t & current_time) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_Time_t ccm_dds_time; + ::DDS::ReturnCode_t const retval = this->impl ()->get_current_time (ccm_dds_time); + current_time <<= ccm_dds_time; + return retval; +#else + return this->impl ()->get_current_time (current_time); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipant_i::enable (void) + { + return this->impl ()->enable (); + } + + ::DDS::StatusCondition_ptr + CCM_DDS_DomainParticipant_i::get_statuscondition (void) + { + ::DDS::StatusCondition_var retval = ::DDS::StatusCondition::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSStatusCondition* sc = this->impl ()->get_statuscondition (); + if (sc) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::StatusCondition_var sc = this->impl ()->get_statuscondition (); + if (! ::CORBA::is_nil (sc.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + ::DDS::StatusMask + CCM_DDS_DomainParticipant_i::get_status_changes (void) + { + return this->impl ()->get_status_changes (); + } + + DDS_INSTANCE_HANDLE_T_RETN + CCM_DDS_DomainParticipant_i::get_instance_handle (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t const rtihandle = this->impl ()->get_instance_handle (); + ::DDS::InstanceHandle_t handle; + handle <<= rtihandle; + return handle; +#else + return this->impl ()->get_instance_handle (); +#endif + } + + DDSDomainParticipant * + CCM_DDS_DomainParticipant_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_DomainParticipant_i::set_impl (DDSDomainParticipant * dp) + { + this->impl_ = dp; + } + + DDSDomainParticipant * + CCM_DDS_DomainParticipant_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipant.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipant.h new file mode 100644 index 00000000000..b326b2d178e --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipant.h @@ -0,0 +1,220 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef CIAO_NDDS_PARTICIPANT_H +#define CIAO_NDDS_PARTICIPANT_H + +#include "tao/LocalObject.h" +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" +#include "dds4ccm/impl/dds/ndds/InstanceHandle_t.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#include <map> + +#if (CIAO_DDS4CCM_NDDS==1) +#include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DomainParticipant DDSDomainParticipant; +#endif + +#include "tao/LocalObject.h" + +namespace CIAO +{ + namespace DDS4CCM + { + class CCM_DDS_Topic_i; + + class DDS4CCM_DDS_IMPL_Export CCM_DDS_DomainParticipant_i : + public virtual ::DDS::CCM_DomainParticipant, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_DomainParticipant_i (DDSDomainParticipant * dp); + + /// Destructor + virtual ~CCM_DDS_DomainParticipant_i (void); + + virtual ::DDS::Publisher_ptr create_publisher ( + const ::DDS::PublisherQos & qos, + ::DDS::PublisherListener_ptr a_listener, + ::DDS::StatusMask mask); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual ::DDS::Publisher_ptr create_publisher_with_profile ( + const char* library_name, + const char *profile_name, + ::DDS::PublisherListener_ptr a_listener, + ::DDS::StatusMask mask); +#endif + + virtual ::DDS::ReturnCode_t delete_publisher (::DDS::Publisher_ptr p); + + virtual ::DDS::Subscriber_ptr create_subscriber ( + const ::DDS::SubscriberQos & qos, + ::DDS::SubscriberListener_ptr a_listener, + ::DDS::StatusMask mask); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual ::DDS::Subscriber_ptr create_subscriber_with_profile( + const char* library_name, + const char *profile_name, + ::DDS::SubscriberListener_ptr a_listener, + ::DDS::StatusMask mask); +#endif + + virtual ::DDS::ReturnCode_t delete_subscriber (::DDS::Subscriber_ptr s); + + virtual ::DDS::Subscriber_ptr get_builtin_subscriber (void); + + virtual ::DDS::Topic_ptr create_topic ( + const char * impl_name, + const char * type_name, + const ::DDS::TopicQos & qos, + ::DDS::TopicListener_ptr a_listener, + ::DDS::StatusMask mask); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual ::DDS::Topic_ptr create_topic_with_profile ( + const char * impl_name, + const char * type_name, + const char* library_name, + const char *profile_name, + ::DDS::TopicListener_ptr a_listener, + ::DDS::StatusMask mask); +#endif + + virtual ::DDS::ReturnCode_t delete_topic (::DDS::Topic_ptr a_topic); + + virtual ::DDS::Topic_ptr find_topic ( + const char * impl_name, + const ::DDS::Duration_t & timeout); + + virtual ::DDS::TopicDescription_ptr lookup_topicdescription ( + const char * name); + + virtual ::DDS::ContentFilteredTopic_ptr create_contentfilteredtopic ( + const char * name, + ::DDS::Topic_ptr related_topic, + const char * filter_expression, + const ::DDS::StringSeq & expression_parameters); + + virtual ::DDS::ReturnCode_t delete_contentfilteredtopic ( + ::DDS::ContentFilteredTopic_ptr a_contentfilteredtopic); + + virtual ::DDS::MultiTopic_ptr create_multitopic ( + const char * name, + const char * type_name, + const char * subscription_expression, + const ::DDS::StringSeq & expression_parameters); + + virtual ::DDS::ReturnCode_t delete_multitopic ( + ::DDS::MultiTopic_ptr a_multitopic); + + virtual ::DDS::ReturnCode_t delete_contained_entities (void); + + virtual ::DDS::ReturnCode_t set_qos ( + const ::DDS::DomainParticipantQos & qos); + + virtual ::DDS::ReturnCode_t get_qos ( + ::DDS::DomainParticipantQos & qos); + + virtual ::DDS::ReturnCode_t set_listener ( + ::DDS::DomainParticipantListener_ptr a_listener, + ::DDS::StatusMask mask); + + virtual ::DDS::DomainParticipantListener_ptr get_listener (void); + + virtual ::DDS::ReturnCode_t ignore_participant ( + DDS_INSTANCE_HANDLE_T_IN handle); + + virtual ::DDS::ReturnCode_t ignore_topic ( + DDS_INSTANCE_HANDLE_T_IN handle); + + virtual ::DDS::ReturnCode_t ignore_publication ( + DDS_INSTANCE_HANDLE_T_IN handle); + + virtual ::DDS::ReturnCode_t ignore_subscription ( + DDS_INSTANCE_HANDLE_T_IN handle); + + virtual ::DDS::DomainId_t get_domain_id (void); + + virtual ::DDS::ReturnCode_t assert_liveliness (void); + + virtual ::DDS::ReturnCode_t set_default_publisher_qos ( + const ::DDS::PublisherQos & qos); + + virtual ::DDS::ReturnCode_t get_default_publisher_qos ( + ::DDS::PublisherQos & qos); + + virtual ::DDS::ReturnCode_t set_default_subscriber_qos ( + const ::DDS::SubscriberQos & qos); + + virtual ::DDS::ReturnCode_t get_default_subscriber_qos ( + ::DDS::SubscriberQos & qos); + + virtual ::DDS::ReturnCode_t set_default_topic_qos ( + const ::DDS::TopicQos & qos); + + virtual ::DDS::ReturnCode_t get_default_topic_qos ( + ::DDS::TopicQos & qos); + + virtual ::DDS::ReturnCode_t get_discovered_participants ( + ::DDS::InstanceHandleSeq & impl_handles); + + virtual ::DDS::ReturnCode_t get_discovered_participant_data ( + ::DDS::ParticipantBuiltinTopicData & impl_data, + DDS_INSTANCE_HANDLE_T_IN impl_handle); + + virtual ::DDS::ReturnCode_t get_discovered_topics ( + ::DDS::InstanceHandleSeq & impl_handles); + + virtual ::DDS::ReturnCode_t get_discovered_topic_data ( + ::DDS::TopicBuiltinTopicData & impl_data, + DDS_INSTANCE_HANDLE_T_IN impl_handle); + + virtual ::CORBA::Boolean contains_entity ( + DDS_INSTANCE_HANDLE_T_IN a_handle); + + virtual ::DDS::ReturnCode_t get_current_time ( + ::DDS::Time_t & current_time); + + virtual ::DDS::ReturnCode_t enable (void); + + virtual ::DDS::StatusCondition_ptr get_statuscondition (void); + + virtual ::DDS::StatusMask get_status_changes (void); + + virtual DDS_INSTANCE_HANDLE_T_RETN get_instance_handle (void); + + DDSDomainParticipant * get_impl (void); + + void set_impl (DDSDomainParticipant * dp); + + protected: + DDSDomainParticipant *impl_; + + DDSDomainParticipant * impl (void); + + private: + bool remove_topic (CCM_DDS_Topic_i * topic); + + TAO_SYNCH_MUTEX tps_mutex_; + typedef std::map<ACE_CString, CCM_DDS_Topic_i *> Topics; + Topics tps_; + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantFactory.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantFactory.cpp new file mode 100644 index 00000000000..3b1908901d2 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantFactory.cpp @@ -0,0 +1,355 @@ +// $Id$ + +#include "DomainParticipantFactory.h" +#include "DomainParticipant.h" +#include "DomainParticipantListener.h" + +#include "ndds/DomainParticipantFactoryQos.h" +#include "ndds/DomainParticipantQos.h" + +#include "Utils.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/idl/dds4ccm_BaseC.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) + typedef ::DDS::DomainParticipantFactory DDSDomainParticipantFactory; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_DomainParticipantFactory_i::CCM_DDS_DomainParticipantFactory_i (void) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::CCM_DDS_DomainParticipantFactory_i"); + } + + CCM_DDS_DomainParticipantFactory_i::~CCM_DDS_DomainParticipantFactory_i (void) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::~CCM_DDS_DomainParticipantFactory_i"); + } + + ::DDS::DomainParticipant_ptr + CCM_DDS_DomainParticipantFactory_i::create_participant (::DDS::DomainId_t domain_id, + const ::DDS::DomainParticipantQos & qos, + ::DDS::DomainParticipantListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::create_participant"); + +#if (CIAO_DDS4CCM_NDDS==1) + ACE_UNUSED_ARG (qos); + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipantFactory_i::create_participant - " + "Creating domain participant for domain <%d>\n", + domain_id)); + + CCM_DDS_DomainPublisherListener_i *ccm_dds_dpl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_dpl, + CCM_DDS_DomainPublisherListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + + ACE_CString qos_profile = ACE_TEXT ("default"); + + ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, _guard, + this->dps_mutex_, CORBA::INTERNAL ()); + { + CCM_DDS_DomainParticipant_i *ccm_dds_dp = this->dps_[qos_profile]; + + if (!ccm_dds_dp) + { + DDSDomainParticipant *part = DDSDomainParticipantFactory::get_instance ()-> + create_participant (domain_id, + DDS_PARTICIPANT_QOS_DEFAULT, + ccm_dds_dpl, + mask); + + if (!part) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipantFactory_i::create_participant - " + "Error: Unable to create DomainParticipant for domain <%d>\n", + domain_id)); + throw CCM_DDS::InternalError (1, 0); + } + + ::DDS::DomainParticipant_var retval = ::DDS::DomainParticipant::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (part), + CORBA::NO_MEMORY ()); + part->enable (); + ccm_dds_dp = dynamic_cast < CCM_DDS_DomainParticipant_i *> (retval.in ()); + ccm_dds_dp->set_impl (part); + + this->dps_[qos_profile] = ccm_dds_dp; + + return retval._retn (); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "CCM_DDS_DomainParticipantFactory_i::create_participant - " + "Re-using participant for QOS profile <%C> and domain <%d>.\n", + qos_profile.c_str (), + domain_id)); + return ::DDS::DomainParticipant::_duplicate (ccm_dds_dp); + } + } + +#else + return DDSDomainParticipantFactory::get_instance ()-> + create_participant (domain_id, + qos, + a_listener, + mask); +#endif + } + +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::DomainParticipant_ptr + CCM_DDS_DomainParticipantFactory_i::create_participant_with_profile ( + ::DDS::DomainId_t domain_id, + const char * library_name, + const char * profile_name, + ::DDS::DomainParticipantListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::create_participant_with_profile"); + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipantFactory_i::create_participant_with_profile - " + "Creating domain participant: profile <%C#%C> - domain <%d>\n", + library_name, profile_name, domain_id)); + CCM_DDS_DomainPublisherListener_i *ccm_dds_dpl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_dpl, + CCM_DDS_DomainPublisherListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + + ACE_CString qos_profile = library_name; + qos_profile += ACE_TEXT ("#"); + qos_profile += profile_name; + + ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, _guard, + this->dps_mutex_, CORBA::INTERNAL ()); + { + CCM_DDS_DomainParticipant_i *ccm_dds_dp = this->dps_[qos_profile]; + + if (!ccm_dds_dp) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "CCM_DDS_DomainParticipantFactory_i::create_participant_with_profile - " + "Creating participant: profile <%C> - domain <%d>\n", + qos_profile.c_str (), + domain_id)); + DDSDomainParticipant * part = DDSDomainParticipantFactory::get_instance ()-> + create_participant_with_profile (domain_id, + library_name, + profile_name, + ccm_dds_dpl, + mask); + if (!part) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipantFactory_i::create_participant_with_profile - " + "Error: Unable to create DomainParticipant\n")); + throw CCM_DDS::InternalError (1, 0); + } + ::DDS::DomainParticipant_var retval = ::DDS::DomainParticipant::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (part), + CORBA::NO_MEMORY ()); + + part->enable (); + + ccm_dds_dp = dynamic_cast < CCM_DDS_DomainParticipant_i *> (retval.in ()); + ccm_dds_dp->set_impl (part); + this->dps_[qos_profile] = ccm_dds_dp; + return retval._retn (); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "CCM_DDS_DomainParticipantFactory_i::create_participant_with_profile - " + "Re-using participant for QOS profile <%C> and domain <%d>.\n", + qos_profile.c_str (), + domain_id)); + return ::DDS::DomainParticipant::_duplicate (ccm_dds_dp); + } + } + } +#endif + + bool + CCM_DDS_DomainParticipantFactory_i::remove_participant (CCM_DDS_DomainParticipant_i * part) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::remove_participant"); + + ACE_GUARD_THROW_EX (TAO_SYNCH_MUTEX, _guard, + this->dps_mutex_, CORBA::INTERNAL ()); + + if (part->_refcount_value () == 1) + { + DomainParticipants::iterator pos; + for (pos = this->dps_.begin(); pos != this->dps_.end(); ++pos) + { + if (pos->second == part) + { + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipantFactory_i::remove_participant - " + "Removing participant for %C from list.\n", + pos->first.c_str ())); + this->dps_.erase (pos->first); + break; + } + } + } + else + { + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipantFactory_i::remove_participant - " + "Don't delete participant since it's still used - ref_count <%d>\n", + part->_refcount_value ())); + return false; + } + return true; + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipantFactory_i::delete_participant (::DDS::DomainParticipant_ptr a_participant) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::delete_participant"); + +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_DomainParticipant_i *part = dynamic_cast< CCM_DDS_DomainParticipant_i * > (a_participant); + + if (!part) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipantFactory_i::delete_participant - " + "Unable to cast provided object reference to servant type, bailing.\n")); + return DDS::RETCODE_ERROR; + } + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_DomainParticipantFactory_i::delete_participant - " + "Successfully casted provided object reference to servant type.\n")); + + ::DDS::ReturnCode_t retval = DDS::RETCODE_OK; + if (this->remove_participant (part)) + { + retval = DDSDomainParticipantFactory::get_instance ()-> + delete_participant (part->get_impl ()); + + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_DomainParticipantFactory_i::delete_participant - " + "RTI delete_participant returned non-ok error code %C\n", + translate_retcode (retval))); + } + else DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_DomainParticipantFactory_i::delete_participant - " + "Successfully deleted provided participant.\n")); + } + return retval; +#else + return DDSDomainParticipantFactory::get_instance ()-> + delete_participant (a_participant); +#endif + } + + ::DDS::DomainParticipant_ptr + CCM_DDS_DomainParticipantFactory_i::lookup_participant (::DDS::DomainId_t domain_id) + { + ::DDS::DomainParticipant_var retval = ::DDS::DomainParticipant::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDSDomainParticipant* dp = DDSDomainParticipantFactory::get_instance ()->lookup_participant (domain_id); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (dp), + CORBA::NO_MEMORY ()); +#else + ::DDS::DomainParticipant_var dp = DDSDomainParticipantFactory::get_instance ()->lookup_participant (domain_id); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (dp.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipantFactory_i::set_default_participant_qos (const ::DDS::DomainParticipantQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::set_default_participant_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + DDS_DomainParticipantQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return DDSDomainParticipantFactory::get_instance ()->set_default_participant_qos (ccm_dds_qos); +#else + return DDSDomainParticipantFactory::get_instance ()->set_default_participant_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipantFactory_i::get_default_participant_qos (::DDS::DomainParticipantQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::get_default_participant_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + DDS_DomainParticipantQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = + DDSDomainParticipantFactory::get_instance ()->get_default_participant_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return DDSDomainParticipantFactory::get_instance ()->get_default_participant_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipantFactory_i::set_qos (const ::DDS::DomainParticipantFactoryQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::set_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + DDS_DomainParticipantFactoryQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return DDSDomainParticipantFactory::get_instance ()->set_qos (ccm_dds_qos); +#else + return DDSDomainParticipantFactory::get_instance ()->set_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipantFactory_i::get_qos (::DDS::DomainParticipantFactoryQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::get_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + DDS_DomainParticipantFactoryQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = + DDSDomainParticipantFactory::get_instance ()->get_qos (ccm_dds_qos); + ccm_dds_qos <<= qos; + return retcode; +#else + return DDSDomainParticipantFactory::get_instance ()->get_qos (qos); +#endif + } + +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::ReturnCode_t + CCM_DDS_DomainParticipantFactory_i::set_default_participant_qos_with_profile ( + const char * library_name, + const char * profile_name) + { + DDS4CCM_TRACE ("CCM_DDS_DomainParticipantFactory_i::set_default_participant_qos_with_profile"); + + return DDSDomainParticipantFactory::get_instance ()->set_default_participant_qos_with_profile (library_name, profile_name); + } +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) + ::DDS::DomainParticipantFactory_ptr + CCM_DDS_DomainParticipantFactory_i::get_instance (void) + { + return 0; + } +#endif + } +} + +#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION) +template ACE_Singleton<CIAO::DDS4CCM::CCM_DDS_DomainParticipantFactory_i, TAO_SYNCH_MUTEX> * + ACE_Singleton<CIAO::DDS4CCM::CCM_DDS_DomainParticipantFactory_i, TAO_SYNCH_MUTEX>::singleton_; +#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantFactory.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantFactory.h new file mode 100644 index 00000000000..4a1439ecba1 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantFactory.h @@ -0,0 +1,112 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS_RTI_PARTICIPANTFACTORY_H +#define DDS_RTI_PARTICIPANTFACTORY_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#include "tao/LocalObject.h" + +#include "ace/Singleton.h" + +#include <map> + +namespace CIAO +{ + namespace DDS4CCM + { + class CCM_DDS_DomainParticipant_i; + + class DDS4CCM_DDS_IMPL_Export CCM_DDS_DomainParticipantFactory_i : + public virtual ::DDS::CCM_DomainParticipantFactory, + public virtual ::CORBA::LocalObject + { + friend class ACE_Singleton<CCM_DDS_DomainParticipantFactory_i, TAO_SYNCH_MUTEX>; + + private: + // Construtor + CCM_DDS_DomainParticipantFactory_i (void); + + /// Destructor + virtual ~CCM_DDS_DomainParticipantFactory_i (void); + + public: +#if (CIAO_DDS4CCM_OPENDDS==1) + virtual ::DDS::DomainParticipantFactory_ptr get_instance (void); +#endif + + virtual + ::DDS::DomainParticipant_ptr create_participant (::DDS::DomainId_t domain_id, + const ::DDS::DomainParticipantQos & qos, + ::DDS::DomainParticipantListener_ptr a_listener, + ::DDS::StatusMask mask); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual + ::DDS::DomainParticipant_ptr create_participant_with_profile (::DDS::DomainId_t domain_id, + const char * library_name, + const char * profile_name, + ::DDS::DomainParticipantListener_ptr a_listener, + ::DDS::StatusMask mask); +#endif + + virtual + ::DDS::ReturnCode_t delete_participant (::DDS::DomainParticipant_ptr a_participant); + + virtual + ::DDS::DomainParticipant_ptr lookup_participant (::DDS::DomainId_t domain_id); + + virtual + ::DDS::ReturnCode_t set_default_participant_qos (const ::DDS::DomainParticipantQos & qos); + + virtual + ::DDS::ReturnCode_t get_default_participant_qos (::DDS::DomainParticipantQos & qos); + + virtual + ::DDS::ReturnCode_t set_qos (const ::DDS::DomainParticipantFactoryQos & qos); + + virtual + ::DDS::ReturnCode_t get_qos (::DDS::DomainParticipantFactoryQos & qos); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual ::DDS::ReturnCode_t set_default_participant_qos_with_profile( + const char * library_name, + const char * profile_name); +#endif + + private: + bool remove_participant (CCM_DDS_DomainParticipant_i * part); + + TAO_SYNCH_MUTEX dps_mutex_; + typedef std::map<ACE_CString, CCM_DDS_DomainParticipant_i *> DomainParticipants; + DomainParticipants dps_; + private: + ACE_UNIMPLEMENTED_FUNC (void operator= (const CCM_DDS_DomainParticipantFactory_i &)) + ACE_UNIMPLEMENTED_FUNC (CCM_DDS_DomainParticipantFactory_i (const CCM_DDS_DomainParticipantFactory_i &)) + }; + + typedef ACE_Singleton<CCM_DDS_DomainParticipantFactory_i, + TAO_SYNCH_MUTEX> Domain_Participant_Factory; + } +} + +#define DPFACTORY ::CIAO::DDS4CCM::Domain_Participant_Factory::instance () + +/// Declare a process wide singleton +DDS4CCM_DDS_IMPL_SINGLETON_DECLARE (ACE_Singleton, + ::CIAO::DDS4CCM::CCM_DDS_DomainParticipantFactory_i, + TAO_SYNCH_MUTEX) + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener.cpp new file mode 100644 index 00000000000..90d81e1a7cb --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener.cpp @@ -0,0 +1,127 @@ +// $Id$ + +#include "DomainParticipantListener.h" +#include "DomainParticipant.h" + +#include "ndds/SampleLostStatus.h" +#include "ndds/SubscriptionMatchedStatus.h" +#include "ndds/RequestedDeadlineMissedStatus.h" +#include "ndds/SampleRejectedStatus.h" +#include "ndds/LivelinessChangedStatus.h" +#include "ndds/RequestedIncompatibleQosStatus.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_DomainPublisherListener_i::CCM_DDS_DomainPublisherListener_i ( + ::DDS::DomainParticipantListener_ptr p) + : impl_ (::DDS::DomainParticipantListener::_duplicate (p)) + { + } + + CCM_DDS_DomainPublisherListener_i::~CCM_DDS_DomainPublisherListener_i (void) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_inconsistent_topic ( + ::DDS::Topic_ptr, + const ::DDS::InconsistentTopicStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_requested_deadline_missed ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedDeadlineMissedStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_requested_incompatible_qos ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedIncompatibleQosStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_sample_rejected ( + ::DDS::DataReader_ptr , + const ::DDS::SampleRejectedStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_liveliness_changed ( + ::DDS::DataReader_ptr , + const ::DDS::LivelinessChangedStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_data_available ( + ::DDS::DataReader_ptr ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_subscription_matched ( + ::DDS::DataReader_ptr , + const ::DDS::SubscriptionMatchedStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_sample_lost ( + ::DDS::DataReader_ptr , + const ::DDS::SampleLostStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_offered_deadline_missed ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedDeadlineMissedStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_offered_incompatible_qos ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedIncompatibleQosStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_liveliness_lost ( + ::DDS::DataWriter_ptr , + const ::DDS::LivelinessLostStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_publication_matched ( + ::DDS::DataWriter_ptr , + const ::DDS::PublicationMatchedStatus & ) + { + } + + void + CCM_DDS_DomainPublisherListener_i::on_data_on_readers ( + ::DDS::Subscriber_ptr ) + { + } + + ::DDS::DomainParticipantListener_ptr + CCM_DDS_DomainPublisherListener_i::get_domainparticipantlistener (void) + { + return ::DDS::DomainParticipantListener::_duplicate (this->impl_.in ()); + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener.h new file mode 100644 index 00000000000..93d2163dfdc --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener.h @@ -0,0 +1,112 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DOMAINPARTICIPANTLISTENER_H +#define DDS4CCM_DOMAINPARTICIPANTLISTENER_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DomainParticipantListener DDSDomainParticipantListener; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_DomainPublisherListener_i : + public virtual ::DDSDomainParticipantListener + { + public: + /// Constructor + CCM_DDS_DomainPublisherListener_i (::DDS::DomainParticipantListener_ptr p); + + /// Destructor + virtual ~CCM_DDS_DomainPublisherListener_i (void); + + ::DDS::DomainParticipantListener_ptr get_domainparticipantlistener (void); + + virtual void + on_inconsistent_topic ( + ::DDS::Topic_ptr, + const ::DDS::InconsistentTopicStatus & ); + + virtual void + on_requested_deadline_missed ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedDeadlineMissedStatus & ); + + virtual void + on_requested_incompatible_qos ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedIncompatibleQosStatus & ); + + virtual void + on_sample_rejected ( + ::DDS::DataReader_ptr , + const ::DDS::SampleRejectedStatus & ); + + virtual void + on_liveliness_changed ( + ::DDS::DataReader_ptr , + const ::DDS::LivelinessChangedStatus & ); + + virtual void + on_data_available ( + ::DDS::DataReader_ptr ); + + virtual void + on_subscription_matched ( + ::DDS::DataReader_ptr , + const ::DDS::SubscriptionMatchedStatus & ); + + virtual void + on_sample_lost ( + ::DDS::DataReader_ptr , + const ::DDS::SampleLostStatus & ); + + virtual void + on_offered_deadline_missed ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedDeadlineMissedStatus & ); + + virtual void + on_offered_incompatible_qos ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedIncompatibleQosStatus & ); + + virtual void + on_liveliness_lost ( + ::DDS::DataWriter_ptr , + const ::DDS::LivelinessLostStatus & ); + + virtual void + on_publication_matched ( + ::DDS::DataWriter_ptr , + const ::DDS::PublicationMatchedStatus & ); + + virtual void + on_data_on_readers ( + ::DDS::Subscriber_ptr ); + + private: + ::DDS::DomainParticipantListener_var impl_; + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener_T.cpp new file mode 100644 index 00000000000..3649ff9fce7 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener_T.cpp @@ -0,0 +1,152 @@ +// $Id$ +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds/DataReaderHandler_T.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#include "tao/ORB_Core.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::DomainParticipantListener_T ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener) + : error_listener_ (::CCM_DDS::ConnectorStatusListener::_duplicate (error_listener)) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DomainParticipantListener_T::DomainParticipantListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::~DomainParticipantListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DomainParticipantListener_T::~DomainParticipantListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_inconsistent_topic ( + ::DDS::Topic_ptr, + const ::DDS::InconsistentTopicStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_requested_deadline_missed ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedDeadlineMissedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_requested_incompatible_qos ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedIncompatibleQosStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_sample_rejected ( + ::DDS::DataReader_ptr , + const ::DDS::SampleRejectedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_liveliness_changed ( + ::DDS::DataReader_ptr , + const ::DDS::LivelinessChangedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_data_available ( + ::DDS::DataReader_ptr ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_subscription_matched ( + ::DDS::DataReader_ptr , + const ::DDS::SubscriptionMatchedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_sample_lost ( + ::DDS::DataReader_ptr , + const ::DDS::SampleLostStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_offered_deadline_missed ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedDeadlineMissedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_offered_incompatible_qos ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedIncompatibleQosStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_liveliness_lost ( + ::DDS::DataWriter_ptr , + const ::DDS::LivelinessLostStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_publication_matched ( + ::DDS::DataWriter_ptr , + const ::DDS::PublicationMatchedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_data_on_readers ( + ::DDS::Subscriber_ptr ) +{ +} + +#if (CIAO_DDS4CCM_NDDS==1) +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_reliable_writer_cache_changed ( + ::DDS::DataWriter_ptr , + const ::DDS::ReliableWriterCacheChangedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::on_reliable_reader_activity_changed ( + ::DDS::DataWriter_ptr , + const ::DDS::ReliableReaderActivityChangedStatus & ) +{ +} +#endif + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StatusMask +CIAO::DDS4CCM::DomainParticipantListener_T<DDS_TYPE, CCM_TYPE>::get_mask (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DomainParticipantListener_T::get_mask"); + return 0; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener_T.h new file mode 100644 index 00000000000..119e223086e --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/DomainParticipantListener_T.h @@ -0,0 +1,114 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#include "ace/Copy_Disabled.h" + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class DomainParticipantListener_T : + public virtual ::DDS::CCM_DomainParticipantListener, + public virtual ::CORBA::LocalObject, + private virtual ACE_Copy_Disabled + { + public: + /// Constructor + DomainParticipantListener_T ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener); + + /// Destructor + virtual ~DomainParticipantListener_T (void); + + static ::DDS::StatusMask get_mask (void); + + virtual void + on_inconsistent_topic ( + ::DDS::Topic_ptr, + const ::DDS::InconsistentTopicStatus & ); + + virtual void + on_requested_deadline_missed ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedDeadlineMissedStatus & ); + + virtual void + on_requested_incompatible_qos ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedIncompatibleQosStatus & ); + + virtual void + on_sample_rejected ( + ::DDS::DataReader_ptr , + const ::DDS::SampleRejectedStatus & ); + + virtual void + on_liveliness_changed ( + ::DDS::DataReader_ptr , + const ::DDS::LivelinessChangedStatus & ); + + virtual void + on_data_available ( + ::DDS::DataReader_ptr ); + + virtual void + on_subscription_matched ( + ::DDS::DataReader_ptr , + const ::DDS::SubscriptionMatchedStatus & ); + + virtual void + on_sample_lost ( + ::DDS::DataReader_ptr , + const ::DDS::SampleLostStatus & ); + + virtual void + on_offered_deadline_missed ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedDeadlineMissedStatus & ); + + virtual void + on_offered_incompatible_qos ( + ::DDS::DataWriter_ptr , + const ::DDS::OfferedIncompatibleQosStatus & ); + + virtual void + on_liveliness_lost ( + ::DDS::DataWriter_ptr , + const ::DDS::LivelinessLostStatus & ); + + virtual void + on_publication_matched ( + ::DDS::DataWriter_ptr , + const ::DDS::PublicationMatchedStatus & ); + + virtual void + on_data_on_readers ( + ::DDS::Subscriber_ptr ); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual void on_reliable_writer_cache_changed ( + ::DDS::DataWriter_ptr , + const ::DDS::ReliableWriterCacheChangedStatus & ); + + virtual void on_reliable_reader_activity_changed ( + ::DDS::DataWriter_ptr , + const ::DDS::ReliableReaderActivityChangedStatus & ); +#endif + + private: + ::CCM_DDS::ConnectorStatusListener_var error_listener_; + }; + } +} + +#include "dds4ccm/impl/dds/DomainParticipantListener_T.cpp" diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Getter_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Getter_T.cpp new file mode 100644 index 00000000000..3debef97c3e --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Getter_T.cpp @@ -0,0 +1,556 @@ +// $Id$ +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/ndds/Duration_t.h" +#include "dds4ccm/impl/dds/ndds/SampleInfo.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::Getter_Base_T (void) + : reader_ (0), + condition_(0), + time_out_ (), + max_delivered_data_ (0), + ws_ (0), + rd_condition_ (0), + q_condition_ (0) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::Getter_Base_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::~Getter_Base_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::~Getter_Base_T"); + delete this->ws_; + this->ws_ = 0; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +typename DDS_TYPE::data_reader * +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::impl (void) +{ + if (this->reader_) + { + return DDS_TYPE::data_reader::narrow (this->reader_->get_impl ()); + } + else + { + throw ::CORBA::BAD_INV_ORDER (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +bool +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::wait ( + DDSConditionSeq& active_conditions) +{ + DDS_Duration_t timeout; + timeout <<= this->time_out_; + DDS_ReturnCode_t const retcode = this->ws_->wait (active_conditions, timeout); + if (retcode == DDS_RETCODE_TIMEOUT) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("Getter: No data available after timeout.\n"))); + return false; + } + return true; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +bool +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::get_many ( + typename CCM_TYPE::seq_type::_out_type instances, + ::CCM_DDS::ReadInfoSeq_out infos) +{ + instances = 0; + ACE_NEW_THROW_EX (instances, + typename CCM_TYPE::seq_type, + CORBA::NO_MEMORY ()); + infos = 0; + ACE_NEW_THROW_EX (infos, + ::CCM_DDS::ReadInfoSeq, + CORBA::NO_MEMORY ()); + + DDSConditionSeq active_conditions; + if (!this->wait (active_conditions)) + { + return false; + } + + ::DDS_Long max_samples = this->max_delivered_data_; + if (max_samples == 0) + { + max_samples = DDS_LENGTH_UNLIMITED; + } + + DDS_SampleInfoSeq sample_info; + typename DDS_TYPE::dds_seq_type data; + for (::DDS_Long i = 0; i < active_conditions.length(); i++) + { + if (active_conditions[i] == this->rd_condition_ || + active_conditions[i] == this->q_condition_) + { + // Check trigger + active_conditions[i]->get_trigger_value (); + + // Take read condition + DDS_ReturnCode_t retcode = DDS_RETCODE_OK; + if (this->q_condition_) + { + retcode = this->impl ()->read_w_condition ( + data, + sample_info, + max_samples, + this->q_condition_); + } + else + { + retcode = this->impl ()->read_w_condition ( + data, + sample_info, + max_samples, + this->rd_condition_); + } + + if (retcode == DDS_RETCODE_OK && data.length () >= 1) + { + ::CORBA::ULong number_read = 0; + for (::DDS_Long index = 0; index < sample_info.length (); index ++) + { + if (sample_info[index].valid_data) + { + ++number_read; + } + } + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("Getter_Base_T::get_many: ") + ACE_TEXT ("read <%d> - valid <%d>\n"), + sample_info.length (), + number_read)); + infos->length (number_read); + instances->length (number_read); + number_read = 0; + for (::DDS_Long j = 0; j < data.length (); j ++) + { + if (sample_info[j].valid_data) + { + infos->operator[](number_read) <<= sample_info[j]; + instances->operator[](number_read) = data[j]; + ++number_read; + } + } + } + else + { + // RETCODE_NO_DATA should be an error + // because after a timeout there should be + // data. + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::Getter_Base_T::get_many - " + "Error while reading from DDS: <%C>\n", + translate_retcode (retcode))); + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::Getter_Base_T::get_many - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + throw CCM_DDS::InternalError (retcode, 1); + } + + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::Getter_Base_T::get_many - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + } + } + return true; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::Duration_t +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::time_out (void) +{ + return this->time_out_; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::time_out ( + const ::DDS::Duration_t & time_out) +{ + this->time_out_ = time_out; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::CCM_DDS::DataNumber_t +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::max_delivered_data (void) +{ + return this->max_delivered_data_; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::max_delivered_data ( + ::CCM_DDS::DataNumber_t max_delivered_data) +{ + this->max_delivered_data_ = max_delivered_data; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_ReturnCode_t +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::remove_conditions () +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::remove_conditions"); + + DDS_ReturnCode_t retcode = DDS_RETCODE_OK; + if (this->q_condition_) + { + retcode = this->ws_->detach_condition (this->q_condition_); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "Getter_Base_T::remove_conditions - " + "Unable to detach query condition from waitset.\n")); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "Getter_Base_T::remove_conditions - " + "Query condition successfully detached from waitset.\n")); + + retcode = this->impl ()->delete_readcondition (this->q_condition_); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "Getter_Base_T::remove_conditions - " + "Unable to delete query condition from DDSDataReader.\n")); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "Getter_Base_T::remove_conditions - " + "Query condition successfully deleted from DDSDataReader.\n")); + } + } + } + else + { + retcode = this->ws_->detach_condition (this->rd_condition_); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "Getter_Base_T::remove_conditions - " + "Unable to detach read condition from waitset.\n")); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "Getter_Base_T::remove_conditions - " + "Read condition successfully detached from waitset.\n")); + } + } + retcode = this->impl ()->delete_readcondition (this->rd_condition_); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "Getter_Base_T::remove_conditions - " + "Unable to delete read condition from DDSDataReader.\n")); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "Getter_Base_T::remove_conditions - " + "Read condition successfully deleted from DDSDataReader.\n")); + } + delete this->ws_; + this->ws_ = 0; + + return retcode; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +DDS_ReturnCode_t +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::passivate () +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::passivate"); + return this->remove_conditions (); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::create_conditions () +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::create_conditions"); + + // Now create the waitset conditions + ACE_NEW_THROW_EX (this->ws_, + DDSWaitSet (), + CORBA::NO_MEMORY ()); + this->rd_condition_ = this->impl ()->create_readcondition (DDS_NOT_READ_SAMPLE_STATE, + DDS_NEW_VIEW_STATE | DDS_NOT_NEW_VIEW_STATE, + DDS_ALIVE_INSTANCE_STATE | DDS_NOT_ALIVE_INSTANCE_STATE); + DDS_ReturnCode_t retcode = this->ws_->attach_condition (this->rd_condition_); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "GETTER: Unable to attach read condition to waitset.\n")); + throw CCM_DDS::InternalError (retcode, 1); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::create_querycondition ( + const char * query, + const ::DDS_StringSeq & qp) +{ + this->q_condition_ = this->impl ()->create_querycondition ( + DDS_NOT_READ_SAMPLE_STATE, + DDS_NEW_VIEW_STATE | DDS_NOT_NEW_VIEW_STATE, + DDS_ALIVE_INSTANCE_STATE, + query, + qp); + if (!this->q_condition_) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Getter_T::create_querycondition - " + "Error creating query condition.")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 1); + } + DDS_ReturnCode_t retcode = this->ws_->detach_condition (this->rd_condition_); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "Getter_Base_T::create_querycondition - " + "Unable to detach read condition from waitset.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 1); + } + retcode = this->ws_->attach_condition (this->q_condition_); + if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "Getter_Base_T::create_querycondition - " + "Unable to attach query condition to waitset.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 1); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::set_queryparameters ( + const ::DDS_StringSeq & qp) +{ + ::DDS::ReturnCode_t retval = this->q_condition_->set_query_parameters (qp); + if (retval != ::DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Getter_T::set_queryparameters - " + "Error setting expression_parameters. " + "Retval is %C\n", + translate_retcode(retval))); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, retval); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::DDS_CCM::Getter_Base_T<DDS_TYPE, CCM_TYPE>::set_impl ( + CCM_DDS_DataReader_i *reader) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::set_impl"); + + if (!reader) + { + delete this->ws_; + this->ws_ = 0; + this->reader_ = 0; + } + else + { + this->reader_ = reader; + this->create_conditions (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +bool +CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, true>::get_one ( + typename DDS_TYPE::value_type::_out_type an_instance, + ::CCM_DDS::ReadInfo_out info) +{ + DDSConditionSeq active_conditions; + if (!this->wait (active_conditions)) + { + return false; + } + + for (::DDS_Long i = 0; i < active_conditions.length(); i++) + { + if (active_conditions[i] == this->rd_condition_ || + active_conditions[i] == this->q_condition_) + { + bool valid_data_read = false; + + while (!valid_data_read) + { + DDS_SampleInfoSeq sample_info; + typename DDS_TYPE::dds_seq_type data; + DDS_ReturnCode_t retcode = DDS_RETCODE_OK; + if (this->q_condition_) + { + retcode = this->impl ()->read_w_condition (data, + sample_info, + 1, + this->q_condition_); + } + else + { + retcode = this->impl ()->read_w_condition (data, + sample_info, + 1, + this->rd_condition_); + } + if (retcode == DDS_RETCODE_NO_DATA) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, true>::get_one - " + "DDS returned DDS_RETCODE_NO_DATA. No data available in DDS.\n")); + return false; + } + else if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, true>::get_one - " + "Error while reading from DDS: <%C>\n", + translate_retcode (retcode))); + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::Getter_T<DDS_TYPE, CCM_TYPE, true>::get_one - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + + throw CCM_DDS::InternalError (retcode, 1); + } + else if (data.length () == 1 && + sample_info[0].valid_data) + { + info <<= sample_info[0]; + an_instance = data[0]; + valid_data_read = true; + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, true>::get_one - " + "No valid available in DDS.\n")); + } + //return the loan of each read. + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::Getter_T<DDS_TYPE, CCM_TYPE, true>::get_one - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + } + } + } + + return true; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +bool +CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, false>::get_one ( + typename DDS_TYPE::value_type::_out_type an_instance, + ::CCM_DDS::ReadInfo_out info) +{ + an_instance = 0; + ACE_NEW_THROW_EX (an_instance, + typename DDS_TYPE::value_type, + CORBA::NO_MEMORY ()); + DDSConditionSeq active_conditions; + if (!this->wait (active_conditions)) + { + return false; + } + + DDS_SampleInfoSeq sample_info; + typename DDS_TYPE::dds_seq_type data; + for (::DDS_Long i = 0; i < active_conditions.length(); i++) + { + if (active_conditions[i] == this->rd_condition_ || + active_conditions[i] == this->q_condition_) + { + bool valid_data_read = false; + + while (!valid_data_read) + { + DDS_SampleInfoSeq sample_info; + typename DDS_TYPE::dds_seq_type data; + DDS_ReturnCode_t retcode = DDS_RETCODE_OK; + if (this->q_condition_) + { + retcode = this->impl ()->read_w_condition (data, + sample_info, + 1, + this->q_condition_); + } + else + { + retcode = this->impl ()->read_w_condition (data, + sample_info, + 1, + this->rd_condition_); + } + if (retcode == DDS_RETCODE_NO_DATA) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, false>::get_one - " + "DDS returned DDS_RETCODE_NO_DATA. No data available in DDS.\n")); + return false; + } + else if (retcode != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, false>::get_one - " + "Error while reading from DDS: <%C>\n", + translate_retcode (retcode))); + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::Getter_T<DDS_TYPE, CCM_TYPE, false>::get_one - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + throw CCM_DDS::InternalError (retcode, 1); + } + else if (data.length () == 1 && + sample_info[0].valid_data) + { + info <<= sample_info[0]; + *an_instance = data[0]; + valid_data_read = true; + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_T<DDS_TYPE, CCM_TYPE, false>::get_one - " + "No valid available in DDS.\n")); + } + // Return the loan of each read. + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Getter_Base_T::Getter_T<DDS_TYPE, CCM_TYPE, false>::get_one - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + } + } + } + + return true; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Getter_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Getter_T.h new file mode 100644 index 00000000000..dcea39a902b --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Getter_T.h @@ -0,0 +1,149 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef GETTER_T_H +#define GETTER_T_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::GuardCondition DDSGuardCondition; +typedef ::DDS::WaitSet DDSWaitSet; +typedef ::DDS::ReadCondition DDSReadCondition; +typedef ::DDS::ConditionSeq DDSConditionSeq; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + namespace DDS_CCM + { + /** + * @class Getter_Base_T<DDS_TYPE,CCM_TYPE> + * + * @brief Templated base class for the Getter port. + * + * Spec: Get operations are performed with the following parameters + * · SampleStateMask: NO_READ, + * · ViewStateMask: NEW or NOT_NEW, + * · InstanceStateMask: ALIVE or NOT_ALIVE, + * · Through the query (if any) of the Reader associated to the port, + * · Within the time limit specified in time_out. + * + * All methods return a boolean as result indicating whether actual data + * are provided (TRUE) or if the time-out occurred (FALSE). + */ + template <typename DDS_TYPE, typename CCM_TYPE> + class Getter_Base_T : + public virtual CCM_TYPE::getter_type, + public virtual ::CORBA::LocalObject, + private virtual ACE_Copy_Disabled + { + public: + /// Constructor + Getter_Base_T (void); + + /// Destructor + virtual ~Getter_Base_T (void); + + /** + * Spec : get_many returns all the available samples + * in the limits set by the attribute max_delivered_data. + * In case there are more available samples, the first + * max_delivered_data are returned. The default value for + * that attribute is UNLIMITED (0) + */ + virtual bool get_many ( + typename CCM_TYPE::seq_type::_out_type instances, + ::CCM_DDS::ReadInfoSeq_out infos); + virtual ::DDS::Duration_t time_out (void); + virtual void time_out (const ::DDS::Duration_t & time_out); + + virtual ::CCM_DDS::DataNumber_t max_delivered_data (void); + virtual void max_delivered_data ( + ::CCM_DDS::DataNumber_t max_delivered_data); + + /** + * Set the actual pointer to DDS Datareader + */ + void set_impl (CCM_DDS_DataReader_i *reader); + + DDS_ReturnCode_t passivate (void); + + DDS_ReturnCode_t remove_conditions (void); + + void create_querycondition (const char * query, + const ::DDS_StringSeq & qp); + void set_queryparameters (const ::DDS_StringSeq & qp); + + protected: + CCM_DDS_DataReader_i * reader_; + DDSQueryCondition * condition_; + ::DDS::Duration_t time_out_; + ::CCM_DDS::DataNumber_t max_delivered_data_; + DDSWaitSet * ws_; + DDSReadCondition * rd_condition_; + DDSQueryCondition * q_condition_; + + void create_conditions (); + + bool wait (DDSConditionSeq& active_conditions); + + typename DDS_TYPE::data_reader * impl (void); + }; + + template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> + class Getter_T; + + /** + * @brief Implementation of the Getter port for variable sized data types. + * + */ + template <typename DDS_TYPE, typename CCM_TYPE> + class Getter_T <DDS_TYPE, CCM_TYPE, false> : + public Getter_Base_T <DDS_TYPE, CCM_TYPE> + { + public: + /** + * + * @brief get_one implementation for variable sized datatypes. + * + * Spec : get_one returns the next sample to be gotten. + */ + virtual bool get_one ( + typename DDS_TYPE::value_type::_out_type an_instance, + ::CCM_DDS::ReadInfo_out info); + }; + + /** + * @brief Implementation of the Getter port for fixed sized data types. + * + */ + template <typename DDS_TYPE, typename CCM_TYPE> + class Getter_T <DDS_TYPE, CCM_TYPE, true> : + public Getter_Base_T <DDS_TYPE, CCM_TYPE> + { + public: + /** + * @brief get_one implementation for fixed sized datatypes. + * + * Spec : get_one returns the next sample to be gotten. + */ + virtual bool get_one ( + typename DDS_TYPE::value_type::_out_type an_instance, + ::CCM_DDS::ReadInfo_out info); + }; + } + } +} + +#include "dds4ccm/impl/dds/Getter_T.cpp" + +#endif /* GETTER_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/InstanceHandleManager_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/InstanceHandleManager_T.cpp new file mode 100644 index 00000000000..cbcd0859bcc --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/InstanceHandleManager_T.cpp @@ -0,0 +1,73 @@ +// $Id$ + +#include "dds4ccm/impl/dds/DataWriter.h" +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/ndds/InstanceHandle_t.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE, typename BASE_TYPE> +CIAO::DDS4CCM::InstanceHandleManager_T<DDS_TYPE, CCM_TYPE, BASE_TYPE>::InstanceHandleManager_T (void) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE, typename BASE_TYPE> +CIAO::DDS4CCM::InstanceHandleManager_T<DDS_TYPE, CCM_TYPE, BASE_TYPE>::~InstanceHandleManager_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::InstanceHandleManager_T::~InstanceHandleManager_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE, typename BASE_TYPE> +typename DDS_TYPE::data_writer * +CIAO::DDS4CCM::InstanceHandleManager_T<DDS_TYPE, CCM_TYPE, BASE_TYPE>::impl (void) +{ + if (this->writer_) + { + return DDS_TYPE::data_writer::narrow (this->writer_->get_impl ()); + } + else + { + throw ::CORBA::BAD_INV_ORDER (); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, typename BASE_TYPE> +::DDS::InstanceHandle_t +CIAO::DDS4CCM::InstanceHandleManager_T<DDS_TYPE, CCM_TYPE, BASE_TYPE>:: + register_instance (const typename DDS_TYPE::value_type & datum) +{ + ::DDS::InstanceHandle_t dds_handle; + ::DDS_InstanceHandle_t const handle = this->impl ()->register_instance (datum); + dds_handle <<= handle; + return dds_handle; +} + +template <typename DDS_TYPE, typename CCM_TYPE, typename BASE_TYPE> +void +CIAO::DDS4CCM::InstanceHandleManager_T<DDS_TYPE, CCM_TYPE, BASE_TYPE>::unregister_instance ( + const typename DDS_TYPE::value_type & datum, + const ::DDS::InstanceHandle_t & instance_handle) +{ + ::DDS_InstanceHandle_t handle = ::DDS_HANDLE_NIL; + handle <<= instance_handle; + this->impl ()->unregister_instance (datum, handle); +} + +template <typename DDS_TYPE, typename CCM_TYPE, typename BASE_TYPE> +void +CIAO::DDS4CCM::InstanceHandleManager_T<DDS_TYPE, CCM_TYPE, BASE_TYPE>::set_impl ( + CCM_DDS_DataWriter_i *writer) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::InstanceHandleManager_T::set_impl"); + + if (!writer) + { + this->writer_ = 0; + } + else + { + this->writer_ = writer; + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/InstanceHandleManager_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/InstanceHandleManager_T.h new file mode 100644 index 00000000000..5a12a7b7a82 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/InstanceHandleManager_T.h @@ -0,0 +1,51 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef INSTANCE_HANDLEMANGER_T_H +#define INSTANCE_HANDLEMANGER_T_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE, typename BASE_TYPE> + class InstanceHandleManager_T : + public virtual BASE_TYPE, + public virtual ::CORBA::LocalObject, + private virtual ACE_Copy_Disabled + { + public: + /// Constructor + InstanceHandleManager_T (void); + + /// Destructor + virtual ~InstanceHandleManager_T (void); + + virtual ::DDS::InstanceHandle_t register_instance ( + const typename DDS_TYPE::value_type & datum); + + virtual void unregister_instance ( + const typename DDS_TYPE::value_type & datum, + const ::DDS::InstanceHandle_t & instance_handle); + + void set_impl (CCM_DDS_DataWriter_i *writer); + + typename DDS_TYPE::data_writer * impl (void); + + private: + CCM_DDS_DataWriter_i *writer_; + }; + } +} + +#include "dds4ccm/impl/dds/InstanceHandleManager_T.cpp" + +#endif /* INSTANCE_HANDLEMANGER_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/PortStatusListener_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/PortStatusListener_T.cpp new file mode 100644 index 00000000000..d2f6c3d9a4e --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/PortStatusListener_T.cpp @@ -0,0 +1,182 @@ +// $Id$ +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds/DataReaderHandler_T.h" +#include "tao/ORB_Core.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::PortStatusListener_T ( + ::CCM_DDS::PortStatusListener_ptr port_status_listener, + ACE_Reactor* reactor) + : port_status_listener_ (::CCM_DDS::PortStatusListener::_duplicate (port_status_listener)), + reactor_ (reactor) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PortStatusListener_T::PortStatusListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::~PortStatusListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PortStatusListener_T::~PortStatusListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::on_requested_deadline_missed ( + ::DDS::DataReader_ptr the_reader, + const ::DDS::RequestedDeadlineMissedStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PortStatusListener_T::on_requested_deadline_missed"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("PortStatusListener_T::on_requested_deadline_missed: ") + ACE_TEXT ("total count <%d> - total change <%d> - ") + ACE_TEXT ("last instance handle <length <%l> - isValid <%l>\n"), + status.total_count, status.total_count_change, + status.last_instance_handle.length, status.last_instance_handle.isValid)); + + if (! ::CORBA::is_nil (this->port_status_listener_)) + { + try + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnRequestedDeadlineMissedHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnRequestedDeadlineMissedHandler ( + this->port_status_listener_, the_reader, status)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + ACE_TEXT ("PortStatusListener_T::on_requested_deadline_missed: ") + ACE_TEXT ("failed to use reactor.\n"))); + } + } + else + { + this->port_status_listener_->on_requested_deadline_missed (the_reader, status); + } + } + catch (...) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("PortStatusListener_T::on_requested_deadline_missed: ") + ACE_TEXT ("DDS Exception caught\n"))); + } + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, + ACE_TEXT ("PortStatusListener_T::on_requested_deadline_missed: ") + ACE_TEXT ("No portstatus listener installed\n"))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::on_sample_lost ( + ::DDS::DataReader_ptr the_reader, + const ::DDS::SampleLostStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PortStatusListener_T::on_sample_lost"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("PortStatusListener_T::on_sample_lost: ") + ACE_TEXT ("total count <%d> - total change <%d>\n"), + status.total_count, status.total_count_change)); + + if (! ::CORBA::is_nil (this->port_status_listener_)) + { + try + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnSampleLostHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnSampleLostHandler ( + this->port_status_listener_, + the_reader, + status)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + ACE_TEXT ("PortStatusListener_T::on_sample_lost: ") + ACE_TEXT ("failed to use reactor.\n"))); + } + } + else + { + this->port_status_listener_->on_sample_lost (the_reader, status); + } + } + catch (...) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("PortStatusListener_T::on_sample_lost: ") + ACE_TEXT ("DDS Exception caught\n"))); + } + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, + ACE_TEXT ("PortStatusListener_T::on_sample_lost: ") + ACE_TEXT ("No portstatus listener installed\n"))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::on_requested_incompatible_qos ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedIncompatibleQosStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::on_sample_rejected ( + ::DDS::DataReader_ptr , + const ::DDS::SampleRejectedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::on_liveliness_changed ( + ::DDS::DataReader_ptr , + const ::DDS::LivelinessChangedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::on_data_available ( + ::DDS::DataReader_ptr ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::on_subscription_matched ( + ::DDS::DataReader_ptr , + const ::DDS::SubscriptionMatchedStatus & ) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StatusMask +CIAO::DDS4CCM::PortStatusListener_T<DDS_TYPE, CCM_TYPE>::get_mask ( + ::CCM_DDS::PortStatusListener_ptr psl) +{ + if (! ::CORBA::is_nil (psl) || CIAO_debug_level >= 10) + { + return DDS_REQUESTED_DEADLINE_MISSED_STATUS | + DDS_SAMPLE_LOST_STATUS; + } + else + { + return 0; + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/PortStatusListener_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/PortStatusListener_T.h new file mode 100644 index 00000000000..14cbecb1e5a --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/PortStatusListener_T.h @@ -0,0 +1,84 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_PORTSTATUSLISTENER_T_H +#define DDS4CCM_PORTSTATUSLISTENER_T_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL +class ACE_Reactor; +ACE_END_VERSIONED_NAMESPACE_DECL + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class PortStatusListener_T : + public ::DDS::DataReaderListener, + private ACE_Copy_Disabled + { + public: + /// Constructor + PortStatusListener_T ( + ::CCM_DDS::PortStatusListener_ptr port_status_listener, + ACE_Reactor* reactor); + + /// Destructor + virtual ~PortStatusListener_T (void); + + virtual void on_requested_deadline_missed ( + ::DDS::DataReader_ptr the_reader, + const ::DDS::RequestedDeadlineMissedStatus & status); + + virtual void on_sample_lost ( + ::DDS::DataReader_ptr the_reader, + const ::DDS::SampleLostStatus & status); + + virtual void + on_requested_incompatible_qos ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedIncompatibleQosStatus & ); + + virtual void + on_sample_rejected ( + ::DDS::DataReader_ptr , + const ::DDS::SampleRejectedStatus & ); + + virtual void + on_liveliness_changed ( + ::DDS::DataReader_ptr , + const ::DDS::LivelinessChangedStatus & ); + + virtual void + on_data_available ( + ::DDS::DataReader_ptr ); + + virtual void + on_subscription_matched ( + ::DDS::DataReader_ptr , + const ::DDS::SubscriptionMatchedStatus & ); + + static ::DDS::StatusMask get_mask ( + ::CCM_DDS::PortStatusListener_ptr psl); + + private: + ::CCM_DDS::PortStatusListener_var port_status_listener_; + protected: + ACE_Reactor* reactor_; + + }; + } +} + +#include "dds4ccm/impl/dds/PortStatusListener_T.cpp" + +#endif /* DDS4CCM_PORTSTATUSLISTENER_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Publisher.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Publisher.cpp new file mode 100644 index 00000000000..6b18f7b07f4 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Publisher.cpp @@ -0,0 +1,456 @@ +// $Id$ + +#include "Publisher.h" +#include "PublisherListener.h" +#include "Topic.h" +#include "DataWriter.h" +#include "StatusCondition.h" +#include "Utils.h" +#include "DataWriterListener.h" + +#include "ndds/InstanceHandle_t.h" +#include "ndds/Duration_t.h" +#include "ndds/DataWriterQos.h" +#include "ndds/PublisherQos.h" +#include "ndds/TopicQos.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_Publisher_i::CCM_DDS_Publisher_i (DDSPublisher * dw) + : impl_ (dw) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::CCM_DDS_Publisher_i"); + } + + CCM_DDS_Publisher_i::~CCM_DDS_Publisher_i (void) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::~CCM_DDS_Publisher_i"); + } + + ::DDS::DataWriter_ptr + CCM_DDS_Publisher_i::create_datawriter (::DDS::Topic_ptr a_topic, + const ::DDS::DataWriterQos & qos, + ::DDS::DataWriterListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::create_datawriter"); + +#if (CIAO_DDS4CCM_NDDS==1) + ACE_UNUSED_ARG (qos); + + CCM_DDS_Topic_i * topic = dynamic_cast < CCM_DDS_Topic_i * > (a_topic); + + if (!topic) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Publisher_i::create_datawriter - " + "Error: Unable to cast provided topic to its servant.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_BAD_PARAMETER, 0); + } + + DDSDataWriterListener *ccm_dds_drl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_drl, + CCM_DDS_DataWriterListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + DDS_DataWriterQos ccm_dds_qos = DDS_DATAWRITER_QOS_DEFAULT; + DDSDataWriter *ccm_dds_dw = this->impl ()->create_datawriter ( + topic->get_impl (), + ccm_dds_qos, + ccm_dds_drl, + mask); + + if (!ccm_dds_dw) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Publisher_i::create_datawriter - " + "Error: RTI Topic returned a nil datawriter.\n")); + delete ccm_dds_drl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + + ::DDS::DataWriter_var retval = ::DDS::DataWriter::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DataWriter_i (ccm_dds_dw), + CORBA::NO_MEMORY ()); + + ccm_dds_dw->enable (); + CCM_DDS_DataWriter_i *dw = dynamic_cast< CCM_DDS_DataWriter_i * > (retval.in ()); + dw->set_impl (ccm_dds_dw); + + return retval._retn (); +#else + return this->impl ()->create_datawriter ( + a_topic, + qos, + a_listener, + mask); +#endif + } + +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::DataWriter_ptr + CCM_DDS_Publisher_i::create_datawriter_with_profile (::DDS::Topic_ptr a_topic, + const char* library_name, + const char *profile_name, + ::DDS::DataWriterListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::create_datawriter"); + + CCM_DDS_Topic_i * topic = dynamic_cast < CCM_DDS_Topic_i * > (a_topic); + + if (!topic) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Publisher_i::create_datawriter_with_profile - " + "Error: Unable to cast provided topic to its servant.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_BAD_PARAMETER, 0); + } + + DDSDataWriterListener *ccm_dds_drl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_drl, + CCM_DDS_DataWriterListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + DDSDataWriter *ccm_dds_dw = this->impl ()->create_datawriter_with_profile ( + topic->get_impl (), + library_name, + profile_name, + ccm_dds_drl, + mask); + + if (!ccm_dds_dw) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Publisher_i::create_datawriter_with_profile - " + "Error: RTI Topic returned a nil datawriter.\n")); + delete ccm_dds_drl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "CCM_DDS_Publisher_i::create_datareader_with_profile - " + "Successfully created datawriter with profile <%C#%C>.\n", + library_name, + profile_name)); + } + + ::DDS::DataWriter_var retval = ::DDS::DataWriter::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DataWriter_i (ccm_dds_dw), + CORBA::NO_MEMORY ()); + + ccm_dds_dw->enable (); + + return retval._retn (); + } +#endif + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::delete_datawriter (::DDS::DataWriter_ptr a_datawriter) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::delete_datawriter"); + +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_DataWriter_i *top = dynamic_cast< CCM_DDS_DataWriter_i *> (a_datawriter); + + if (top == 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Publisher_i::delete_datawriter - " + "Unable to cast provided object reference to servant.\n")); + return ::DDS::RETCODE_BAD_PARAMETER; + } + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_Publisher_i::delete_datawriter - " + "Successfully casted provided object reference to servant.\n")); + + DDS_ReturnCode_t const retval = this->impl ()->delete_datawriter (top->get_impl ()); + + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Publisher_i::delete_datawriter - " + "Error: RTI delete_datawriter returned non-ok error code %C\n", + translate_retcode (retval))); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_Publisher_i::delete_datawriter - " + "Provided datawriter successfully deleted\n")); + } + + return retval; +#else + return this->impl ()->delete_datawriter (a_datawriter); +#endif + } + + ::DDS::DataWriter_ptr + CCM_DDS_Publisher_i::lookup_datawriter (const char * impl_name) + { + ::DDS::DataWriter_var retval = ::DDS::DataWriter::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSDataWriter* dw = this->impl ()->lookup_datawriter (impl_name); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DataWriter_i (dw), + CORBA::NO_MEMORY ()); +#else + ::DDS::DataWriter_var dw = this->impl ()->lookup_datawriter (impl_name); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DataWriter_i (dw.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::delete_contained_entities (void) + { + return this->impl ()->delete_contained_entities (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::set_qos (const ::DDS::PublisherQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::set_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_PublisherQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl ()->set_qos (ccm_dds_qos); +#else + return this->impl ()->set_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::get_qos (::DDS::PublisherQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::get_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_PublisherQos ccm_dds_qos; + ccm_dds_qos <<= qos; + ::DDS::ReturnCode_t retcode = this->impl()-> + get_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl ()->get_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::set_listener (::DDS::PublisherListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::set_listener"); + +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_PublisherListener_i *ccm_dds_impl_list = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_impl_list, + CCM_DDS_PublisherListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + return this->impl ()->set_listener (ccm_dds_impl_list, mask); +#else + return this->impl ()->set_listener (a_listener, mask); +#endif + } + + ::DDS::PublisherListener_ptr + CCM_DDS_Publisher_i::get_listener (void) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::get_listener"); + +#if (CIAO_DDS4CCM_NDDS==1) + DDSPublisherListener *ccm_dds_pub_list = this->impl ()->get_listener (); + CCM_DDS_PublisherListener_i *list_proxy = dynamic_cast <CCM_DDS_PublisherListener_i *> (ccm_dds_pub_list); + if (!list_proxy) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, "CCM_DDS_Publisher_i::get_listener - " + "DDS returned a NIL listener.\n")); + return ::DDS::PublisherListener::_nil (); + } + return list_proxy->get_publisher_listener (); +#else + return this->impl ()->get_listener (); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::suspend_publications (void) + { + return this->impl ()->suspend_publications (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::resume_publications (void) + { + return this->impl ()->resume_publications (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::begin_coherent_changes (void) + { + return this->impl ()->begin_coherent_changes (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::end_coherent_changes (void) + { + return this->impl ()->end_coherent_changes (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::wait_for_acknowledgments (const ::DDS::Duration_t & max_wait) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_Duration_t ccm_dds_dds_duration; + ccm_dds_dds_duration <<= max_wait; + return this->impl ()->wait_for_acknowledgments (ccm_dds_dds_duration); +#else + return this->impl ()->wait_for_acknowledgments (max_wait); +#endif + } + + ::DDS::DomainParticipant_ptr + CCM_DDS_Publisher_i::get_participant (void) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::get_participant"); + ::DDS::DomainParticipant_var retval = ::DDS::DomainParticipant::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSDomainParticipant* p = this->impl ()->get_participant (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p), + CORBA::NO_MEMORY ()); +#else + ::DDS::DomainParticipant_var p = this->impl ()->get_participant (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::set_default_datawriter_qos (const ::DDS::DataWriterQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::set_default_datawriter_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataWriterQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl()->set_default_datawriter_qos (ccm_dds_qos); +#else + return this->impl()->set_default_datawriter_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::get_default_datawriter_qos (::DDS::DataWriterQos & qos) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::get_default_datawriter_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataWriterQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = + this->impl()->get_default_datawriter_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl()->get_default_datawriter_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::copy_from_topic_qos (::DDS::DataWriterQos & a_dataimpl_qos, + const ::DDS::TopicQos & a_impl_qos) + { + DDS4CCM_TRACE ("CCM_DDS_Publisher_i::copy_from_topic_qos"); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataWriterQos ccm_dds_qos; + ::DDS_TopicQos ccm_dds_topic_qos; + + ccm_dds_qos <<= a_dataimpl_qos; + ccm_dds_topic_qos <<= a_impl_qos; + ::DDS::ReturnCode_t const retcode = + this->impl()->copy_from_topic_qos (ccm_dds_qos, ccm_dds_topic_qos); + a_dataimpl_qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl()->copy_from_topic_qos (a_dataimpl_qos, a_impl_qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Publisher_i::enable (void) + { + return this->impl ()->enable (); + } + + ::DDS::StatusCondition_ptr + CCM_DDS_Publisher_i::get_statuscondition (void) + { + ::DDS::StatusCondition_var retval = ::DDS::StatusCondition::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSStatusCondition* sc = this->impl ()->get_statuscondition (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc), + CORBA::NO_MEMORY ()); +#else + ::DDS::StatusCondition_var sc = this->impl ()->get_statuscondition (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + ::DDS::StatusMask + CCM_DDS_Publisher_i::get_status_changes (void) + { + return this->impl ()->get_status_changes (); + } + + ::DDS::InstanceHandle_t + CCM_DDS_Publisher_i::get_instance_handle (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t const rtihandle = this->impl ()->get_instance_handle (); + ::DDS::InstanceHandle_t handle; + handle <<= rtihandle; + return handle; +#else + return this->impl ()->get_instance_handle (); +#endif + } + + DDSPublisher * + CCM_DDS_Publisher_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_Publisher_i::set_impl (DDSPublisher * dw) + { + this->impl_ = dw; + } + + DDSPublisher * + CCM_DDS_Publisher_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Publisher.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Publisher.h new file mode 100644 index 00000000000..46705e0f284 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Publisher.h @@ -0,0 +1,133 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_PUBLISHER_H +#define DDS4CCM_PUBLISHER_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::Publisher DDSPublisher; +#endif + +#include "tao/LocalObject.h" + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_Publisher_i : + public virtual ::DDS::CCM_Publisher, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_Publisher_i (DDSPublisher * dw); + + /// Destructor + virtual ~CCM_DDS_Publisher_i (void); + + virtual + ::DDS::DataWriter_ptr create_datawriter (::DDS::Topic_ptr a_topic, + const ::DDS::DataWriterQos & qos, + ::DDS::DataWriterListener_ptr a_listener, + ::DDS::StatusMask mask); + + virtual + ::DDS::DataWriter_ptr create_datawriter_with_profile (::DDS::Topic_ptr a_topic, + const char* library_name, + const char *profile_name, + ::DDS::DataWriterListener_ptr a_listener, + ::DDS::StatusMask mask); + + virtual + ::DDS::ReturnCode_t delete_datawriter (::DDS::DataWriter_ptr a_datawriter); + + virtual + ::DDS::DataWriter_ptr lookup_datawriter (const char * impl_name); + + virtual + ::DDS::ReturnCode_t delete_contained_entities (void); + + virtual + ::DDS::ReturnCode_t set_qos (const ::DDS::PublisherQos & qos); + + virtual + ::DDS::ReturnCode_t get_qos (::DDS::PublisherQos & qos); + + virtual + ::DDS::ReturnCode_t set_listener (::DDS::PublisherListener_ptr a_listener, + ::DDS::StatusMask mask); + + virtual + ::DDS::PublisherListener_ptr get_listener (void); + + virtual + ::DDS::ReturnCode_t suspend_publications (void); + + virtual + ::DDS::ReturnCode_t resume_publications (void); + + virtual + ::DDS::ReturnCode_t begin_coherent_changes (void); + + virtual + ::DDS::ReturnCode_t end_coherent_changes (void); + + virtual + ::DDS::ReturnCode_t wait_for_acknowledgments (const ::DDS::Duration_t & max_wait); + + virtual + ::DDS::DomainParticipant_ptr get_participant (void); + + virtual + ::DDS::ReturnCode_t set_default_datawriter_qos (const ::DDS::DataWriterQos & qos); + + virtual + ::DDS::ReturnCode_t get_default_datawriter_qos (::DDS::DataWriterQos & qos); + + virtual + ::DDS::ReturnCode_t copy_from_topic_qos (::DDS::DataWriterQos & a_dataimpl_qos, + const ::DDS::TopicQos & a_impl_qos); + + virtual + ::DDS::ReturnCode_t enable (void); + + virtual + ::DDS::StatusCondition_ptr get_statuscondition (void); + + virtual + ::DDS::StatusMask get_status_changes (void); + + virtual + ::DDS::InstanceHandle_t get_instance_handle (void); + + DDSPublisher * get_impl (void); + + void set_impl (DDSPublisher *p); + + private: + DDSPublisher *impl_; + + DDSPublisher *impl (void); + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener.cpp new file mode 100644 index 00000000000..0749c455e56 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener.cpp @@ -0,0 +1,156 @@ +// $Id$ + +#include "PublisherListener.h" +#include "Publisher.h" +#include "DataWriter.h" + +#include "ndds/PublicationMatchedStatus.h" +#include "ndds/LivelinessLostStatus.h" +#include "ndds/OfferedIncompatibleQosStatus.h" +#include "ndds/OfferedDeadlineMissedStatus.h" +#include "ndds/ReliableReaderActivityChangedStatus.h" +#include "ndds/ReliableWriterCacheChangedStatus.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_PublisherListener_i::CCM_DDS_PublisherListener_i ( ::DDS::PublisherListener_ptr p) + : impl_ (::DDS::PublisherListener::_duplicate (p)) + { + DDS4CCM_TRACE ("CCM_DDS_PublisherListener_i::CCM_DDS_PublisherListener_i"); + } + + CCM_DDS_PublisherListener_i::~CCM_DDS_PublisherListener_i (void) + { + DDS4CCM_TRACE ("CCM_DDS_PublisherListener_i::~CCM_DDS_PublisherListener_i"); + } + + void + CCM_DDS_PublisherListener_i::on_offered_deadline_missed ( + ::DDSDataWriter* writer, + const ::DDS_OfferedDeadlineMissedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_PublisherListener_i::on_offered_deadline_missed"); + + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (writer)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::OfferedDeadlineMissedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_offered_deadline_missed (dds_writer.in (), ddsstatus); +#else + this->impl_->on_offered_deadline_missed (dds_writer.in (), status); +#endif + } + + void + CCM_DDS_PublisherListener_i::on_offered_incompatible_qos ( + ::DDSDataWriter* writer, + const ::DDS_OfferedIncompatibleQosStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_PublisherListener_i::on_offered_incompatible_qos"); + + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (writer)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::OfferedIncompatibleQosStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_offered_incompatible_qos (dds_writer.in (), ddsstatus); +#else + this->impl_->on_offered_incompatible_qos (dds_writer.in (), status); +#endif + } + + void + CCM_DDS_PublisherListener_i::on_liveliness_lost ( + ::DDSDataWriter* writer, + const ::DDS_LivelinessLostStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_PublisherListener_i::on_liveliness_lost"); + + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (writer)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::LivelinessLostStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_liveliness_lost (dds_writer.in (), ddsstatus); +#else + this->impl_->on_liveliness_lost (dds_writer.in (), status); +#endif + } + + void + CCM_DDS_PublisherListener_i::on_publication_matched ( + ::DDSDataWriter* writer, + const ::DDS_PublicationMatchedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_PublisherListener_i::on_publication_matched"); + + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (writer)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::PublicationMatchedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_publication_matched (dds_writer.in (), ddsstatus); +#else + this->impl_->on_publication_matched (dds_writer.in (), status); +#endif + } + + void + CCM_DDS_PublisherListener_i::on_reliable_reader_activity_changed ( + ::DDSDataWriter *writer, + const ::DDS_ReliableReaderActivityChangedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_PublisherListener_i::on_reliable_reader_activity_changed"); + + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (writer)); + +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::ReliableReaderActivityChangedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_reliable_reader_activity_changed (dds_writer.in (), ddsstatus); +#else + this->impl_->on_reliable_reader_activity_changed (dds_writer.in (), status); +#endif + } + + void + CCM_DDS_PublisherListener_i::on_reliable_writer_cache_changed ( + ::DDSDataWriter* writer, + const ::DDS_ReliableWriterCacheChangedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_PublisherListener_i::on_reliable_writer_cache_changed"); + + ::DDS::DataWriter_var dds_writer = ::DDS::DataWriter::_nil (); + ACE_NEW (dds_writer, + CCM_DDS_DataWriter_i (writer)); + +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::ReliableWriterCacheChangedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_reliable_writer_cache_changed (dds_writer.in (), ddsstatus); +#else + this->impl_->on_reliable_writer_cache_changed (dds_writer.in (), status); +#endif + } + + ::DDS::PublisherListener_ptr + CCM_DDS_PublisherListener_i::get_publisher_listener (void) + { + return ::DDS::PublisherListener::_duplicate (this->impl_.in ()); + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener.h b/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener.h new file mode 100644 index 00000000000..9f26a421124 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener.h @@ -0,0 +1,90 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_PUBLISHERLISTENER_H +#define DDS4CCM_PUBLISHERLISTENER_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::PublisherListener DDSPublisherListener; +typedef ::DDS::DataWriter DDSDataWriter; +typedef ::DDS::OfferedDeadlineMissedStatus DDS_OfferedDeadlineMissedStatus; +typedef ::DDS::OfferedIncompatibleQosStatus DDS_OfferedIncompatibleQosStatus; +typedef ::DDS::LivelinessLostStatus DDS_LivelinessLostStatus; +typedef ::DDS::PublicationMatchedStatus DDS_PublicationMatchedStatus; +typedef ::DDS::ReliableWriterCacheChangedStatus DDS_ReliableWriterCacheChangedStatus; +#endif + +#include "tao/LocalObject.h" + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_PublisherListener_i : + public virtual ::DDSPublisherListener + { + public: + /// Constructor + CCM_DDS_PublisherListener_i (::DDS::PublisherListener_ptr p); + + /// Destructor + virtual ~CCM_DDS_PublisherListener_i (void); + + virtual void + on_offered_deadline_missed ( + ::DDSDataWriter *writer, + const ::DDS_OfferedDeadlineMissedStatus & status); + + virtual void + on_offered_incompatible_qos ( + ::DDSDataWriter *writer, + const ::DDS_OfferedIncompatibleQosStatus & status); + + virtual void + on_liveliness_lost ( + ::DDSDataWriter *writer, + const ::DDS_LivelinessLostStatus & status); + + virtual void + on_publication_matched ( + ::DDSDataWriter *writer, + const ::DDS_PublicationMatchedStatus & status); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual void + on_reliable_reader_activity_changed ( + ::DDSDataWriter *writer, + const ::DDS_ReliableReaderActivityChangedStatus & status); + + virtual void + on_reliable_writer_cache_changed ( + ::DDSDataWriter *writer, + const ::DDS_ReliableWriterCacheChangedStatus & status); +#endif + + ::DDS::PublisherListener_ptr get_publisher_listener (void); + private: + ::DDS::PublisherListener_var impl_; + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener_T.cpp new file mode 100644 index 00000000000..fd298923e7f --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener_T.cpp @@ -0,0 +1,294 @@ +// $Id$ +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds/DataReaderHandler_T.h" +#include "dds4ccm/impl/dds/DDSCallbackStatusHandler.h" +#include "dds4ccm/impl/dds4ccm_conf.h" +#include "tao/ORB_Core.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::PublisherListener_T ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener, + ACE_Reactor* reactor) + : error_listener_ (::CCM_DDS::ConnectorStatusListener::_duplicate (error_listener)), + reactor_ (reactor) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::PublisherListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::~PublisherListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::~PublisherListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::on_unexpected_status ( + ::DDS::Entity_ptr entity, + ::DDS::StatusKind status_kind) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::on_unexpected_status"); + + if (! ::CORBA::is_nil (this->error_listener_)) + { + try + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnUnexpectedStatusHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnUnexpectedStatusHandler ( + this->error_listener_, entity, status_kind)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("PublisherListener_T::failed to use reactor.\n"))); + } + } + else + { + this->error_listener_->on_unexpected_status (entity, status_kind); + } + } + catch (...) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, + ACE_TEXT ("PublisherListener_T::on_unexpected_status: ") + ACE_TEXT ("DDS Exception caught\n"))); + } + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_offered_deadline_missed: ") + ACE_TEXT ("No error listener connected\n"))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::on_offered_deadline_missed ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::OfferedDeadlineMissedStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::on_offered_deadline_missed"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_offered_deadline_missed: ") + ACE_TEXT ("total count <%d> - count change <%d> - ") + ACE_TEXT ("last instance handle <length <%d> - isValid <%d>\n"), + status.total_count, status.total_count_change, + status.last_instance_handle.length, + status.last_instance_handle.isValid)); + + if (! ::CORBA::is_nil (this->error_listener_)) + { + try + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnOfferedDeadlineMissedHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnOfferedDeadlineMissedHandler ( + this->error_listener_, the_Writer, status)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("PublisherListener_T::failed to use reactor.\n"))); + } + } + else + { + this->error_listener_->on_offered_deadline_missed (the_Writer, status); + } + } + catch (...) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("PublisherListener_T::on_offered_deadline_missed: ") + ACE_TEXT ("DDS Exception caught\n"))); + } + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_offered_deadline_missed: ") + ACE_TEXT ("No error listener connected\n"))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::on_offered_incompatible_qos ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::OfferedIncompatibleQosStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::on_offered_incompatible_qos"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_offered_incompatible_qos: ") + ACE_TEXT ("total count <%d> - total change <%d> - ") + ACE_TEXT ("last policy id <%d> - policies "), + status.total_count, status.total_count_change, + status.last_policy_id)); + for (CORBA::ULong i = 0; i < status.policies.length (); ++i) + { + DDS4CCM_DEBUG (10, (LM_DEBUG, + ACE_TEXT ("\t\tid <%d> - count <%d>\n"), + status.policies[i].policy_id, + status.policies[i].count)); + } + + if (! ::CORBA::is_nil (this->error_listener_)) + { + try + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnOfferedIncompatibleQoSHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnOfferedIncompatibleQoSHandler ( + this->error_listener_, the_Writer, status)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("PublisherListener_T::failed to use reactor.\n"))); + } + } + else + { + this->error_listener_->on_offered_incompatible_qos (the_Writer, status); + } + } + catch (...) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("PublisherListener_T::on_offered_incompatible_qos: ") + ACE_TEXT ("DDS Exception caught\n"))); + } + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_offered_incompatible_qos: ") + ACE_TEXT ("No error listener connected\n"))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::on_liveliness_lost ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::LivelinessLostStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::on_liveliness_lost"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_liveliness_lost: ") + ACE_TEXT ("total count <%d> - count change <%d>\n"), + status.total_count, status.total_count_change)); + + this->on_unexpected_status (the_Writer, ::DDS::LIVELINESS_LOST_STATUS); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::on_publication_matched ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::PublicationMatchedStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::on_publication_matched"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_publication_matched: ") + ACE_TEXT ("total count <%d> - count change <%d> - ") + ACE_TEXT ("current count <%d> - current count change <%d> ") + ACE_TEXT ("last publication handle <length <%d> - isValid <%d>\n"), + status.total_count, status.total_count_change, + status.current_count, status.current_count_change, + status.last_subscription_handle.length, + status.last_subscription_handle.isValid)); + + this->on_unexpected_status (the_Writer, ::DDS::PUBLICATION_MATCHED_STATUS); +} + +#if (CIAO_DDS4CCM_NDDS==1) +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::on_reliable_writer_cache_changed ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::ReliableWriterCacheChangedStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::on_reliable_writer_cache_changed"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_reliable_writer_cache_changed: ") + ACE_TEXT ("empty_reliable_writer_cache.total_count <%d> - ") + ACE_TEXT ("empty_reliable_writer_cache.total_count_change <%d> - ") + ACE_TEXT ("full_reliable_writer_cache.total_count <%d> - ") + ACE_TEXT ("full_reliable_writer_cache.total_count_change <%d> - ") + ACE_TEXT ("low_watermark_reliable_writer_cache.total_count <%d> - ") + ACE_TEXT ("low_watermark_reliable_writer_cache.total_count_change <%d> - ") + ACE_TEXT ("high_watermark_reliable_writer_cache.total_count <%d> - ") + ACE_TEXT ("high_watermark_reliable_writer_cache.total_count_change <%d> - ") + ACE_TEXT ("unacknowledged_sample_count <%d> - ") + ACE_TEXT ("unacknowledged_sample_count_peak <%d>\n"), + status.empty_reliable_writer_cache.total_count, + status.empty_reliable_writer_cache.total_count_change, + status.full_reliable_writer_cache.total_count, + status.full_reliable_writer_cache.total_count_change, + status.low_watermark_reliable_writer_cache.total_count, + status.low_watermark_reliable_writer_cache.total_count_change, + status.high_watermark_reliable_writer_cache.total_count, + status.high_watermark_reliable_writer_cache.total_count_change, + status.unacknowledged_sample_count, + status.unacknowledged_sample_count_peak)); + + this->on_unexpected_status (the_Writer, ::DDS::RELIABLE_WRITER_CACHE_CHANGED_STATUS); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::on_reliable_reader_activity_changed ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::ReliableReaderActivityChangedStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::PublisherListener_T::on_reliable_reader_activity_changed"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("PublisherListener_T::on_reliable_reader_activity_changed: ") + ACE_TEXT ("active count <%d> - active change <%d> - ") + ACE_TEXT ("not active count <%d> - inactive count change <%d>") + ACE_TEXT ("last instance handle <length <%d> - isValid <%d>\n"), + status.active_count, status.active_count_change, + status.inactive_count, status.inactive_count_change, + status.last_instance_handle.length, + status.last_instance_handle.isValid)); + + this->on_unexpected_status (the_Writer, ::DDS::RELIABLE_READER_ACTIVITY_CHANGED_STATUS); +} +#endif + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StatusMask +CIAO::DDS4CCM::PublisherListener_T<DDS_TYPE, CCM_TYPE>::get_mask ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener) +{ + if (! ::CORBA::is_nil (error_listener) || CIAO_debug_level >= 10) + { + return ::DDS::OFFERED_DEADLINE_MISSED_STATUS | + ::DDS::OFFERED_INCOMPATIBLE_QOS_STATUS | +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::RELIABLE_WRITER_CACHE_CHANGED_STATUS | + ::DDS::RELIABLE_READER_ACTIVITY_CHANGED_STATUS | +#endif + ::DDS::LIVELINESS_LOST_STATUS | + ::DDS::PUBLICATION_MATCHED_STATUS; + } + else + { + return 0; + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener_T.h new file mode 100644 index 00000000000..e352c86084c --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/PublisherListener_T.h @@ -0,0 +1,83 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS_PUBLISHERLISTENER_T_H_ +#define DDS_PUBLISHERLISTENER_T_H_ + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds4ccm_conf.h" +#include "ace/Copy_Disabled.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL +class ACE_Reactor; +ACE_END_VERSIONED_NAMESPACE_DECL + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class PublisherListener_T : + public ::DDS::PublisherListener, + private ACE_Copy_Disabled + { + public: + /// Constructor + PublisherListener_T ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener, + ACE_Reactor* reactor); + + virtual void on_offered_deadline_missed ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::OfferedDeadlineMissedStatus & status); + + virtual void on_liveliness_lost ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::LivelinessLostStatus & status); + + virtual void on_offered_incompatible_qos ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::OfferedIncompatibleQosStatus & status); + + virtual void on_publication_matched ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::PublicationMatchedStatus & status); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual void on_reliable_writer_cache_changed ( + ::DDS::DataWriter_ptr the_writer, + const ::DDS::ReliableWriterCacheChangedStatus & status); + + virtual void on_reliable_reader_activity_changed ( + ::DDS::DataWriter_ptr the_Writer, + const ::DDS::ReliableReaderActivityChangedStatus & status); +#endif + + /// Destructor + virtual ~PublisherListener_T (void); + + static ::DDS::StatusMask get_mask ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener); + + private: + virtual void on_unexpected_status ( + ::DDS::Entity_ptr entity, + ::DDS::StatusKind status_kind); + + ::CCM_DDS::ConnectorStatusListener_var error_listener_; + + ACE_Reactor* reactor_; + }; + } +} + +#include "dds4ccm/impl/dds/PublisherListener_T.cpp" + +#endif /* DDS_PUBLISHERLISTENER_T_H_ */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/QueryCondition.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/QueryCondition.cpp new file mode 100644 index 00000000000..3209ccc6149 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/QueryCondition.cpp @@ -0,0 +1,134 @@ +// $Id$ + +#include "QueryCondition.h" +#include "Subscriber.h" +#include "DataReader.h" + +#include "ndds/StringSeq.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_QueryCondition_i::CCM_DDS_QueryCondition_i (DDSQueryCondition * qc) + : impl_ (qc) + { + } + + CCM_DDS_QueryCondition_i::~CCM_DDS_QueryCondition_i (void) + { + } + + ::CORBA::Boolean + CCM_DDS_QueryCondition_i::get_trigger_value (void) + { + return this->impl ()->get_trigger_value (); + } + + ::DDS::SampleStateMask + CCM_DDS_QueryCondition_i::get_sample_state_mask (void) + { + return this->impl ()->get_sample_state_mask (); + } + + ::DDS::ViewStateMask + CCM_DDS_QueryCondition_i::get_view_state_mask (void) + { + return this->impl ()->get_view_state_mask (); + } + + ::DDS::InstanceStateMask + CCM_DDS_QueryCondition_i::get_instance_state_mask (void) + { + return this->impl ()->get_instance_state_mask (); + } + + ::DDS::DataReader_ptr + CCM_DDS_QueryCondition_i::get_datareader (void) + { + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDSDataReader* reader = this->impl ()->get_datareader (); + if (reader) + { + ACE_NEW_THROW_EX (dds_reader, + CCM_DDS_DataReader_i (reader), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::DataReader_var reader = this->impl ()->get_datareader (); + if (! ::CORBA::is_nil (reader.in ())) + { + ACE_NEW_THROW_EX (dds_reader, + CCM_DDS_DataReader_i (reader.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return dds_reader._retn (); + } + + char * + CCM_DDS_QueryCondition_i::get_query_expression (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + return ::CORBA::string_dup (this->impl ()->get_query_expression ()); +#else + return this->impl ()->get_query_expression (); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_QueryCondition_i::get_query_parameters ( + ::DDS::StringSeq & query_parameters) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_StringSeq parameters; + ::DDS::ReturnCode_t const retval = this->impl ()->get_query_parameters (parameters); + query_parameters <<= parameters; + return retval; +#else + return this->impl ()->get_query_parameters (query_parameters); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_QueryCondition_i::set_query_parameters ( + const ::DDS::StringSeq & query_parameters) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_StringSeq parameters; + parameters <<= query_parameters; + return this->impl ()->set_query_parameters (parameters); +#else + return this->impl ()->set_query_parameters (query_parameters); +#endif + } + + DDSQueryCondition * + CCM_DDS_QueryCondition_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_QueryCondition_i::set_impl (DDSQueryCondition * dw) + { + this->impl_ = dw; + } + + DDSQueryCondition * + CCM_DDS_QueryCondition_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/QueryCondition.h b/modules/CIAO/connectors/dds4ccm/impl/dds/QueryCondition.h new file mode 100644 index 00000000000..959101a3d6e --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/QueryCondition.h @@ -0,0 +1,76 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_QUERYCONDITION_H +#define DDS4CCM_QUERYCONDITION_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +#include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::QueryCondition DDSQueryCondition; +#endif + +#include "tao/LocalObject.h" + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_QueryCondition_i : + public virtual ::DDS::CCM_QueryCondition, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_QueryCondition_i (DDSQueryCondition * qc); + + /// Destructor + virtual ~CCM_DDS_QueryCondition_i (void); + + virtual ::CORBA::Boolean get_trigger_value (void); + + virtual ::DDS::SampleStateMask get_sample_state_mask (void); + + virtual ::DDS::ViewStateMask get_view_state_mask (void); + + virtual ::DDS::InstanceStateMask get_instance_state_mask (void); + + virtual ::DDS::DataReader_ptr get_datareader (void); + + virtual char *get_query_expression (void); + + virtual ::DDS::ReturnCode_t + get_query_parameters (::DDS::StringSeq & query_parameters); + + virtual ::DDS::ReturnCode_t + set_query_parameters (const ::DDS::StringSeq & query_parameters); + + DDSQueryCondition * get_impl (void); + + void set_impl (DDSQueryCondition * qc); + + private: + DDSQueryCondition * impl_; + + DDSQueryCondition * impl (); + }; + } +} + +#endif /* DDS4CCM_QUERYCONDITION_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ReadCondition.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/ReadCondition.cpp new file mode 100644 index 00000000000..e8459b51e0a --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ReadCondition.cpp @@ -0,0 +1,80 @@ +// $Id$ + +#include "ReadCondition.h" +#include "DataReader.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_ReadCondition_i::CCM_DDS_ReadCondition_i (DDSReadCondition * rc) + : impl_ (rc) + { + } + + CCM_DDS_ReadCondition_i::~CCM_DDS_ReadCondition_i (void) + { + } + + ::CORBA::Boolean + CCM_DDS_ReadCondition_i::get_trigger_value (void) + { + return this->impl ()->get_trigger_value (); + } + + ::DDS::SampleStateMask + CCM_DDS_ReadCondition_i::get_sample_state_mask (void) + { + return this->impl ()->get_sample_state_mask (); + } + + ::DDS::ViewStateMask + CCM_DDS_ReadCondition_i::get_view_state_mask (void) + { + return this->impl ()->get_view_state_mask (); + } + + ::DDS::InstanceStateMask + CCM_DDS_ReadCondition_i::get_instance_state_mask (void) + { + return this->impl ()->get_instance_state_mask (); + } + + ::DDS::DataReader_ptr + CCM_DDS_ReadCondition_i::get_datareader (void) + { + ::DDS::DataReader_var retval = ::DDS::DataReader::_nil (); + ::DDSDataReader* rd = this->impl ()->get_datareader (); + if (rd) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_DataReader_i (rd), + CORBA::NO_MEMORY ()); + } + return retval._retn (); + } + + DDSReadCondition * + CCM_DDS_ReadCondition_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_ReadCondition_i::set_impl (DDSReadCondition * rc) + { + this->impl_ = rc; + } + + DDSReadCondition * + CCM_DDS_ReadCondition_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ReadCondition.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ReadCondition.h new file mode 100644 index 00000000000..de289f58c05 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ReadCondition.h @@ -0,0 +1,68 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_READCONDITION_H +#define DDS4CCM_READCONDITION_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +#include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::ReadCondition DDSReadCondition; +#endif + +#include "tao/LocalObject.h" + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_ReadCondition_i : + public virtual ::DDS::CCM_ReadCondition, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_ReadCondition_i (DDSReadCondition * rc); + + /// Destructor + virtual ~CCM_DDS_ReadCondition_i (void); + + virtual ::CORBA::Boolean get_trigger_value (void); + + virtual ::DDS::SampleStateMask get_sample_state_mask (void); + + virtual ::DDS::ViewStateMask get_view_state_mask (void); + + virtual ::DDS::InstanceStateMask get_instance_state_mask (void); + + virtual ::DDS::DataReader_ptr get_datareader (void); + + DDSReadCondition * get_impl (void); + + void set_impl (DDSReadCondition * rc); + + private: + DDSReadCondition *impl_; + + DDSReadCondition * impl (void); + }; + } +} + +#endif /* DDS4CCM_READCONDITION_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Reader_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Reader_T.cpp new file mode 100644 index 00000000000..ecfc048b600 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Reader_T.cpp @@ -0,0 +1,682 @@ +// $Id$ + +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/dds/DataReaderListener_T.h" +#include "dds4ccm/impl/dds/Utils.h" +#include "dds4ccm/impl/dds/Subscriber.h" +#include "dds4ccm/impl/dds/QueryCondition.h" + +#include "dds4ccm/impl/dds/ndds/SampleInfo.h" +#include "dds4ccm/impl/dds/ndds/StringSeq.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::Reader_T (void) + : reader_ (0), + dds_get_ (0), + library_name_ (""), + profile_name_ ("") +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Reader_T::Reader_T"); + #if (DDS4CCM_USES_QUERY_CONDITION==1) + this->qc_ = 0; + #else + this->cft_ = 0; + #endif +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::~Reader_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Reader_T::~Reader_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +typename DDS_TYPE::data_reader * +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::impl (void) +{ + if (this->reader_) + { + return DDS_TYPE::data_reader::narrow (this->reader_->get_impl ()); + } + else + { + throw ::CORBA::BAD_INV_ORDER (); + } +} + +// For the requirement : 'samples ordered by instances' the following settings are necessary: +// ordered_access -> true and DDS_INSTANCE_PRESENTATION_QOS (default) . +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +CORBA::ULong +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::get_nr_valid_samples ( + const DDS_SampleInfoSeq& sample_info, + bool determine_last) +{ + CORBA::ULong nr_of_samples = 0; + for (::DDS_Long i = 0 ; i < sample_info.length(); ++i) + { + if (determine_last) + { + if (sample_info[i].sample_rank == 0 && sample_info[i].valid_data) + { + ++nr_of_samples; + } + } + else if (sample_info[i].valid_data) + { + ++nr_of_samples; + } + } + return nr_of_samples; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::read_without_instance ( + typename DDS_TYPE::dds_seq_type & data, + DDS_SampleInfoSeq & sample_info) +{ + DDS_ReturnCode_t retval = DDS_RETCODE_ERROR; +#if (DDS4CCM_USES_QUERY_CONDITION==1) + if (this->qc_) + { + retval = this->impl ()->read_w_condition (data, + sample_info, + DDS_LENGTH_UNLIMITED, + this->qc_); + } + else + { +#endif + retval = this->impl ()->read (data, + sample_info, + DDS_LENGTH_UNLIMITED, + DDS_READ_SAMPLE_STATE | DDS_NOT_READ_SAMPLE_STATE, + DDS_NEW_VIEW_STATE | DDS_NOT_NEW_VIEW_STATE, + DDS_ALIVE_INSTANCE_STATE); +#if (DDS4CCM_USES_QUERY_CONDITION==1) + } +#endif + if (retval != DDS_RETCODE_OK && retval != DDS_RETCODE_NO_DATA) + { + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Reader_T::read_without_instance - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("CIAO::DDS4CCM::DDS_CCM::Reader_T::read_without_instance - ") + ACE_TEXT ("retval is %C\n"), translate_retcode(retval))); + throw ::CCM_DDS::InternalError (retval, 0); + } +} + + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::read_last ( + typename CCM_TYPE::seq_type::_out_type instances, + ::CCM_DDS::ReadInfoSeq_out infos) +{ + // This function has to return the last sample of all instances + DDS_SampleInfoSeq sample_info; + typename DDS_TYPE::dds_seq_type data; + + this->read_without_instance (data, sample_info); + + typename CCM_TYPE::seq_type * inst_seq = 0; + ACE_NEW_THROW_EX (inst_seq, + typename CCM_TYPE::seq_type, + CORBA::NO_MEMORY ()); + ::CCM_DDS::ReadInfoSeq * infoseq = 0; + ACE_NEW_THROW_EX (infoseq, + ::CCM_DDS::ReadInfoSeq, + CORBA::NO_MEMORY ()); + + CORBA::ULong const nr_of_last_samples = this->get_nr_valid_samples (sample_info, true); + + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("CIAO::DDS4CCM::DDS_CCM::Reader_T::read_last - ") + ACE_TEXT ("total number of samples <%u> - ") + ACE_TEXT ("last number of samples <%u>\n"), + data.length(), + nr_of_last_samples)); + CORBA::ULong ix = 0; + + infoseq->length (nr_of_last_samples); + inst_seq->length (nr_of_last_samples); + + // We need only the last sample of each instance + for (::DDS_Long i = 0 ; i < sample_info.length(); ++i) + { + if((sample_info[i].sample_rank == 0) && (sample_info[i].valid_data)) + { + (*infoseq)[ix] <<= sample_info[i]; + (*inst_seq)[ix] = data[i]; + ++ix; + } + } + + // Return the loan + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Reader_T::read_last - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + infos = infoseq; + instances = inst_seq; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::read_all ( + typename CCM_TYPE::seq_type::_out_type instances, + ::CCM_DDS::ReadInfoSeq_out infos) +{ + // This function has to return all samples of all instances + DDS_SampleInfoSeq sample_info; + typename DDS_TYPE::dds_seq_type data; + + this->read_without_instance (data, sample_info); + + CORBA::ULong const nr_of_valid_samples = this->get_nr_valid_samples (sample_info); + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("CIAO::DDS4CCM::DDS_CCM::Reader_T::read_all - ") + ACE_TEXT ("total number of samples <%u> - ") + ACE_TEXT ("valid number of samples <%u>\n"), + data.length (), + nr_of_valid_samples)); + + typename CCM_TYPE::seq_type * inst_seq = 0; + ACE_NEW_THROW_EX (inst_seq, + typename CCM_TYPE::seq_type, + CORBA::NO_MEMORY ()); + ::CCM_DDS::ReadInfoSeq * infoseq = 0; + ACE_NEW_THROW_EX (infoseq, + ::CCM_DDS::ReadInfoSeq, + CORBA::NO_MEMORY ()); + + infoseq->length (nr_of_valid_samples); + inst_seq->length (nr_of_valid_samples); + + CORBA::ULong ix = 0; + + for (::DDS_Long i = 0 ; i < sample_info.length(); ++i) + { + if(sample_info[i].valid_data) + { + (*infoseq)[ix] <<= sample_info[i]; + (*inst_seq)[ix] = data[i]; + ++ix; + } + } + + // Return the loan + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Reader_T::read_all - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + + infos = infoseq; + instances = inst_seq; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_InstanceHandle_t +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::check_handle ( + const typename DDS_TYPE::value_type& an_instance, + const ::DDS::InstanceHandle_t & instance_handle) +{ + DDS_InstanceHandle_t hnd = ::DDS_HANDLE_NIL; + hnd <<= instance_handle; + + DDS_InstanceHandle_t const lookup_hnd = + this->impl ()->lookup_instance (an_instance); + if (!DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL) && + !DDS_InstanceHandle_equals (&hnd, &lookup_hnd)) + { + throw ::CCM_DDS::InternalError (0, 0); + } + if (DDS_InstanceHandle_equals (&lookup_hnd, &::DDS_HANDLE_NIL)) + { + throw ::CCM_DDS::NonExistent (); + } + return lookup_hnd; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::read_with_instance ( + typename DDS_TYPE::dds_seq_type & data, + const ::DDS_InstanceHandle_t & lookup_hnd, + DDS_SampleInfoSeq & sample_info) +{ + DDS4CCM_DEBUG (6, (LM_INFO, ACE_TEXT ("CIAO::DDS4CCM::DDS_CCM::Reader_T::read_with_instance - ") + ACE_TEXT ("Reading with instance.\n"))); + DDS_ReturnCode_t const retval = this->impl ()->read_instance ( + data, + sample_info, + DDS_LENGTH_UNLIMITED, + lookup_hnd, + DDS_READ_SAMPLE_STATE | DDS_NOT_READ_SAMPLE_STATE , + DDS_NEW_VIEW_STATE | DDS_NOT_NEW_VIEW_STATE, + DDS_ALIVE_INSTANCE_STATE); + if (retval != DDS_RETCODE_OK && retval != DDS_RETCODE_NO_DATA) + { + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Reader_T::read_with_instance - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + DDS4CCM_ERROR (1, (LM_ERROR, ACE_TEXT ("CIAO::DDS4CCM::DDS_CCM::Reader_T::read_with_instance - ") + ACE_TEXT ("retval is %C\n"), translate_retcode(retval))); + throw ::CCM_DDS::InternalError (retval, 0); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::read_one_last ( + typename DDS_TYPE::value_type& an_instance, + ::CCM_DDS::ReadInfo_out info, + const ::DDS::InstanceHandle_t & instance_handle) +{ + DDS_InstanceHandle_t const lookup_hnd = this->check_handle (an_instance, instance_handle); + + DDS_SampleInfoSeq sample_info; + typename DDS_TYPE::dds_seq_type data; + + // For now, only read with instance... + this->read_with_instance (data, lookup_hnd, sample_info); + + ::DDS_Long sample = data.length(); + DDS4CCM_DEBUG (6, (LM_INFO, + ACE_TEXT ("CIAO::DDS4CCM::DDS_CCM::Reader_T::read_one_last - ") + ACE_TEXT ("total number of samples <%u>\n"), + sample)); + while (sample >= 0 && !sample_info[sample-1].valid_data) + { + --sample; + } + if (sample >= 0) + { + if(sample_info[sample-1].valid_data) + { + an_instance = data[sample-1]; + info <<= sample_info[sample-1]; + } + } + // Return the loan + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Reader_T::read_one_last - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::read_one_all ( + const typename DDS_TYPE::value_type& an_instance, + typename CCM_TYPE::seq_type::_out_type instances, + ::CCM_DDS::ReadInfoSeq_out infos, + const ::DDS::InstanceHandle_t & instance_handle) +{ + DDS_InstanceHandle_t const lookup_hnd = + this->check_handle (an_instance, instance_handle); + + DDS_SampleInfoSeq sample_info; + typename DDS_TYPE::dds_seq_type data; + + this->read_with_instance (data, lookup_hnd, sample_info); + + // Count the number of valid samples + CORBA::ULong const nr_of_valid_samples = this->get_nr_valid_samples (sample_info); + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("CIAO::DDS4CCM::DDS_CCM::Reader_T::read_all - ") + ACE_TEXT ("total number of samples <%u> - ") + ACE_TEXT ("valid number of samples <%u>\n"), + data.length (), + nr_of_valid_samples)); + + typename CCM_TYPE::seq_type * inst_seq = 0; + ACE_NEW_THROW_EX (inst_seq, + typename CCM_TYPE::seq_type (nr_of_valid_samples), + CORBA::NO_MEMORY ()); + ::CCM_DDS::ReadInfoSeq * infoseq = 0; + ACE_NEW_THROW_EX (infoseq, + ::CCM_DDS::ReadInfoSeq (nr_of_valid_samples), + CORBA::NO_MEMORY ()); + + infoseq->length (nr_of_valid_samples); + inst_seq->length (nr_of_valid_samples); + + // Copy the valid samples + CORBA::ULong ix = 0; + for (::DDS_Long i = 0 ; i < sample_info.length(); ++i) + { + if(sample_info[i].valid_data) + { + (*infoseq)[ix] <<= sample_info[i]; + (*inst_seq)[ix] = data[i]; + ++ix; + } + } + + // Return the loan + DDS_ReturnCode_t const retval = this->impl ()->return_loan (data, sample_info); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + "CIAO::DDS4CCM::DDS_CCM::Reader_T::read_one_all - " + "Error returning loan to DDS - <%C>\n", + translate_retcode (retval))); + } + + infos = infoseq; + instances = inst_seq; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::create_contentfilteredtopic ( + const ::CCM_DDS::QueryFilter & filter, + ::DDSSubscriber * sub) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Reader_T::create_contentfilteredtopic"); + + // To create a ContentFilteredTopic we need a DDSTopic. + // Since a ContentFilteredTopic is created on the DomainParticipant, + // we need to obtain the DomainParticipant through the + // Subscriber. + ::DDSDomainParticipant * dp = sub->get_participant (); + if (!dp) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::create_contentfilteredtopic - " + "Unable to get the Participant from the DDS Subscriber\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 1); + } + // Now, get the topic. + ::DDSTopicDescription * td = this->reader_->get_impl ()->get_topicdescription (); + if (!td) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::create_contentfilteredtopic - " + "Unable to get the TopicDescription from the DDS DomainParticipant\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 2); + } + ::DDSTopic * tp = ::DDSTopic::narrow (td); + if (!tp) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::create_contentfilteredtopic - " + "Unable to narrow the DDS TopicDescription to a DDS Topic\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 3); + } + // Now create the ContentFilteredTopic + DDS_StringSeq params; + params <<= filter.query_parameters; + this->cft_ = dp->create_contentfilteredtopic ( + "DDS4CCMContentFilteredTopic", + tp, + filter.query, + params); + if (!this->cft_) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::create_contentfilteredtopic - " + "Error: Unable to create ContentFilteredTopic.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 4); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::delete_datareader ( + ::DDSSubscriber * sub) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Reader_T::delete_datareader"); + DDS_ReturnCode_t const retval = sub->delete_datareader (this->impl ()); + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::delete_datareader - " + "Unable to delete original DataReader. " + "Retval is %C\n", + translate_retcode(retval))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::create_filter ( + const ::CCM_DDS::QueryFilter & filter) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Reader_T::create_filter"); + + // we need to use the DDS entities direct since we're not allowed + // to change the CORBA interfaces. These are known to component + // the end user has created. + + // To set a ContentFilteredTopic on a DataReader, the DataReader + // should be recreated. Since the Getter uses the same DataReader, + // the original DataReader should not be destroyed. + ::DDSSubscriber * sub = this->impl ()->get_subscriber (); + if (!sub) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::create_filter - " + "Unable to get the Subscriber from the type specific DDS DataReader\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + this->create_contentfilteredtopic (filter, sub); + + // Now recreate the DataReader, using the ContentFilteredTopic. + // After recreation, connect the original DataReaderListener to it. + ::DDSDataReaderListener *drl = this->impl ()->get_listener (); + + ::DDSDataReader * dr = 0; + if (this->library_name_.length () > 0 && + this->profile_name_.length () > 0) + { + dr = sub->create_datareader_with_profile (this->cft_, + this->library_name_.c_str (), + this->profile_name_.c_str (), + drl, + ::DDS::DATA_AVAILABLE_STATUS | + ::DDS::REQUESTED_DEADLINE_MISSED_STATUS | + ::DDS::SAMPLE_LOST_STATUS); + } + else + { + DDS_DataReaderQos const qos = DDS_DATAREADER_QOS_DEFAULT; + dr = sub->create_datareader (this->cft_, + qos, + drl, + ::DDS::DATA_AVAILABLE_STATUS | + ::DDS::REQUESTED_DEADLINE_MISSED_STATUS | + ::DDS::SAMPLE_LOST_STATUS); + } + if (!dr) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::create_filter - " + "Error: Unable to create a new DataReader.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 1); + } + // Inform the Getter that there's a new DataReader created + if (this->dds_get_) + { + this->dds_get_->remove_conditions (); + this->delete_datareader (sub); + // Now we need to set the new created DataReader in our proxy classes. + this->reader_->set_impl (dr); + this->dds_get_->set_impl (this->reader_); + } + else + { + this->delete_datareader (sub); + this->reader_->set_impl (dr); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> + ::CCM_DDS::QueryFilter * + CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::filter (void) +{ + #if (DDS4CCM_USES_QUERY_CONDITION==1) + if (!this->qc_) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::filter - " + "Error: No QueryCondition set yet. First set a filter.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + ::CCM_DDS::QueryFilter_var filter = 0; + ACE_NEW_THROW_EX (filter, + ::CCM_DDS::QueryFilter(), + CORBA::NO_MEMORY ()); + filter->query = this->qc_->get_query_expression (); + ::DDS_StringSeq dds_qp; + this->qc_->get_query_parameters (dds_qp); + filter->query_parameters <<= dds_qp; + return filter._retn (); + #else + if (!this->cft_) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::filter - " + "Error: No ContentFilter set yet. First set a filter.\n")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + ::CCM_DDS::QueryFilter_var filter = 0; + ACE_NEW_THROW_EX (filter, + ::CCM_DDS::QueryFilter(), + CORBA::NO_MEMORY ()); + filter->query = this->cft_->get_filter_expression (); + DDS_StringSeq params; + ::DDS::ReturnCode_t const retval = this->cft_->get_expression_parameters ( + params); + filter->query_parameters <<= params; + if (retval != DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::filter - " + "Error getting expression_parameters. " + "Retval is %C\n", + translate_retcode(retval))); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, retval); + } + return filter._retn (); + #endif +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::filter ( + const ::CCM_DDS::QueryFilter & filter) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Reader_T::filter"); + #if (DDS4CCM_USES_QUERY_CONDITION==1) + if (!this->qc_) + { + ::DDS_StringSeq dds_qp; + dds_qp <<= filter.query_parameters; + this->qc_ = this->impl ()->create_querycondition ( + DDS_READ_SAMPLE_STATE | DDS_NOT_READ_SAMPLE_STATE, + DDS_NEW_VIEW_STATE | DDS_NOT_NEW_VIEW_STATE, + DDS_ALIVE_INSTANCE_STATE, + filter.query, + dds_qp); + if (!this->qc_) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::filter - " + "Error creating query condition.")); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 1); + } + if (this->dds_get_) + { + this->dds_get_->create_querycondition (filter.query, dds_qp); + } + } + else + { + ::DDS_StringSeq dds_qp; + dds_qp <<= filter.query_parameters; + ::DDS::ReturnCode_t retval = this->qc_->set_query_parameters ( + dds_qp); + if (retval != ::DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::filter - " + "Error setting expression_parameters. " + "Retval is %C\n", + translate_retcode(retval))); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, retval); + } + if (this->dds_get_) + { + this->dds_get_->set_queryparameters (dds_qp); + } + } + #else + if (!this->cft_) + { + this->create_filter (filter); + } + else + { + DDS_StringSeq params; + params <<= filter.query_parameters; + ::DDS::ReturnCode_t retval = this->cft_->set_expression_parameters ( + params); + if (retval != ::DDS::RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::DDS_CCM::Reader_T::filter - " + "Error setting expression_parameters. " + "Retval is %C\n", + translate_retcode(retval))); + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, retval); + } + } + #endif +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::set_contentfilteredtopic_data ( + const char * library_name, + const char * profile_name, + Getter_T<DDS_TYPE, CCM_TYPE, FIXED> * dds_get) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Reader_T::set_contentfilteredtopic_data"); + this->library_name_ = library_name; + this->profile_name_ = profile_name; + this->dds_get_ = dds_get; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +DDS_ReturnCode_t +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::passivate () +{ + #if (DDS4CCM_USES_QUERY_CONDITION==1) + if (this->qc_) + { + return this->impl ()->delete_readcondition (this->qc_); + } + #endif + return DDS_RETCODE_OK; +} + +template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> +void +CIAO::DDS4CCM::DDS_CCM::Reader_T<DDS_TYPE, CCM_TYPE, FIXED>::set_impl ( + CCM_DDS_DataReader_i *reader) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::DDS_CCM::Reader_T::set_impl"); + this->reader_ = reader; +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Reader_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Reader_T.h new file mode 100644 index 00000000000..20c6f49ef47 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Reader_T.h @@ -0,0 +1,123 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ +#ifndef DDS_READER_T +#define DDS_READER_T + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" +#include "dds4ccm/impl/dds4ccm_conf.h" +#include "dds4ccm/impl/dds/Getter_T.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::InstanceHandle_t DDS_InstanceHandle_t; +typedef ::DDS::SampleInfoSeq DDS_SampleInfoSeq; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + namespace DDS_CCM + { + template <typename DDS_TYPE, typename CCM_TYPE, bool FIXED> + class Reader_T : + public virtual CCM_TYPE::reader_type, + public virtual ::CORBA::LocalObject, + private virtual ACE_Copy_Disabled + { + public: + /// Constructor + Reader_T (void); + + /// Destructor + virtual ~Reader_T (void); + + virtual void read_last ( + typename CCM_TYPE::seq_type::_out_type instances, + ::CCM_DDS::ReadInfoSeq_out infos); + + virtual void read_all ( + typename CCM_TYPE::seq_type::_out_type instances, + ::CCM_DDS::ReadInfoSeq_out infos); + + virtual void read_one_last ( + typename DDS_TYPE::value_type& an_instance, + ::CCM_DDS::ReadInfo_out info, + const ::DDS::InstanceHandle_t & instance_handle); + + virtual void read_one_all ( + const typename DDS_TYPE::value_type& an_instance, + typename CCM_TYPE::seq_type::_out_type instances, + ::CCM_DDS::ReadInfoSeq_out infos, + const ::DDS::InstanceHandle_t & instance_handle); + + virtual ::CCM_DDS::QueryFilter *filter (void); + + virtual void filter (const ::CCM_DDS::QueryFilter & filter); + + void set_contentfilteredtopic_data ( + const char * libary_name, + const char * profile_name, + Getter_T<DDS_TYPE, CCM_TYPE, FIXED> * dds_get=0); + + void set_impl (CCM_DDS_DataReader_i *reader); + + DDS_ReturnCode_t passivate (void); + + private: + CCM_DDS_DataReader_i *reader_; + + Getter_T<DDS_TYPE, CCM_TYPE, FIXED> * dds_get_; + + ACE_CString library_name_; + ACE_CString profile_name_; + + #if (DDS4CCM_USES_QUERY_CONDITION==1) + ::DDSQueryCondition * qc_; + #else + ::DDSContentFilteredTopic * cft_; + #endif + + typename DDS_TYPE::data_reader * impl (void); + + DDS_InstanceHandle_t check_handle ( + const typename DDS_TYPE::value_type& an_instance, + const ::DDS::InstanceHandle_t & instance_handle); + + void read_with_instance ( + typename DDS_TYPE::dds_seq_type & data, + const ::DDS_InstanceHandle_t & lookup_hnd, + DDS_SampleInfoSeq & sample_info); + + void read_without_instance ( + typename DDS_TYPE::dds_seq_type & data, + DDS_SampleInfoSeq & sample_info); + + CORBA::ULong get_nr_valid_samples ( + const DDS_SampleInfoSeq & sample_info, + bool determine_last = false); + + void delete_datareader ( + ::DDSSubscriber * sub); + + void create_filter ( + const ::CCM_DDS::QueryFilter & filter); + + void create_contentfilteredtopic ( + const ::CCM_DDS::QueryFilter & filter, + ::DDSSubscriber * sub); + }; + } + } +} + +#include "dds4ccm/impl/dds/Reader_T.cpp" + +#endif /* DDS_READER_T */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/StateListenerControl_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/StateListenerControl_T.cpp new file mode 100644 index 00000000000..197e999eae8 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/StateListenerControl_T.cpp @@ -0,0 +1,35 @@ +// -*- C++ -*- +// $Id$ + +template <typename BASE_TYPE> +CCM_DDS_StateListenerControl_T<BASE_TYPE>::CCM_DDS_StateListenerControl_T (void) + : is_filter_interpreted_ (false) +{ + DDS4CCM_TRACE ("CCM_DDS_StateListenerControl_T::CCM_DDS_StateListenerControl_T"); +} + +template <typename BASE_TYPE> +CCM_DDS_StateListenerControl_T<BASE_TYPE>::~CCM_DDS_StateListenerControl_T (void) +{ + DDS4CCM_TRACE ("CCM_DDS_StateListenerControl_T::~CCM_DDS_StateListenerControl_T"); +} + +template <typename BASE_TYPE> +::CORBA::Boolean +CCM_DDS_StateListenerControl_T<BASE_TYPE>::is_filter_interpreted (void) +{ + DDS4CCM_TRACE ("CCM_DDS_StateListenerControl_T::is_filter_interpreted"); + + return this->is_filter_interpreted_.value (); +} + +template <typename BASE_TYPE> +void +CCM_DDS_StateListenerControl_T<BASE_TYPE>::is_filter_interpreted ( + ::CORBA::Boolean is_filter_interpreted) +{ + DDS4CCM_TRACE ("CCM_DDS_StateListenerControl_T::is_filter_interpreted"); + + this->is_filter_interpreted_ = is_filter_interpreted; +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/StateListenerControl_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/StateListenerControl_T.h new file mode 100644 index 00000000000..bbee0e73a71 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/StateListenerControl_T.h @@ -0,0 +1,38 @@ +// -*- C++ -*- +// $Id$ + +#ifndef DDS4CCM_STATELISTENERCONTROLI_H_ +#define DDS4CCM_STATELISTENERCONTROLI_H_ + +#include "dds4ccm/impl/dds/DataListenerControl_T.h" +#include "dds4ccm/idl/dds4ccm_StateListenerControlEC.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +template <typename BASE_TYPE> +class CCM_DDS_StateListenerControl_T + : public virtual CCM_DDS_DataListenerControl_T<BASE_TYPE> +{ +public: + /// Constructor + CCM_DDS_StateListenerControl_T (void); + + /// Destructor + virtual ~CCM_DDS_StateListenerControl_T (void); + + /// Set the is_filter_interpreted + virtual ::CORBA::Boolean is_filter_interpreted (void); + + /// Get the is_filter_interpreted + virtual void is_filter_interpreted (::CORBA::Boolean is_filter_interpreted); + +private: + ACE_Atomic_Op <TAO_SYNCH_MUTEX, ::CORBA::Boolean> is_filter_interpreted_; +}; + +#include "dds4ccm/impl/dds/StateListenerControl_T.cpp" + +#endif /* DDS4CCM_STATELISTENERCONTROLI_H_ */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/StatusCondition.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/StatusCondition.cpp new file mode 100644 index 00000000000..37baef77d72 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/StatusCondition.cpp @@ -0,0 +1,72 @@ +// $Id$ + +#include "StatusCondition.h" +#include "Subscriber.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_StatusCondition_i::CCM_DDS_StatusCondition_i ( + DDSStatusCondition * sc) : + impl_ (sc) + { + } + + CCM_DDS_StatusCondition_i::~CCM_DDS_StatusCondition_i (void) + { + } + + ::CORBA::Boolean + CCM_DDS_StatusCondition_i::get_trigger_value (void) + { + return this->impl ()->get_trigger_value (); + } + + ::DDS::StatusMask + CCM_DDS_StatusCondition_i::get_enabled_statuses (void) + { + return this->impl ()->get_enabled_statuses (); + } + + ::DDS::ReturnCode_t + CCM_DDS_StatusCondition_i::set_enabled_statuses ( + ::DDS::StatusMask mask) + { + return this->impl ()->set_enabled_statuses (mask); + } + + ::DDS::Entity_ptr + CCM_DDS_StatusCondition_i::get_entity (void) + { + throw CORBA::NO_IMPLEMENT (); + } + + DDSStatusCondition * + CCM_DDS_StatusCondition_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_StatusCondition_i::set_impl (DDSStatusCondition * sc) + { + this->impl_ = sc; + } + + DDSStatusCondition * + CCM_DDS_StatusCondition_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/StatusCondition.h b/modules/CIAO/connectors/dds4ccm/impl/dds/StatusCondition.h new file mode 100644 index 00000000000..f3caf0d4c97 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/StatusCondition.h @@ -0,0 +1,65 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_STATUSCONDITION_H +#define DDS4CCM_STATUSCONDITION_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::StatusCondition DDSStatusCondition; +#endif + +#include "tao/LocalObject.h" + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_StatusCondition_i : + public virtual ::DDS::CCM_StatusCondition, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_StatusCondition_i (DDSStatusCondition *sc); + + /// Destructor + virtual ~CCM_DDS_StatusCondition_i (void); + + virtual ::CORBA::Boolean get_trigger_value (void); + + virtual ::DDS::StatusMask get_enabled_statuses (void); + + virtual ::DDS::ReturnCode_t set_enabled_statuses (::DDS::StatusMask mask); + + virtual ::DDS::Entity_ptr get_entity (void); + + DDSStatusCondition * get_impl (void); + + void set_impl (DDSStatusCondition * sc); + + private: + DDSStatusCondition * impl_; + DDSStatusCondition * impl (void); + }; + } +} + +#endif /* DDS4CCM_STATUSCONDITION_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Subscriber.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Subscriber.cpp new file mode 100644 index 00000000000..ea334641528 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Subscriber.cpp @@ -0,0 +1,537 @@ +// $Id$ + +#include "Subscriber.h" +#include "SubscriberListener.h" +#include "Topic.h" +#include "ContentFilteredTopic.h" +#include "DataReader.h" +#include "DataReaderListener.h" +#include "Utils.h" +#include "StatusCondition.h" + +#include "ndds/InstanceHandle_t.h" +#include "ndds/DataReaderQos.h" +#include "ndds/SubscriberQos.h" +#include "ndds/TopicQos.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_Subscriber_i::CCM_DDS_Subscriber_i (DDSSubscriber * sub) + : impl_ (sub) + { + DDS4CCM_TRACE ("CCM_DDS_Subscriber_i::CCM_DDS_Subscriber_i"); + } + + CCM_DDS_Subscriber_i::~CCM_DDS_Subscriber_i (void) + { + DDS4CCM_TRACE ("CCM_DDS_Subscriber_i::~CCM_DDS_Subscriber_i"); + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::enable (void) + { + return this->impl ()->enable (); + } + + ::DDS::StatusCondition_ptr + CCM_DDS_Subscriber_i::get_statuscondition (void) + { + ::DDS::StatusCondition_var retval = ::DDS::StatusCondition::_nil (); +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + DDSStatusCondition* sc = this->impl ()->get_statuscondition (); + if (sc) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::StatusCondition_var sc = this->impl ()->get_statuscondition (); + if (! ::CORBA::is_nil (sc.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + ::DDS::StatusMask + CCM_DDS_Subscriber_i::get_status_changes (void) + { + return this->impl ()->get_status_changes (); + } + + ::DDS::InstanceHandle_t + CCM_DDS_Subscriber_i::get_instance_handle (void) + { +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t const rtihandle = this->impl ()->get_instance_handle (); + ::DDS::InstanceHandle_t handle; + handle <<= rtihandle; + return handle; +#else + return this->impl ()->get_instance_handle (); +#endif + } + + DDSDataReader * + CCM_DDS_Subscriber_i::create_datareader ( + DDSContentFilteredTopic * topic, + DDSDataReaderListener * ccm_dds_drl, + ::DDS::StatusMask mask, + const ::DDS::DataReaderQos & qos) + { +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + ACE_UNUSED_ARG (qos); + DDS_DataReaderQos ccm_dds_qos = DDS_DATAREADER_QOS_DEFAULT; + return this->impl ()->create_datareader (topic, + ccm_dds_qos, + ccm_dds_drl, + mask); +#else + return this->impl ()->create_datareader (topic, + qos, + ccm_dds_drl, + mask); +#endif + } + + DDSDataReader * + CCM_DDS_Subscriber_i::create_datareader ( + DDSTopic * topic, + DDSDataReaderListener * ccm_dds_drl, + ::DDS::StatusMask mask, + const ::DDS::DataReaderQos & qos) + { +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + ACE_UNUSED_ARG (qos); + DDS_DataReaderQos ccm_dds_qos = DDS_DATAREADER_QOS_DEFAULT; + return this->impl ()->create_datareader (topic, + ccm_dds_qos, + ccm_dds_drl, + mask); +#else + return this->impl ()->create_datareader (topic, + qos, + ccm_dds_drl, + mask); +#endif + } + +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + DDSDataReader * + CCM_DDS_Subscriber_i::create_datareader_with_profile ( + DDSContentFilteredTopic * topic, + const char * library_name, + const char * profile_name, + DDSDataReaderListener * ccm_dds_drl, + ::DDS::StatusMask mask) + { + return this->impl ()->create_datareader_with_profile (topic, + library_name, + profile_name, + ccm_dds_drl, + mask); + } +#endif + +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + DDSDataReader * + CCM_DDS_Subscriber_i::create_datareader_with_profile ( + DDSTopic * topic, + const char * library_name, + const char * profile_name, + DDSDataReaderListener * ccm_dds_drl, + ::DDS::StatusMask mask) + { + return this->impl ()->create_datareader_with_profile (topic, + library_name, + profile_name, + ccm_dds_drl, + mask); + } +#endif + + ::DDS::DataReader_ptr + CCM_DDS_Subscriber_i::create_datareader ( + ::DDS::TopicDescription_ptr a_topic, + const ::DDS::DataReaderQos & qos, + ::DDS::DataReaderListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_Subscriber_i::create_datareader"); + ::DDS::DataReader_var retval = ::DDS::DataReader::_nil (); + DDSDataReaderListener *ccm_dds_drl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_drl, + CCM_DDS_DataReaderListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + + DDSDataReader * ccm_dds_dr = 0; + CCM_DDS_Topic_i * topic = dynamic_cast < CCM_DDS_Topic_i * > (a_topic); + + if (!topic) + { + CCM_DDS_ContentFilteredTopic_i * cf_topic = + dynamic_cast < CCM_DDS_ContentFilteredTopic_i * > (a_topic); + if (!cf_topic) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Subscriber_i::create_datareader - " + "Error: Unable to cast provided topic to one of its servant.\n")); + delete ccm_dds_drl; + throw CCM_DDS::InternalError (::DDS::RETCODE_BAD_PARAMETER, 0); + } + else + ccm_dds_dr = this->create_datareader (cf_topic->get_impl (), ccm_dds_drl, mask, qos); + } + else + ccm_dds_dr = this->create_datareader (topic->get_impl (), ccm_dds_drl, mask, qos); + + if (!ccm_dds_dr) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Subscriber_i::create_datareader - " + "Error: RTI Topic returned a nil datareader.\n")); + delete ccm_dds_drl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "CCM_DDS_Subscriber_i::create_datareader_with_profile - " + "Successfully created datareader.\n")); + } + + ccm_dds_dr->enable (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DataReader_i (ccm_dds_dr), + CORBA::NO_MEMORY ()); + return retval._retn (); + } + + ::DDS::DataReader_ptr + CCM_DDS_Subscriber_i::create_datareader_with_profile ( + ::DDS::TopicDescription_ptr a_topic, + const char * library_name, + const char * profile_name, + ::DDS::DataReaderListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_Subscriber_i::create_datareader_with_profile"); + DDSDataReaderListener *ccm_dds_drl = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_drl, + CCM_DDS_DataReaderListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + + DDSDataReader * ccm_dds_dr = 0; + CCM_DDS_Topic_i * topic = dynamic_cast < CCM_DDS_Topic_i * > (a_topic); + + if (!topic) + { + CCM_DDS_ContentFilteredTopic_i * cf_topic = + dynamic_cast < CCM_DDS_ContentFilteredTopic_i * > (a_topic); + if (!cf_topic) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Subscriber_i::create_datareader_with_profile - " + "Error: Unable to cast provided topic to one of its servant.\n")); + delete ccm_dds_drl; + throw CCM_DDS::InternalError (::DDS::RETCODE_BAD_PARAMETER, 0); + } + else + { + ccm_dds_dr = this->create_datareader_with_profile (cf_topic->get_impl (), + library_name, + profile_name, + ccm_dds_drl, + mask); + } + } + else + { + ccm_dds_dr = this->create_datareader_with_profile (topic->get_impl (), + library_name, + profile_name, + ccm_dds_drl, + mask); + } + + if (!ccm_dds_dr) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Subscriber_i::create_datareader_with_profile - " + "Error: RTI Topic returned a nil datareader.\n")); + delete ccm_dds_drl; + throw CCM_DDS::InternalError (::DDS::RETCODE_ERROR, 0); + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO "CCM_DDS_Subscriber_i::create_datareader_with_profile - " + "Successfully created datareader with profile <%C#%C>.\n", + library_name, + profile_name)); + } + + ::DDS::DataReader_var retval = ::DDS::DataReader::_nil (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_DataReader_i (ccm_dds_dr), + CORBA::NO_MEMORY ()); + + ccm_dds_dr->enable (); + + return retval._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::delete_datareader ( + ::DDS::DataReader_ptr a_datareader) + { + CCM_DDS_DataReader_i *dr = dynamic_cast< CCM_DDS_DataReader_i *> (a_datareader); + if (!dr) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Subscriber_i::delete_datareader - " + "Unable to cast provided object reference to servant.\n")); + return ::DDS::RETCODE_BAD_PARAMETER; + } + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CCM_DDS_Subscriber_i::delete_datareader - " + "Successfully casted provided object reference to servant.\n")); + + DDS_ReturnCode_t const retval = this->impl ()->delete_datareader (dr->get_impl ()); + + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CCM_DDS_Subscriber_i::delete_datareader - " + "Error: Returned non-ok error code %C\n", + translate_retcode (retval))); + } + else + { + DDS4CCM_DEBUG (6, (LM_INFO, CLINFO "CCM_DDS_Subscriber_i::delete_datareader - " + "Datareader successfully deleted\n")); + } + + return retval; + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::delete_contained_entities (void) + { + return this->impl ()->delete_contained_entities (); + } + + ::DDS::DataReader_ptr + CCM_DDS_Subscriber_i::lookup_datareader ( + const char * impl_name) + { + ::DDS::DataReader_var retval = ::DDS::DataReader::_nil (); + DDSDataReader* dr = this->impl ()->lookup_datareader (impl_name); + if (dr) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_DataReader_i (dr), + CORBA::NO_MEMORY ()); + } + return retval._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::get_datareaders ( + ::DDS::DataReaderSeq & /*readers*/, + ::DDS::SampleStateMask /*sample_states*/, + ::DDS::ViewStateMask /*view_states*/, + ::DDS::InstanceStateMask /*instance_states*/) + { + throw CORBA::NO_IMPLEMENT (); + // Add your implementation here + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::notify_datareaders (void) + { + return this->impl ()->notify_datareaders (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::set_qos ( + const ::DDS::SubscriberQos & qos) + { + CIAO_TRACE ("CCM_DDS_Subscriber_i::set_qos"); +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + ::DDS_SubscriberQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl ()->get_qos (ccm_dds_qos); +#else + return this->impl ()->set_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::get_qos ( + ::DDS::SubscriberQos & qos) + { + CIAO_TRACE ("CCM_DDS_Subscriber_i::get_qos"); +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + ::DDS_SubscriberQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = this->impl ()->get_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl ()->get_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::set_listener ( + ::DDS::SubscriberListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_Subscriber_i::set_listener"); + + CCM_DDS_SubscriberListener_i* ccm_dds_impl_list = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_impl_list, + CCM_DDS_SubscriberListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + return this->impl ()->set_listener (ccm_dds_impl_list, mask); + } + + ::DDS::SubscriberListener_ptr + CCM_DDS_Subscriber_i::get_listener (void) + { + DDS4CCM_TRACE ("CCM_DDS_Subscriber_i::get_listener"); + + DDSSubscriberListener *ccm_dds_impl_list = this->impl ()->get_listener (); + CCM_DDS_SubscriberListener_i *list_proxy = dynamic_cast <CCM_DDS_SubscriberListener_i *> (ccm_dds_impl_list); + if (!list_proxy) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, "CCM_DDS_Subscriber_i::get_listener - " + "DDS returned a NIL listener.\n")); + return ::DDS::SubscriberListener::_nil (); + } + return list_proxy->get_subscriber_listener (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::begin_access (void) + { + return this->impl ()->begin_access (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::end_access (void) + { + return this->impl ()->end_access (); + } + + ::DDS::DomainParticipant_ptr + CCM_DDS_Subscriber_i::get_participant (void) + { + ::DDS::DomainParticipant_var retval = ::DDS::DomainParticipant::_nil (); +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + DDSDomainParticipant* p = this->impl ()->get_participant (); + if (p) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::DomainParticipant_var p = this->impl ()->get_participant (); + if (! ::CORBA::is_nil (p.in)) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::set_default_datareader_qos ( + const ::DDS::DataReaderQos & qos) + { + CIAO_TRACE ("CCM_DDS_Subscriber_i::set_default_datareader_qos"); +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataReaderQos ccm_dds_qos; + ccm_dds_qos <<= qos; + return this->impl ()->set_default_datareader_qos (ccm_dds_qos); +#else + return this->impl ()->set_default_datareader_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::get_default_datareader_qos ( + ::DDS::DataReaderQos & qos) + { + CIAO_TRACE ("CCM_DDS_Subscriber_i::get_default_datareader_qos"); +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataReaderQos ccm_dds_qos; + ::DDS::ReturnCode_t retcode = this->impl ()->get_default_datareader_qos (ccm_dds_qos); + qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl ()->get_default_datareader_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Subscriber_i::copy_from_topic_qos ( + ::DDS::DataReaderQos & a_datareader_qos, + const ::DDS::TopicQos & a_impl_qos) + { + DDS4CCM_TRACE ("CCM_DDS_Subscriber_i::copy_from_topic_qos"); +#if defined (CIAO_DDS4CCM_NDDS) && (CIAO_DDS4CCM_NDDS==1) + ::DDS_DataReaderQos ccm_dds_qos; + ::DDS_TopicQos ccm_dds_topic_qos; + + ccm_dds_qos <<= a_datareader_qos; + ccm_dds_topic_qos <<= a_impl_qos; + ::DDS::ReturnCode_t retcode = + this->impl()->copy_from_topic_qos (ccm_dds_qos, + ccm_dds_topic_qos); + a_datareader_qos <<= ccm_dds_qos; + return retcode; +#else + return this->impl()->copy_from_topic_qos (a_datareader_qos, + a_impl_qos); +#endif + } + + DDSSubscriber * + CCM_DDS_Subscriber_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_Subscriber_i::set_impl (DDSSubscriber * sub) + { + this->impl_ = sub; + } + + DDSSubscriber * + CCM_DDS_Subscriber_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Subscriber.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Subscriber.h new file mode 100644 index 00000000000..76dc06ef111 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Subscriber.h @@ -0,0 +1,177 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_SUBSCRIBER_H +#define DDS4CCM_SUBSCRIBER_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#include "tao/LocalObject.h" + +#if (CIAO_DDS4CCM_NDDS==1) +#include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::Subscriber DDSSubscriber; +typedef ::DDS::DataReaderListener DDSDataReaderListener; +typedef ::DDS::DataReader DDSDataReader; +typedef ::DDS::ContentFilteredTopic DDSContentFilteredTopic; +typedef ::DDS::Topic DDSTopic; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_Subscriber_i : + public virtual ::DDS::CCM_Subscriber, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_Subscriber_i (DDSSubscriber * sub); + + /// Destructor + virtual ~CCM_DDS_Subscriber_i (void); + + virtual ::DDS::ReturnCode_t enable (void); + + virtual ::DDS::StatusCondition_ptr get_statuscondition (void); + + virtual ::DDS::StatusMask get_status_changes (void); + + virtual ::DDS::InstanceHandle_t get_instance_handle (void); + + virtual ::DDS::DataReader_ptr create_datareader ( + ::DDS::TopicDescription_ptr a_topic, + const ::DDS::DataReaderQos & qos, + ::DDS::DataReaderListener_ptr a_listener, + ::DDS::StatusMask mask); + +#if (CIAO_DDS4CCM_NDDS==1) + virtual ::DDS::DataReader_ptr + create_datareader_with_profile ( + ::DDS::TopicDescription_ptr a_topic, + const char* library_name, + const char *profile_name, + ::DDS::DataReaderListener_ptr a_listener, + ::DDS::StatusMask mask); +#endif + + virtual ::DDS::ReturnCode_t + delete_datareader ( + ::DDS::DataReader_ptr a_datareader); + + virtual ::DDS::ReturnCode_t delete_contained_entities (void); + + virtual ::DDS::DataReader_ptr lookup_datareader ( + const char * impl_name); + + virtual ::DDS::ReturnCode_t + get_datareaders ( + ::DDS::DataReaderSeq & readers, + ::DDS::SampleStateMask sample_states, + ::DDS::ViewStateMask view_states, + ::DDS::InstanceStateMask instance_states); + + virtual ::DDS::ReturnCode_t + notify_datareaders (void); + + virtual ::DDS::ReturnCode_t + set_qos ( + const ::DDS::SubscriberQos & qos); + + virtual ::DDS::ReturnCode_t + get_qos ( + ::DDS::SubscriberQos & qos); + + virtual ::DDS::ReturnCode_t + set_listener ( + ::DDS::SubscriberListener_ptr a_listener, + ::DDS::StatusMask mask); + + virtual ::DDS::SubscriberListener_ptr + get_listener (void); + + virtual ::DDS::ReturnCode_t + begin_access (void); + + virtual ::DDS::ReturnCode_t + end_access (void); + + virtual ::DDS::DomainParticipant_ptr + get_participant (void); + + virtual ::DDS::ReturnCode_t + set_default_datareader_qos ( + const ::DDS::DataReaderQos & qos); + + virtual ::DDS::ReturnCode_t + get_default_datareader_qos ( + ::DDS::DataReaderQos & qos); + + virtual ::DDS::ReturnCode_t + copy_from_topic_qos ( + ::DDS::DataReaderQos & a_datareader_qos, + const ::DDS::TopicQos & a_impl_qos); + + DDSSubscriber * get_impl (void); + + void set_impl (DDSSubscriber * sub); + + private: + DDSSubscriber *impl_; + + DDSSubscriber *impl (void); + + DDSDataReader * + create_datareader ( + DDSTopic * topic, + DDSDataReaderListener * ccm_dds_drl, + ::DDS::StatusMask mask, + const ::DDS::DataReaderQos & qos); + + DDSDataReader * + create_datareader ( + DDSContentFilteredTopic * topic, + DDSDataReaderListener * ccm_dds_drl, + ::DDS::StatusMask mask, + const ::DDS::DataReaderQos & qos); + +#if (CIAO_DDS4CCM_NDDS==1) + DDSDataReader * + create_datareader_with_profile ( + DDSContentFilteredTopic * topic, + const char* library_name, + const char *profile_name, + DDSDataReaderListener * ccm_dds_drl, + ::DDS::StatusMask mask); +#endif + +#if (CIAO_DDS4CCM_NDDS==1) + DDSDataReader * + create_datareader_with_profile ( + DDSTopic * topic, + const char* library_name, + const char *profile_name, + DDSDataReaderListener * ccm_dds_drl, + ::DDS::StatusMask mask); +#endif + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener.cpp new file mode 100644 index 00000000000..43acb3e5757 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener.cpp @@ -0,0 +1,178 @@ +// $Id$ + +#include "SubscriberListener.h" +#include "Subscriber.h" +#include "DataReader.h" + +#include "ndds/SampleLostStatus.h" +#include "ndds/SubscriptionMatchedStatus.h" +#include "ndds/RequestedDeadlineMissedStatus.h" +#include "ndds/SampleRejectedStatus.h" +#include "ndds/LivelinessChangedStatus.h" +#include "ndds/RequestedIncompatibleQosStatus.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_SubscriberListener_i::CCM_DDS_SubscriberListener_i (::DDS::SubscriberListener_ptr p) + : impl_ ( ::DDS::SubscriberListener::_duplicate (p)) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::CCM_DDS_SubscriberListener_i"); + } + + CCM_DDS_SubscriberListener_i::~CCM_DDS_SubscriberListener_i (void) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::~CCM_DDS_SubscriberListener_i"); + } + + void + CCM_DDS_SubscriberListener_i::on_data_on_readers ( + ::DDSSubscriber* the_subscriber) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::on_data_on_readers"); + + ::DDS::Subscriber_var sub = ::DDS::Subscriber::_nil (); + ACE_NEW (sub, + CCM_DDS_Subscriber_i (the_subscriber)); + this->impl_->on_data_on_readers (sub.in ()); + the_subscriber->notify_datareaders (); + } + + void + CCM_DDS_SubscriberListener_i::on_requested_deadline_missed ( + ::DDSDataReader* the_reader, + const ::DDS_RequestedDeadlineMissedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::on_requested_deadline_missed"); + + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::RequestedDeadlineMissedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_requested_deadline_missed (dds_reader.in (), ddsstatus); +#else + this->impl_->on_requested_deadline_missed (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_SubscriberListener_i::on_requested_incompatible_qos ( + ::DDSDataReader* the_reader, + const ::DDS_RequestedIncompatibleQosStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::on_requested_incompatible_qos"); + + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::RequestedIncompatibleQosStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_requested_incompatible_qos (dds_reader.in (), ddsstatus); +#else + this->impl_->on_requested_incompatible_qos (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_SubscriberListener_i::on_sample_rejected ( + ::DDSDataReader* the_reader, + const ::DDS_SampleRejectedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::on_sample_rejected"); + + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::SampleRejectedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_sample_rejected (dds_reader.in (), ddsstatus); +#else + this->impl_->on_sample_rejected (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_SubscriberListener_i::on_liveliness_changed ( + ::DDSDataReader* the_reader, + const ::DDS_LivelinessChangedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::on_liveliness_changed"); + + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::LivelinessChangedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_liveliness_changed (dds_reader.in (), ddsstatus); +#else + this->impl_->on_liveliness_changed (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_SubscriberListener_i::on_data_available ( + ::DDSDataReader* the_reader) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::on_data_available"); + + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); + this->impl_->on_data_available (dds_reader.in ()); + } + + void + CCM_DDS_SubscriberListener_i::on_subscription_matched ( + ::DDSDataReader* the_reader, + const ::DDS_SubscriptionMatchedStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::on_subscription_matched"); + + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::SubscriptionMatchedStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_subscription_matched (dds_reader.in (), ddsstatus); +#else + this->impl_->on_subscription_matched (dds_reader.in (), status); +#endif + } + + void + CCM_DDS_SubscriberListener_i::on_sample_lost ( + ::DDSDataReader* the_reader, + const ::DDS_SampleLostStatus & status) + { + DDS4CCM_TRACE ("CCM_DDS_SubscriberListener_i::on_sample_lost"); + + ::DDS::DataReader_var dds_reader = ::DDS::DataReader::_nil (); + ACE_NEW (dds_reader, + CCM_DDS_DataReader_i (the_reader)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::SampleLostStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_sample_lost (dds_reader.in (), ddsstatus); +#else + this->impl_->on_sample_lost (dds_reader.in (), status); +#endif + } + + ::DDS::SubscriberListener_ptr + CCM_DDS_SubscriberListener_i::get_subscriber_listener (void) + { + return ::DDS::SubscriberListener::_duplicate (this->impl_.in ()); + } + } +} + + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener.h b/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener.h new file mode 100644 index 00000000000..e8c624d4e7c --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener.h @@ -0,0 +1,95 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_SUBSCRIBERLISTENER_H +#define DDS4CCM_SUBSCRIBERLISTENER_H + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +#include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::SubscriberListener DDSSubscriberListener; +typedef ::DDS::DataReader DDSDataReader; +typedef ::DDS::Subscriber DDSSubscriber; +typedef ::DDS::RequestedDeadlineMissedStatus DDS_RequestedDeadlineMissedStatus; +typedef ::DDS::LivelinessChangedStatus DDS_LivelinessChangedStatus; +typedef ::DDS::RequestedIncompatibleQosStatus DDS_RequestedIncompatibleQosStatus; +typedef ::DDS::SampleRejectedStatus DDS_SampleRejectedStatus; +typedef ::DDS::SubscriptionMatchedStatus DDS_SubscriptionMatchedStatus; +typedef ::DDS::SampleLostStatus DDS_SampleLostStatus; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_SubscriberListener_i : + public virtual ::DDSSubscriberListener + { + public: + /// Constructor + CCM_DDS_SubscriberListener_i ( ::DDS::SubscriberListener_ptr s); + + /// Destructor + virtual ~CCM_DDS_SubscriberListener_i (void); + + virtual void + on_requested_deadline_missed ( + ::DDSDataReader* the_reader, + const ::DDS_RequestedDeadlineMissedStatus & status); + + virtual void + on_requested_incompatible_qos ( + ::DDSDataReader* the_reader, + const ::DDS_RequestedIncompatibleQosStatus & status); + + virtual void + on_sample_rejected ( + ::DDSDataReader* the_reader, + const ::DDS_SampleRejectedStatus & status); + + virtual void + on_liveliness_changed ( + ::DDSDataReader* the_reader, + const ::DDS_LivelinessChangedStatus & status); + + virtual void + on_data_available ( + ::DDSDataReader* the_reader); + + virtual void + on_subscription_matched ( + ::DDSDataReader* the_reader, + const ::DDS_SubscriptionMatchedStatus & status); + + virtual void + on_sample_lost ( + ::DDSDataReader* the_reader, + const ::DDS_SampleLostStatus & status); + + virtual void + on_data_on_readers ( + ::DDSSubscriber* the_subscriber); + + ::DDS::SubscriberListener_ptr get_subscriber_listener (void); + private: + ::DDS::SubscriberListener_var impl_; + }; + } +} + +#endif + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener_T.cpp new file mode 100644 index 00000000000..2ce57d7afcc --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener_T.cpp @@ -0,0 +1,277 @@ +// $Id$ +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/DataReader.h" +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds/DDSCallbackStatusHandler.h" +#include "dds4ccm/impl/dds/Utils.h" +#include "tao/ORB_Core.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::SubscriberListener_T ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener, + ACE_Reactor* reactor) + : error_listener_ (::CCM_DDS::ConnectorStatusListener::_duplicate (error_listener)), + reactor_ (reactor) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::SubscriberListener_T::SubscriberListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::~SubscriberListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::SubscriberListener_T::~SubscriberListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_requested_incompatible_qos ( + ::DDS::DataReader_ptr reader, + const ::DDS::RequestedIncompatibleQosStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::SubscriberListener_T::on_requested_incompatible_qos"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("SubscriberListener_T::on_requested_incompatible_qos: ") + ACE_TEXT ("total count <%d> - total change <%d> - ") + ACE_TEXT ("last policy id <%d> - policies\n"), + status.total_count, status.total_count_change, + status.last_policy_id)); + for (CORBA::ULong i = 0; i < status.policies.length (); ++i) + { + DDS4CCM_DEBUG (10, (LM_DEBUG, + ACE_TEXT ("\t\tid <%d> - count <%d>\n"), + status.policies[i].policy_id, + status.policies[i].count)); + } + + if (! ::CORBA::is_nil (this->error_listener_)) + { + try + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnRequestedOncompatibleQosHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnRequestedOncompatibleQosHandler ( + this->error_listener_, reader, status)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + ACE_TEXT ("SubscriberListener_T::on_requested_incompatible_qos: ") + ACE_TEXT ("failed to use reactor.\n"))); + } + } + else + { + this->error_listener_->on_requested_incompatible_qos (reader, status); + } + } + catch (...) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("SubscriberListener_T::on_requested_incompatible_qos: ") + ACE_TEXT ("DDS Exception caught\n"))); + } + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + ACE_TEXT ("SubscriberListener_T::on_requested_incompatible_qos: ") + ACE_TEXT ("No error listener connected\n"))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_unexpected_status ( + ::DDS::Entity_ptr entity, + ::DDS::StatusKind status_kind) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::SubscriberListener_T::on_unexpected_status"); + + if (! ::CORBA::is_nil (this->error_listener_)) + { + try + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnUnexpectedStatusHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnUnexpectedStatusHandler ( + this->error_listener_, entity, status_kind)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + ACE_TEXT ("SubscriberListener_T::on_unexpected_status: ") + ACE_TEXT ("failed to use reactor.\n"))); + } + } + else + { + this->error_listener_->on_unexpected_status (entity, status_kind); + } + } + catch (...) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, + ACE_TEXT ("SubscriberListener_T::on_unexpected_status: ") + ACE_TEXT ("DDS Exception caught\n"))); + } + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + ACE_TEXT ("SubscriberListener_T::on_requested_incompatible_qos: ") + ACE_TEXT ("No error listener connected\n"))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_liveliness_changed ( + ::DDS::DataReader* reader, + const ::DDS::LivelinessChangedStatus& status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::SubscriberListener_T::on_liveliness_changed"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("SubscriberListener_T::on_liveliness_changed: ") + ACE_TEXT ("alive count <%d> - not alive count <%d> - ") + ACE_TEXT ("alive count change <%d> - not alive count change <%d> ") + ACE_TEXT ("last publication handle length <%d> - isValid <%d>\n"), + status.alive_count, status.not_alive_count, + status.alive_count_change, status.not_alive_count_change, + status.last_publication_handle.length, + status.last_publication_handle.isValid)); + + this->on_unexpected_status (reader, ::DDS::LIVELINESS_CHANGED_STATUS); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_sample_rejected ( + ::DDS::DataReader_ptr reader, + const ::DDS::SampleRejectedStatus& status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::SubscriberListener_T::on_sample_rejected"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("SubscriberListener_T::on_sample_rejected: ") + ACE_TEXT ("total count <%d> - count change <%d> - ") + ACE_TEXT ("last reason <%C> - last instance handle ") + ACE_TEXT ("<length <%d> - isValid <%d>\n"), + status.total_count, status.total_count_change, + translate_rejectedstatuskind (status.last_reason), + status.last_instance_handle.length, + status.last_instance_handle.isValid)); + + if (! ::CORBA::is_nil (this->error_listener_)) + { + try + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnSampleRejectedHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnSampleRejectedHandler ( + this->error_listener_, reader, status)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + ACE_TEXT ("SubscriberListener_T::on_sample_rejected: ") + ACE_TEXT ("failed to use reactor.\n"))); + } + } + else + { + this->error_listener_->on_sample_rejected (reader, status); + } + } + catch (...) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, ACE_TEXT ("SubscriberListener_T::on_sample_rejected: ") + ACE_TEXT ("DDS Exception caught\n"))); + } + } + else + { + DDS4CCM_DEBUG (6, (LM_DEBUG, CLINFO + ACE_TEXT ("SubscriberListener_T::on_sample_rejected: ") + ACE_TEXT ("No error listener connected\n"))); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_subscription_matched( + ::DDS::DataReader* reader, + const ::DDS::SubscriptionMatchedStatus& status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::SubscriberListener_T::on_subscription_matched"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("SubscriberListener_T::on_subscription_matched: ") + ACE_TEXT ("total count <%d> - count change <%d> - ") + ACE_TEXT ("current count <%d> - current count change <%d> ") + ACE_TEXT ("last publication handle length <%d> - isValid <%d>\n"), + status.total_count, status.total_count_change, + status.current_count, status.current_count_change, + status.last_publication_handle.length, + status.last_publication_handle.isValid)); + + this->on_unexpected_status (reader, ::DDS::SUBSCRIPTION_MATCHED_STATUS); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_data_on_readers( + ::DDS::Subscriber *) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::SubscriberListener_T::on_data_on_readers"); + //do nothing by design +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_requested_deadline_missed ( + ::DDS::DataReader_ptr, + const ::DDS::RequestedDeadlineMissedStatus &) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_data_available ( + ::DDS::DataReader_ptr) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::on_sample_lost ( + ::DDS::DataReader_ptr, + const ::DDS::SampleLostStatus &) +{ +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StatusMask +CIAO::DDS4CCM::SubscriberListener_T<DDS_TYPE, CCM_TYPE>::get_mask ( + ::CCM_DDS::ConnectorStatusListener_ptr csl) +{ + if (! ::CORBA::is_nil (csl) || CIAO_debug_level >= 10) + { + return ::DDS::REQUESTED_INCOMPATIBLE_QOS_STATUS | + ::DDS::SAMPLE_REJECTED_STATUS | + ::DDS::LIVELINESS_CHANGED_STATUS | + ::DDS::SUBSCRIPTION_MATCHED_STATUS; + } + else + { + return 0; + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener_T.h new file mode 100644 index 00000000000..7cdf42eb1a5 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/SubscriberListener_T.h @@ -0,0 +1,87 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS_SUBSCRIBERLISTENER_T_H_ +#define DDS_SUBSCRIBERLISTENER_T_H_ + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL +class ACE_Reactor; +ACE_END_VERSIONED_NAMESPACE_DECL + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class SubscriberListener_T : + public ::DDS::CCM_SubscriberListener, + private ACE_Copy_Disabled + { + public: + /// Constructor + SubscriberListener_T ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener, + ACE_Reactor* reactor); + + /// Destructor + virtual ~SubscriberListener_T (void); + + virtual void on_requested_incompatible_qos ( + ::DDS::DataReader_ptr reader, + const ::DDS::RequestedIncompatibleQosStatus & status); + + virtual void on_liveliness_changed( + ::DDS::DataReader* reader, + const ::DDS::LivelinessChangedStatus& status); + + virtual void on_sample_rejected( + ::DDS::DataReader* reader, + const ::DDS::SampleRejectedStatus& status); + + virtual void on_subscription_matched( + ::DDS::DataReader* reader, + const ::DDS::SubscriptionMatchedStatus& status); + + virtual void on_data_on_readers( + ::DDS::Subscriber* subscriber); + + virtual void on_requested_deadline_missed ( + ::DDS::DataReader_ptr , + const ::DDS::RequestedDeadlineMissedStatus & ); + + virtual void on_data_available ( + ::DDS::DataReader_ptr ); + + virtual void on_sample_lost ( + ::DDS::DataReader_ptr , + const ::DDS::SampleLostStatus & ); + + static ::DDS::StatusMask get_mask ( + ::CCM_DDS::ConnectorStatusListener_ptr csl); + + private: + typename CCM_TYPE::context_type::_var_type context_; + + virtual void on_unexpected_status( + ::DDS::Entity_ptr entity, + ::DDS::StatusKind status_kind); + + ::CCM_DDS::ConnectorStatusListener_var error_listener_; + + ACE_Reactor* reactor_; + }; + } +} + +#include "dds4ccm/impl/dds/SubscriberListener_T.cpp" + +#endif /* DDS_SUBSCRIBERLISTENER_T_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/TimeUtilities.h b/modules/CIAO/connectors/dds4ccm/impl/dds/TimeUtilities.h new file mode 100644 index 00000000000..e6f1050e518 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/TimeUtilities.h @@ -0,0 +1,34 @@ +// $Id$ + +//============================================================================= +/** + * @file TimeUtilities.h + * + * $Id$ + * + * @author Marcel Smit <msmit@remedy.nl> + */ +//============================================================================= + + +#ifndef DDS4CCM_TIME_UTILITIES_H +#define DDS4CCM_TIME_UTILITIES_H + +#include "ace/Time_Value.h" +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" + +inline void +operator<<= (::DDS::Time_t & dds_time, const ::ACE_Time_Value & ace_time) +{ + dds_time.sec = static_cast < ::CORBA::Long> (ace_time.sec ()); + dds_time.nanosec = ace_time.usec () * 1000; +} + +inline void +operator<<= (::ACE_Time_Value & ace_time, const ::DDS::Time_t &dds_time) +{ + ace_time.sec (dds_time.sec); + ace_time.usec (dds_time.nanosec/1000); +} + +#endif /* DDS4CCM_TIME_UTILITIES_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Topic.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Topic.cpp new file mode 100644 index 00000000000..d0ce219972a --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Topic.cpp @@ -0,0 +1,217 @@ +// $Id$ + +#include "Topic.h" +#include "ContentFilteredTopic.h" +#include "StatusCondition.h" +#include "TopicListener.h" + +#include "ndds/InstanceHandle_t.h" +#include "ndds/InconsistentTopicStatus.h" +#include "ndds/TopicQos.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_Topic_i::CCM_DDS_Topic_i (DDSTopic* topic) + : impl_ (topic) + { + } + + CCM_DDS_Topic_i::~CCM_DDS_Topic_i (void) + { + } + + ::DDS::ReturnCode_t + CCM_DDS_Topic_i::set_qos (const ::DDS::TopicQos &qos) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_TopicQos ddsqos; + ddsqos <<= qos; + return this->impl ()->set_qos (ddsqos); +#else + return this->impl ()->set_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Topic_i::get_qos (::DDS::TopicQos &qos) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_TopicQos ddsqos; + ::DDS_ReturnCode_t const retval = this->impl ()->get_qos (ddsqos); + qos <<= ddsqos; + return retval; +#else + return this->impl ()->get_qos (qos); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Topic_i::set_listener ( + ::DDS::TopicListener_ptr a_listener, + ::DDS::StatusMask mask) + { + DDS4CCM_TRACE ("CCM_DDS_Topic_i::set_listener"); + +#if (CIAO_DDS4CCM_NDDS==1) + CCM_DDS_TopicListener_i *ccm_dds_impl_list = 0; + if (! ::CORBA::is_nil (a_listener)) + { + ACE_NEW_THROW_EX (ccm_dds_impl_list, + CCM_DDS_TopicListener_i (a_listener), + CORBA::NO_MEMORY ()); + } + return this->impl ()->set_listener (ccm_dds_impl_list, mask); +#else + return this->impl ()->set_listener (a_listener, mask); +#endif + } + + ::DDS::TopicListener_ptr + CCM_DDS_Topic_i::get_listener (void) + { + DDS4CCM_TRACE ("CCM_DDS_Topic_i::get_listener"); + +#if (CIAO_DDS4CCM_NDDS==1) + DDSTopicListener *ccm_dds_topic_list = this->impl ()->get_listener (); + CCM_DDS_TopicListener_i *list_proxy = dynamic_cast <CCM_DDS_TopicListener_i *> (ccm_dds_topic_list); + if (!list_proxy) + { + DDS4CCM_DEBUG (6, (LM_DEBUG, "CCM_DDS_Topic_i::get_listener - " + "DDS returned a NIL listener.\n")); + return ::DDS::TopicListener::_nil (); + } + return list_proxy->get_topiclistener (); +#else + return this->impl ()->get_listener (); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Topic_i::get_inconsistent_topic_status ( + ::DDS::InconsistentTopicStatus & a_status) + { +#if (CIAO_DDS4CCM_NDDS==1) + DDS_InconsistentTopicStatus ddsstatus; + ::DDS::ReturnCode_t const retval = this->impl ()->get_inconsistent_topic_status (ddsstatus); + a_status <<= ddsstatus;; + return retval; +#else + return this->impl ()->get_inconsistent_topic_status (a_status); +#endif + } + + ::DDS::ReturnCode_t + CCM_DDS_Topic_i::enable (void) + { + return this->impl ()->enable (); + } + + ::DDS::StatusCondition_ptr + CCM_DDS_Topic_i::get_statuscondition (void) + { + ::DDS::StatusCondition_var retval = ::DDS::StatusCondition::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSStatusCondition* sc = this->impl ()->get_statuscondition (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc), + CORBA::NO_MEMORY ()); +#else + ::DDS::StatusCondition_var sc = this->impl ()->get_statuscondition (); + ACE_NEW_THROW_EX (retval, + CCM_DDS_StatusCondition_i (sc.in ()), + CORBA::NO_MEMORY ()); +#endif + return retval._retn (); + } + + ::DDS::StatusMask + CCM_DDS_Topic_i::get_status_changes (void) + { + return this->impl ()->get_status_changes (); + } + + ::DDS::InstanceHandle_t + CCM_DDS_Topic_i::get_instance_handle (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS_InstanceHandle_t const rtihandle = this->impl ()->get_instance_handle (); + ::DDS::InstanceHandle_t handle; + handle <<= rtihandle; + return handle; +#else + return this->impl ()->get_instance_handle (); +#endif + } + + char * + CCM_DDS_Topic_i::get_type_name (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + return CORBA::string_dup (this->impl ()->get_type_name ()); +#else + return this->impl ()->get_type_name (); +#endif + } + + char * + CCM_DDS_Topic_i::get_name (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + return CORBA::string_dup (this->impl ()->get_name ()); +#else + return this->impl ()->get_name (); +#endif + } + + ::DDS::DomainParticipant_ptr + CCM_DDS_Topic_i::get_participant (void) + { + ::DDS::DomainParticipant_var retval = ::DDS::DomainParticipant::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSDomainParticipant* p = this->impl ()->get_participant (); + if (p) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::DomainParticipant_var p = this->impl ()->get_participant (); + if (! ::CORBA::is_nil (p.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + DDSTopic * + CCM_DDS_Topic_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_Topic_i::set_impl (DDSTopic * topic) + { + this->impl_ = topic; + } + + DDSTopic * + CCM_DDS_Topic_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Topic.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Topic.h new file mode 100644 index 00000000000..981835d8e91 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Topic.h @@ -0,0 +1,83 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef CIAO_NDDS_TOPIC_H +#define CIAO_NDDS_TOPIC_H + +#include "DomainParticipant.h" + +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "tao/LocalObject.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::Topic DDSTopic; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_Topic_i : + public virtual ::DDS::CCM_Topic, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_Topic_i (DDSTopic* topic); + + /// Destructor + virtual ~CCM_DDS_Topic_i (void); + + virtual ::DDS::ReturnCode_t set_qos (const ::DDS::TopicQos & qos); + + virtual ::DDS::ReturnCode_t get_qos (::DDS::TopicQos & qos); + + virtual ::DDS::ReturnCode_t set_listener ( + ::DDS::TopicListener_ptr a_listener, + ::DDS::StatusMask mask); + + virtual ::DDS::TopicListener_ptr get_listener (void); + + virtual ::DDS::ReturnCode_t get_inconsistent_topic_status ( + ::DDS::InconsistentTopicStatus & a_status); + + virtual + ::DDS::ReturnCode_t enable (void); + + virtual + ::DDS::StatusCondition_ptr get_statuscondition (void); + + virtual + ::DDS::StatusMask get_status_changes (void); + + virtual + ::DDS::InstanceHandle_t get_instance_handle (void); + + virtual + char * get_type_name (void); + + virtual + char * get_name (void); + + virtual + ::DDS::DomainParticipant_ptr get_participant (void); + + DDSTopic * get_impl (void); + + void set_impl (DDSTopic* topic); + + private: + DDSTopic * impl_; + + DDSTopic * impl (void); + }; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/TopicDescription.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicDescription.cpp new file mode 100644 index 00000000000..298c3b5c567 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicDescription.cpp @@ -0,0 +1,90 @@ +// $Id$ + +#include "TopicDescription.h" +#include "DomainParticipant.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_TopicDescription_i::CCM_DDS_TopicDescription_i ( + DDSTopicDescription * rc) : impl_ (rc) + { + } + + CCM_DDS_TopicDescription_i::~CCM_DDS_TopicDescription_i (void) + { + } + + char * + CCM_DDS_TopicDescription_i::get_type_name (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + return CORBA::string_dup (this->impl ()->get_type_name ()); +#else + return this->impl ()->get_type_name (); +#endif + } + + char * + CCM_DDS_TopicDescription_i::get_name (void) + { +#if (CIAO_DDS4CCM_NDDS==1) + return CORBA::string_dup (this->impl ()->get_name ()); +#else + return this->impl ()->get_name (); +#endif + } + + ::DDS::DomainParticipant_ptr + CCM_DDS_TopicDescription_i::get_participant (void) + { + ::DDS::DomainParticipant_var retval = ::DDS::DomainParticipant::_nil (); +#if (CIAO_DDS4CCM_NDDS==1) + DDSDomainParticipant* p = this->impl ()->get_participant (); + if (p) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p), + CORBA::NO_MEMORY ()); + } +#else + ::DDS::DomainParticipant_var p = this->impl ()->get_participant (); + if (! ::CORBA::is_nil (p.in ())) + { + ACE_NEW_THROW_EX (retval, + CCM_DDS_DomainParticipant_i (p.in ()), + CORBA::NO_MEMORY ()); + } +#endif + return retval._retn (); + } + + DDSTopicDescription * + CCM_DDS_TopicDescription_i::get_impl (void) + { + return this->impl_; + } + + void + CCM_DDS_TopicDescription_i::set_impl (DDSTopicDescription * rc) + { + this->impl_ = rc; + } + + DDSTopicDescription * + CCM_DDS_TopicDescription_i::impl (void) + { + if (!this->impl_) + { + throw ::CORBA::BAD_INV_ORDER (); + } + return this->impl_; + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/TopicDescription.h b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicDescription.h new file mode 100644 index 00000000000..b107d4c75ac --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicDescription.h @@ -0,0 +1,64 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef CIAO_DDS4CCM_TOPICDESCRIPTION_H +#define CIAO_DDS4CCM_TOPICDESCRIPTION_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsEC.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds/dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +#include "ndds/ndds_cpp.h" +#endif + +#include "tao/LocalObject.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::TopicDescription DDSTopicDescription; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_TopicDescription_i : + public virtual ::DDS::CCM_TopicDescription, + public virtual ::CORBA::LocalObject + { + public: + /// Constructor + CCM_DDS_TopicDescription_i (DDSTopicDescription * rc); + + /// Destructor + virtual ~CCM_DDS_TopicDescription_i (void); + + virtual char * get_type_name (void); + + virtual char * get_name (void); + + virtual ::DDS::DomainParticipant_ptr get_participant (void); + + DDSTopicDescription * get_impl (void); + + void set_impl (DDSTopicDescription * rc); + + private: + DDSTopicDescription * impl_; + + DDSTopicDescription * impl (void); + }; + } +} + +#endif /* CIAO_DDS4CCM_TOPICDESCRIPTION_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener.cpp new file mode 100644 index 00000000000..e2fcd574ce5 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener.cpp @@ -0,0 +1,49 @@ +// $Id$ + +#include "TopicListener.h" +#include "Topic.h" + +#include "ndds/InconsistentTopicStatus.h" + +#include "dds4ccm/idl/dds4ccm_BaseC.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +namespace CIAO +{ + namespace DDS4CCM + { + CCM_DDS_TopicListener_i::CCM_DDS_TopicListener_i (::DDS::TopicListener_ptr p) + : impl_ (::DDS::TopicListener::_duplicate (p)) + { + } + + CCM_DDS_TopicListener_i::~CCM_DDS_TopicListener_i (void) + { + } + + void + CCM_DDS_TopicListener_i::on_inconsistent_topic ( + ::DDSTopic* the_topic, + const ::DDS_InconsistentTopicStatus & status) + { + ::DDS::Topic_var dds_topic = ::DDS::Topic::_nil (); + ACE_NEW (dds_topic, + CCM_DDS_Topic_i (the_topic)); +#if (CIAO_DDS4CCM_NDDS==1) + ::DDS::InconsistentTopicStatus ddsstatus; + ddsstatus <<= status; + this->impl_->on_inconsistent_topic (dds_topic.in (), ddsstatus); +#else + this->impl_->on_inconsistent_topic (dds_topic.in (), status); +#endif + } + + ::DDS::TopicListener_ptr + CCM_DDS_TopicListener_i::get_topiclistener (void) + { + return ::DDS::TopicListener::_duplicate (this->impl_.in ()); + } + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener.h b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener.h new file mode 100644 index 00000000000..553131e0070 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener.h @@ -0,0 +1,53 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_TOPICLISTENER_H +#define DDS4CCM_TOPICLISTENER_H + +#include "tao/LocalObject.h" + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm_dds_impl_export.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +# include "ndds/ndds_cpp.h" +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::TopicListener DDSTopicListener; +typedef ::DDS::Topic DDSTopic; +typedef ::DDS::InconsistentTopicStatus DDS_InconsistentTopicStatus; +#endif + +namespace CIAO +{ + namespace DDS4CCM + { + class DDS4CCM_DDS_IMPL_Export CCM_DDS_TopicListener_i : + public virtual ::DDSTopicListener + { + public: + /// Constructor + CCM_DDS_TopicListener_i (::DDS::TopicListener_ptr p); + + /// Destructor + virtual ~CCM_DDS_TopicListener_i (void); + + virtual void on_inconsistent_topic( + ::DDSTopic* topic, + const ::DDS_InconsistentTopicStatus& status); + + ::DDS::TopicListener_ptr get_topiclistener (void); + private: + ::DDS::TopicListener_var impl_; + }; + } +} + +#endif /* DDS4CCM_TOPICLISTENER_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener_T.cpp new file mode 100644 index 00000000000..b9d60532edb --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener_T.cpp @@ -0,0 +1,78 @@ +// $Id$ +#include "dds4ccm/impl/dds/Utils.h" + +#include "dds4ccm/impl/dds/Topic.h" +#include "dds4ccm/impl/dds/DDSCallbackStatusHandler.h" +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::TopicListener_T<DDS_TYPE, CCM_TYPE>::TopicListener_T ( + ::CCM_DDS::ConnectorStatusListener_ptr error_listener, + ACE_Reactor* reactor) : + error_listener_ (::CCM_DDS::ConnectorStatusListener::_duplicate (error_listener)), + reactor_ (reactor) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::TopicListener_T::TopicListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::TopicListener_T<DDS_TYPE, CCM_TYPE>::~TopicListener_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::TopicListener_T::~TopicListener_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::TopicListener_T<DDS_TYPE, CCM_TYPE>::on_inconsistent_topic ( + ::DDS::Topic_ptr the_topic, + const ::DDS::InconsistentTopicStatus & status) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::TopicListener_T::on_inconsistent_topic"); + + DDS4CCM_DEBUG (10, (LM_DEBUG, CLINFO + ACE_TEXT ("TopicListener_T::on_inconsistent_topic: ") + ACE_TEXT ("total count <%d> - total change <%d> - "), + status.total_count, status.total_count_change)); + + if (! ::CORBA::is_nil (this->error_listener_.in ())) + { + if (this->reactor_) + { + ::CIAO::DDS4CCM::OnInconsistentTopicHandler* rh = 0; + ACE_NEW (rh, + ::CIAO::DDS4CCM::OnInconsistentTopicHandler ( + this->error_listener_, + the_topic, + status)); + ACE_Event_Handler_var safe_handler (rh); + if (this->reactor_->notify (rh) != 0) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO + ACE_TEXT ("TopicListener_T::on_inconsistent_topic: ") + ACE_TEXT ("failed to use reactor.\n"))); + } + } + else + { + this->error_listener_->on_inconsistent_topic (the_topic, status); + } + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +::DDS::StatusMask +CIAO::DDS4CCM::TopicListener_T<DDS_TYPE, CCM_TYPE>::get_mask ( + CCM_DDS::ConnectorStatusListener_ptr error_listener) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::TopicListener_T::get_mask"); + + if (! ::CORBA::is_nil (error_listener) || CIAO_debug_level >= 10) + { + return ::DDS::INCONSISTENT_TOPIC_STATUS; + } + else + { + return 0; + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener_T.h new file mode 100644 index 00000000000..609978767e8 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/TopicListener_T.h @@ -0,0 +1,47 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL +class ACE_Reactor; +ACE_END_VERSIONED_NAMESPACE_DECL + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class TopicListener_T : + public ::DDS::TopicListener, + private ACE_Copy_Disabled + { + public: + /// Constructor + TopicListener_T (::CCM_DDS::ConnectorStatusListener_ptr error_listener, + ACE_Reactor* reactor); + + /// Destructor + virtual ~TopicListener_T (void); + + virtual void on_inconsistent_topic ( + ::DDS::Topic_ptr the_topic, + const ::DDS::InconsistentTopicStatus & status); + + static ::DDS::StatusMask get_mask ( + CCM_DDS::ConnectorStatusListener_ptr error_listener); + + private: + CCM_DDS::ConnectorStatusListener_var error_listener_; + ACE_Reactor* reactor_; + }; + } +} + +#include "dds4ccm/impl/dds/TopicListener_T.cpp" diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Updater_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Updater_T.cpp new file mode 100644 index 00000000000..ee905982084 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Updater_T.cpp @@ -0,0 +1,304 @@ +// $Id$ + +#include "dds4ccm/impl/dds/DataWriter.h" +#include "dds4ccm/impl/dds/Utils.h" +#include "dds4ccm/impl/dds/Coherent_Changes_Guard.h" +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::Updater_T (void) + : InstanceHandleManager_T<DDS_TYPE, CCM_TYPE, typename CCM_TYPE::updater_type> (), + is_global_scope_ (false), + is_coherent_write_ (false) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::Updater_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::~Updater_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::~Updater_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +bool +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::is_global_scope () +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::is_global_scope"); + return this->is_global_scope_; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +bool +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::is_coherent_write () +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::is_coherent_write"); + return this->is_coherent_write_; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::is_coherent_write (bool value) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::is_coherent_write"); + this->is_coherent_write_ = value; +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::create_i ( + const typename DDS_TYPE::value_type & an_instance, + ::CCM_DDS::DataNumber_t index) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::create_i"); + DDS_InstanceHandle_t const hnd = this->impl ()->register_instance (an_instance); + if (DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL)) + { + DDS4CCM_ERROR (1, (LM_ERROR, + ACE_TEXT ("CIAO::DDS4CCM::Updater_T::create_i: ") + ACE_TEXT ("Unable to unregister instance, nil handle.\n"))); + throw CCM_DDS::InternalError (::DDS_RETCODE_ERROR, index); + } + ::DDS_ReturnCode_t const result = this->impl ()->write (an_instance, hnd); + if (result != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, + ACE_TEXT ("CIAO::DDS4CCM::Updater_T::create_i: ") + ACE_TEXT ("Unable to update data, error %C.\n"), + translate_retcode (result))); + throw CCM_DDS::InternalError (result, index); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::create_one ( + const typename DDS_TYPE::value_type & an_instance) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::create_one"); + DDS_InstanceHandle_t const hnd = this->impl ()->lookup_instance (an_instance); + if (!DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL)) + { + throw CCM_DDS::AlreadyCreated (0); + } + + this->create_i (an_instance, 0); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::update_i ( + const typename DDS_TYPE::value_type & an_instance, + const ::DDS::InstanceHandle_t & instance_handle, + ::CCM_DDS::DataNumber_t index) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::update_i"); + DDS_InstanceHandle_t hnd = ::DDS_HANDLE_NIL; + hnd <<= instance_handle; + ::DDS_ReturnCode_t const result = this->impl ()->write (an_instance, hnd); + if (result != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, + ACE_TEXT ("CIAO::DDS4CCM::Updater_T::update_i: ") + ACE_TEXT ("Unable to update data, error %C.\n"), + translate_retcode (result))); + throw CCM_DDS::InternalError (result, index); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::update_one ( + const typename DDS_TYPE::value_type & an_instance, + const ::DDS::InstanceHandle_t & instance_handle) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::update_one"); + DDS_InstanceHandle_t hnd = ::DDS_HANDLE_NIL; + hnd <<= instance_handle; + if (DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL)) + { + hnd = this->impl ()->lookup_instance (an_instance); + } + else + { + // Check explicitly if the instance handle matches the instance, this + // is not checked by RTI DDS + DDS_InstanceHandle_t const instance_handle = + this->impl ()->lookup_instance (an_instance); + + if (!DDS_InstanceHandle_equals (&hnd, &instance_handle)) + { + throw CCM_DDS::InternalError (::DDS_RETCODE_BAD_PARAMETER, 0); + } + } + if (DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL)) + { + throw CCM_DDS::NonExistent (0); + } + this->update_i (an_instance, instance_handle, 0); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::delete_i ( + const typename DDS_TYPE::value_type & an_instance, + const ::DDS::InstanceHandle_t & instance_handle, + ::CCM_DDS::DataNumber_t index) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::delete_i"); + DDS_InstanceHandle_t hnd = ::DDS_HANDLE_NIL; + hnd <<= instance_handle; + ::DDS_ReturnCode_t result = this->impl ()->dispose (an_instance, hnd); + if (result != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, + ACE_TEXT ("CIAO::DDS4CCM::Updater_T::delete_i: ") + ACE_TEXT ("Unable to dispose instance, error %C.\n"), + translate_retcode (result))); + throw CCM_DDS::InternalError (result, index); + } + result = + this->impl ()->unregister_instance (an_instance, hnd); + if (result != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, + ACE_TEXT ("CIAO::DDS4CCM::Updater_T::delete_i: ") + ACE_TEXT ("Unable to unregister instance, error %C.\n"), + translate_retcode (result))); + throw CCM_DDS::InternalError (result, index); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::delete_one ( + const typename DDS_TYPE::value_type & an_instance, + const ::DDS::InstanceHandle_t & instance_handle) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::delete_one"); + DDS_InstanceHandle_t hnd = ::DDS_HANDLE_NIL; + hnd <<= instance_handle; + if (DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL)) + { + hnd = this->impl ()->lookup_instance (an_instance); + } + else + { + // Check explicitly if the instance handle matches the instance, this + // is not checked by RTI DDS + DDS_InstanceHandle_t const instance_handle = + this->impl ()->lookup_instance (an_instance); + + if (!DDS_InstanceHandle_equals (&hnd, &instance_handle)) + { + throw CCM_DDS::InternalError (::DDS_RETCODE_BAD_PARAMETER, 0); + } + } + if (DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL)) + { + throw CCM_DDS::NonExistent (0); + } + this->delete_i (an_instance, instance_handle, 0); +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::create_many ( + const typename CCM_TYPE::seq_type& data) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::create_many"); + + // Check for existance of instances + this->check_already_created (data); + + Coherent_Changes_Guard guard (this->impl ()->get_publisher(), + this->is_coherent_write_); + + for (typename CCM_TYPE::seq_type::size_type index = 0; index < data.length (); index++) + { + this->create_i (data[index], index); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::check_existent ( + const typename CCM_TYPE::seq_type& data) +{ + ::CCM_DDS::NonExistent exception; + for (typename CCM_TYPE::seq_type::size_type index = 0; index < data.length (); index++) + { + DDS_InstanceHandle_t const hnd = this->impl ()->lookup_instance (data[index]); + if (::DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL)) + { + CORBA::ULong const length = exception.indexes.length (); + exception.indexes.length (length + 1); + exception.indexes[length] = index; + } + } + + if (exception.indexes.length () > 0) + { + throw exception; + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::check_already_created ( + const typename CCM_TYPE::seq_type& data) +{ + ::CCM_DDS::AlreadyCreated exception; + for (typename CCM_TYPE::seq_type::size_type index = 0; index < data.length (); index++) + { + DDS_InstanceHandle_t const hnd = this->impl ()->lookup_instance (data[index]); + if (!::DDS_InstanceHandle_equals (&hnd, &::DDS_HANDLE_NIL)) + { + CORBA::ULong const length = exception.indexes.length (); + exception.indexes.length (length + 1); + exception.indexes[length] = index; + } + } + + if (exception.indexes.length () > 0) + { + throw exception; + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::update_many ( + const typename CCM_TYPE::seq_type& data) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::update_many"); + + // Check for existance of instances + this->check_existent (data); + + Coherent_Changes_Guard guard (this->impl ()->get_publisher(), this->is_coherent_write_); + + for (typename CCM_TYPE::seq_type::size_type index = 0; index < data.length (); index++) + { + this->update_i (data[index], ::DDS::HANDLE_NIL, index); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE> +void +CIAO::DDS4CCM::Updater_T<DDS_TYPE, CCM_TYPE>::delete_many ( + const typename CCM_TYPE::seq_type& data) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Updater_T::delete_many"); + + // Check for existance of instances + this->check_existent (data); + + Coherent_Changes_Guard guard (this->impl ()->get_publisher(), this->is_coherent_write_); + + for (typename CCM_TYPE::seq_type::size_type index = 0; index < data.length (); index++) + { + this->delete_i (data[index], ::DDS::HANDLE_NIL, index); + } +} + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Updater_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Updater_T.h new file mode 100644 index 00000000000..376e333005e --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Updater_T.h @@ -0,0 +1,86 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_UPDATER_H +#define DDS4CCM_UPDATER_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" +#include "InstanceHandleManager_T.h" + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class Updater_T : + public InstanceHandleManager_T <DDS_TYPE, CCM_TYPE, typename CCM_TYPE::updater_type> + { + public: + /// Constructor + Updater_T (void); + + /// Destructor + virtual ~Updater_T (void); + + virtual void create_one ( + const typename DDS_TYPE::value_type& an_instance); + + virtual void update_one ( + const typename DDS_TYPE::value_type& an_instance, + const ::DDS::InstanceHandle_t & instance_handle); + + virtual void delete_one ( + const typename DDS_TYPE::value_type& an_instance, + const ::DDS::InstanceHandle_t & instance_handle); + + virtual void create_many ( + const typename CCM_TYPE::seq_type& data); + + virtual void update_many ( + const typename CCM_TYPE::seq_type& data); + + virtual void delete_many ( + const typename CCM_TYPE::seq_type& data); + + virtual bool is_global_scope (); + + virtual bool is_coherent_write (); + + virtual void is_coherent_write (bool value_); + + private: + void create_i ( + const typename DDS_TYPE::value_type& an_instance, + ::CCM_DDS::DataNumber_t index); + + void update_i ( + const typename DDS_TYPE::value_type& an_instance, + const ::DDS::InstanceHandle_t & instance_handle, + ::CCM_DDS::DataNumber_t index); + + void delete_i ( + const typename DDS_TYPE::value_type& an_instance, + const ::DDS::InstanceHandle_t & instance_handle, + ::CCM_DDS::DataNumber_t index); + + void check_existent ( + const typename CCM_TYPE::seq_type& data); + + void check_already_created ( + const typename CCM_TYPE::seq_type& data); + + bool is_global_scope_; + bool is_coherent_write_; + }; + } +} + +#include "dds4ccm/impl/dds/Updater_T.cpp" + +#endif /* DDS4CCM_UPDATER_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Utils.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Utils.cpp new file mode 100644 index 00000000000..0f270083afb --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Utils.cpp @@ -0,0 +1,10 @@ +// $Id$ + +#include "Utils.h" + +namespace CIAO +{ + namespace DDS4CCM + { + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Utils.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Utils.h new file mode 100644 index 00000000000..a4d2c1a5f1a --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Utils.h @@ -0,0 +1,91 @@ +/** + * @file Utils.h + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * + * $Id$ + * + * Misc utility classes for NDDS. + */ + +#ifndef NDDS_UTILS_H +#define NDDS_UTILS_H + +#include "dds4ccm_dds_impl_export.h" +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +namespace CIAO +{ + namespace DDS4CCM + { + inline const char * translate_retcode (::DDS::ReturnCode_t ret) + { +#define RTI_DDS_RETCODE(X) case X: return #X + switch (ret) + { + RTI_DDS_RETCODE (DDS::RETCODE_OK); + RTI_DDS_RETCODE (DDS::RETCODE_ERROR); + RTI_DDS_RETCODE (DDS::RETCODE_UNSUPPORTED); + RTI_DDS_RETCODE (DDS::RETCODE_BAD_PARAMETER); + RTI_DDS_RETCODE (DDS::RETCODE_PRECONDITION_NOT_MET); + RTI_DDS_RETCODE (DDS::RETCODE_OUT_OF_RESOURCES); + RTI_DDS_RETCODE (DDS::RETCODE_NOT_ENABLED); + RTI_DDS_RETCODE (DDS::RETCODE_IMMUTABLE_POLICY); + RTI_DDS_RETCODE (DDS::RETCODE_INCONSISTENT_POLICY); + RTI_DDS_RETCODE (DDS::RETCODE_ALREADY_DELETED); + RTI_DDS_RETCODE (DDS::RETCODE_TIMEOUT); + RTI_DDS_RETCODE (DDS::RETCODE_NO_DATA); + RTI_DDS_RETCODE (DDS::RETCODE_ILLEGAL_OPERATION); + } + return "***Unknown enum value, update RTI::translate_retcode()"; +#undef RTI_DDS_RETCODE + } + + inline const char * translate_statuskind (DDS::StatusKind ret) + { +#define RTI_DDS_RETCODE(X) case X: return #X + switch (ret) + { + RTI_DDS_RETCODE (DDS::INCONSISTENT_TOPIC_STATUS); + RTI_DDS_RETCODE (DDS::OFFERED_DEADLINE_MISSED_STATUS); + RTI_DDS_RETCODE (DDS::REQUESTED_DEADLINE_MISSED_STATUS); + RTI_DDS_RETCODE (DDS::OFFERED_INCOMPATIBLE_QOS_STATUS); + RTI_DDS_RETCODE (DDS::REQUESTED_INCOMPATIBLE_QOS_STATUS); + RTI_DDS_RETCODE (DDS::SAMPLE_LOST_STATUS); + RTI_DDS_RETCODE (DDS::SAMPLE_REJECTED_STATUS); + RTI_DDS_RETCODE (DDS::DATA_ON_READERS_STATUS); + RTI_DDS_RETCODE (DDS::DATA_AVAILABLE_STATUS); + RTI_DDS_RETCODE (DDS::LIVELINESS_LOST_STATUS); + RTI_DDS_RETCODE (DDS::LIVELINESS_CHANGED_STATUS); + RTI_DDS_RETCODE (DDS::PUBLICATION_MATCHED_STATUS); + RTI_DDS_RETCODE (DDS::SUBSCRIPTION_MATCHED_STATUS); +#if (CIAO_DDS4CCM_NDDS==1) + RTI_DDS_RETCODE (DDS::RELIABLE_WRITER_CACHE_CHANGED_STATUS); + RTI_DDS_RETCODE (DDS::RELIABLE_READER_ACTIVITY_CHANGED_STATUS); +#endif + //RTI_DDS_RETCODE (DDS::DATA_WRITER_CACHE_STATUS); + //RTI_DDS_RETCODE (DDS::DATA_WRITER_PROTOCOL_STATUS); + //RTI_DDS_RETCODE (DDS::DATA_READER_CACHE_STATUS); + //RTI_DDS_RETCODE (DDS::DATA_READER_PROTOCOL_STATUS); + } + return "***Unknown enum value, update RTI::translate_statuskind()"; +#undef RTI_DDS_RETCODE + } + + inline const char * translate_rejectedstatuskind (DDS::SampleRejectedStatusKind ret) + { +#define RTI_DDS_RETCODE(X) case X: return #X + switch (ret) + { + RTI_DDS_RETCODE (DDS::NOT_REJECTED); + RTI_DDS_RETCODE (DDS::REJECTED_BY_INSTANCES_LIMIT); + RTI_DDS_RETCODE (DDS::REJECTED_BY_SAMPLES_LIMIT); + RTI_DDS_RETCODE (DDS::REJECTED_BY_SAMPLES_PER_INSTANCE_LIMIT); + } + return "***Unknown enum value, update RTI::translate_rejectedstatuskind()"; +#undef RTI_DDS_RETCODE + } + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Writer_T.cpp b/modules/CIAO/connectors/dds4ccm/impl/dds/Writer_T.cpp new file mode 100644 index 00000000000..f7837a19975 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Writer_T.cpp @@ -0,0 +1,98 @@ +// $Id$ + +#include "dds4ccm/impl/dds/DataWriter.h" +#include "dds4ccm/impl/dds/Utils.h" +#include "dds4ccm/impl/dds/Coherent_Changes_Guard.h" + +#include "dds4ccm/impl/dds/ndds/InstanceHandle_t.h" + +#include "dds4ccm/impl/logger/Log_Macros.h" + +template <typename DDS_TYPE, typename CCM_TYPE > +CIAO::DDS4CCM::Writer_T<DDS_TYPE, CCM_TYPE>::Writer_T (void) + : InstanceHandleManager_T<DDS_TYPE, CCM_TYPE, typename CCM_TYPE::writer_type> (), + is_coherent_write_ (false) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Writer_T::Writer_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE > +CIAO::DDS4CCM::Writer_T<DDS_TYPE, CCM_TYPE>::~Writer_T (void) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Writer_T::~Writer_T"); +} + +template <typename DDS_TYPE, typename CCM_TYPE > +void +CIAO::DDS4CCM::Writer_T<DDS_TYPE, CCM_TYPE>::write_i ( + const typename DDS_TYPE::value_type& datum, + const ::DDS::InstanceHandle_t& instance_handle, + ::CCM_DDS::DataNumber_t index) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Writer_T::write_i"); + + ::DDS_InstanceHandle_t handle = ::DDS_HANDLE_NIL; + handle <<= instance_handle; + DDS_ReturnCode_t const retval = this->impl ()->write (datum, handle); + + if (retval != DDS_RETCODE_OK) + { + DDS4CCM_ERROR (1, (LM_ERROR, CLINFO "CIAO::DDS4CCM::Writer_T::write_i - " + "Write unsuccessful, received error code %C\n", + translate_retcode (retval))); + throw CCM_DDS::InternalError (retval, index); + } +} + +template <typename DDS_TYPE, typename CCM_TYPE > +void +CIAO::DDS4CCM::Writer_T<DDS_TYPE, CCM_TYPE>::write_one ( + const typename DDS_TYPE::value_type & an_instance, + const ::DDS::InstanceHandle_t & instance_handle) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Writer_T::write_one"); + + this->write_i (an_instance, instance_handle, 0); + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CIAO::DDS4CCM::Writer_T::write_one - " + "Write successful\n")); +} + +template <typename DDS_TYPE, typename CCM_TYPE > +void +CIAO::DDS4CCM::Writer_T<DDS_TYPE, CCM_TYPE>::write_many ( + const typename CCM_TYPE::seq_type& instances) +{ + DDS4CCM_TRACE ("CIAO::DDS4CCM::Writer_T::write_many"); + + Coherent_Changes_Guard guard (this->impl ()->get_publisher(), + this->is_coherent_write_); + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CIAO::DDS4CCM::Writer_T::write_many - " + "Preparing to write to DDS\n")); + + for (typename CCM_TYPE::seq_type::size_type index = 0; + index < instances.length(); + index++) + { + this->write_i (instances[index], ::DDS::HANDLE_NIL, index); + } + + DDS4CCM_DEBUG (9, (LM_TRACE, CLINFO "CIAO::DDS4CCM::Writer_T::write_many - " + "Write successful\n")); +} + +template <typename DDS_TYPE, typename CCM_TYPE > +::CORBA::Boolean +CIAO::DDS4CCM::Writer_T<DDS_TYPE, CCM_TYPE>::is_coherent_write (void) +{ + return this->is_coherent_write_; +} + +template <typename DDS_TYPE, typename CCM_TYPE > +void +CIAO::DDS4CCM::Writer_T<DDS_TYPE, CCM_TYPE>::is_coherent_write ( + ::CORBA::Boolean value) +{ + this->is_coherent_write_ = value; +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/Writer_T.h b/modules/CIAO/connectors/dds4ccm/impl/dds/Writer_T.h new file mode 100644 index 00000000000..d38887768c5 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/Writer_T.h @@ -0,0 +1,55 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef WRITER_T_H +#define WRITER_T_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "ace/Copy_Disabled.h" +#include "InstanceHandleManager_T.h" + +namespace CIAO +{ + namespace DDS4CCM + { + template <typename DDS_TYPE, typename CCM_TYPE> + class Writer_T : + public InstanceHandleManager_T <DDS_TYPE, CCM_TYPE, typename CCM_TYPE::writer_type> + { + public: + /// Constructor + Writer_T (void); + + /// Destructor + virtual ~Writer_T (void); + + virtual void write_one ( + const typename DDS_TYPE::value_type& an_instance, + const ::DDS::InstanceHandle_t & instance_handle); + + virtual void write_many ( + const typename CCM_TYPE::seq_type& instances); + + virtual ::CORBA::Boolean is_coherent_write (void); + + virtual void is_coherent_write ( ::CORBA::Boolean value); + + private: + void write_i (const typename DDS_TYPE::value_type& datum, + const ::DDS::InstanceHandle_t& instance_handle, + ::CCM_DDS::DataNumber_t index); + + bool is_coherent_write_; + }; + } +} + +#include "dds4ccm/impl/dds/Writer_T.cpp" + +#endif /* WRITER_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/dds4ccm_dds_impl_export.h b/modules/CIAO/connectors/dds4ccm/impl/dds/dds4ccm_dds_impl_export.h new file mode 100644 index 00000000000..c22f3ecbe8f --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/dds4ccm_dds_impl_export.h @@ -0,0 +1,58 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl DDS4CCM_NDDS_IMPL +// ------------------------------ +#ifndef DDS4CCM_DDS_IMPL_EXPORT_H +#define DDS4CCM_DDS_IMPL_EXPORT_H + +#include "ace/config-all.h" + +#if defined (ACE_AS_STATIC_LIBS) && !defined (DDS4CCM_DDS_IMPL_HAS_DLL) +# define DDS4CCM_DDS_IMPL_HAS_DLL 0 +#endif /* ACE_AS_STATIC_LIBS && DDS4CCM_DDS_IMPL_HAS_DLL */ + +#if !defined (DDS4CCM_DDS_IMPL_HAS_DLL) +# define DDS4CCM_DDS_IMPL_HAS_DLL 1 +#endif /* ! DDS4CCM_DDS_IMPL_HAS_DLL */ + +#if defined (DDS4CCM_DDS_IMPL_HAS_DLL) && (DDS4CCM_DDS_IMPL_HAS_DLL == 1) +# if defined (DDS4CCM_DDS_IMPL_BUILD_DLL) +# define DDS4CCM_DDS_IMPL_Export ACE_Proper_Export_Flag +# define DDS4CCM_DDS_IMPL_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define DDS4CCM_DDS_IMPL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* DDS4CCM_DDS_IMPL_BUILD_DLL */ +# define DDS4CCM_DDS_IMPL_Export ACE_Proper_Import_Flag +# define DDS4CCM_DDS_IMPL_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define DDS4CCM_DDS_IMPL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* DDS4CCM_DDS_IMPL_BUILD_DLL */ +#else /* DDS4CCM_DDS_IMPL_HAS_DLL == 1 */ +# define DDS4CCM_DDS_IMPL_Export +# define DDS4CCM_DDS_IMPL_SINGLETON_DECLARATION(T) +# define DDS4CCM_DDS_IMPL_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* DDS4CCM_DDS_IMPL_HAS_DLL == 1 */ + +// Set DDS4CCM_DDS_IMPL_NTRACE = 0 to turn on library specific tracing even if +// tracing is turned off for ACE. +#if !defined (DDS4CCM_DDS_IMPL_NTRACE) +# if (ACE_NTRACE == 1) +# define DDS4CCM_DDS_IMPL_NTRACE 1 +# else /* (ACE_NTRACE == 1) */ +# define DDS4CCM_DDS_IMPL_NTRACE 0 +# endif /* (ACE_NTRACE == 1) */ +#endif /* !DDS4CCM_DDS_IMPL_NTRACE */ + +#if (DDS4CCM_DDS_IMPL_NTRACE == 1) +# define DDS4CCM_DDS_IMPL_TRACE(X) +#else /* (DDS4CCM_DDS_IMPL_NTRACE == 1) */ +# if !defined (ACE_HAS_TRACE) +# define ACE_HAS_TRACE +# endif /* ACE_HAS_TRACE */ +# define DDS4CCM_DDS_IMPL_TRACE(X) ACE_TRACE_IMPL(X) +# include "ace/Trace.h" +#endif /* (DDS4CCM_DDS_IMPL_NTRACE == 1) */ + +#endif /* DDS4CCM_DDS_IMPL_EXPORT_H */ + +// End of auto generated file. diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/dds4ccm_impl.mpc b/modules/CIAO/connectors/dds4ccm/impl/dds/dds4ccm_impl.mpc new file mode 100644 index 00000000000..58326b8db12 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/dds4ccm_impl.mpc @@ -0,0 +1,42 @@ +// $Id$ + +project(CIAO_DDS4CCM_DDS_Impl) : dds4ccm_skel, taolib, ciao_output, ccm_stub, ciao_logger { + + after += DDS4CCM_lem_stub + libs += DDS4CCM_lem_stub + + dynamicflags = DDS4CCM_DDS_IMPL_BUILD_DLL + macros += BUILDING_DDS_LIB + Header_Files { + *.h + ndds/*.h + } + + Template_Files { + *_T.cpp + } + + Source_Files { + Coherent_Changes_Guard.cpp + DataWriter.cpp + DataWriterListener.cpp + DataReader.cpp + DataReaderListener.cpp + DomainParticipant.cpp + DomainParticipantListener.cpp + DomainParticipantFactory.cpp + ContentFilteredTopic.cpp + Topic.cpp + TopicDescription.cpp + Publisher.cpp + PublisherListener.cpp + Subscriber.cpp + SubscriberListener.cpp + StatusCondition.cpp + ReadCondition.cpp + QueryCondition.cpp + Utils.cpp + TopicListener.cpp + DDSCallbackStatusHandler.cpp + } +} diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/BuiltinTopicKey_t.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/BuiltinTopicKey_t.h new file mode 100644 index 00000000000..b9499075d09 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/BuiltinTopicKey_t.h @@ -0,0 +1,28 @@ + /** + * @author Marcel Smit <msmit@dre.vanderbilt.edu> + * + * $Id$ + * + */ + +#ifndef BUILTINTOPICKEY_T_H +#define BUILTINTOPICKEY_T_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::BuiltinTopicKey_t &ddsbuiltintopickey, const ::DDS_BuiltinTopicKey_t & builtintopickey) +{ + ACE_OS::memcpy (ddsbuiltintopickey.value, builtintopickey.value, sizeof (builtintopickey.value)); +} + +inline void +operator<<= (::DDS_BuiltinTopicKey_t &ddsbuiltintopickey, const ::DDS::BuiltinTopicKey_t & builtintopickey) +{ + ACE_OS::memcpy (ddsbuiltintopickey.value, builtintopickey.value, sizeof (builtintopickey.value)); +} + +#endif + +#endif /* BUILTINTOPICKEY_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DataReaderQos.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DataReaderQos.h new file mode 100644 index 00000000000..8df844a7386 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DataReaderQos.h @@ -0,0 +1,68 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DATAREADERQOS_H +#define DDS4CCM_DATAREADERQOS_H + +#include "DurabilityQosPolicy.h" +#include "DeadlineQosPolicy.h" +#include "LatencyBudgetQosPolicy.h" +#include "LivelinessQosPolicy.h" +#include "ReliabilityQosPolicy.h" +#include "DestinationOrderQosPolicy.h" +#include "HistoryQosPolicy.h" +#include "ResourceLimitsQosPolicy.h" +#include "UserDataQosPolicy.h" +#include "OwnershipQosPolicy.h" +#include "TimeBasedFilterQosPolicy.h" +#include "ReaderDataLifecycleQosPolicy.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DataReaderQos DDS_DataReaderQos; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::DataReaderQos &ddsqos, const ::DDS_DataReaderQos & qos) +{ + ddsqos.durability <<= qos.durability; + ddsqos.deadline <<= qos.deadline; + ddsqos.latency_budget <<= qos.latency_budget; + ddsqos.liveliness <<= qos.liveliness; + ddsqos.reliability <<= qos.reliability; + ddsqos.destination_order <<= qos.destination_order; + ddsqos.history <<= qos.history; + ddsqos.resource_limits <<= qos.resource_limits; + ddsqos.user_data <<= qos.user_data; + ddsqos.ownership <<= qos.ownership; + ddsqos.time_based_filter <<= qos.time_based_filter; + ddsqos.reader_data_lifecycle <<= qos.reader_data_lifecycle; +} + +inline void +operator<<= (::DDS_DataReaderQos &ddsqos, const ::DDS::DataReaderQos & qos) +{ + ddsqos.durability <<= qos.durability; + ddsqos.deadline <<= qos.deadline; + ddsqos.latency_budget <<= qos.latency_budget; + ddsqos.liveliness <<= qos.liveliness; + ddsqos.reliability <<= qos.reliability; + ddsqos.destination_order <<= qos.destination_order; + ddsqos.history <<= qos.history; + ddsqos.resource_limits <<= qos.resource_limits; + ddsqos.user_data <<= qos.user_data; + ddsqos.ownership <<= qos.ownership; + ddsqos.time_based_filter <<= qos.time_based_filter; + ddsqos.reader_data_lifecycle <<= qos.reader_data_lifecycle; +} + +#endif + +#endif /* DDS4CCM_DATAREADERQOS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DataWriterQos.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DataWriterQos.h new file mode 100644 index 00000000000..28eef81e587 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DataWriterQos.h @@ -0,0 +1,77 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DATAWRITERQOS_H +#define DDS4CCM_DATAWRITERQOS_H + +#include "DurabilityQosPolicy.h" +#include "DurabilityServiceQosPolicy.h" +#include "DeadlineQosPolicy.h" +#include "LatencyBudgetQosPolicy.h" +#include "LivelinessQosPolicy.h" +#include "ReliabilityQosPolicy.h" +#include "DestinationOrderQosPolicy.h" +#include "HistoryQosPolicy.h" +#include "ResourceLimitsQosPolicy.h" +#include "TransportPriorityQosPolicy.h" +#include "LifespanQosPolicy.h" +#include "UserDataQosPolicy.h" +#include "OwnershipQosPolicy.h" +#include "OwnershipStrengthQosPolicy.h" +#include "WriterDataLifecycleQosPolicy.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DataWriterQos DDS_DataWriterQos; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::DataWriterQos &ddsqos, const ::DDS_DataWriterQos & qos) +{ + ddsqos.durability <<= qos.durability; + ddsqos.durability_service <<= qos.durability_service; + ddsqos.deadline <<= qos.deadline; + ddsqos.latency_budget <<= qos.latency_budget; + ddsqos.liveliness <<= qos.liveliness; + ddsqos.reliability <<= qos.reliability; + ddsqos.destination_order <<= qos.destination_order; + ddsqos.history <<= qos.history; + ddsqos.resource_limits <<= qos.resource_limits; + ddsqos.transport_priority <<= qos.transport_priority; + ddsqos.lifespan <<= qos.lifespan; + ddsqos.user_data <<= qos.user_data; + ddsqos.ownership <<= qos.ownership; + ddsqos.ownership_strength <<= qos.ownership_strength; + ddsqos.writer_data_lifecycle <<= qos.writer_data_lifecycle; +} + +inline void +operator<<= (::DDS_DataWriterQos &ddsqos, const ::DDS::DataWriterQos & qos) +{ + ddsqos.durability <<= qos.durability; + ddsqos.durability_service <<= qos.durability_service; + ddsqos.deadline <<= qos.deadline; + ddsqos.latency_budget <<= qos.latency_budget; + ddsqos.liveliness <<= qos.liveliness; + ddsqos.reliability <<= qos.reliability; + ddsqos.destination_order <<= qos.destination_order; + ddsqos.history <<= qos.history; + ddsqos.resource_limits <<= qos.resource_limits; + ddsqos.transport_priority <<= qos.transport_priority; + ddsqos.lifespan <<= qos.lifespan; + ddsqos.user_data <<= qos.user_data; + ddsqos.ownership <<= qos.ownership; + ddsqos.ownership_strength <<= qos.ownership_strength; + ddsqos.writer_data_lifecycle <<= qos.writer_data_lifecycle; +} + +#endif + +#endif /* DDS4CCM_DATAWRITERQOS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DeadlineQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DeadlineQosPolicy.h new file mode 100644 index 00000000000..59baeba5405 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DeadlineQosPolicy.h @@ -0,0 +1,34 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DEADLINEQOSPOLICY_H +#define DDS4CCM_DEADLINEQOSPOLICY_H + +#include "Duration_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DeadlineQosPolicy DDS_DeadlineQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::DeadlineQosPolicy &ddsqos, const ::DDS_DeadlineQosPolicy & qos) +{ + ddsqos.period <<= qos.period; +} + +inline void +operator<<= (::DDS_DeadlineQosPolicy &ddsqos, const ::DDS::DeadlineQosPolicy & qos) +{ + ddsqos.period <<= qos.period; +} + +#endif + +#endif /* DDS4CCM_DEADLINEQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DestinationOrderQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DestinationOrderQosPolicy.h new file mode 100644 index 00000000000..b28d8bedf75 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DestinationOrderQosPolicy.h @@ -0,0 +1,34 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DESTINATIONORDERQOSPOLICY_H +#define DDS4CCM_DESTINATIONORDERQOSPOLICY_H + +#include "Duration_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DestinationOrderQosPolicy DDS_DestinationOrderQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::DestinationOrderQosPolicy &ddsqos, const ::DDS_DestinationOrderQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS::DestinationOrderQosPolicyKind> (qos.kind); +} + +inline void +operator<<= (::DDS_DestinationOrderQosPolicy &ddsqos, const ::DDS::DestinationOrderQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS_DestinationOrderQosPolicyKind> (qos.kind); +} + +#endif + +#endif /* DDS4CCM_DESTINATIONORDERQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DomainParticipantFactoryQos.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DomainParticipantFactoryQos.h new file mode 100644 index 00000000000..5a392830c03 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DomainParticipantFactoryQos.h @@ -0,0 +1,34 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DOMAINPARTICIPANTFACTORYQOSPOLICY_H +#define DDS4CCM_DOMAINPARTICIPANTFACTORYQOSPOLICY_H + +#include "EntityFactoryQosPolicy.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DomainParticipantFactoryQos DDS_DomainParticipantFactoryQos; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::DomainParticipantFactoryQos &ddsqos, const ::DDS_DomainParticipantFactoryQos & qos) +{ + ddsqos.entity_factory <<= qos.entity_factory; +} + +inline void +operator<<= (::DDS_DomainParticipantFactoryQos &ddsqos, const ::DDS::DomainParticipantFactoryQos & qos) +{ + ddsqos.entity_factory <<= qos.entity_factory; +} + +#endif + +#endif /* DDS4CCM_DOMAINPARTICIPANTFACTORYQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DomainParticipantQos.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DomainParticipantQos.h new file mode 100644 index 00000000000..e6f8429ca35 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DomainParticipantQos.h @@ -0,0 +1,38 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DOMAINPARTICIPANTQOSPOLICY_H +#define DDS4CCM_DOMAINPARTICIPANTQOSPOLICY_H + +#include "UserDataQosPolicy.h" +#include "EntityFactoryQosPolicy.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DomainParticipantQos DDS_DomainParticipantQos; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::DomainParticipantQos &ddsqos, const ::DDS_DomainParticipantQos & qos) +{ + ddsqos.user_data <<= qos.user_data; + ddsqos.entity_factory <<= qos.entity_factory; +} + +inline void +operator<<= (::DDS_DomainParticipantQos &ddsqos, const ::DDS::DomainParticipantQos & qos) +{ + ddsqos.user_data <<= qos.user_data; + ddsqos.entity_factory <<= qos.entity_factory; +} + +#endif + +#endif /* DDS4CCM_DOMAINPARTICIPANTQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DurabilityQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DurabilityQosPolicy.h new file mode 100644 index 00000000000..08ad411e188 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DurabilityQosPolicy.h @@ -0,0 +1,33 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DURABILITYQOSPOLICY_H +#define DDS4CCM_DURABILITYQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DurabilityQosPolicy DDS_DurabilityQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::DurabilityQosPolicy &ddsqos, const ::DDS_DurabilityQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS::DurabilityQosPolicyKind> (qos.kind); +} + +inline void +operator<<= (::DDS_DurabilityQosPolicy &ddsqos, const ::DDS::DurabilityQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS_DurabilityQosPolicyKind> (qos.kind); +} + +#endif + +#endif /* DDS4CCM_DURABILITYQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DurabilityServiceQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DurabilityServiceQosPolicy.h new file mode 100644 index 00000000000..9686b01e59d --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/DurabilityServiceQosPolicy.h @@ -0,0 +1,44 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DURABILITYSERVICEQOSPOLICY_H +#define DDS4CCM_DURABILITYSERVICEQOSPOLICY_H + +#include "Duration_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::DurabilityServiceQosPolicy DDS_DurabilityServiceQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::DurabilityServiceQosPolicy &ddsqos, const ::DDS_DurabilityServiceQosPolicy & qos) +{ + ddsqos.service_cleanup_delay <<= qos.service_cleanup_delay; + ddsqos.history_kind = static_cast < ::DDS::HistoryQosPolicyKind> (qos.history_kind); + ddsqos.history_depth = qos.history_depth; + ddsqos.max_samples = qos.max_samples; + ddsqos.max_instances = qos.max_instances; + ddsqos.max_samples_per_instance = qos.max_samples_per_instance; +} + +inline void +operator<<= (::DDS_DurabilityServiceQosPolicy &ddsqos, const ::DDS::DurabilityServiceQosPolicy & qos) +{ + ddsqos.service_cleanup_delay <<= qos.service_cleanup_delay; + ddsqos.history_kind = static_cast < ::DDS_HistoryQosPolicyKind> (qos.history_kind); + ddsqos.history_depth = qos.history_depth; + ddsqos.max_samples = qos.max_samples; + ddsqos.max_instances = qos.max_instances; + ddsqos.max_samples_per_instance = qos.max_samples_per_instance; +} + +#endif + +#endif /* DDS4CCM_DURABILITYSERVICEQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/Duration_t.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/Duration_t.h new file mode 100644 index 00000000000..597339c10ab --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/Duration_t.h @@ -0,0 +1,37 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_DURATION_T_H +#define DDS4CCM_DURATION_T_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::Duration_t DDS_Duration_t; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::Duration_t &ddsduration, const ::DDS_Duration_t & duration) +{ + ddsduration.sec = duration.sec; + ddsduration.nanosec = duration.nanosec; +} + +inline void +operator<<= (::DDS_Duration_t &ddsduration, const ::DDS::Duration_t & duration) +{ + ddsduration.sec = duration.sec; + ddsduration.nanosec = duration.nanosec; +} + +#endif + +#endif /* DDS4CCM_DURATION_T_H */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/EntityFactoryQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/EntityFactoryQosPolicy.h new file mode 100644 index 00000000000..356de511292 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/EntityFactoryQosPolicy.h @@ -0,0 +1,33 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_ENTITYFACTORYQOSPOLICY_H +#define DDS4CCM_ENTITYFACTORYQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::EntityFactoryQosPolicy DDS_EntityFactoryQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::EntityFactoryQosPolicy &ddsqos, const ::DDS_EntityFactoryQosPolicy & qos) +{ + ddsqos.autoenable_created_entities = qos.autoenable_created_entities; +} + +inline void +operator<<= (::DDS_EntityFactoryQosPolicy &ddsqos, const ::DDS::EntityFactoryQosPolicy & qos) +{ + ddsqos.autoenable_created_entities = qos.autoenable_created_entities; +} + +#endif + +#endif /* DDS4CCM_ENTITYFACTORYQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/GroupDataQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/GroupDataQosPolicy.h new file mode 100644 index 00000000000..c8c63445f29 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/GroupDataQosPolicy.h @@ -0,0 +1,35 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_GROUPDATAQOSPOLICY_H +#define DDS4CCM_GROUPDATAQOSPOLICY_H + +#include "OctetSeq.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::GroupDataQosPolicy DDS_GroupDataQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) + +inline void +operator<<= (::DDS::GroupDataQosPolicy &ddsqos, const ::DDS_GroupDataQosPolicy & qos) +{ + ddsqos.value <<= qos.value; +} + +inline void +operator<<= (::DDS_GroupDataQosPolicy &ddsqos, const ::DDS::GroupDataQosPolicy & qos) +{ + ddsqos.value <<= qos.value; +} + +#endif + +#endif /* DDS4CCM_GROUPDATAQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/HistoryQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/HistoryQosPolicy.h new file mode 100644 index 00000000000..d2140f4ca63 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/HistoryQosPolicy.h @@ -0,0 +1,35 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_HISTORYQOSPOLICY_H +#define DDS4CCM_HISTORYQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::HistoryQosPolicy DDS_HistoryQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::HistoryQosPolicy &ddsqos, const ::DDS_HistoryQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS::HistoryQosPolicyKind> (qos.kind); + ddsqos.depth = qos.depth; +} + +inline void +operator<<= (::DDS_HistoryQosPolicy &ddsqos, const ::DDS::HistoryQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS_HistoryQosPolicyKind> (qos.kind); + ddsqos.depth = qos.depth; +} + +#endif + +#endif /* DDS4CCM_HISTORYQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InconsistentTopicStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InconsistentTopicStatus.h new file mode 100644 index 00000000000..6946874f57c --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InconsistentTopicStatus.h @@ -0,0 +1,36 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_INCONSISTENTTOPICSTATUS_H +#define DDS4CCM_INCONSISTENTTOPICSTATUS_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::InconsistentTopicStatus DDS_InconsistentTopicStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::InconsistentTopicStatus &ddsstatus, const ::DDS_InconsistentTopicStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; +} + +inline void +operator<<= (::DDS_InconsistentTopicStatus &ddsstatus, const ::DDS::InconsistentTopicStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; +} + +#endif + +#endif /* DDS4CCM_INCONSISTENTTOPICSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InstanceHandleSeq.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InstanceHandleSeq.h new file mode 100644 index 00000000000..6a95c92a610 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InstanceHandleSeq.h @@ -0,0 +1,48 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_INSTANCEHANDLESEQ_H +#define DDS4CCM_INSTANCEHANDLESEQ_H + +#include "InstanceHandle_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::InstanceHandleSeq DDS_InstanceHandleSeq; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +template <typename corbaseq, typename ddsseq> +void convert_dds_to_corba_sequence(corbaseq & target, const ddsseq& source) { + target.length (source.length ()); + for (::DDS_Long index = 0; index < source.length (); index++) + { + target[index] <<= source[index]; + } +} + +inline void +operator<<= (::DDS::InstanceHandleSeq &ddsinstancehandleseqseq, const ::DDS_InstanceHandleSeq & instancehandleseq) +{ + convert_dds_to_corba_sequence (ddsinstancehandleseqseq, instancehandleseq); +} + +inline void +operator<<= (::DDS_InstanceHandleSeq &ddsinstancehandleseqseq, const ::DDS::InstanceHandleSeq & instancehandleseq) +{ + ddsinstancehandleseqseq.length (instancehandleseq.length ()); + for (::DDS::InstanceHandleSeq::size_type index = 0; index < instancehandleseq.length (); index++) + { + ddsinstancehandleseqseq[index] <<= instancehandleseq[index]; + } +} + +#endif + +#endif /* DDS4CCM_INSTANCEHANDLESEQ_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InstanceHandle_t.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InstanceHandle_t.h new file mode 100644 index 00000000000..8b2517eaa35 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/InstanceHandle_t.h @@ -0,0 +1,92 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_INSTANCEHANDLE_T_H +#define DDS4CCM_INSTANCEHANDLE_T_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +#include "ndds/ndds_cpp.h" +#define DDS_INSTANCE_HANDLE_T_IN const ::DDS::InstanceHandle_t & +#define DDS_INSTANCE_HANDLE_T_RETN ::DDS::InstanceHandle_t +#endif + +#if (CIAO_DDS4CCM_OPENDDS==1) +#define DDS_INSTANCE_HANDLE_T_IN ::DDS::InstanceHandle_t +#define DDS_INSTANCE_HANDLE_T_RETN ::DDS::InstanceHandle_t +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::InstanceHandle_t &ddsinstancehandle, const ::DDS_InstanceHandle_t & instancehandle) +{ + ACE_OS::memcpy (ddsinstancehandle.value, instancehandle.keyHash.value, sizeof (instancehandle.keyHash.value)); + ddsinstancehandle.length = instancehandle.keyHash.length; + ddsinstancehandle.isValid = instancehandle.isValid; +} + +inline void +operator<<= (::DDS_InstanceHandle_t &ddsinstancehandle, const ::DDS::InstanceHandle_t & instancehandle) +{ + ACE_OS::memcpy (ddsinstancehandle.keyHash.value, instancehandle.value, sizeof (instancehandle.value)); + ddsinstancehandle.keyHash.length = instancehandle.length; + ddsinstancehandle.isValid = instancehandle.isValid; +} + +inline bool +operator== (const ::DDS::InstanceHandle_t & instancehandle1, const ::DDS::InstanceHandle_t & instancehandle2) +{ + return instancehandle1.length == instancehandle2.length && + instancehandle1.isValid == instancehandle2.isValid && + ACE_OS::memcmp (instancehandle1.value, instancehandle2.value, sizeof (instancehandle1.value)) == 0; +} + +inline bool +operator== (const DDS_InstanceHandle_t & dds_instancehandle, const ::DDS::InstanceHandle_t & ccm_instancehandle) +{ + return dds_instancehandle.keyHash.length == ccm_instancehandle.length && + static_cast<CORBA::ULong>(dds_instancehandle.isValid) == ccm_instancehandle.isValid && + ACE_OS::memcmp (dds_instancehandle.keyHash.value, ccm_instancehandle.value, sizeof (dds_instancehandle.keyHash.value)) == 0; +} + +inline bool +operator== (const ::DDS::InstanceHandle_t & ccm_instancehandle, const DDS_InstanceHandle_t & dds_instancehandle) +{ + return ccm_instancehandle.length == dds_instancehandle.keyHash.length && + ccm_instancehandle.isValid == static_cast<CORBA::ULong>(dds_instancehandle.isValid) && + ACE_OS::memcmp (ccm_instancehandle.value, dds_instancehandle.keyHash.value, sizeof (ccm_instancehandle.value)) == 0; +} + +inline bool +operator!= (const ::DDS::InstanceHandle_t & instancehandle1, const ::DDS::InstanceHandle_t & instancehandle2) +{ + return instancehandle1.length != instancehandle2.length || + instancehandle1.isValid != instancehandle2.isValid || + ACE_OS::memcmp (instancehandle1.value, instancehandle2.value, sizeof (instancehandle1.value)) != 0; +} + +inline bool +operator!= (const DDS_InstanceHandle_t & dds_instancehandle, const ::DDS::InstanceHandle_t & ccm_instancehandle) +{ + return dds_instancehandle.keyHash.length != ccm_instancehandle.length || + static_cast<CORBA::ULong>(dds_instancehandle.isValid) != ccm_instancehandle.isValid || + ACE_OS::memcmp (dds_instancehandle.keyHash.value, ccm_instancehandle.value, sizeof (dds_instancehandle.keyHash.value)) != 0; +} + +inline bool +operator!= (const ::DDS::InstanceHandle_t & ccm_instancehandle, const DDS_InstanceHandle_t & dds_instancehandle) +{ + return ccm_instancehandle.length != dds_instancehandle.keyHash.length || + ccm_instancehandle.isValid != static_cast<CORBA::ULong>(dds_instancehandle.isValid) || + ACE_OS::memcmp (ccm_instancehandle.value, dds_instancehandle.keyHash.value, sizeof (ccm_instancehandle.value)) != 0; +} +#endif + +#endif /* DDS4CCM_INSTANCEHANDLE_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LatencyBudgetQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LatencyBudgetQosPolicy.h new file mode 100644 index 00000000000..27900434e79 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LatencyBudgetQosPolicy.h @@ -0,0 +1,34 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_LATENCYBUDGETQOSPOLICY_H +#define DDS4CCM_LATENCYBUDGETQOSPOLICY_H + +#include "Duration_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::LatencyBudgetQosPolicy DDS_LatencyBudgetQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::LatencyBudgetQosPolicy &ddsqos, const ::DDS_LatencyBudgetQosPolicy & qos) +{ + ddsqos.duration <<= qos.duration; +} + +inline void +operator<<= (::DDS_LatencyBudgetQosPolicy &ddsqos, const ::DDS::LatencyBudgetQosPolicy & qos) +{ + ddsqos.duration <<= qos.duration; +} + +#endif + +#endif /* DDS4CCM_LATENCYBUDGETQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LifespanQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LifespanQosPolicy.h new file mode 100644 index 00000000000..53220c3b745 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LifespanQosPolicy.h @@ -0,0 +1,34 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_LIFESPANQOSPOLICY_H +#define DDS4CCM_LIFESPANQOSPOLICY_H + +#include "Duration_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::LifespanQosPolicy DDS_LifespanQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::LifespanQosPolicy &ddsqos, const ::DDS_LifespanQosPolicy & qos) +{ + ddsqos.duration <<= qos.duration; +} + +inline void +operator<<= (::DDS_LifespanQosPolicy &ddsqos, const ::DDS::LifespanQosPolicy & qos) +{ + ddsqos.duration <<= qos.duration; +} + +#endif + +#endif /* DDS4CCM_LIFESPANQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessChangedStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessChangedStatus.h new file mode 100644 index 00000000000..a588bb4cf31 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessChangedStatus.h @@ -0,0 +1,43 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_LIVELINESSCHANGEDSTATUS_H +#define DDS4CCM_LIVELINESSCHANGEDSTATUS_H + +#include "InstanceHandle_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::LivelinessChangedStatus DDS_LivelinessChangedStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::LivelinessChangedStatus &ddsstatus, const ::DDS_LivelinessChangedStatus & status) +{ + ddsstatus.alive_count = status.alive_count; + ddsstatus.not_alive_count = status.not_alive_count; + ddsstatus.alive_count_change = status.alive_count_change; + ddsstatus.not_alive_count_change = status.not_alive_count_change; + ddsstatus.last_publication_handle <<= status.last_publication_handle; +} + +inline void +operator<<= (::DDS_LivelinessChangedStatus &ddsstatus, const ::DDS::LivelinessChangedStatus & status) +{ + ddsstatus.alive_count = status.alive_count; + ddsstatus.not_alive_count = status.not_alive_count; + ddsstatus.alive_count_change = status.alive_count_change; + ddsstatus.not_alive_count_change = status.not_alive_count_change; + ddsstatus.last_publication_handle <<= status.last_publication_handle; +} + +#endif + +#endif /* DDS4CCM_LIVELINESSCHANGEDSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessLostStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessLostStatus.h new file mode 100644 index 00000000000..dff10ab7ab3 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessLostStatus.h @@ -0,0 +1,36 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_LIVELINESSLOSTSTATUS_H +#define DDS4CCM_LIVELINESSLOSTSTATUS_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::LivelinessLostStatus DDS_LivelinessLostStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::LivelinessLostStatus &ddsstatus, const ::DDS_LivelinessLostStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; +} + +inline void +operator<<= (::DDS_LivelinessLostStatus &ddsstatus, const ::DDS::LivelinessLostStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; +} + +#endif + +#endif /* DDS4CCM_LIVELINESSLOSTSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessQosPolicy.h new file mode 100644 index 00000000000..18b56dae8cf --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/LivelinessQosPolicy.h @@ -0,0 +1,36 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_LIVELINESSQOSPOLICY_H +#define DDS4CCM_LIVELINESSQOSPOLICY_H + +#include "Duration_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::LivelinessQosPolicy DDS_LivelinessQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::LivelinessQosPolicy &ddsqos, const ::DDS_LivelinessQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS::LivelinessQosPolicyKind> (qos.kind); + ddsqos.lease_duration <<= qos.lease_duration; +} + +inline void +operator<<= (::DDS_LivelinessQosPolicy &ddsqos, const ::DDS::LivelinessQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS_LivelinessQosPolicyKind> (qos.kind); + ddsqos.lease_duration <<= qos.lease_duration; +} + +#endif + +#endif /* DDS4CCM_LIVELINESSQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OctetSeq.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OctetSeq.h new file mode 100644 index 00000000000..ed0cc97a018 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OctetSeq.h @@ -0,0 +1,32 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_OCTETSEQ_H +#define DDS4CCM_OCTETSEQ_H + +inline void +operator<<= (::DDS::OctetSeq &ddsseq, const ::DDS_OctetSeq & seq) +{ + ddsseq.length (seq.length ()); + for (::DDS_Long i = 0; i < seq.length (); ++i) + { + ddsseq[i] = seq[i]; + } +} + +inline void +operator<<= (::DDS_OctetSeq &ddsseq, const ::DDS::OctetSeq & seq) +{ + ddsseq.length (seq.length ()); + for (::CORBA::ULong i = 0; i < seq.length (); ++i) + { + ddsseq[i] = seq[i]; + } +} + +#endif /* DDS4CCM_OCTETSEQ_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OfferedDeadlineMissedStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OfferedDeadlineMissedStatus.h new file mode 100644 index 00000000000..164d6a571c4 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OfferedDeadlineMissedStatus.h @@ -0,0 +1,39 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_OFFEREDDEADLINEMISSEDSTATUS_H +#define DDS4CCM_OFFEREDDEADLINEMISSEDSTATUS_H + +#include "InstanceHandle_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::OfferedDeadlineMissedStatus DDS_OfferedDeadlineMissedStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::OfferedDeadlineMissedStatus &ddsstatus, const ::DDS_OfferedDeadlineMissedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_instance_handle <<= status.last_instance_handle; +} + +inline void +operator<<= (::DDS_OfferedDeadlineMissedStatus &ddsstatus, const ::DDS::OfferedDeadlineMissedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_instance_handle <<= status.last_instance_handle; +} + +#endif + +#endif /* DDS4CCM_OFFEREDDEADLINEMISSEDSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OfferedIncompatibleQosStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OfferedIncompatibleQosStatus.h new file mode 100644 index 00000000000..9b6391a747b --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OfferedIncompatibleQosStatus.h @@ -0,0 +1,41 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_OFFEREDINCOMPATIBLEQOSSTATUS_H +#define DDS4CCM_OFFEREDINCOMPATIBLEQOSSTATUS_H + +#include "QosPolicyCountSeq.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::OfferedIncompatibleQosStatus DDS_OfferedIncompatibleQosStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::OfferedIncompatibleQosStatus &ddsstatus, const ::DDS_OfferedIncompatibleQosStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_policy_id = status.last_policy_id; + ddsstatus.policies <<= status.policies; +} + +inline void +operator<<= (::DDS_OfferedIncompatibleQosStatus &ddsstatus, const ::DDS::OfferedIncompatibleQosStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_policy_id = static_cast <DDS_QosPolicyId_t>(status.last_policy_id); + ddsstatus.policies <<= status.policies; +} + +#endif + +#endif /* DDS4CCM_OFFEREDINCOMPATIBLEQOSSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OwnershipQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OwnershipQosPolicy.h new file mode 100644 index 00000000000..eec42c30ed1 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OwnershipQosPolicy.h @@ -0,0 +1,33 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_OWNERSHIPQOSPOLICY_H +#define DDS4CCM_OWNERSHIPQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::OwnershipQosPolicy DDS_OwnershipQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::OwnershipQosPolicy &ddsqos, const ::DDS_OwnershipQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS::OwnershipQosPolicyKind> (qos.kind); +} + +inline void +operator<<= (::DDS_OwnershipQosPolicy &ddsqos, const ::DDS::OwnershipQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS_OwnershipQosPolicyKind> (qos.kind); +} + +#endif + +#endif /* DDS4CCM_OWNERSHIPQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OwnershipStrengthQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OwnershipStrengthQosPolicy.h new file mode 100644 index 00000000000..77401f1d9e2 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/OwnershipStrengthQosPolicy.h @@ -0,0 +1,33 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_OWNERSHIPSTRENGTHQOSPOLICY_H +#define DDS4CCM_OWNERSHIPSTRENGTHQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::OwnershipStrengthQosPolicy DDS_OwnershipStrengthQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::OwnershipStrengthQosPolicy &ddsqos, const ::DDS_OwnershipStrengthQosPolicy & qos) +{ + ddsqos.value = qos.value; +} + +inline void +operator<<= (::DDS_OwnershipStrengthQosPolicy &ddsqos, const ::DDS::OwnershipStrengthQosPolicy & qos) +{ + ddsqos.value = qos.value; +} + +#endif + +#endif /* DDS4CCM_OWNERSHIPSTRENGTHQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PartitionQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PartitionQosPolicy.h new file mode 100644 index 00000000000..0059665c277 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PartitionQosPolicy.h @@ -0,0 +1,35 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_PARTITIONQOSPOLICY_H +#define DDS4CCM_PARTITIONQOSPOLICY_H + +#include "StringSeq.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::PartitionQosPolicy DDS_PartitionQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::PartitionQosPolicy &ddsqos, const ::DDS_PartitionQosPolicy & qos) +{ + ddsqos.name <<= qos.name; +} + +inline void +operator<<= (::DDS_PartitionQosPolicy &ddsqos, const ::DDS::PartitionQosPolicy & qos) +{ + ddsqos.name <<= qos.name; +} + +#endif + +#endif /* DDS4CCM_PARTITIONQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PresentationQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PresentationQosPolicy.h new file mode 100644 index 00000000000..7d5ab4fc283 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PresentationQosPolicy.h @@ -0,0 +1,37 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_PRESENTATIONQOSPOLICY_H +#define DDS4CCM_PRESENTATIONQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::PresentationQosPolicy DDS_PresentationQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::PresentationQosPolicy &ddsqos, const ::DDS_PresentationQosPolicy & qos) +{ + ddsqos.access_scope = static_cast < ::DDS::PresentationQosPolicyAccessScopeKind> (qos.access_scope); + ddsqos.coherent_access = qos.coherent_access; + ddsqos.ordered_access = qos.ordered_access; +} + +inline void +operator<<= (::DDS_PresentationQosPolicy &ddsqos, const ::DDS::PresentationQosPolicy & qos) +{ + ddsqos.access_scope = static_cast < DDS_PresentationQosPolicyAccessScopeKind> (qos.access_scope); + ddsqos.coherent_access = qos.coherent_access; + ddsqos.ordered_access = qos.ordered_access; +} + +#endif + +#endif /* DDS4CCM_PRESENTATIONQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublicationBuiltinTopicData.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublicationBuiltinTopicData.h new file mode 100644 index 00000000000..ce578f36e82 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublicationBuiltinTopicData.h @@ -0,0 +1,81 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + */ + +#ifndef PUBLICATIONBUILTINTOPICDATA_H_ +#define PUBLICATIONBUILTINTOPICDATA_H_ + +#include "BuiltinTopicKey_t.h" +#include "DurabilityQosPolicy.h" +#include "DurabilityServiceQosPolicy.h" +#include "DeadlineQosPolicy.h" +#include "LatencyBudgetQosPolicy.h" +#include "LivelinessQosPolicy.h" +#include "ReliabilityQosPolicy.h" +#include "LifespanQosPolicy.h" +#include "UserDataQosPolicy.h" +#include "OwnershipQosPolicy.h" +#include "OwnershipStrengthQosPolicy.h" +#include "DestinationOrderQosPolicy.h" +#include "PresentationQosPolicy.h" +#include "PartitionQosPolicy.h" +#include "TopicDataQosPolicy.h" +#include "GroupDataQosPolicy.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::PublicationBuiltinTopicData &ddstopicdata, const ::DDS_PublicationBuiltinTopicData & topicdata) +{ + ddstopicdata.key <<= topicdata.key; + ddstopicdata.participant_key <<= topicdata.participant_key; + ddstopicdata.topic_name = topicdata.topic_name; + ddstopicdata.type_name = topicdata.type_name; + ddstopicdata.durability <<= topicdata.durability; + ddstopicdata.durability_service <<= topicdata.durability_service; + ddstopicdata.deadline <<= topicdata.deadline; + ddstopicdata.latency_budget <<= topicdata.latency_budget; + ddstopicdata.liveliness <<= topicdata.liveliness; + ddstopicdata.reliability <<= topicdata.reliability; + ddstopicdata.lifespan <<= topicdata.lifespan; + ddstopicdata.user_data <<= topicdata.user_data; + ddstopicdata.ownership <<= topicdata.ownership; + ddstopicdata.ownership_strength <<= topicdata.ownership_strength; + ddstopicdata.destination_order <<= topicdata.destination_order; + ddstopicdata.presentation <<= topicdata.presentation; + ddstopicdata.partition <<= topicdata.partition; + ddstopicdata.topic_data <<= topicdata.topic_data; + ddstopicdata.group_data <<= topicdata.group_data; +} + +inline void +operator<<= (::DDS_PublicationBuiltinTopicData & ddstopicdata, const ::DDS::PublicationBuiltinTopicData & topicdata) +{ + ddstopicdata.key <<= topicdata.key; + ddstopicdata.participant_key <<= topicdata.participant_key; + ddstopicdata.topic_name = CORBA::string_dup (topicdata.topic_name); + ddstopicdata.type_name = CORBA::string_dup (topicdata.type_name); + ddstopicdata.durability <<= topicdata.durability; + ddstopicdata.durability_service <<= topicdata.durability_service; + ddstopicdata.deadline <<= topicdata.deadline; + ddstopicdata.latency_budget <<= topicdata.latency_budget; + ddstopicdata.liveliness <<= topicdata.liveliness; + ddstopicdata.reliability <<= topicdata.reliability; + ddstopicdata.lifespan <<= topicdata.lifespan; + ddstopicdata.user_data <<= topicdata.user_data; + ddstopicdata.ownership <<= topicdata.ownership; + ddstopicdata.ownership_strength <<= topicdata.ownership_strength; + ddstopicdata.destination_order <<= topicdata.destination_order; + ddstopicdata.presentation <<= topicdata.presentation; + ddstopicdata.partition <<= topicdata.partition; + ddstopicdata.topic_data <<= topicdata.topic_data; + ddstopicdata.group_data <<= topicdata.group_data; +} + +#endif + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublicationMatchedStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublicationMatchedStatus.h new file mode 100644 index 00000000000..2374f58d2c2 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublicationMatchedStatus.h @@ -0,0 +1,43 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_PUBLICATIONMATCHEDSTATUS_H +#define DDS4CCM_PUBLICATIONMATCHEDSTATUS_H + +#include "InstanceHandle_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::PublicationMatchedStatus DDS_PublicationMatchedStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::PublicationMatchedStatus &ddsstatus, const ::DDS_PublicationMatchedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.current_count = status.current_count; + ddsstatus.current_count_change = status.current_count_change; + ddsstatus.last_subscription_handle <<= status.last_subscription_handle; +} + +inline void +operator<<= (::DDS_PublicationMatchedStatus &ddsstatus, const ::DDS::PublicationMatchedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.current_count = status.current_count; + ddsstatus.current_count_change = status.current_count_change; + ddsstatus.last_subscription_handle <<= status.last_subscription_handle; +} + +#endif + +#endif /* DDS4CCM_PUBLICATIONMATCHEDSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublisherQos.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublisherQos.h new file mode 100644 index 00000000000..6a129795137 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/PublisherQos.h @@ -0,0 +1,44 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_PUBLISHERQOS_H +#define DDS4CCM_PUBLISHERQOS_H + +#include "PresentationQosPolicy.h" +#include "PartitionQosPolicy.h" +#include "GroupDataQosPolicy.h" +#include "EntityFactoryQosPolicy.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::PublisherQos DDS_PublisherQos; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::PublisherQos &ddsqos, const ::DDS_PublisherQos & qos) +{ + ddsqos.presentation <<= qos.presentation; + ddsqos.partition <<= qos.partition; + ddsqos.group_data <<= qos.group_data; + ddsqos.entity_factory <<= qos.entity_factory; +} + +inline void +operator<<= (::DDS_PublisherQos &ddsqos, const ::DDS::PublisherQos & qos) +{ + ddsqos.presentation <<= qos.presentation; + ddsqos.partition <<= qos.partition; + ddsqos.group_data <<= qos.group_data; + ddsqos.entity_factory <<= qos.entity_factory; +} + +#endif + +#endif /* DDS4CCM_PUBLISHERQOS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/QosPolicyCountSeq.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/QosPolicyCountSeq.h new file mode 100644 index 00000000000..5a6224d84a7 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/QosPolicyCountSeq.h @@ -0,0 +1,44 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_QOSPOLICYCOUNTSEQ_H +#define DDS4CCM_QOSPOLICYCOUNTSEQ_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::QosPolicyCountSeq DDS_QosPolicyCountSeq; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::QosPolicyCountSeq & ddspolicycount, const ::DDS_QosPolicyCountSeq & policycount) +{ + ddspolicycount.length (policycount.length ()); + for (::DDS_Long i = 0 ; i < policycount.length (); ++i) + { + ddspolicycount[i].policy_id = policycount[i].policy_id; + ddspolicycount[i].count = policycount[i].count; + } +} + +inline void +operator<<= (::DDS_QosPolicyCountSeq & ddspolicycount, const ::DDS::QosPolicyCountSeq & policycount) +{ + ddspolicycount.length (policycount.length ()); + for (::CORBA::ULong i = 0 ; i < policycount.length (); ++i) + { + ddspolicycount[i].policy_id = static_cast <DDS_QosPolicyId_t> (policycount[i].policy_id); + ddspolicycount[i].count = policycount[i].count; + } +} + +#endif + +#endif /* DDS4CCM_QOSPOLICYCOUNTSEQ_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReaderDataLifecycleQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReaderDataLifecycleQosPolicy.h new file mode 100644 index 00000000000..8d0ab08b72a --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReaderDataLifecycleQosPolicy.h @@ -0,0 +1,38 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_READERDATALIFECYCLEQOSPOLICY_H +#define DDS4CCM_READERDATALIFECYCLEQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::ReaderDataLifecycleQosPolicy DDS_ReaderDataLifecycleQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) + +#include "Duration_t.h" + +inline void +operator<<= (::DDS::ReaderDataLifecycleQosPolicy &ddsqos, const ::DDS_ReaderDataLifecycleQosPolicy & qos) +{ + ddsqos.autopurge_nowriter_samples_delay <<= qos.autopurge_nowriter_samples_delay; + ddsqos.autopurge_disposed_samples_delay <<= qos.autopurge_disposed_samples_delay; +} + +inline void +operator<<= (::DDS_ReaderDataLifecycleQosPolicy &ddsqos, const ::DDS::ReaderDataLifecycleQosPolicy & qos) +{ + ddsqos.autopurge_nowriter_samples_delay <<= qos.autopurge_nowriter_samples_delay; + ddsqos.autopurge_disposed_samples_delay <<= qos.autopurge_disposed_samples_delay; +} + +#endif + +#endif /* DDS4CCM_READERDATALIFECYCLEQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliabilityQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliabilityQosPolicy.h new file mode 100644 index 00000000000..d4253585857 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliabilityQosPolicy.h @@ -0,0 +1,36 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_RELIABILITYSQOSPOLICY_H +#define DDS4CCM_RELIABILITYSQOSPOLICY_H + +#include "Duration_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::ReliabilityQosPolicy DDS_ReliabilityQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::ReliabilityQosPolicy &ddsqos, const ::DDS_ReliabilityQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS::ReliabilityQosPolicyKind> (qos.kind); + ddsqos.max_blocking_time <<= qos.max_blocking_time; +} + +inline void +operator<<= (::DDS_ReliabilityQosPolicy &ddsqos, const ::DDS::ReliabilityQosPolicy & qos) +{ + ddsqos.kind = static_cast < ::DDS_ReliabilityQosPolicyKind> (qos.kind); + ddsqos.max_blocking_time <<= qos.max_blocking_time; +} + +#endif + +#endif /* DDS4CCM_RELIABILITYSQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliableReaderActivityChangedStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliableReaderActivityChangedStatus.h new file mode 100644 index 00000000000..113a27393a7 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliableReaderActivityChangedStatus.h @@ -0,0 +1,42 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_RELIABLEREADERACTIVITYCHANGEDSTATUS_H +#define DDS4CCM_RELIABLEREADERACTIVITYCHANGEDSTATUS_H + +#include "dds4ccm/impl/dds/ndds/InstanceHandle_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::ReliableReaderActivityChangedStatus DDS_ReliableReaderActivityChangedStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::ReliableReaderActivityChangedStatus &ddsstatus, const ::DDS_ReliableReaderActivityChangedStatus & status) +{ + ddsstatus.active_count = status.active_count; + ddsstatus.active_count_change = status.active_count_change; + ddsstatus.inactive_count = status.inactive_count; + ddsstatus.inactive_count_change = status.inactive_count_change; + ddsstatus.last_instance_handle <<= status.last_instance_handle; +} + +inline void +operator<<= (::DDS_ReliableReaderActivityChangedStatus &ddsstatus, const ::DDS::ReliableReaderActivityChangedStatus & status) +{ + ddsstatus.active_count = status.active_count; + ddsstatus.active_count_change = status.active_count_change; + ddsstatus.inactive_count = status.inactive_count; + ddsstatus.inactive_count_change = status.inactive_count_change; + ddsstatus.last_instance_handle <<= status.last_instance_handle; +} + +#endif + +#endif /* DDS4CCM_RELIABLEREADERACTIVITYCHANGEDSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliableWriterCacheChangedStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliableWriterCacheChangedStatus.h new file mode 100644 index 00000000000..31e8653b8be --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ReliableWriterCacheChangedStatus.h @@ -0,0 +1,51 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_RELIABLEWRITERCACHECHANGEDSTATUS_H +#define DDS4CCM_RELIABLEWRITERCACHECHANGEDSTATUS_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::ReliableWriterCacheChangedStatus DDS_ReliableWriterCacheChangedStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::ReliableWriterCacheChangedStatus &ddsstatus, const ::DDS_ReliableWriterCacheChangedStatus & status) +{ + ddsstatus.empty_reliable_writer_cache.total_count = status.empty_reliable_writer_cache.total_count; + ddsstatus.empty_reliable_writer_cache.total_count_change = status.empty_reliable_writer_cache.total_count_change; + ddsstatus.full_reliable_writer_cache.total_count = status.full_reliable_writer_cache.total_count; + ddsstatus.full_reliable_writer_cache.total_count_change = status.full_reliable_writer_cache.total_count_change; + ddsstatus.low_watermark_reliable_writer_cache.total_count = status.low_watermark_reliable_writer_cache.total_count; + ddsstatus.low_watermark_reliable_writer_cache.total_count_change = status.low_watermark_reliable_writer_cache.total_count_change; + ddsstatus.high_watermark_reliable_writer_cache.total_count = status.high_watermark_reliable_writer_cache.total_count; + ddsstatus.high_watermark_reliable_writer_cache.total_count_change = status.high_watermark_reliable_writer_cache.total_count_change; + ddsstatus.unacknowledged_sample_count = status.unacknowledged_sample_count; + ddsstatus.unacknowledged_sample_count_peak = status.unacknowledged_sample_count_peak; +} + +inline void +operator<<= (::DDS_ReliableWriterCacheChangedStatus &ddsstatus, const ::DDS::ReliableWriterCacheChangedStatus & status) +{ + ddsstatus.empty_reliable_writer_cache.total_count = status.empty_reliable_writer_cache.total_count; + ddsstatus.empty_reliable_writer_cache.total_count_change = status.empty_reliable_writer_cache.total_count_change; + ddsstatus.full_reliable_writer_cache.total_count = status.full_reliable_writer_cache.total_count; + ddsstatus.full_reliable_writer_cache.total_count_change = status.full_reliable_writer_cache.total_count_change; + ddsstatus.low_watermark_reliable_writer_cache.total_count = status.low_watermark_reliable_writer_cache.total_count; + ddsstatus.low_watermark_reliable_writer_cache.total_count_change = status.low_watermark_reliable_writer_cache.total_count_change; + ddsstatus.high_watermark_reliable_writer_cache.total_count = status.high_watermark_reliable_writer_cache.total_count; + ddsstatus.high_watermark_reliable_writer_cache.total_count_change = status.high_watermark_reliable_writer_cache.total_count_change; + ddsstatus.unacknowledged_sample_count = status.unacknowledged_sample_count; + ddsstatus.unacknowledged_sample_count_peak = status.unacknowledged_sample_count_peak; +} + +#endif + +#endif /* DDS4CCM_RELIABLEWRITERCACHECHANGEDSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/RequestedDeadlineMissedStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/RequestedDeadlineMissedStatus.h new file mode 100644 index 00000000000..9d26f544d4b --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/RequestedDeadlineMissedStatus.h @@ -0,0 +1,38 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_REQUESTEDDEADLINEMISSEDSTATUS_H +#define DDS4CCM_REQUESTEDDEADLINEMISSEDSTATUS_H + +#include "InstanceHandle_t.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::RequestedDeadlineMissedStatus DDS_RequestedDeadlineMissedStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::RequestedDeadlineMissedStatus &ddsstatus, const ::DDS_RequestedDeadlineMissedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_instance_handle <<= status.last_instance_handle; +} + +inline void +operator<<= (::DDS_RequestedDeadlineMissedStatus &ddsstatus, const ::DDS::RequestedDeadlineMissedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_instance_handle <<= status.last_instance_handle; +} + +#endif + +#endif /* DDS4CCM_REQUESTEDDEADLINEMISSEDSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/RequestedIncompatibleQosStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/RequestedIncompatibleQosStatus.h new file mode 100644 index 00000000000..d36b9d7da1c --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/RequestedIncompatibleQosStatus.h @@ -0,0 +1,41 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_REQUESTEDINCOMPATIBLEQOSSTATUS_H +#define DDS4CCM_REQUESTEDINCOMPATIBLEQOSSTATUS_H + +#include "QosPolicyCountSeq.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::RequestedIncompatibleQosStatus DDS_RequestedIncompatibleQosStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::RequestedIncompatibleQosStatus &ddsstatus, const ::DDS_RequestedIncompatibleQosStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_policy_id = status.last_policy_id; + ddsstatus.policies <<= status.policies; +} + +inline void +operator<<= (::DDS_RequestedIncompatibleQosStatus &ddsstatus, const ::DDS::RequestedIncompatibleQosStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_policy_id = static_cast <DDS_QosPolicyId_t>(status.last_policy_id); + ddsstatus.policies <<= status.policies; +} + +#endif + +#endif /* DDS4CCM_REQUESTEDINCOMPATIBLEQOSSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ResourceLimitsQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ResourceLimitsQosPolicy.h new file mode 100644 index 00000000000..f7d2f2dd1f0 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/ResourceLimitsQosPolicy.h @@ -0,0 +1,37 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_RESOURCELIMITSQOSPOLICY_H +#define DDS4CCM_RESOURCELIMITSQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::ResourceLimitsQosPolicy DDS_ResourceLimitsQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::ResourceLimitsQosPolicy &ddsqos, const ::DDS_ResourceLimitsQosPolicy & qos) +{ + ddsqos.max_samples = qos.max_samples; + ddsqos.max_instances = qos.max_instances; + ddsqos.max_samples_per_instance = qos.max_samples_per_instance; +} + +inline void +operator<<= (::DDS_ResourceLimitsQosPolicy &ddsqos, const ::DDS::ResourceLimitsQosPolicy & qos) +{ + ddsqos.max_samples = qos.max_samples; + ddsqos.max_instances = qos.max_instances; + ddsqos.max_samples_per_instance = qos.max_samples_per_instance; +} + +#endif + +#endif /* DDS4CCM_RESOURCELIMITSQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleInfo.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleInfo.h new file mode 100644 index 00000000000..5b1122e1db8 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleInfo.h @@ -0,0 +1,71 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef SAMPLE_INFO_H +#define SAMPLE_INFO_H + +#include "dds4ccm/idl/dds_rtf2_dcpsC.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#include "Time_t.h" +#include "InstanceHandle_t.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::SampleStateKind DDS_SampleStateKind; +typedef ::DDS::SampleInfo DDS_SampleInfo; +#endif + +inline void +operator<<= (::CCM_DDS::AccessStatus & access_status, const ::DDS_SampleStateKind & sample_state) +{ + if (sample_state == ::DDS::NOT_READ_SAMPLE_STATE) + { + access_status = ::CCM_DDS::FRESH_INFO; + } + else if (sample_state == ::DDS::READ_SAMPLE_STATE) + { + access_status = ::CCM_DDS::ALREADY_SEEN; + } +} + +inline void +operator<<= (::CCM_DDS::ReadInfo& ccm_dds_readinfo, const ::DDS_SampleInfo& sample_info) +{ +#if (CIAO_DDS4CCM_NDDS==1) + ccm_dds_readinfo.source_timestamp <<= sample_info.source_timestamp; +#else + ccm_dds_readinfo.source_timestamp = sample_info.source_timestamp; +#endif + ccm_dds_readinfo.access_status <<= sample_info.sample_state; +#if (CIAO_DDS4CCM_NDDS==1) + ccm_dds_readinfo.instance_handle <<= sample_info.instance_handle; +#else + ccm_dds_readinfo.instance_handle = sample_info.instance_handle; +#endif + + if (sample_info.instance_state == ::DDS::ALIVE_INSTANCE_STATE && + sample_info.view_state == ::DDS::NEW_VIEW_STATE) + { + // Instance_status new + ccm_dds_readinfo.instance_status = ::CCM_DDS::INSTANCE_CREATED; + } + else if (sample_info.instance_state == ::DDS::NOT_ALIVE_DISPOSED_INSTANCE_STATE) + { + // Instance_status deleted + ccm_dds_readinfo.instance_status = ::CCM_DDS::INSTANCE_DELETED; + } + else if ((sample_info.instance_state == ::DDS::ALIVE_INSTANCE_STATE && + sample_info.view_state == ::DDS::NOT_NEW_VIEW_STATE) || + sample_info.instance_state == ::DDS::NOT_ALIVE_NO_WRITERS_INSTANCE_STATE) + { + // Instance_status updated + ccm_dds_readinfo.instance_status = ::CCM_DDS::INSTANCE_UPDATED; + } +} + +#endif diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleLostStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleLostStatus.h new file mode 100644 index 00000000000..6191c745c17 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleLostStatus.h @@ -0,0 +1,36 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_SAMPLELOSTSTATUS_H +#define DDS4CCM_SAMPLELOSTSTATUS_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::SampleLostStatus DDS_SampleLostStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::SampleLostStatus &ddsstatus, const ::DDS_SampleLostStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; +} + +inline void +operator>>= (const ::DDS_SampleLostStatus &status, ::DDS::SampleLostStatus & ddsstatus) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; +} +#endif + +#endif /* DDS4CCM_SAMPLELOSTSTATUS_H */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleRejectedStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleRejectedStatus.h new file mode 100644 index 00000000000..2467b100e13 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SampleRejectedStatus.h @@ -0,0 +1,41 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_SAMPLEREJECTEDSTATUS_H +#define DDS4CCM_SAMPLEREJECTEDSTATUS_H + +#include "InstanceHandle_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::SampleRejectedStatus DDS_SampleRejectedStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::SampleRejectedStatus &ddsstatus, const ::DDS_SampleRejectedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_reason = static_cast < ::DDS::SampleRejectedStatusKind> (status.last_reason); + ddsstatus.last_instance_handle <<= status.last_instance_handle; +} + +inline void +operator<<= (::DDS_SampleRejectedStatus &ddsstatus, const ::DDS::SampleRejectedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.last_reason = static_cast < ::DDS_SampleRejectedStatusKind> (status.last_reason); + ddsstatus.last_instance_handle <<= status.last_instance_handle; +} + +#endif + +#endif /* DDS4CCM_SAMPLEREJECTEDSTATUS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/StringSeq.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/StringSeq.h new file mode 100644 index 00000000000..6fcc769b4f2 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/StringSeq.h @@ -0,0 +1,45 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + */ + +#ifndef DDS4CCM_STRINGSEQ_T_H +#define DDS4CCM_STRINGSEQ_T_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::StringSeq DDS_StringSeq; +typedef long DDS_Long; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::StringSeq & string_seq, const ::DDS_StringSeq & dds_string_seq) +{ + string_seq.length (dds_string_seq.length ()); + for (::DDS_Long i = 0 ; i < dds_string_seq.length(); ++i) + { + string_seq[i] = CORBA::string_dup (dds_string_seq[i]); + } +} + +inline void +operator<<= (::DDS_StringSeq & dds_string_seq, const ::DDS::StringSeq & string_seq) +{ + const char** parameterlist = new const char*[string_seq.length ()]; + + for (CORBA::ULong i = 0; i < string_seq.length (); ++i) + { + parameterlist[i] = string_seq[i].in (); + } + dds_string_seq.length (string_seq.length ()); + dds_string_seq.from_array (parameterlist, string_seq.length ()); + delete [] parameterlist; +} +#endif + +#endif /* DDS4CCM_STRINGSEQ_T_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriberQos.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriberQos.h new file mode 100644 index 00000000000..9741f0b9682 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriberQos.h @@ -0,0 +1,44 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_SUBSCRIBERQOS_H +#define DDS4CCM_SUBSCRIBERQOS_H + +#include "EntityFactoryQosPolicy.h" +#include "GroupDataQosPolicy.h" +#include "PartitionQosPolicy.h" +#include "PresentationQosPolicy.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::SubscriberQos DDS_SubscriberQos; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::SubscriberQos &ddsqos, const ::DDS_SubscriberQos & qos) +{ + ddsqos.presentation <<= qos.presentation; + ddsqos.partition <<= qos.partition; + ddsqos.group_data <<= qos.group_data; + ddsqos.entity_factory <<= qos.entity_factory; +} + +inline void +operator<<= (::DDS_SubscriberQos &ddsqos, const ::DDS::SubscriberQos & qos) +{ + ddsqos.presentation <<= qos.presentation; + ddsqos.partition <<= qos.partition; + ddsqos.group_data <<= qos.group_data; + ddsqos.entity_factory <<= qos.entity_factory; +} + +#endif + +#endif /* DDS4CCM_SUBSCRIBERQOS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriptionBuiltinTopicData.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriptionBuiltinTopicData.h new file mode 100644 index 00000000000..06f39b23e4b --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriptionBuiltinTopicData.h @@ -0,0 +1,80 @@ +/** + * @author Marcel Smit <msmit@remedy.nl> + * + * $Id$ + * + */ + +#ifndef SUBSCRIPTIONBUILTINTOPICDATA_H_ +#define SUBSCRIPTIONBUILTINTOPICDATA_H_ + +#include "BuiltinTopicKey_t.h" +#include "DurabilityQosPolicy.h" +#include "DeadlineQosPolicy.h" +#include "LatencyBudgetQosPolicy.h" +#include "LivelinessQosPolicy.h" +#include "ReliabilityQosPolicy.h" +#include "OwnershipQosPolicy.h" +#include "OwnershipStrengthQosPolicy.h" +#include "DestinationOrderQosPolicy.h" +#include "UserDataQosPolicy.h" +#include "TimeBasedFilterQosPolicy.h" +#include "PresentationQosPolicy.h" +#include "PartitionQosPolicy.h" +#include "TopicDataQosPolicy.h" +#include "GroupDataQosPolicy.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::SubscriptionBuiltinTopicData &ddstopicdata, const ::DDS_SubscriptionBuiltinTopicData & topicdata) +{ + ddstopicdata.key <<= topicdata.key; + ddstopicdata.participant_key <<= topicdata.participant_key; + ddstopicdata.topic_name = topicdata.topic_name; + ddstopicdata.type_name = topicdata.type_name; + + ddstopicdata.durability <<= topicdata.durability; + ddstopicdata.deadline <<= topicdata.deadline; + ddstopicdata.latency_budget <<= topicdata.latency_budget; + ddstopicdata.liveliness <<= topicdata.liveliness; + ddstopicdata.reliability <<= topicdata.reliability; + ddstopicdata.ownership <<= topicdata.ownership; + ddstopicdata.destination_order <<= topicdata.destination_order; + ddstopicdata.user_data <<= topicdata.user_data; + ddstopicdata.time_based_filter <<= topicdata.time_based_filter; + + ddstopicdata.presentation <<= topicdata.presentation; + ddstopicdata.partition <<= topicdata.partition; + ddstopicdata.topic_data <<= topicdata.topic_data; + ddstopicdata.group_data <<= topicdata.group_data; +} + +inline void +operator<<= (::DDS_SubscriptionBuiltinTopicData & ddstopicdata, const ::DDS::SubscriptionBuiltinTopicData & topicdata) +{ + ddstopicdata.key <<= topicdata.key; + ddstopicdata.participant_key <<= topicdata.participant_key; + ddstopicdata.topic_name = CORBA::string_dup (topicdata.topic_name); + ddstopicdata.type_name = CORBA::string_dup (topicdata.type_name); + + ddstopicdata.durability <<= topicdata.durability; + ddstopicdata.deadline <<= topicdata.deadline; + ddstopicdata.latency_budget <<= topicdata.latency_budget; + ddstopicdata.liveliness <<= topicdata.liveliness; + ddstopicdata.reliability <<= topicdata.reliability; + ddstopicdata.ownership <<= topicdata.ownership; + ddstopicdata.destination_order <<= topicdata.destination_order; + ddstopicdata.user_data <<= topicdata.user_data; + ddstopicdata.time_based_filter <<= topicdata.time_based_filter; + + ddstopicdata.presentation <<= topicdata.presentation; + ddstopicdata.partition <<= topicdata.partition; + ddstopicdata.topic_data <<= topicdata.topic_data; + ddstopicdata.group_data <<= topicdata.group_data; +} + +#endif + +#endif /* SUBSCRIPTIONBUILTINTOPICDATA_H_ */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriptionMatchedStatus.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriptionMatchedStatus.h new file mode 100644 index 00000000000..a8d02d7a24d --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/SubscriptionMatchedStatus.h @@ -0,0 +1,44 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_SUBSCRIPTIONMATCHEDSTATUS_H +#define DDS4CCM_SUBSCRIPTIONMATCHEDSTATUS_H + +#include "InstanceHandle_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::SubscriptionMatchedStatus DDS_SubscriptionMatchedStatus; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::SubscriptionMatchedStatus &ddsstatus, const ::DDS_SubscriptionMatchedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.current_count = status.current_count; + ddsstatus.current_count_change = status.current_count_change; + ddsstatus.last_publication_handle <<= status.last_publication_handle; +} + +inline void +operator<<= (::DDS_SubscriptionMatchedStatus &ddsstatus, const ::DDS::SubscriptionMatchedStatus & status) +{ + ddsstatus.total_count = status.total_count; + ddsstatus.total_count_change = status.total_count_change; + ddsstatus.current_count = status.current_count; + ddsstatus.current_count_change = status.current_count_change; + ddsstatus.last_publication_handle <<= status.last_publication_handle; +} + +#endif + +#endif /* DDS4CCM_SUBSCRIPTIONMATCHEDSTATUS_H */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TimeBasedFilterQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TimeBasedFilterQosPolicy.h new file mode 100644 index 00000000000..dfb3f711249 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TimeBasedFilterQosPolicy.h @@ -0,0 +1,34 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_TIMEBASEDFILTERQOSPOLICY_H +#define DDS4CCM_TIMEBASEDFILTERQOSPOLICY_H + +#include "Duration_t.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::TimeBasedFilterQosPolicy DDS_TimeBasedFilterQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::TimeBasedFilterQosPolicy &ddsqos, const ::DDS_TimeBasedFilterQosPolicy & qos) +{ + ddsqos.minimum_separation <<= qos.minimum_separation; +} + +inline void +operator<<= (::DDS_TimeBasedFilterQosPolicy &ddsqos, const ::DDS::TimeBasedFilterQosPolicy & qos) +{ + ddsqos.minimum_separation <<= qos.minimum_separation; +} + +#endif + +#endif /* DDS4CCM_TIMEBASEDFILTERQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/Time_t.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/Time_t.h new file mode 100644 index 00000000000..c9c62c27372 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/Time_t.h @@ -0,0 +1,37 @@ +/** + * @author William R. Otte <wotte@dre.vanderbilt.edu> + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_TIME_T_H +#define DDS4CCM_TIME_T_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::Time_t DDS_Time_t; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::Time_t &ddstime, const ::DDS_Time_t & time) +{ + ddstime.sec = time.sec; + ddstime.nanosec = time.nanosec; +} + +inline void +operator<<= (::DDS_Time_t &ddstime, const ::DDS::Time_t & time) +{ + ddstime.sec = time.sec; + ddstime.nanosec = time.nanosec; +} + +#endif + +#endif /* DDS4CCM_TIME_T_H */ + diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TopicDataQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TopicDataQosPolicy.h new file mode 100644 index 00000000000..394b201ff77 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TopicDataQosPolicy.h @@ -0,0 +1,34 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_TOPICDATAQOSPOLICY_H +#define DDS4CCM_TOPICDATAQOSPOLICY_H + +#include "OctetSeq.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::TopicDataQosPolicy DDS_TopicDataQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::TopicDataQosPolicy &ddsqos, const ::DDS_TopicDataQosPolicy & qos) +{ + ddsqos.value <<= qos.value; +} + +inline void +operator<<= (::DDS_TopicDataQosPolicy &ddsqos, const ::DDS::TopicDataQosPolicy & qos) +{ + ddsqos.value <<= qos.value; +} + +#endif + +#endif /* DDS4CCM_TOPICDATAQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TopicQos.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TopicQos.h new file mode 100644 index 00000000000..1cbc53d2b4b --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TopicQos.h @@ -0,0 +1,71 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_TOPICQOS_H +#define DDS4CCM_TOPICQOS_H + +#include "TopicDataQosPolicy.h" +#include "DurabilityQosPolicy.h" +#include "DurabilityServiceQosPolicy.h" +#include "DeadlineQosPolicy.h" +#include "LatencyBudgetQosPolicy.h" +#include "LivelinessQosPolicy.h" +#include "ReliabilityQosPolicy.h" +#include "DestinationOrderQosPolicy.h" +#include "HistoryQosPolicy.h" +#include "ResourceLimitsQosPolicy.h" +#include "TransportPriorityQosPolicy.h" +#include "LifespanQosPolicy.h" +#include "OwnershipQosPolicy.h" + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::TopicQos DDS_TopicQos; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::TopicQos &ddsqos, const ::DDS_TopicQos & qos) +{ + ddsqos.topic_data <<= qos.topic_data; + ddsqos.durability <<= qos.durability; + ddsqos.durability_service <<= qos.durability_service; + ddsqos.deadline <<= qos.deadline; + ddsqos.latency_budget <<= qos.latency_budget; + ddsqos.liveliness <<= qos.liveliness; + ddsqos.reliability <<= qos.reliability; + ddsqos.destination_order <<= qos.destination_order; + ddsqos.history <<= qos.history; + ddsqos.resource_limits <<= qos.resource_limits; + ddsqos.transport_priority <<= qos.transport_priority; + ddsqos.lifespan <<= qos.lifespan; + ddsqos.ownership <<= qos.ownership; +} + +inline void +operator<<= (::DDS_TopicQos &ddsqos, const ::DDS::TopicQos & qos) +{ + ddsqos.topic_data <<= qos.topic_data; + ddsqos.durability <<= qos.durability; + ddsqos.durability_service <<= qos.durability_service; + ddsqos.deadline <<= qos.deadline; + ddsqos.latency_budget <<= qos.latency_budget; + ddsqos.liveliness <<= qos.liveliness; + ddsqos.reliability <<= qos.reliability; + ddsqos.destination_order <<= qos.destination_order; + ddsqos.history <<= qos.history; + ddsqos.resource_limits <<= qos.resource_limits; + ddsqos.transport_priority <<= qos.transport_priority; + ddsqos.lifespan <<= qos.lifespan; + ddsqos.ownership <<= qos.ownership; +} + +#endif + +#endif /* DDS4CCM_TOPICQOS_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TransportPriorityQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TransportPriorityQosPolicy.h new file mode 100644 index 00000000000..3116b5f5bb5 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/TransportPriorityQosPolicy.h @@ -0,0 +1,33 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_TRANSPORTPRIOTITYQOSPOLICY_H +#define DDS4CCM_TRANSPORTPRIOTITYQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::TransportPriorityQosPolicy DDS_TransportPriorityQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::TransportPriorityQosPolicy &ddsqos, const ::DDS_TransportPriorityQosPolicy & qos) +{ + ddsqos.value = qos.value; +} + +inline void +operator<<= (::DDS_TransportPriorityQosPolicy &ddsqos, const ::DDS::TransportPriorityQosPolicy & qos) +{ + ddsqos.value = qos.value; +} + +#endif + +#endif /* DDS4CCM_TRANSPORTPRIOTITYQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/UserDataQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/UserDataQosPolicy.h new file mode 100644 index 00000000000..9e4dc792d5d --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/UserDataQosPolicy.h @@ -0,0 +1,34 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_USERDATAQOSPOLICY_H +#define DDS4CCM_USERDATAQOSPOLICY_H + +#include "OctetSeq.h" +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::UserDataQosPolicy DDS_UserDataQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::UserDataQosPolicy &ddsqos, const ::DDS_UserDataQosPolicy & qos) +{ + ddsqos.value <<= qos.value; +} + +inline void +operator<<= (::DDS_UserDataQosPolicy &ddsqos, const ::DDS::UserDataQosPolicy & qos) +{ + ddsqos.value <<= qos.value; +} + +#endif + +#endif /* DDS4CCM_USERDATAQOSPOLICY_H */ diff --git a/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/WriterDataLifecycleQosPolicy.h b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/WriterDataLifecycleQosPolicy.h new file mode 100644 index 00000000000..6cecbb95c45 --- /dev/null +++ b/modules/CIAO/connectors/dds4ccm/impl/dds/ndds/WriterDataLifecycleQosPolicy.h @@ -0,0 +1,33 @@ +/** + * @author Johnny Willemsen <jwillemsen@remedy.nl> + * + * $Id$ + * + * Wrapper facade for NDDS. + */ + +#ifndef DDS4CCM_WRITERDATALIFECYCLEQOSPOLICY_H +#define DDS4CCM_WRITERDATALIFECYCLEQOSPOLICY_H + +#include "dds4ccm/impl/dds4ccm_conf.h" + +#if (CIAO_DDS4CCM_OPENDDS==1) +typedef ::DDS::WriterDataLifecycleQosPolicy DDS_WriterDataLifecycleQosPolicy; +#endif + +#if (CIAO_DDS4CCM_NDDS==1) +inline void +operator<<= (::DDS::WriterDataLifecycleQosPolicy &ddsqos, const ::DDS_WriterDataLifecycleQosPolicy & qos) +{ + ddsqos.autodispose_unregistered_instances = qos.autodispose_unregistered_instances; +} + +inline void +operator<<= (::DDS_WriterDataLifecycleQosPolicy &ddsqos, const ::DDS::WriterDataLifecycleQosPolicy & qos) +{ + ddsqos.autodispose_unregistered_instances = qos.autodispose_unregistered_instances; +} + +#endif + +#endif /* DDS4CCM_WRITERDATALIFECYCLEQOSPOLICY_H */ |