OpenRTM
1.0.0
|
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