00001
00020 #ifndef InPortCorbaProvider_h
00021 #define InPortCorbaProvider_h
00022
00023 #include <rtm/idl/DataPortSkel.h>
00024 #include <rtm/BufferBase.h>
00025 #include <rtm/InPortProvider.h>
00026
00027 namespace RTC
00028 {
00054 template <class DataType>
00055 class InPortCorbaProvider
00056 : public InPortProvider,
00057 public virtual POA_RTC::InPortAny,
00058 public virtual PortableServer::RefCountServantBase
00059 {
00060 public:
00086 InPortCorbaProvider(BufferBase<DataType>& buffer)
00087 : m_buffer(buffer)
00088 {
00089 CORBA::Any any_var;
00090 DataType tmp_var;
00091 any_var <<= tmp_var;
00092
00093
00094 setDataType(any_var.type()->name());
00095 setInterfaceType("CORBA_Any");
00096 setDataFlowType("Push, Pull");
00097 setSubscriptionType("Any");
00098
00099
00100 m_objref = this->_this();
00101
00102
00103
00104 }
00105
00123 void publishInterface(SDOPackage::NVList& prop)
00124 {
00125 if (!NVUtil::isStringValue(prop,
00126 "dataport.interface_type",
00127 "CORBA_Any"))
00128 {
00129 return;
00130 }
00131 SDOPackage::NVList nv(m_properties);
00132 CORBA_SeqUtil::push_back(nv,
00133 NVUtil::newNV("dataport.corba_any.inport_ref",
00134 RTC::InPortAny::_duplicate(m_objref)));
00135
00136 NVUtil::append(prop, nv);
00137 }
00138
00152 virtual ~InPortCorbaProvider()
00153 {
00154 }
00155
00173 virtual void put(const CORBA::Any& data)
00174 throw (CORBA::SystemException)
00175 {
00176 const DataType* tmp;
00177 if (data >>= tmp)
00178 {
00179 m_buffer.write(*tmp);
00180 }
00181 return;
00182 }
00183
00184 private:
00185 BufferBase<DataType>& m_buffer;
00186 RTC::InPortAny_var m_objref;
00187 };
00188 };
00189 #endif // InPortCorbaProvider_h
00190