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
00164 virtual void operator()(const ConnectorInfo& info,
00165 const cdrMemoryStream& data) = 0;
00166 };
00167
00194 template <class DataType>
00195 class ConnectorDataListenerT
00196 : public ConnectorDataListener
00197 {
00198 public:
00206 virtual ~ConnectorDataListenerT(){}
00207
00231 virtual void operator()(const ConnectorInfo& info,
00232 const cdrMemoryStream& cdrdata)
00233 {
00234 DataType data;
00235 cdrMemoryStream cdr(cdrdata.bufPtr(), cdrdata.bufSize());
00236
00237
00238 std::string endian_type;
00239 endian_type = info.properties.getProperty("serializer.cdr.endian",
00240 "little");
00241 coil::normalize(endian_type);
00242 std::vector<std::string> endian(coil::split(endian_type, ","));
00243 if (endian[0] == "little")
00244 {
00245 cdr.setByteSwapFlag(true);
00246 }
00247 else if (endian[0] == "big")
00248 {
00249 cdr.setByteSwapFlag(false);
00250 }
00251 data <<= cdr;
00252 this->operator()(info, data);
00253 }
00254
00266 virtual void operator()(const ConnectorInfo& info,
00267 const DataType& data) = 0;
00268
00269 };
00270
00271
00297 enum ConnectorListenerType
00298 {
00299 ON_BUFFER_EMPTY = 0,
00300 ON_BUFFER_READ_TIMEOUT,
00301 ON_SENDER_EMPTY,
00302 ON_SENDER_TIMEOUT,
00303 ON_SENDER_ERROR,
00304 ON_CONNECT,
00305 ON_DISCONNECT,
00306 CONNECTOR_LISTENER_NUM
00307 };
00308
00327 class ConnectorListener
00328 {
00329 public:
00353 static const char* toString(ConnectorListenerType type)
00354 {
00355 static const char* typeStr[] =
00356 {
00357 "ON_BUFFER_EMPTY",
00358 "ON_BUFFER_READ_TIMEOUT",
00359 "ON_SENDER_EMPTY",
00360 "ON_SENDER_TIMEOUT",
00361 "ON_SENDER_ERROR",
00362 "ON_CONNECT",
00363 "ON_DISCONNECT",
00364 "CONNECTOR_LISTENER_NUM"
00365 };
00366 if (type < CONNECTOR_LISTENER_NUM) { return typeStr[type]; }
00367 return "";
00368 }
00369
00377 virtual ~ConnectorListener();
00378
00390 virtual void operator()(const ConnectorInfo& info) = 0;
00391 };
00392
00393
00409 class ConnectorDataListenerHolder
00410 {
00411 typedef std::pair<ConnectorDataListener*, bool> Entry;
00412 public:
00420 ConnectorDataListenerHolder();
00428 virtual ~ConnectorDataListenerHolder();
00429
00441 void addListener(ConnectorDataListener* listener, bool autoclean);
00442
00454 void removeListener(ConnectorDataListener* listener);
00455
00467 void notify(const ConnectorInfo& info,
00468 const cdrMemoryStream& cdrdata);
00469
00470 private:
00471 std::vector<Entry> m_listeners;
00472 };
00473
00474
00490 class ConnectorListenerHolder
00491 {
00492 typedef std::pair<ConnectorListener*, bool> Entry;
00493 public:
00501 ConnectorListenerHolder();
00502
00510 virtual ~ConnectorListenerHolder();
00511
00523 void addListener(ConnectorListener* listener, bool autoclean);
00524
00536 void removeListener(ConnectorListener* listener);
00537
00549 void notify(const ConnectorInfo& info);
00550
00551 private:
00552 std::vector<Entry> m_listeners;
00553 };
00554
00568 class ConnectorListeners
00569 {
00570 public:
00580 ConnectorDataListenerHolder connectorData_[CONNECTOR_DATA_LISTENER_NUM];
00590 ConnectorListenerHolder connector_[CONNECTOR_LISTENER_NUM];
00591 }
00592 ;
00593 };
00594
00595 #endif // RTC_CONNECTORLISTENER_H