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 #include <rtm/Properties.h> 00028 #include <rtm/CORBA_SeqUtil.h> 00029 00030 namespace RTC 00031 { 00056 template <class DataType> 00057 class InPortTcpSockProvider 00058 : public InPortProvider 00059 { 00060 public: 00088 InPortTcpSockProvider(BufferBase<DataType>& buffer, Properties& prop) 00089 : m_server(buffer, prop), m_buffer(buffer), m_prop(prop) 00090 { 00091 CORBA::Any any_var; 00092 DataType tmp_var; 00093 any_var <<= tmp_var; 00094 00095 // PortProfile setting 00096 setDataType(any_var.type()->name()); 00097 setInterfaceType("TCP_Any"); 00098 setDataFlowType("Push"); 00099 setSubscriptionType("Any"); 00100 00101 // setup TCP server 00102 m_server.open(0); 00103 00104 // set the TCP server address to properties 00105 std::string addr; 00106 addr = m_server.getHostName(); 00107 addr += ":"; 00108 addr += otos(m_server.getPortNumber()); 00109 CORBA_SeqUtil::push_back(m_properties, 00110 NVUtil::newNV("dataport.tcp_any.inport_addr", addr.c_str())); 00111 } 00112 00126 virtual ~InPortTcpSockProvider(void) 00127 { 00128 } 00129 00147 void publishInterface(SDOPackage::NVList& prop) 00148 { 00149 if (!NVUtil::isStringValue(prop, 00150 "dataport.interface_type", 00151 "TCP_Any")) 00152 { 00153 return; 00154 } 00155 SDOPackage::NVList nv(m_properties); 00156 NVUtil::append(prop, nv); 00157 } 00158 00159 private: 00160 TcpServer<DataType> m_server; 00161 BufferBase<DataType>& m_buffer; 00162 Properties& m_prop; 00163 }; 00164 }; // namespace RTC 00165 #endif // InPortTcpSockProvider_h