Go to the documentation of this file.00001 #ifndef _DDS_SUBSCRIBER_H
00002 #define _DDS_SUBSCRIBER_H
00003
00004 #include <DDSHelper.h>
00005 #include <acsddsncDataReaderListener.h>
00006 #include <dds/DCPS/SubscriberImpl.h>
00007
00008 namespace ddsnc{
00009
00016 class DDSSubscriber : public ddsnc::DDSHelper{
00017 private:
00018 DDS::Subscriber_var sub;
00019 OpenDDS::DCPS::SubscriberImpl *sub_impl;
00020 DDS::DataReaderListener_var *listener;
00021
00022 int attachToTransport();
00023
00029 int createSubscriber();
00030
00031 protected:
00032 DDS::SubscriberQos subQos;
00033
00034 public:
00035 DDS::DataReaderQos drQos;
00050 DDSSubscriber(CORBA::String_var channel_name);
00051
00052 ~DDSSubscriber()
00053 {
00054 delete listener;
00055 }
00056
00063 void consumerReady();
00064
00081 template <class DRV, class DR, class D>
00082 void addSubscription(
00083 void (*templateFunction)(D, void *), void *handlerParam=0)
00084 {
00085 std::cerr << "DDSSubscriber::addSubscription" << std::endl;
00086
00087 listener = new DDS::DataReaderListener_var
00088 (new ddsnc::ACSDDSNCDataReaderListener
00089 <DRV,DR,D>(templateFunction, handlerParam));
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 }
00100
00101
00121 template <class D, class TSV, class TSI>
00122 void initialize()
00123 {
00124 std::cerr<< "DDSSubscriber::initialize()" << std::endl;
00125 createParticipant();
00126 if (CORBA::is_nil (participant.in()))
00127 std::cerr << "Participant is nil" << std::endl;
00128
00129 if(partitionName!=NULL){
00130 participant->get_default_subscriber_qos(subQos);
00131 subQos.partition.name.length(1);
00132 subQos.partition.name[0]=CORBA::string_dup(partitionName);
00133 }
00134 initializeTransport();
00135
00136 createSubscriber();
00137
00138
00139 TSV ts;
00140 ts = new TSI();
00141 if (DDS::RETCODE_OK != ts->register_type(participant.in(),"")){
00142 std::cerr << "register_type failed" << std::endl;
00143 }
00144
00145
00146 initializeTopic(ts->get_type_name());
00147 if(CORBA::is_nil(topic.in()))
00148 std::cerr<< "Topic is nil" << std::endl;
00149
00150 sub->get_default_datareader_qos (drQos);
00151
00152 drQos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS;
00153 drQos.reliability.max_blocking_time.sec = 1;
00154
00155 drQos.history.kind = ::DDS::KEEP_LAST_HISTORY_QOS;
00156
00157 drQos.history.depth = 1;
00158 }
00159 };
00160 }
00161
00172 #define ACS_NEW_DDS_SUBSCRIBER(subscriber_p, idlStruct, channelName, handlerFunc, handlerParam) \
00173 { \
00174 subscriber_p= new ddsnc::DDSSubscriber(channelName); \
00175 subscriber_p->initialize<idlStruct, idlStruct##TypeSupport_var, idlStruct##TypeSupportImpl>(); \
00176 subscriber_p->addSubscription<idlStruct##DataReader_var, idlStruct##DataReader, idlStruct>(handlerFunc, handlerParam); \
00177 }
00178
00179 #endif