00001
00020 #ifndef RTC_CONNECTORLISTENER_H
00021 #define RTC_CONNECTORLISTENER_H
00022
00023 #include <vector>
00024 #include <utility>
00025 #include <rtm/RTC.h>
00026 #include <rtm/ConnectorBase.h>
00027
00028 class cdrMemoryStream;
00029
00030 namespace RTC
00031 {
00032 class ConnectorInfo;
00033
00065 enum ConnectorDataListenerType
00066 {
00067 ON_BUFFER_WRITE = 0,
00068 ON_BUFFER_FULL,
00069 ON_BUFFER_WRITE_TIMEOUT,
00070 ON_BUFFER_OVERWRITE,
00071 ON_BUFFER_READ,
00072 ON_SEND,
00073 ON_RECEIVED,
00074 ON_RECEIVER_FULL,
00075 ON_RECEIVER_TIMEOUT,
00076 ON_RECEIVER_ERROR,
00077 CONNECTOR_DATA_LISTENER_NUM
00078 };
00079
00186 class ConnectorDataListener
00187 {
00188 public:
00212 static const char* toString(ConnectorDataListenerType type)
00213 {
00214 static const char* typeString[] =
00215 {
00216 "ON_BUFFER_WRITE",
00217 "ON_BUFFER_FULL",
00218 "ON_BUFFER_WRITE_TIMEOUT",
00219 "ON_BUFFER_OVERWRITE",
00220 "ON_BUFFER_READ",
00221 "ON_SEND",
00222 "ON_RECEIVED",
00223 "ON_RECEIVER_FULL",
00224 "ON_RECEIVER_TIMEOUT",
00225 "ON_RECEIVER_ERROR",
00226 "CONNECTOR_DATA_LISTENER_NUM"
00227 };
00228 if (type < CONNECTOR_DATA_LISTENER_NUM) { return typeString[type]; }
00229 return "";
00230 }
00231
00239 virtual ~ConnectorDataListener();
00240
00257 virtual void operator()(const ConnectorInfo& info,
00258 const cdrMemoryStream& data) = 0;
00259 };
00260
00287 template <class DataType>
00288 class ConnectorDataListenerT
00289 : public ConnectorDataListener
00290 {
00291 public:
00299 virtual ~ConnectorDataListenerT(){}
00300
00324 virtual void operator()(const ConnectorInfo& info,
00325 const cdrMemoryStream& cdrdata)
00326 {
00327 DataType data;
00328 cdrMemoryStream cdr(cdrdata.bufPtr(), cdrdata.bufSize());
00329
00330
00331 std::string endian_type;
00332 endian_type = info.properties.getProperty("serializer.cdr.endian",
00333 "little");
00334 coil::normalize(endian_type);
00335 std::vector<std::string> endian(coil::split(endian_type, ","));
00336 if (endian[0] == "little")
00337 {
00338 cdr.setByteSwapFlag(true);
00339 }
00340 else if (endian[0] == "big")
00341 {
00342 cdr.setByteSwapFlag(false);
00343 }
00344 data <<= cdr;
00345 this->operator()(info, data);
00346 }
00347
00365 virtual void operator()(const ConnectorInfo& info,
00366 const DataType& data) = 0;
00367
00368 };
00369
00370
00396 enum ConnectorListenerType
00397 {
00398 ON_BUFFER_EMPTY = 0,
00399 ON_BUFFER_READ_TIMEOUT,
00400 ON_SENDER_EMPTY,
00401 ON_SENDER_TIMEOUT,
00402 ON_SENDER_ERROR,
00403 ON_CONNECT,
00404 ON_DISCONNECT,
00405 CONNECTOR_LISTENER_NUM
00406 };
00407
00514 class ConnectorListener
00515 {
00516 public:
00540 static const char* toString(ConnectorListenerType type)
00541 {
00542 static const char* typeStr[] =
00543 {
00544 "ON_BUFFER_EMPTY",
00545 "ON_BUFFER_READ_TIMEOUT",
00546 "ON_SENDER_EMPTY",
00547 "ON_SENDER_TIMEOUT",
00548 "ON_SENDER_ERROR",
00549 "ON_CONNECT",
00550 "ON_DISCONNECT",
00551 "CONNECTOR_LISTENER_NUM"
00552 };
00553 if (type < CONNECTOR_LISTENER_NUM) { return typeStr[type]; }
00554 return "";
00555 }
00556
00564 virtual ~ConnectorListener();
00565
00583 virtual void operator()(const ConnectorInfo& info) = 0;
00584 };
00585
00586
00602 class ConnectorDataListenerHolder
00603 {
00604 typedef std::pair<ConnectorDataListener*, bool> Entry;
00605 public:
00613 ConnectorDataListenerHolder();
00621 virtual ~ConnectorDataListenerHolder();
00622
00644 void addListener(ConnectorDataListener* listener, bool autoclean);
00645
00663 void removeListener(ConnectorDataListener* listener);
00664
00684 void notify(const ConnectorInfo& info,
00685 const cdrMemoryStream& cdrdata);
00686
00687 private:
00688 std::vector<Entry> m_listeners;
00689 };
00690
00691
00707 class ConnectorListenerHolder
00708 {
00709 typedef std::pair<ConnectorListener*, bool> Entry;
00710 public:
00718 ConnectorListenerHolder();
00719
00727 virtual ~ConnectorListenerHolder();
00728
00750 void addListener(ConnectorListener* listener, bool autoclean);
00751
00769 void removeListener(ConnectorListener* listener);
00770
00788 void notify(const ConnectorInfo& info);
00789
00790 private:
00791 std::vector<Entry> m_listeners;
00792 };
00793
00807 class ConnectorListeners
00808 {
00809 public:
00819 ConnectorDataListenerHolder connectorData_[CONNECTOR_DATA_LISTENER_NUM];
00829 ConnectorListenerHolder connector_[CONNECTOR_LISTENER_NUM];
00830 };
00831 };
00832
00833 #endif // RTC_CONNECTORLISTENER_H