OpenRTM  1.0.0
PortBase.h
説明を見る。
1 // -*- C++ -*-
20 #ifndef RTC_PORTBASE_H
21 #define RTC_PORTBASE_H
22 
23 #include <rtm/RTC.h>
24 
25 #include <string>
26 #include <vector>
27 #include <coil/Guard.h>
28 #include <coil/Mutex.h>
29 #include <rtm/idl/RTCSkel.h>
30 #include <rtm/CORBA_SeqUtil.h>
31 #include <rtm/NVUtil.h>
32 #include <rtm/SystemLogger.h>
34 #include <iostream>
35 
36 #ifdef WIN32
37 #pragma warning( disable : 4290 )
38 #endif
39 
40 namespace RTC
41 {
42  class ConnectionCallback;
43 
134  class PortBase
135  : public virtual POA_RTC::PortService,
136  public virtual PortableServer::RefCountServantBase
137  {
138  public:
164  PortBase(const char* name = "");
165 
183  virtual ~PortBase(void);
184 
236  virtual PortProfile* get_port_profile()
237  throw (CORBA::SystemException);
238 
264  const PortProfile& getPortProfile() const;
265 
318  virtual ConnectorProfileList* get_connector_profiles()
319  throw (CORBA::SystemException);
320 
360  virtual ConnectorProfile* get_connector_profile(const char* connector_id)
361  throw (CORBA::SystemException);
362 
520  virtual ReturnCode_t connect(ConnectorProfile& connector_profile)
521  throw (CORBA::SystemException);
522 
638  virtual ReturnCode_t notify_connect(ConnectorProfile& connector_profile)
639  throw (CORBA::SystemException);
640 
706  virtual ReturnCode_t disconnect(const char* connector_id)
707  throw (CORBA::SystemException);
708 
797  virtual ReturnCode_t notify_disconnect(const char* connector_id)
798  throw (CORBA::SystemException);
799 
819  virtual ReturnCode_t disconnect_all()
820  throw (CORBA::SystemException);
821 
822  //============================================================
823  // Local operations
824  //============================================================
841  virtual void activateInterfaces() = 0;
842 
859  virtual void deactivateInterfaces() = 0;
860 
880  void setName(const char* name);
881 
899  const char* getName() const;
900 
918  const PortProfile& getProfile() const;
919 
941  void setPortRef(PortService_ptr port_ref);
942 
964  PortService_ptr getPortRef();
965 
985  void setOwner(RTObject_ptr owner);
986 
987  //============================================================
988  // callbacks
989  //============================================================
1034  void setOnPublishInterfaces(ConnectionCallback* on_publish);
1035 
1080  void setOnSubscribeInterfaces(ConnectionCallback* on_subscribe);
1081 
1133  void setOnConnected(ConnectionCallback* on_connected);
1134 
1180  void setOnUnsubscribeInterfaces(ConnectionCallback* on_subscribe);
1181 
1225  void setOnDisconnected(ConnectionCallback* on_disconnected);
1226 
1251  void setOnConnectionLost(ConnectionCallback* on_connection_lost);
1252 
1273  void setPortConnectListenerHolder(PortConnectListeners* portconnListeners);
1274 
1275  //============================================================
1276  // protected operations
1277  //============================================================
1278  protected:
1345  virtual ReturnCode_t
1346  publishInterfaces(ConnectorProfile& connector_profile) = 0;
1347 
1374  virtual ReturnCode_t connectNext(ConnectorProfile& connector_profile);
1375 
1402  virtual ReturnCode_t disconnectNext(ConnectorProfile& connector_profile);
1403 
1467  virtual ReturnCode_t
1468  subscribeInterfaces(const ConnectorProfile& connector_profile) = 0;
1469 
1507  virtual void
1508  unsubscribeInterfaces(const ConnectorProfile& connector_profile) = 0;
1509 
1525  virtual void setConnectionLimit(int limit_value);
1526 
1547  virtual ReturnCode_t _publishInterfaces(void);
1548  //============================================================
1549  // protected utility functions
1550  //============================================================
1577  bool isEmptyId(const ConnectorProfile& connector_profile) const;
1578 
1598  const std::string getUUID() const;
1599 
1619  void setUUID(ConnectorProfile& connector_profile) const;
1620 
1646  bool isExistingConnId(const char* id);
1647 
1677  ConnectorProfile findConnProfile(const char* id);
1678 
1707  CORBA::Long findConnProfileIndex(const char* id);
1708 
1736  void updateConnectorProfile(const ConnectorProfile& connector_profile);
1737 
1767  bool eraseConnectorProfile(const char* id);
1768 
1818  bool appendInterface(const char* name, const char* type_name,
1819  PortInterfacePolarity pol);
1820 
1850  bool deleteInterface(const char* name, PortInterfacePolarity pol);
1851 
1875  template <class ValueType>
1876  void addProperty(const char* key, ValueType value)
1877  {
1879  NVUtil::newNV(key, value));
1880  }
1881 
1907  void appendProperty(const char* key, const char* value)
1908  {
1909  NVUtil::appendStringValue(m_profile.properties, key, value);
1910  }
1911 
1912  protected:
1930  void updateConnectors();
1931 
1949 #ifndef ORB_IS_RTORB
1950  bool checkPorts(::RTC::PortServiceList& ports);
1951 #else // ORB_IS_RTORB
1952  bool checkPorts(RTC_PortServiceList& ports);
1953 #endif // ORB_IS_RTORB
1954 
1955 
1956  inline void onNotifyConnect(const char* portname,
1957  RTC::ConnectorProfile& profile)
1958  {
1959  if (m_portconnListeners != NULL)
1960  {
1962  portconnect_[ON_NOTIFY_CONNECT].notify(portname, profile);
1963  }
1964  }
1965 
1966  inline void onNotifyDisconnect(const char* portname,
1967  RTC::ConnectorProfile& profile)
1968  {
1969  if (m_portconnListeners != NULL)
1970  {
1972  portconnect_[ON_NOTIFY_DISCONNECT].notify(portname, profile);
1973  }
1974  }
1975  inline void onUnsubscribeInterfaces(const char* portname,
1976  RTC::ConnectorProfile& profile)
1977  {
1978  if (m_portconnListeners != NULL)
1979  {
1981  portconnect_[ON_UNSUBSCRIBE_INTERFACES].notify(portname, profile);
1982  }
1983  }
1984 
1985  inline void onPublishInterfaces(const char* portname,
1986  RTC::ConnectorProfile& profile,
1987  ReturnCode_t ret)
1988  {
1989  if (m_portconnListeners != NULL)
1990  {
1992  portconnret_[ON_PUBLISH_INTERFACES].notify(portname,
1993  profile, ret);
1994  }
1995  }
1996 
1997  inline void onConnectNextport(const char* portname,
1998  RTC::ConnectorProfile& profile,
1999  ReturnCode_t ret)
2000  {
2001  if (m_portconnListeners != NULL)
2002  {
2004  portconnret_[ON_CONNECT_NEXTPORT].notify(portname,
2005  profile, ret);
2006  }
2007  }
2008 
2009  inline void onSubscribeInterfaces(const char* portname,
2010  RTC::ConnectorProfile& profile,
2011  ReturnCode_t ret)
2012  {
2013  if (m_portconnListeners != NULL)
2014  {
2016  portconnret_[ON_SUBSCRIBE_INTERFACES].notify(portname,
2017  profile, ret);
2018  }
2019  }
2020 
2021  inline void onConnected(const char* portname,
2022  RTC::ConnectorProfile& profile,
2023  ReturnCode_t ret)
2024  {
2025  if (m_portconnListeners != NULL)
2026  {
2028  portconnret_[ON_CONNECTED].notify(portname, profile, ret);
2029  }
2030  }
2031 
2032  inline void onDisconnectNextport(const char* portname,
2033  RTC::ConnectorProfile& profile,
2034  ReturnCode_t ret)
2035  {
2036  if (m_portconnListeners != NULL)
2037  {
2039  portconnret_[ON_DISCONNECT_NEXT].notify(portname, profile, ret);
2040  }
2041  }
2042 
2043  inline void onDisconnected(const char* portname,
2044  RTC::ConnectorProfile& profile,
2045  ReturnCode_t ret)
2046  {
2047  if (m_portconnListeners != NULL)
2048  {
2050  portconnret_[ON_DISCONNECTED].notify(portname, profile, ret);
2051  }
2052  }
2053 
2054  protected:
2062  mutable Logger rtclog;
2070  PortProfile m_profile;
2071 
2079  RTC::PortService_var m_objref;
2090 
2098  std::string m_ownerInstanceName;
2099 
2108 
2181 
2197 
2212 
2213  //============================================================
2214  // Functor
2215  //============================================================
2224  {
2225  find_conn_id(const char* id) : m_id(id) {};
2226  bool operator()(const ConnectorProfile& cprof)
2227  {
2228  return m_id == std::string(cprof.connector_id);
2229  }
2230  std::string m_id;
2231  }; // struct find_conn_id
2232 
2241  {
2242  find_port_ref(PortService_ptr port_ref) : m_port(port_ref) {};
2243  bool operator()(PortService_ptr port_ref)
2244  {
2245  return m_port->_is_equivalent(port_ref);
2246  }
2247  PortService_ptr m_port;
2248  }; // struct find_port_ref
2249 
2258  {
2259  find_interface(const char* name, PortInterfacePolarity pol)
2260  : m_name(name), m_pol(pol)
2261  {}
2262 
2263  bool operator()(const PortInterfaceProfile& prof)
2264  {
2265  CORBA::String_var name(CORBA::string_dup(prof.instance_name));
2266  return ((m_name == (const char *)name) && (m_pol == prof.polarity));
2267  }
2268  std::string m_name;
2269  PortInterfacePolarity m_pol;
2270  }; // struct find_interface
2271  }; // class PortBase
2272 }; // namespace RTC
2273 
2274 #ifdef WIN32
2275 #pragma warning( default : 4290 )
2276 #endif
2277 
2278 #endif // RTC_PORTBASE_H