OpenRTM-aist  1.2.1
ConnectorListener.h
Go to the documentation of this file.
1 // -*- C++ -*-
18 #ifndef RTC_CONNECTORLISTENER_H
19 #define RTC_CONNECTORLISTENER_H
20 
21 #include <vector>
22 #include <utility>
23 #include <coil/Mutex.h>
24 #include <coil/Guard.h>
25 #include <rtm/RTC.h>
26 #include <rtm/ConnectorBase.h>
27 
28 class cdrMemoryStream;
29 
30 namespace RTC
31 {
32  class ConnectorInfo;
62  {
63  public:
64  enum Enum
65  {
66  NO_CHANGE = 0,
67  INFO_CHANGED = 1 << 0,
68  DATA_CHANGED = 1 << 1,
70  };
71  };
76 
100 #define USE_CONNLISTENER_STATUS \
101  typedef ::RTC::ConnectorListenerStatus::Enum ReturnCode; \
102  using ::RTC::ConnectorListenerStatus::NO_CHANGE; \
103  using ::RTC::ConnectorListenerStatus::INFO_CHANGED; \
104  using ::RTC::ConnectorListenerStatus::DATA_CHANGED; \
105  using ::RTC::ConnectorListenerStatus::BOTH_CHANGED;
106 
139  {
151  };
152 
402  : public ConnectorListenerStatus
403  {
404  public:
429  static const char* toString(ConnectorDataListenerType type)
430  {
431  static const char* typeString[] =
432  {
433  "ON_BUFFER_WRITE",
434  "ON_BUFFER_FULL",
435  "ON_BUFFER_WRITE_TIMEOUT",
436  "ON_BUFFER_OVERWRITE",
437  "ON_BUFFER_READ",
438  "ON_SEND",
439  "ON_RECEIVED",
440  "ON_RECEIVER_FULL",
441  "ON_RECEIVER_TIMEOUT",
442  "ON_RECEIVER_ERROR",
443  "CONNECTOR_DATA_LISTENER_NUM"
444  };
445  if (type < CONNECTOR_DATA_LISTENER_NUM) { return typeString[type]; }
446  return "";
447  }
448 
456  virtual ~ConnectorDataListener();
457 
474  virtual ReturnCode operator()(ConnectorInfo& info,
475  cdrMemoryStream& data) = 0;
476  };
477 
504  template <class DataType>
506  : public ConnectorDataListener
507  {
508  public:
517 
541  virtual ReturnCode operator()(ConnectorInfo& info,
542  cdrMemoryStream& cdrdata)
543  {
544  DataType data;
545  cdrMemoryStream cdr(cdrdata.bufPtr(), cdrdata.bufSize());
546 
547  // endian type check
548  std::string endian_type;
549  endian_type = info.properties.getProperty("serializer.cdr.endian",
550  "little");
551  coil::normalize(endian_type);
552  std::vector<std::string> endian(coil::split(endian_type, ","));
553  if (endian[0] == "little")
554  {
555  cdr.setByteSwapFlag(true);
556  }
557  else if (endian[0] == "big")
558  {
559  cdr.setByteSwapFlag(false);
560  }
561  data <<= cdr;
562  ReturnCode ret = this->operator()(info, data);
563  if (ret == DATA_CHANGED || ret == BOTH_CHANGED)
564  {
565  cdrdata.rewindPtrs();
566  data >>= cdrdata;
567  }
568  return ret;
569  }
570 
588  virtual ReturnCode operator()(ConnectorInfo& info,
589  DataType& data) = 0;
590  };
591 
592 
619  {
628  };
629 
832  : public ConnectorListenerStatus
833  {
834  public:
859  static const char* toString(ConnectorListenerType type)
860  {
861  static const char* typeStr[] =
862  {
863  "ON_BUFFER_EMPTY",
864  "ON_BUFFER_READ_TIMEOUT",
865  "ON_SENDER_EMPTY",
866  "ON_SENDER_TIMEOUT",
867  "ON_SENDER_ERROR",
868  "ON_CONNECT",
869  "ON_DISCONNECT",
870  "CONNECTOR_LISTENER_NUM"
871  };
872  if (type < CONNECTOR_LISTENER_NUM) { return typeStr[type]; }
873  return "";
874  }
875 
883  virtual ~ConnectorListener();
884 
902  virtual ReturnCode operator()(ConnectorInfo& info) = 0;
903  };
904 
905 
922  : public ConnectorListenerStatus
923  {
924  typedef std::pair<ConnectorDataListener*, bool> Entry;
926  public:
943  virtual ~ConnectorDataListenerHolder();
944 
966  void addListener(ConnectorDataListener* listener, bool autoclean);
967 
985  void removeListener(ConnectorDataListener* listener);
986 
1004  size_t size();
1005 
1025  ReturnCode notify(ConnectorInfo& info,
1026  cdrMemoryStream& cdrdata);
1027 
1049  template <class DataType>
1050  ReturnCode notify(ConnectorInfo& info, DataType& typeddata)
1051  {
1052  Guard guard(m_mutex);
1053  ReturnCode ret(NO_CHANGE);
1054  for (size_t i(0), len(m_listeners.size()); i < len; ++i)
1055  {
1056  ConnectorDataListenerT<DataType>* listener(0);
1057  listener =
1058  dynamic_cast<ConnectorDataListenerT<DataType>*>(m_listeners[i].first);
1059  if (listener != 0)
1060  {
1061  ret = ret | listener->operator()(info, typeddata);
1062  }
1063  else
1064  {
1065  cdrMemoryStream cdr;
1066  typeddata >>= cdr;
1067  ret = ret | m_listeners[i].first->operator()(info, cdr);
1068  }
1069  }
1070  return ret;
1071  }
1072 
1073  private:
1074  std::vector<Entry> m_listeners;
1075  coil::Mutex m_mutex;
1076  };
1077 
1078 
1095  : public ConnectorListenerStatus
1096  {
1097  typedef std::pair<ConnectorListener*, bool> Entry;
1099  public:
1109 
1117  virtual ~ConnectorListenerHolder();
1118 
1140  void addListener(ConnectorListener* listener, bool autoclean);
1141 
1159  void removeListener(ConnectorListener* listener);
1160 
1178  size_t size();
1179 
1197  ReturnCode notify(ConnectorInfo& info);
1198 
1199  private:
1200  std::vector<Entry> m_listeners;
1201  coil::Mutex m_mutex;
1202  };
1203 
1218  {
1219  public:
1240  };
1241 };
1242 
1243 #endif // RTC_CONNECTORLISTENER_H
Definition: ConnectorListener.h:622
ConnectorListeners class.
Definition: ConnectorListener.h:1217
std::string normalize(std::string &str)
Erase the head/tail blank and replace upper case to lower case.
Definition: ConnectorListener.h:147
Definition: ConnectorListener.h:627
coil::Properties properties
Connection properties.
Definition: ConnectorBase.h:126
RT-Component.
USE_CONNLISTENER_STATUS
Definition: ConnectorListener.h:405
ConnectorListener class.
Definition: ConnectorListener.h:831
ConnectorDataListener class.
Definition: ConnectorListener.h:401
Definition: ConnectorListener.h:69
virtual ReturnCode operator()(ConnectorInfo &info, cdrMemoryStream &cdrdata)
Callback method.
Definition: ConnectorListener.h:541
Mutex class.
Definition: Mutex.h:40
Definition: ConnectorListener.h:623
Definition: ConnectorListener.h:146
Definition: ConnectorBase.h:43
Definition: ConnectorListener.h:67
ConnectorListenerStatus::Enum operator|(ConnectorListenerStatus::Enum L, ConnectorListenerStatus::Enum R)
Definition: ConnectorListener.h:140
coil::Guard< coil::Mutex > Guard
Definition: LocalServiceAdmin.h:36
const std::string & getProperty(const std::string &key) const
Search for the property with the specified key in this property.
Definition: ConnectorListener.h:68
ConnectorDataListener holder class.
Definition: ConnectorListener.h:921
Enum
Definition: ConnectorListener.h:64
Definition: ConnectorListener.h:625
USE_CONNLISTENER_STATUS
Definition: ConnectorListener.h:835
Definition: ConnectorListener.h:624
ConnectorDataListenerType
The types of ConnectorDataListener.
Definition: ConnectorListener.h:138
Definition: ConnectorListener.h:145
static const char * toString(ConnectorListenerType type)
Convert ConnectorListenerType into the string.
Definition: ConnectorListener.h:859
Connector base class.
USE_CONNLISTENER_STATUS
Definition: ConnectorListener.h:927
ConnectorDataListenerT class.
Definition: ConnectorListener.h:505
Guard template class.
Definition: ConnectorListener.h:142
Definition: ConnectorListener.h:141
ConnectorListenerStatus::Enum operator&(ConnectorListenerStatus::Enum L, ConnectorListenerStatus::Enum R)
Definition: ConnectorListener.h:144
Definition: ConnectorListener.h:143
Definition: ConnectorListener.h:621
ConnectorListenerType
The types of ConnectorListener.
Definition: ConnectorListener.h:618
Definition: ConnectorListener.h:149
static const char * toString(ConnectorDataListenerType type)
Convert ConnectorDataListenerType into the string.
Definition: ConnectorListener.h:429
USE_CONNLISTENER_STATUS
Definition: ConnectorListener.h:1100
virtual ~ConnectorDataListenerT()
Destructor.
Definition: ConnectorListener.h:516
Definition: ConnectorListener.h:61
Definition: ConnectorListener.h:620
ReturnCode notify(ConnectorInfo &info, DataType &typeddata)
Notify listeners. (Typed data version)
Definition: ConnectorListener.h:1050
Definition: ConnectorListener.h:626
RTComponent header.
ConnectorListener holder class.
Definition: ConnectorListener.h:1094
Definition: ConnectorListener.h:66
vstring split(const std::string &input, const std::string &delimiter, bool ignore_empty=false)
Split string by delimiter.
Definition: ConnectorListener.h:148
Definition: ConnectorListener.h:150