00001
00020 #ifndef InPortTcpSockConsumer_h
00021 #define InPortTcpSockConsumer_h
00022
00023 #include <rtm/BufferBase.h>
00024 #include <rtm/InPortConsumer.h>
00025 #include <rtm/StringUtil.h>
00026 #include <ace/INET_Addr.h>
00027 #include <ace/SOCK_Stream.h>
00028 #include <ace/SOCK_Connector.h>
00029 #include <ace/Log_Msg.h>
00030 #include <ace/OS.h>
00031 #include <iostream>
00032
00033 namespace RTC
00034 {
00062 template <class DataType>
00063 class InPortTcpSockConsumer
00064 : public InPortConsumer
00065 {
00066 public:
00086 InPortTcpSockConsumer(BufferBase<DataType>& buffer, Properties& prop)
00087 : m_buffer(buffer), m_prop(prop), m_byteswap(true)
00088 {
00089 m_byteswap = toBool(m_prop["byteswap"], "YES", "NO", true);
00090 std::cout << "byteswap: " << m_byteswap << std::endl;
00091 }
00092
00110 InPortTcpSockConsumer(const InPortTcpSockConsumer<DataType>& consumer)
00111 : m_buffer(consumer.m_buffer), m_prop(consumer.m_prop),
00112 m_byteswap(consumer.m_byteswap), m_stream(consumer.m_stream),
00113 m_addr(consumer.m_addr)
00114 {
00115 }
00116
00138 InPortTcpSockConsumer&
00139 operator=(const InPortTcpSockConsumer<DataType>& consumer)
00140 {
00141 m_buffer = consumer.m_buffer;
00142 m_prop = consumer.m_prop;
00143 m_stream = consumer.m_stream;
00144 m_addr = consumer.m_addr;
00145 m_byteswap = consumer.m_byteswap;
00146 }
00147
00161 virtual ~InPortTcpSockConsumer()
00162 {}
00163
00177 void push()
00178 {
00179
00180 DataType data;
00181 m_buffer.read(data);
00182 std::cout << "byteswap: " << m_byteswap << std::endl;
00183
00184 CORBA::ULong size(0);
00185 cdrMemoryStream cdrData;
00186 cdrData.setByteSwapFlag(m_byteswap);
00187 size >>= cdrData;
00188 data >>= cdrData;
00189
00190 cdrMemoryStream cdrSize;
00191 size = cdrData.bufSize();
00192 cdrSize.setByteSwapFlag(m_byteswap);
00193 size >>= cdrSize;
00194
00195
00196 memcpy(cdrData.bufPtr(), cdrSize.bufPtr(), sizeof(CORBA::ULong));
00197
00198 int send(0);
00199 send = m_stream->send_n(cdrData.bufPtr(), size);
00200
00201 if (send != (int)size)
00202 {
00203 std::cout << "data size: " << size << std::endl;
00204 std::cout << "send size: " << send << std::endl;
00205 std::cout << "invalid send" << std::endl;
00206 }
00207 }
00208
00226 virtual InPortTcpSockConsumer* clone() const
00227 {
00228 return new InPortTcpSockConsumer<DataType>(*this);
00229 }
00230
00253 virtual bool subscribeInterface(const SDOPackage::NVList& properties)
00254 {
00255 if (!NVUtil::isStringValue(properties,
00256 "dataport.dataflow_type",
00257 "Push"))
00258 {
00259 return false;
00260 }
00261
00262 CORBA::Long index;
00263 index = NVUtil::find_index(properties,
00264 "dataport.tcp_any.inport_addr");
00265 if (index < 0)
00266 {
00267 return false;
00268 }
00269
00270 const char* inport_addr;
00271 if (!(properties[index].value >>= inport_addr))
00272 {
00273 return false;
00274 }
00275
00276 std::vector<std::string> addr(split(inport_addr, ":"));
00277
00278 if (addr.size() != 2)
00279 {
00280 return false;
00281 }
00282
00283 m_addr.set(addr[1].c_str(), addr[0].c_str());
00284 std::cout << "addr: " << addr[0].c_str() << std::endl;
00285 std::cout << "port: " << addr[1].c_str() << std::endl;
00286 m_stream = new ACE_SOCK_Stream();
00287 if (m_connector.connect(*m_stream, m_addr) == -1)
00288 {
00289 std::cout << "Connection failed." << std::endl;
00290 return false;
00291 }
00292
00293
00294 int flag(1);
00295 m_stream->set_option(IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
00296
00297 return true;
00298 }
00299
00313 virtual void unsubscribeInterface(const SDOPackage::NVList& properties)
00314 {
00315 std::cout << "unsubscribe" << std::endl;
00316 m_stream->close();
00317 }
00318
00319 private:
00320 BufferBase<DataType>& m_buffer;
00321 Properties& m_prop;
00322 bool m_byteswap;
00323
00324 ACE_SOCK_Stream* m_stream;
00325 ACE_SOCK_Connector m_connector;
00326 ACE_INET_Addr m_addr;
00327 };
00328 };
00329 #endif // InPortTcpSockConsumer_h