DataOutPort.h

説明を見る。
00001 // -*- C++ -*-
00020 #ifndef DataOutPort_h
00021 #define DataOutPort_h
00022 
00023 
00024 #include <rtm/PortBase.h>
00025 #include <rtm/BufferBase.h>
00026 #include <rtm/OutPortCorbaProvider.h>
00027 #include <rtm/InPortCorbaConsumer.h>
00028 #include <rtm/OutPort.h>
00029 #include <rtm/NVUtil.h>
00030 #include <rtm/PublisherFactory.h>
00031 #include <rtm/Properties.h>
00032 
00033 #ifdef RTC_SOCK_DATAPORT
00034 #include <rtm/OutPortTcpSockProvider.h>
00035 #include <rtm/InPortTcpSockConsumer.h>
00036 #endif
00037 
00038 namespace RTC
00039 {
00099   class DataOutPort
00100     : public PortBase
00101   {
00102   public:
00127     template <class DataType, template <class DataType> class Buffer>
00128     DataOutPort(const char* name, OutPort<DataType, Buffer>& outport,
00129                 Properties& prop)
00130       : PortBase(name), m_outport(outport)
00131     {
00132       // PortProfile::properties を設定
00133       addProperty("port.port_type", "DataOutPort");
00134       
00135       m_providers.push_back(new OutPortCorbaProvider<DataType>(outport));
00136       m_providers.back()->publishInterfaceProfile(m_profile.properties);
00137       
00138 #ifdef RTC_SOCK_DATAPORT
00139       m_providers.push_back(new OutPortTcpSockProvider<DataType>(outport));
00140       m_providers.back()->publishInterfaceProfile(m_profile.properties);
00141 #endif      
00142       m_consumers.push_back(new InPortCorbaConsumer<DataType>(outport));
00143 #ifdef RTC_SOCK_DATAPORT
00144       m_consumers.push_back(new InPortTcpSockConsumer<DataType>(outport, prop));
00145 #endif
00146     }
00147     
00161     virtual ~DataOutPort();
00162     
00163   protected:
00210     virtual ReturnCode_t
00211     publishInterfaces(ConnectorProfile& connector_profile);
00212     
00251     virtual ReturnCode_t
00252     subscribeInterfaces(const ConnectorProfile& connector_profile);
00253     
00285     virtual void
00286     unsubscribeInterfaces(const ConnectorProfile& connector_profile);
00287     
00295     struct publish
00296     {
00297       publish(SDOPackage::NVList& prop) : m_prop(prop) {}
00298       void operator()(OutPortProvider* provider)
00299       {
00300         provider->publishInterface(m_prop);
00301       }
00302       SDOPackage::NVList& m_prop;
00303     };
00304     
00312     struct unsubscribe
00313     {
00314       unsubscribe(const SDOPackage::NVList& prop) : m_prop(prop) {}
00315       void operator()(InPortConsumer* consumer)
00316       {
00317         consumer->unsubscribeInterface(m_prop);
00318       }
00319       const SDOPackage::NVList& m_prop;
00320     };
00321     
00322   private:
00323     std::vector<OutPortProvider*> m_providers;
00324     std::vector<InPortConsumer*> m_consumers;
00325     OutPortBase& m_outport;
00326     
00327     PublisherFactory m_pf;
00328     
00329     struct subscribe
00330     {
00331       subscribe(const ConnectorProfile& prof)
00332         : m_prof(&prof), _consumer(NULL) 
00333       {
00334       }
00335       
00336       subscribe(const subscribe& subs)
00337         : m_prof(subs.m_prof),
00338           _consumer(subs._consumer)
00339       {
00340       }
00341       
00342       subscribe& operator=(const subscribe& subs)
00343       {
00344         if (this == &subs) return *this;
00345         m_prof = subs.m_prof;
00346         _consumer = subs._consumer;
00347         return *this;
00348       }
00349       
00350       void operator()(InPortConsumer* cons)
00351       {
00352         if (cons->subscribeInterface(m_prof->properties))
00353           {
00354             _consumer = cons;
00355           }
00356       }
00357       const ConnectorProfile* m_prof;
00358       InPortConsumer* _consumer;
00359     };
00360   };
00361 }; // namespace RTC
00362 
00363 #endif // DataOutPort_h

OpenRTMに対してThu May 29 15:03:26 2008に生成されました。  doxygen 1.5.3