InPortTcpSockConsumer.h

説明を見る。
00001 // -*- C++ -*-
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       // read data from buffer
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       // hmm... type-unsafe way.
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       // Disable Nagle's algorithm for small packaets
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 };     // namespace RTC
00329 #endif // InPortTcpSockConsumer_h

OpenRTMに対してWed May 21 05:17:25 2008に生成されました。  doxygen 1.5.3