00001
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef DataOutPort_h
00042 #define DataOutPort_h
00043
00044
00045 #include <rtm/PortBase.h>
00046 #include <rtm/BufferBase.h>
00047 #include <rtm/OutPortCorbaProvider.h>
00048 #include <rtm/InPortCorbaConsumer.h>
00049 #include <rtm/OutPort.h>
00050 #include <rtm/NVUtil.h>
00051 #include <rtm/PublisherFactory.h>
00052
00053 namespace RTC
00054 {
00064 class DataOutPort
00065 : public PortBase
00066 {
00067 public:
00075 template <class DataType, template <class DataType> class Buffer>
00076 DataOutPort(const char* name, OutPort<DataType, Buffer>& outport)
00077 : PortBase(name), m_outport(outport)
00078 {
00079
00080 addProperty("port.port_type", "DataOutPort");
00081
00082 m_providers.push_back(new OutPortCorbaProvider<DataType>(outport));
00083
00084 m_consumers.push_back(new InPortCorbaConsumer<DataType>(outport));
00085 }
00086
00087
00095 virtual ~DataOutPort();
00096
00097
00154 protected:
00199 virtual ReturnCode_t
00200 publishInterfaces(ConnectorProfile& connector_profile);
00201
00202
00239 virtual ReturnCode_t
00240 subscribeInterfaces(const ConnectorProfile& connector_profile);
00241
00242
00273 virtual void
00274 unsubscribeInterfaces(const ConnectorProfile& connector_profile);
00275
00276
00277
00278 struct publish
00279 {
00280 publish(SDOPackage::NVList& prop) : m_prop(prop) {}
00281 void operator()(OutPortProvider* provider)
00282 {
00283 provider->publishInterface(m_prop);
00284 }
00285 SDOPackage::NVList& m_prop;
00286 };
00287
00288 struct unsubscribe
00289 {
00290 unsubscribe(const SDOPackage::NVList& prop) : m_prop(prop) {}
00291 void operator()(InPortConsumer* consumer)
00292 {
00293 consumer->unsubscribeInterface(m_prop);
00294 }
00295 const SDOPackage::NVList& m_prop;
00296 };
00297
00298 private:
00299 struct find_conn_id;
00300 std::vector<OutPortProvider*> m_providers;
00301 std::vector<InPortConsumer*> m_consumers;
00302 OutPortBase& m_outport;
00303
00304 PublisherFactory m_pf;
00305
00306 struct subscribe
00307 {
00308 subscribe(const ConnectorProfile& prof)
00309 : m_prof(&prof), _consumer(NULL)
00310 {
00311 }
00312
00313 subscribe(const subscribe& subs)
00314 : m_prof(subs.m_prof),
00315 _consumer(subs._consumer)
00316 {
00317 }
00318
00319 subscribe& operator=(const subscribe& subs)
00320 {
00321 if (this == &subs) return *this;
00322 m_prof = subs.m_prof;
00323 _consumer = subs._consumer;
00324 return *this;
00325 }
00326
00327 void operator()(InPortConsumer* cons)
00328 {
00329 if (cons->subscribeInterface(m_prof->properties))
00330 {
00331 _consumer = cons;
00332 }
00333 }
00334 const ConnectorProfile* m_prof;
00335 InPortConsumer* _consumer;
00336 };
00337
00338
00339 };
00340 };
00341
00342 #endif // DataOutPort_h