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
00098 class ConnectorDataListener
00099 {
00100 public:
00124 static const char* toString(ConnectorDataListenerType type)
00125 {
00126 static const char* typeString[] =
00127 {
00128 "ON_BUFFER_WRITE",
00129 "ON_BUFFER_FULL",
00130 "ON_BUFFER_WRITE_TIMEOUT",
00131 "ON_BUFFER_OVERWRITE",
00132 "ON_BUFFER_READ",
00133 "ON_SEND",
00134 "ON_RECEIVED",
00135 "ON_RECEIVER_FULL",
00136 "ON_RECEIVER_TIMEOUT",
00137 "ON_RECEIVER_ERROR",
00138 "CONNECTOR_DATA_LISTENER_NUM"
00139 };
00140 if (type < CONNECTOR_DATA_LISTENER_NUM) { return typeString[type]; }
00141 return "";
00142 }
00143
00151 virtual ~ConnectorDataListener();
00152
00169 virtual void operator()(const ConnectorInfo& info,
00170 const cdrMemoryStream& data) = 0;
00171 };
00172
00199 template <class DataType>
00200 class ConnectorDataListenerT
00201 : public ConnectorDataListener
00202 {
00203 public:
00211 virtual ~ConnectorDataListenerT(){}
00212
00236 virtual void operator()(const ConnectorInfo& info,
00237 const cdrMemoryStream& cdrdata)
00238 {
00239 DataType data;
00240 cdrMemoryStream cdr(cdrdata.bufPtr(), cdrdata.bufSize());
00241
00242
00243 std::string endian_type;
00244 endian_type = info.properties.getProperty("serializer.cdr.endian",
00245 "little");
00246 coil::normalize(endian_type);
00247 std::vector<std::string> endian(coil::split(endian_type, ","));
00248 if (endian[0] == "little")
00249 {
00250 cdr.setByteSwapFlag(true);
00251 }
00252 else if (endian[0] == "big")
00253 {
00254 cdr.setByteSwapFlag(false);
00255 }
00256 data <<= cdr;
00257 this->operator()(info, data);
00258 }
00259
00277 virtual void operator()(const ConnectorInfo& info,
00278 const DataType& data) = 0;
00279
00280 };
00281
00282
00308 enum ConnectorListenerType
00309 {
00310 ON_BUFFER_EMPTY = 0,
00311 ON_BUFFER_READ_TIMEOUT,
00312 ON_SENDER_EMPTY,
00313 ON_SENDER_TIMEOUT,
00314 ON_SENDER_ERROR,
00315 ON_CONNECT,
00316 ON_DISCONNECT,
00317 CONNECTOR_LISTENER_NUM
00318 };
00319
00338 class ConnectorListener
00339 {
00340 public:
00364 static const char* toString(ConnectorListenerType type)
00365 {
00366 static const char* typeStr[] =
00367 {
00368 "ON_BUFFER_EMPTY",
00369 "ON_BUFFER_READ_TIMEOUT",
00370 "ON_SENDER_EMPTY",
00371 "ON_SENDER_TIMEOUT",
00372 "ON_SENDER_ERROR",
00373 "ON_CONNECT",
00374 "ON_DISCONNECT",
00375 "CONNECTOR_LISTENER_NUM"
00376 };
00377 if (type < CONNECTOR_LISTENER_NUM) { return typeStr[type]; }
00378 return "";
00379 }
00380
00388 virtual ~ConnectorListener();
00389
00407 virtual void operator()(const ConnectorInfo& info) = 0;
00408 };
00409
00410
00426 class ConnectorDataListenerHolder
00427 {
00428 typedef std::pair<ConnectorDataListener*, bool> Entry;
00429 public:
00437 ConnectorDataListenerHolder();
00445 virtual ~ConnectorDataListenerHolder();
00446
00468 void addListener(ConnectorDataListener* listener, bool autoclean);
00469
00487 void removeListener(ConnectorDataListener* listener);
00488
00508 void notify(const ConnectorInfo& info,
00509 const cdrMemoryStream& cdrdata);
00510
00511 private:
00512 std::vector<Entry> m_listeners;
00513 };
00514
00515
00531 class ConnectorListenerHolder
00532 {
00533 typedef std::pair<ConnectorListener*, bool> Entry;
00534 public:
00542 ConnectorListenerHolder();
00543
00551 virtual ~ConnectorListenerHolder();
00552
00574 void addListener(ConnectorListener* listener, bool autoclean);
00575
00593 void removeListener(ConnectorListener* listener);
00594
00612 void notify(const ConnectorInfo& info);
00613
00614 private:
00615 std::vector<Entry> m_listeners;
00616 };
00617
00631 class ConnectorListeners
00632 {
00633 public:
00643 ConnectorDataListenerHolder connectorData_[CONNECTOR_DATA_LISTENER_NUM];
00653 ConnectorListenerHolder connector_[CONNECTOR_LISTENER_NUM];
00654 }
00655 ;
00656 };
00657
00658 #endif // RTC_CONNECTORLISTENER_H