00001
00020 #ifndef RTC_PORTADMIN_H
00021 #define RTC_PORTADMIN_H
00022
00023 #include <rtm/idl/RTCSkel.h>
00024 #include <rtm/PortBase.h>
00025 #include <rtm/ObjectManager.h>
00026 #include <rtm/SystemLogger.h>
00027
00028 namespace RTC
00029 {
00052 class PortAdmin
00053 {
00054 public:
00074 PortAdmin(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa);
00075
00089 virtual ~PortAdmin(void){};
00090
00111 PortServiceList* getPortServiceList() const;
00112
00133 PortProfileList getPortProfileList() const;
00134
00161 PortService_ptr getPortRef(const char* port_name) const;
00162
00189 PortBase* getPort(const char* port_name) const;
00190
00217 bool addPort(PortBase& port);
00218
00245 bool addPort(PortService_ptr port);
00246
00271 void registerPort(PortBase& port);
00272
00297 void registerPort(PortService_ptr port);
00298
00324 bool removePort(PortBase& port);
00325
00351 bool removePort(PortService_ptr port);
00352
00376 void deletePort(PortBase& port);
00377
00401 void deletePort(PortService_ptr port);
00402
00427 void deletePortByName(const char* port_name);
00428
00447 void activatePorts();
00448
00467 void deactivatePorts();
00468
00486 void finalizePorts();
00487
00488 private:
00496 CORBA::ORB_var m_pORB;
00497
00505 PortableServer::POA_var m_pPOA;
00506
00514 PortServiceList m_portRefs;
00515
00523 mutable Logger rtclog;
00524
00532 template <class T>
00533 class comp_op
00534 {
00535 public:
00536 comp_op(const char* _name)
00537 : m_name(_name)
00538 {
00539 }
00540 comp_op(T* obj)
00541 : m_name((const char*)(obj->getProfile().name))
00542 {
00543 }
00544 bool operator()(T* obj)
00545 {
00546 std::string name((const char*)obj->getProfile().name);
00547 return m_name == name;
00548 }
00549 private:
00550 std::string m_name;
00551 };
00552
00560 class port_prof_collect
00561 {
00562 public:
00563 port_prof_collect(PortProfileList& p) : m_p(p) {}
00564 void operator()(const PortBase* port)
00565 {
00566 CORBA_SeqUtil::push_back(m_p, port->getPortProfile());
00567 }
00568 private:
00569 PortProfileList& m_p;
00570 };
00571
00579 class port_prof_collect2
00580 {
00581 public:
00582 port_prof_collect2(PortProfileList& p) : m_p(p) {}
00583 void operator()(const PortService_ptr port)
00584 {
00585 PortProfile* pp(port->get_port_profile());
00586 CORBA_SeqUtil::push_back(m_p, *(pp));
00587 delete pp;
00588 }
00589 private:
00590 PortProfileList& m_p;
00591 };
00592
00593 struct find_port_name;
00594 struct find_port;
00595 struct del_port;
00596
00597
00598 ObjectManager<const char*, PortBase, comp_op<PortBase> > m_portServants;
00599
00600 };
00601 };
00602 #endif // RTC_PORTADMIN_H