00001
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
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