• Classes
  • Modules
  • Namespaces
  • Files
  • Related Pages
  • File List
  • File Members

DDSSubscriber.h

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                                 /*ddsnc::ACSDDSNCDataReaderListener<DRV,DR,D>* listener_servant=
00092                                         dynamic_cast<ddsnc::ACSDDSNCDataReaderListener<DRV,DR,D>*>
00093                                         (listener.in());
00094 
00095                                 if(CORBA::is_nil (listener.in())){
00096                                         std::cerr << "listener is nil" << std::endl;
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                         /*Initialize Type Support*/
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                         /*Initialize the Topic*/
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                         // drQos.history.depth = 100;
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

Generated on Thu Jan 12 2012 23:13:50 for ACS-10.0 C++ API by  doxygen 1.7.0