OpenRTM-aist  2.1.0
CorbaPort.h
[詳解]
1 // -*- C++ -*-
20 #ifndef RTC_CORBAPORT_H
21 #define RTC_CORBAPORT_H
22 
23 #include <rtm/PortBase.h>
24 #include <rtm/CorbaConsumer.h>
25 #include <rtm/NVUtil.h>
26 
27 #include <list>
28 #include <string>
29 #include <vector>
30 
45 namespace RTC
46 {
623  class CorbaPort
624  : public PortBase
625  {
626  public:
653  explicit CorbaPort(const char* name);
654 
666  ~CorbaPort() override;
667 
695  void init(coil::Properties& prop);
696 
735  bool registerProvider(const char* instance_name, const char* type_name,
736  PortableServer::RefCountServantBase& provider);
737 
779  bool registerConsumer(const char* instance_name, const char* type_name,
780  CorbaConsumerBase& consumer);
781 
782  protected:
864  ReturnCode_t
865  publishInterfaces(ConnectorProfile& connector_profile) override;
866 
999  ReturnCode_t
1000  subscribeInterfaces(const ConnectorProfile& connector_profile) override;
1001 
1023  void
1024  unsubscribeInterfaces(const ConnectorProfile& connector_profile) override;
1025 
1026  //============================================================
1027  // Local operations
1028  //============================================================
1045  void activateInterfaces() override;
1046 
1063  void deactivateInterfaces() override;
1064 
1065  protected:
1074 
1075  private:
1076  class CorbaConsumerHolder;
1107  virtual bool findProvider(const NVList& nv, CorbaConsumerHolder& cons,
1108  std::string& iorstr);
1109 
1144  virtual bool findProviderOld(const NVList&nv, CorbaConsumerHolder& cons,
1145  std::string& iorstr);
1146 
1174  bool setObject(const std::string& ior, CorbaConsumerHolder& cons);
1175 
1202  bool releaseObject(const std::string& ior, CorbaConsumerHolder& cons);
1203 
1204  private:
1220  class CorbaProviderHolder
1221  {
1222  public:
1223  CorbaProviderHolder(const char* type_name,
1224  const char* instance_name,
1225  PortableServer::RefCountServantBase* servant)
1226  : m_typeName(type_name),
1227  m_instanceName(instance_name),
1228  m_servant(servant),
1229  m_ior()
1230  {
1231 #ifndef ORB_IS_RTORB
1232 #ifdef ORB_IS_OMNIORB
1233  m_poa = ::RTC::Manager::instance().getShortCutPOA();
1234  m_poa->activate_object(m_servant);
1235 #else
1236  m_poa = ::RTC::Manager::instance().getPOA();
1237 #endif
1238  m_oid = m_poa->servant_to_id(m_servant);
1239  try
1240  {
1241  m_poa->activate_object_with_id(m_oid, m_servant);
1242  }
1243  catch(...)
1244  {
1245  }
1246  CORBA::Object_var obj;
1247  obj = m_poa->id_to_reference(m_oid);
1248  CORBA::ORB_var orb = Manager::instance().getORB();
1249  CORBA::String_var ior_var = orb->object_to_string(obj);
1250  m_ior = ior_var;
1251  deactivate();
1252 #else // ORB_IS_RTORB
1253  // why RtORB does not activate object by __this()
1254  // and does not deactivate at the end of ctor?
1255  PortableServer::POA_var poa = ::RTC::Manager::instance().getPOA();
1256  m_oid = poa->servant_to_id(m_servant);
1257  CORBA::Object_var obj;
1258  obj = CORBA::Object_var(m_servant->__this());
1259  CORBA::ORB_var orb = Manager::instance().getORB();
1260  CORBA::String_var ior_var = orb->object_to_string(obj);
1261  m_ior = ior_var;
1262 #endif // ORB_IS_RTORB
1263  }
1264  virtual ~CorbaProviderHolder()
1265  {
1266  deactivate();
1267  }
1268  std::string instanceName() { return m_instanceName; }
1269  std::string typeName() { return m_typeName; }
1270  std::string ior() { return m_ior; }
1271  std::string descriptor() { return m_typeName + "." + m_instanceName; }
1272 
1273  void activate()
1274  {
1275  try
1276  {
1277  m_poa->activate_object_with_id(m_oid, m_servant);
1278  }
1279  catch(const ::PortableServer::POA::ServantAlreadyActive &)
1280  {
1281  }
1282  catch(...)
1283  {
1284  }
1285  }
1286  void deactivate()
1287  {
1288  try
1289  {
1290  m_poa->deactivate_object(m_oid);
1291  }
1292  catch(...)
1293  {
1294  }
1295  }
1296  private:
1297  std::string m_typeName;
1298  std::string m_instanceName;
1299  PortableServer::RefCountServantBase* m_servant;
1300  PortableServer::ObjectId_var m_oid;
1301  std::string m_ior;
1302  PortableServer::POA_var m_poa;
1303  };
1304 
1312  using CorbaProviderList = std::vector<CorbaProviderHolder>;
1313  CorbaProviderList m_providers;
1314 
1322  class CorbaConsumerHolder
1323  {
1324  public:
1325  CorbaConsumerHolder(const char* type_name,
1326  const char* instance_name,
1327  CorbaConsumerBase* consumer)
1328  : m_typeName(type_name),
1329  m_instanceName(instance_name),
1330  m_consumer(consumer),
1331  m_ior("")
1332  {
1333  }
1334  ~CorbaConsumerHolder();
1335  std::string instanceName() { return m_instanceName; }
1336  std::string typeName() { return m_typeName; }
1337  std::string descriptor() { return m_typeName + "." + m_instanceName; }
1338 
1339  bool setObject(const char* ior)
1340  {
1341  m_ior = ior;
1342  CORBA::ORB_var orb = ::RTC::Manager::instance().getORB();
1343  CORBA::Object_var obj = orb->string_to_object(ior);
1344  if (CORBA::is_nil(obj))
1345  {
1346  return false;
1347  }
1348 
1349  return m_consumer->setObject(obj.in());
1350  }
1351  void releaseObject()
1352  {
1353  m_consumer->releaseObject();
1354  }
1355  const std::string& getIor()
1356  {
1357  return m_ior;
1358  }
1359  private:
1360  std::string m_typeName;
1361  std::string m_instanceName;
1362  CorbaConsumerBase* m_consumer;
1363  std::string m_ior;
1364  };
1365  using CorbaConsumerList = std::vector<CorbaConsumerHolder>;
1366  CorbaConsumerList m_consumers;
1367 
1368  // functors
1376  struct unsubscribe
1377  {
1378  explicit unsubscribe(CorbaConsumerList& consumers)
1379  : m_consumers(consumers)
1380  {
1381  }
1382 
1383  void operator()(const SDOPackage::NameValue& nv)
1384  {
1385  for (auto & consumer : m_consumers)
1386  {
1387  if (consumer.descriptor() == static_cast<const char*>(nv.name))
1388  {
1389  consumer.releaseObject();
1390  }
1391  }
1392  }
1393  CorbaConsumerList& m_consumers;
1394  };
1395  };
1396 } // namespace RTC
1397 #endif // RTC_CORBAPORT_H
CORBA Consumer class
NameValue and NVList utility functions
RTC's Port base class
オブジェクトリファレンスを保持するプレースホルダ基底クラス
Definition: CorbaConsumer.h:84
RT コンポーネント CORBA provider/consumer 用 Port
Definition: CorbaPort.h:625
CorbaPort(const char *name)
コンストラクタ
void activateInterfaces() override
Port の全てのインターフェースを activates する
void deactivateInterfaces() override
全ての Port のインターフェースを deactivates する
void init(coil::Properties &prop)
プロパティの初期化
bool registerConsumer(const char *instance_name, const char *type_name, CorbaConsumerBase &consumer)
Consumer を登録する
ReturnCode_t publishInterfaces(ConnectorProfile &connector_profile) override
Provider Interface 情報を公開する
ReturnCode_t subscribeInterfaces(const ConnectorProfile &connector_profile) override
Provider Interface 情報を取得する
~CorbaPort() override
仮想デストラクタ
void unsubscribeInterfaces(const ConnectorProfile &connector_profile) override
Interface への接続を解除する
bool registerProvider(const char *instance_name, const char *type_name, PortableServer::RefCountServantBase &provider)
Provider を登録する
coil::Properties m_properties
プロパティ
Definition: CorbaPort.h:1073
CORBA::ORB_ptr getORB()
ORB のポインタを取得する (所有権複製)
static Manager & instance()
マネージャのインスタンスの取得
PortableServer::POA_ptr getPOA()
Manager が持つ RootPOA のポインタを取得する (所有権複製)
Port の基底クラス
Definition: PortBase.h:132
RTC::ReturnCode_t activate(const RTC::RTObject_ptr rtc, const RTC::UniqueId ec_id=0)
RTCを指定した実行コンテキストでアクティベーションする
RTC::ReturnCode_t deactivate(const RTC::RTObject_ptr rtc, const RTC::UniqueId ec_id=0)
RTCを指定した実行コンテキストで非アクティベーションする
RTコンポーネント
coil::Properties Properties
Definition: RTC.h:72