00001 // -*- C++ -*- 00020 #ifndef InPortTcpSockProvider_h 00021 #define InPortTcpSockProvider_h 00022 00023 #include <rtm/BufferBase.h> 00024 #include <rtm/InPortProvider.h> 00025 #include <rtm/TcpSockServer.h> 00026 #include <rtm/StringUtil.h> 00027 00028 namespace RTC 00029 { 00054 template <class DataType> 00055 class InPortTcpSockProvider 00056 : public InPortProvider 00057 { 00058 public: 00086 InPortTcpSockProvider(BufferBase<DataType>& buffer, Properties& prop) 00087 : m_server(buffer, prop), m_buffer(buffer), m_prop(prop) 00088 { 00089 CORBA::Any any_var; 00090 DataType tmp_var; 00091 any_var <<= tmp_var; 00092 00093 // PortProfile setting 00094 setDataType(any_var.type()->name()); 00095 setInterfaceType("TCP_Any"); 00096 setDataFlowType("Push"); 00097 setSubscriptionType("Any"); 00098 00099 // setup TCP server 00100 m_server.open(0); 00101 00102 // set the TCP server address to properties 00103 std::string addr; 00104 addr = m_server.getHostName(); 00105 addr += ":"; 00106 addr += otos(m_server.getPortNumber()); 00107 CORBA_SeqUtil::push_back(m_properties, 00108 NVUtil::newNV("dataport.tcp_any.inport_addr", addr.c_str())); 00109 } 00110 00124 virtual ~InPortTcpSockProvider() 00125 { 00126 } 00127 00145 void publishInterface(SDOPackage::NVList& prop) 00146 { 00147 if (!NVUtil::isStringValue(prop, 00148 "dataport.interface_type", 00149 "TCP_Any")) 00150 { 00151 return; 00152 } 00153 SDOPackage::NVList nv(m_properties); 00154 NVUtil::append(prop, nv); 00155 } 00156 00157 private: 00158 TcpServer<DataType> m_server; 00159 BufferBase<DataType>& m_buffer; 00160 Properties& m_prop; 00161 }; 00162 }; // namespace RTC 00163 #endif // InPortTcpSockProvider_h