00001
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef InPortCorbaProvider_h
00035 #define InPortCorbaProvider_h
00036
00037 #include <rtm/idl/DataPortSkel.h>
00038 #include <rtm/BufferBase.h>
00039 #include <rtm/InPortProvider.h>
00040
00041 namespace RTC
00042 {
00052 template <class DataType>
00053 class InPortCorbaProvider
00054 : public InPortProvider,
00055 public virtual POA_RTC::InPortAny,
00056 public virtual PortableServer::RefCountServantBase
00057 {
00058 public:
00066 InPortCorbaProvider(BufferBase<DataType>& buffer)
00067 : m_buffer(buffer)
00068 {
00069 CORBA::Any any_var;
00070 DataType tmp_var;
00071 any_var <<= tmp_var;
00072
00073
00074 setDataType(any_var.type()->name());
00075 setInterfaceType("CORBA_Any");
00076 setDataFlowType("Push, Pull");
00077 setSubscriptionType("Any");
00078
00079
00080 m_objref = this->_this();
00081 CORBA_SeqUtil::push_back(m_properties,
00082 NVUtil::newNV("dataport.corba_any.inport_ref",
00083 RTC::InPortAny::_duplicate(m_objref)));
00084 }
00085
00086 virtual ~InPortCorbaProvider()
00087 {
00088 }
00089
00090 virtual void put(const CORBA::Any& data)
00091 {
00092 DataType* tmp;
00093 if (data >>= tmp)
00094 {
00095 m_buffer.write(*tmp);
00096 }
00097 return;
00098 }
00099 private:
00100 BufferBase<DataType>& m_buffer;
00101 RTC::InPortAny_var m_objref;
00102 };
00103
00104
00105 };
00106 #endif // InPortCorbaProvider_h
00107