OpenRTM-aist  1.2.1
CorbaPort.h
Go to the documentation of this file.
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 #include <list>
27 
42 namespace RTC
43 {
620  class CorbaPort
621  : public PortBase
622  {
623  public:
650  CorbaPort(const char* name);
651 
663  virtual ~CorbaPort(void);
664 
692  void init(coil::Properties& prop);
693 
732  bool registerProvider(const char* instance_name, const char* type_name,
733  PortableServer::RefCountServantBase& provider);
734 
776  bool registerConsumer(const char* instance_name, const char* type_name,
777  CorbaConsumerBase& consumer);
778 
779  protected:
861  virtual ReturnCode_t
862  publishInterfaces(ConnectorProfile& connector_profile);
863 
996  virtual ReturnCode_t
997  subscribeInterfaces(const ConnectorProfile& connector_profile);
998 
1020  virtual void
1021  unsubscribeInterfaces(const ConnectorProfile& connector_profile);
1022 
1023  //============================================================
1024  // Local operations
1025  //============================================================
1042  virtual void activateInterfaces();
1043 
1060  virtual void deactivateInterfaces();
1061 
1062  protected:
1071 
1072  private:
1073  class CorbaConsumerHolder;
1104  virtual bool findProvider(const NVList& nv, CorbaConsumerHolder& cons,
1105  std::string& iorstr);
1106 
1141  virtual bool findProviderOld(const NVList&nv, CorbaConsumerHolder& cons,
1142  std::string& iorstr);
1143 
1171  bool setObject(const std::string& ior, CorbaConsumerHolder& cons);
1172 
1199  bool releaseObject(const std::string& ior, CorbaConsumerHolder& cons);
1200 
1201  private:
1217  class CorbaProviderHolder
1218  {
1219  public:
1220  CorbaProviderHolder(const char* type_name,
1221  const char* instance_name,
1222  PortableServer::RefCountServantBase* servant)
1223  : m_typeName(type_name),
1224  m_instanceName(instance_name),
1225  m_servant(servant),
1226  m_ior()
1227  {
1228 #ifndef ORB_IS_RTORB
1229 #ifdef ORB_IS_OMNIORB
1230  m_poa = ::RTC::Manager::instance().getShortCutPOA();
1231  m_poa->activate_object(m_servant);
1232 #else
1233  m_poa = ::RTC::Manager::instance().getPOA();
1234 #endif
1235  m_oid = m_poa->servant_to_id(m_servant);
1236  try
1237  {
1238  m_poa->activate_object_with_id(m_oid, m_servant);
1239  }
1240  catch(...)
1241  {
1242  ;
1243  }
1244  CORBA::Object_var obj;
1245  obj = m_poa->id_to_reference(m_oid);
1246  CORBA::ORB_var orb = Manager::instance().getORB();
1247  CORBA::String_var ior_var = orb->object_to_string(obj);
1248  m_ior = ior_var;
1249  deactivate();
1250 #else // ORB_IS_RTORB
1251  // why RtORB does not activate object by __this()
1252  // and does not deactivate at the end of ctor?
1253  PortableServer::POA_var poa = ::RTC::Manager::instance().getPOA();
1254  m_oid = poa->servant_to_id(m_servant);
1255  CORBA::Object_var obj;
1256  obj = CORBA::Object_var(m_servant->__this());
1257  CORBA::ORB_var orb = Manager::instance().getORB();
1258  CORBA::String_var ior_var = orb->object_to_string(obj);
1259  m_ior = ior_var;
1260 #endif // ORB_IS_RTORB
1261  }
1262  virtual ~CorbaProviderHolder()
1263  {
1264  deactivate();
1265  }
1266  std::string instanceName() { return m_instanceName; }
1267  std::string typeName() { return m_typeName; }
1268  std::string ior() { return m_ior; }
1269  std::string descriptor() { return m_typeName + "." + m_instanceName; }
1270 
1271  void activate()
1272  {
1273  try
1274  {
1275  m_poa->activate_object_with_id(m_oid, m_servant);
1276  }
1277  catch(const ::PortableServer::POA::ServantAlreadyActive &)
1278  {
1279  ; // do nothing
1280  }
1281  catch(...)
1282  {
1283  ; // do nothing
1284  }
1285  }
1286  void deactivate()
1287  {
1288  try
1289  {
1290  m_poa->deactivate_object(m_oid);
1291  }
1292  catch(...)
1293  {
1294  ; // do nothing
1295  }
1296  }
1297  private:
1298  std::string m_typeName;
1299  std::string m_instanceName;
1300  PortableServer::RefCountServantBase* m_servant;
1301  PortableServer::ObjectId_var m_oid;
1302  std::string m_ior;
1303  PortableServer::POA_var m_poa;
1304  };
1305 
1313  typedef std::vector<CorbaProviderHolder> CorbaProviderList;
1314  CorbaProviderList m_providers;
1315 
1323  class CorbaConsumerHolder
1324  {
1325  public:
1326  CorbaConsumerHolder(const char* type_name,
1327  const char* instance_name,
1328  CorbaConsumerBase* consumer)
1329  : m_typeName(type_name),
1330  m_instanceName(instance_name),
1331  m_consumer(consumer),
1332  m_ior("")
1333  {
1334  }
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  typedef std::vector<CorbaConsumerHolder> CorbaConsumerList;
1366  CorbaConsumerList m_consumers;
1367 
1368  // functors
1376  struct unsubscribe
1377  {
1378  unsubscribe(CorbaConsumerList& consumers)
1379  : m_consumers(consumers)
1380  {
1381  }
1382 
1383  void operator()(const SDOPackage::NameValue& nv)
1384  {
1385  for (CorbaConsumerList::iterator it(m_consumers.begin());
1386  it != m_consumers.end(); ++it)
1387  {
1388  std::string name(nv.name);
1389  if (it->descriptor() == (const char*)nv.name)
1390  {
1391  it->releaseObject();
1392  }
1393  }
1394  }
1395  CorbaConsumerList& m_consumers;
1396  };
1397  };
1398 };
1399 #endif // RTC_CORBAPORT_H
RTC&#39;s Port base class.
CORBA Consumer class.
RT-Component.
coil::Properties m_properties
Properties.
Definition: CorbaPort.h:1070
RT Conponent CORBA service/consumer Port.
Definition: CorbaPort.h:620
CorbaPort(const char *name)
Constructor.
Definition: CorbaConsumer.h:94
PortableServer::POA_ptr getPOA()
Get a pointer to RootPOA held by Manager.
RTC::ReturnCode_t activate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id=0)
void init(coil::Properties &prop)
Initializing properties.
virtual void activateInterfaces()
Activate all Port interfaces.
CORBA::ORB_ptr getORB()
Get the pointer to ORB (ownership duplicated)
virtual void unsubscribeInterfaces(const ConnectorProfile &connector_profile)
Unsubscribe interfaces.
Port base class.
Definition: PortBase.h:135
virtual ~CorbaPort(void)
Virtual destructor.
NameValue and NVList utility functions.
RTC::ReturnCode_t deactivate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id=0)
virtual ReturnCode_t subscribeInterfaces(const ConnectorProfile &connector_profile)
Subscribe to interface.
Class represents a set of properties.
Definition: Properties.h:101
virtual ReturnCode_t publishInterfaces(ConnectorProfile &connector_profile)
Publish information about interfaces.
bool registerConsumer(const char *instance_name, const char *type_name, CorbaConsumerBase &consumer)
Register the consumer.
bool registerProvider(const char *instance_name, const char *type_name, PortableServer::RefCountServantBase &provider)
Register the provider.
static Manager & instance()
Get instance of the manager.
virtual void deactivateInterfaces()
Deactivate all Port interfaces.