#ifndef DPS_DDS_LISTENER_H #define DPS_DDS_LISTENER_H #include "CR_Component.h" #include "OS_Debug.h" #include "ndds/ndds_cpp.h" #include "ndds/ndds_namespace_cpp.h" template< typename Tdatareader, typename Tdataseq > class DPS_DDSListener : public DDS::DataReaderListener { public: DPS_DDSListener( CR_Component* _component, const TDstring& _message ) : component( _component ), message( _message ) {} ~DPS_DDSListener(); virtual void on_requested_deadline_missed( DDS::DataReader* reader, const DDS::RequestedDeadlineMissedStatus& status ) {} virtual void on_requested_incompatible_qos( DDS::DataReader* reader, const DDS::RequestedIncompatibleQosStatus& status ) {} virtual void on_sample_rejected( DDS::DataReader* reader, const DDS::SampleRejectedStatus& status ) {} virtual void on_liveliness_changed( DDS::DataReader* reader, const DDS::LivelinessChangedStatus& status ) {} virtual void on_sample_lost( DDS::DataReader* reader, const DDS::SampleLostStatus& status ) {} virtual void on_subscription_matched( DDS::DataReader* reader, const DDS::SubscriptionMatchedStatus& status) {} virtual void on_data_available( DDS::DataReader* reader ); CR_Component* component; TDstring message; }; template< typename Tdatareader, typename Tdataseq > DPS_DDSListener< Tdatareader, Tdataseq >::~DPS_DDSListener() { component = NULL; } template< typename Tdatareader, typename Tdataseq > void DPS_DDSListener< Tdatareader, Tdataseq >::on_data_available( DDS::DataReader* reader ) { if (component == NULL) return; // narrow Tdatareader * data_reader = Tdatareader::narrow( reader ); if( data_reader == NULL ) { OS_DEBUG( "data_reader narrow error\n" ); return; } // take Tdataseq data_seq; DDS::SampleInfoSeq info_seq; DDS::ReturnCode_t retcode = data_reader->take( data_seq, info_seq, DDS::LENGTH_UNLIMITED, DDS::ANY_SAMPLE_STATE, DDS::ANY_VIEW_STATE, DDS::ANY_INSTANCE_STATE ); if( retcode == DDS::RETCODE_NO_DATA ) { return; } else if( retcode != DDS::RETCODE_OK ) { OS_DEBUG( "take error %d\n", retcode ); return; } // notify for( DDS_Long i = 0; i < data_seq.length( ); ++i ) { if( info_seq[i].valid_data ) { component->Notify( message, &data_seq[i] ); } } // return loan retcode = data_reader->return_loan( data_seq, info_seq ); if( retcode != DDS::RETCODE_OK ) { OS_DEBUG( "return loan error %d\n", retcode ); } } #endif // DPS_DDS_LISTENER_H