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