OpenRTM-aist 2.0.2
Loading...
Searching...
No Matches
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
27#include <list>
28#include <string>
29#include <vector>
30
45namespace RTC
46{
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:
1073 coil::Properties m_properties;
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
virtual bool setObject(CORBA::Object_ptr obj)
Set CORBA Object.
Definition CorbaConsumer.h:214
virtual void releaseObject()
Clear CORBA object setting.
Definition CorbaConsumer.h:269
RT Conponent CORBA service/consumer Port.
Definition CorbaPort.h:625
CorbaPort(const char *name)
Constructor.
void activateInterfaces() override
Activate all Port interfaces.
void deactivateInterfaces() override
Deactivate all Port interfaces.
void init(coil::Properties &prop)
Initializing properties.
bool registerConsumer(const char *instance_name, const char *type_name, CorbaConsumerBase &consumer)
Register the consumer.
ReturnCode_t publishInterfaces(ConnectorProfile &connector_profile) override
Publish information about interfaces.
ReturnCode_t subscribeInterfaces(const ConnectorProfile &connector_profile) override
Subscribe to interface.
~CorbaPort() override
Virtual destructor.
void unsubscribeInterfaces(const ConnectorProfile &connector_profile) override
Unsubscribe interfaces.
bool registerProvider(const char *instance_name, const char *type_name, PortableServer::RefCountServantBase &provider)
Register the provider.
coil::Properties m_properties
Properties .
Definition CorbaPort.h:1073
CORBA::ORB_ptr getORB()
Get the pointer to ORB (ownership duplicated)
static Manager & instance()
Get instance of the manager.
PortableServer::POA_ptr getPOA()
Get a pointer to RootPOA held by Manager.
Port base class.
Definition PortBase.h:132
RT-Component.