ConnectorListener.h
Go to the documentation of this file.
00001 // -*- C++ -*-
00020 #ifndef RTC_CONNECTORLISTENER_H
00021 #define RTC_CONNECTORLISTENER_H
00022 
00023 #include <vector>
00024 #include <utility>
00025 #include <coil/Mutex.h>
00026 #include <coil/Guard.h>
00027 #include <rtm/RTC.h>
00028 #include <rtm/ConnectorBase.h>
00029 
00030 class cdrMemoryStream;
00031 
00032 namespace RTC
00033 {
00034   class ConnectorInfo;
00035 
00067   enum ConnectorDataListenerType
00068     {
00069       ON_BUFFER_WRITE = 0, 
00070       ON_BUFFER_FULL, 
00071       ON_BUFFER_WRITE_TIMEOUT, 
00072       ON_BUFFER_OVERWRITE, 
00073       ON_BUFFER_READ, 
00074       ON_SEND, 
00075       ON_RECEIVED,
00076       ON_RECEIVER_FULL, 
00077       ON_RECEIVER_TIMEOUT, 
00078       ON_RECEIVER_ERROR,
00079       CONNECTOR_DATA_LISTENER_NUM
00080     };
00081 
00188   class ConnectorDataListener
00189   {
00190   public:
00214     static const char* toString(ConnectorDataListenerType type)
00215     {
00216       static const char* typeString[] =
00217         {
00218           "ON_BUFFER_WRITE",
00219           "ON_BUFFER_FULL",
00220           "ON_BUFFER_WRITE_TIMEOUT",
00221           "ON_BUFFER_OVERWRITE",
00222           "ON_BUFFER_READ", 
00223           "ON_SEND", 
00224           "ON_RECEIVED",
00225           "ON_RECEIVER_FULL", 
00226           "ON_RECEIVER_TIMEOUT", 
00227           "ON_RECEIVER_ERROR",
00228           "CONNECTOR_DATA_LISTENER_NUM"
00229         };
00230       if (type < CONNECTOR_DATA_LISTENER_NUM) { return typeString[type]; }
00231       return "";
00232     }
00233 
00241     virtual ~ConnectorDataListener();
00242 
00259     virtual void operator()(const ConnectorInfo& info,
00260                             const cdrMemoryStream& data) = 0;
00261   };
00262 
00289   template <class DataType>
00290   class ConnectorDataListenerT
00291     : public ConnectorDataListener
00292   {
00293   public:
00301     virtual ~ConnectorDataListenerT(){}
00302 
00326     virtual void operator()(const ConnectorInfo& info,
00327                             const cdrMemoryStream& cdrdata)
00328     {
00329       DataType data;
00330       cdrMemoryStream cdr(cdrdata.bufPtr(), cdrdata.bufSize());
00331       
00332       // endian type check
00333       std::string endian_type;
00334       endian_type = info.properties.getProperty("serializer.cdr.endian",
00335                                                 "little");
00336       coil::normalize(endian_type);
00337       std::vector<std::string> endian(coil::split(endian_type, ","));
00338       if (endian[0] == "little")
00339         {
00340           cdr.setByteSwapFlag(true);
00341         }
00342       else if (endian[0] == "big")
00343         {
00344           cdr.setByteSwapFlag(false);
00345         }
00346       data <<= cdr;
00347       this->operator()(info, data);
00348     }
00349 
00367     virtual void operator()(const ConnectorInfo& info,
00368                             const DataType& data) = 0;
00369                             
00370   };
00371 
00372 
00398   enum ConnectorListenerType
00399     {
00400       ON_BUFFER_EMPTY = 0,
00401       ON_BUFFER_READ_TIMEOUT,
00402       ON_SENDER_EMPTY, 
00403       ON_SENDER_TIMEOUT, 
00404       ON_SENDER_ERROR, 
00405       ON_CONNECT,
00406       ON_DISCONNECT,
00407       CONNECTOR_LISTENER_NUM
00408     };
00409 
00516   class ConnectorListener
00517   {
00518   public:
00542     static const char* toString(ConnectorListenerType type)
00543     { 
00544       static const char* typeStr[] =
00545         {
00546           "ON_BUFFER_EMPTY",
00547           "ON_BUFFER_READ_TIMEOUT",
00548           "ON_SENDER_EMPTY", 
00549           "ON_SENDER_TIMEOUT", 
00550           "ON_SENDER_ERROR", 
00551           "ON_CONNECT",
00552           "ON_DISCONNECT",
00553           "CONNECTOR_LISTENER_NUM"
00554         };
00555       if (type < CONNECTOR_LISTENER_NUM) { return typeStr[type]; }
00556       return "";
00557     }
00558 
00566     virtual ~ConnectorListener();
00567 
00585     virtual void operator()(const ConnectorInfo& info) = 0;
00586   };
00587 
00588 
00604   class ConnectorDataListenerHolder
00605   {
00606     typedef std::pair<ConnectorDataListener*, bool> Entry;
00607     typedef coil::Guard<coil::Mutex> Guard;
00608   public:
00616     ConnectorDataListenerHolder();
00624     virtual ~ConnectorDataListenerHolder();
00625     
00647     void addListener(ConnectorDataListener* listener, bool autoclean);
00648     
00666     void removeListener(ConnectorDataListener* listener);
00667     
00687     void notify(const ConnectorInfo& info,
00688                 const cdrMemoryStream& cdrdata);
00689     
00690   private:
00691     std::vector<Entry> m_listeners;
00692     coil::Mutex m_mutex;
00693   };
00694 
00695 
00711   class ConnectorListenerHolder
00712   {
00713     typedef std::pair<ConnectorListener*, bool> Entry;
00714     typedef coil::Guard<coil::Mutex> Guard;
00715   public:
00723     ConnectorListenerHolder();
00724     
00732     virtual ~ConnectorListenerHolder();
00733     
00755     void addListener(ConnectorListener* listener, bool autoclean);
00756     
00774     void removeListener(ConnectorListener* listener);
00775 
00793     void notify(const ConnectorInfo& info);
00794       
00795   private:
00796     std::vector<Entry> m_listeners;
00797     coil::Mutex m_mutex;
00798   };
00799   
00813   class ConnectorListeners
00814   {
00815   public:
00825     ConnectorDataListenerHolder connectorData_[CONNECTOR_DATA_LISTENER_NUM];
00835     ConnectorListenerHolder connector_[CONNECTOR_LISTENER_NUM];
00836   };
00837 };
00838 
00839 #endif // RTC_CONNECTORLISTENER_H


openrtm_aist
Author(s): Noriaki Ando
autogenerated on Thu Aug 27 2015 14:16:37