00001 // -*- C++ -*- 00020 #ifndef OutPortCorbaProvider_h 00021 #define OutPortCorbaProvider_h 00022 00023 #include <rtm/idl/DataPortSkel.h> 00024 #include <rtm/BufferBase.h> 00025 #include <rtm/OutPortProvider.h> 00026 00027 namespace RTC 00028 { 00054 template <class DataType> 00055 class OutPortCorbaProvider 00056 : public OutPortProvider, 00057 public virtual POA_RTC::OutPortAny, 00058 public virtual PortableServer::RefCountServantBase 00059 { 00060 public: 00078 OutPortCorbaProvider(BufferBase<DataType>& buffer) 00079 : m_buffer(buffer) 00080 { 00081 CORBA::Any any_var; 00082 DataType tmp_var; 00083 any_var <<= tmp_var; 00084 00085 // PortProfile setting 00086 setDataType(any_var.type()->name()); 00087 setInterfaceType("CORBA_Any"); 00088 setDataFlowType("Push, Pull"); 00089 setSubscriptionType("Flush, New, Periodic"); 00090 00091 // ConnectorProfile setting 00092 m_objref = this->_this(); 00093 CORBA_SeqUtil::push_back(m_properties, 00094 NVUtil::newNV("dataport.corba_any.outport_ref", 00095 m_objref)); 00096 } 00097 00111 virtual ~OutPortCorbaProvider() 00112 {} 00113 00131 CORBA::Any* get() 00132 { 00133 DataType data; 00134 CORBA::Any_var tmp = new CORBA::Any(); 00135 m_buffer.read(data); 00136 tmp <<= data; 00137 return tmp._retn(); 00138 } 00139 00140 private: 00141 BufferBase<DataType>& m_buffer; 00142 OutPortAny_var m_objref; 00143 }; 00144 }; // namespace RTC 00145 #endif // OutPortCorbaProvider_h