OpenRTM
1.0.0
|
00001 // -*- C++ -*- 00019 #ifndef RTC_NAMINGMANAGER_H 00020 #define RTC_NAMINGMANAGER_H 00021 00022 #include <rtm/RTC.h> 00023 00024 #include <coil/Task.h> 00025 #include <coil/Mutex.h> 00026 #include <coil/Guard.h> 00027 #include <rtm/CorbaNaming.h> 00028 #include <rtm/RTObject.h> 00029 #include <rtm/SystemLogger.h> 00030 #include <rtm/ManagerServant.h> 00031 00032 namespace RTC 00033 { 00034 class Manager; 00063 class NamingBase 00064 { 00065 typedef coil::Mutex Mutex; 00066 typedef coil::Guard<Mutex> Guard; 00067 public: 00079 NamingBase() {}; 00080 00092 virtual ~NamingBase(void) {}; 00093 00112 virtual void bindObject(const char* name, const RTObject_impl* rtobj) = 0; 00113 00132 virtual void bindObject(const char* name, 00133 const RTM::ManagerServant* mgr) = 0; 00134 00152 virtual void unbindObject(const char* name) = 0; 00153 00169 virtual bool isAlive() = 0; 00170 }; 00171 00172 00196 class NamingOnCorba 00197 : public virtual NamingBase 00198 { 00199 public: 00226 NamingOnCorba(CORBA::ORB_ptr orb, const char* names); 00227 00239 virtual ~NamingOnCorba(void){}; 00240 00264 virtual void bindObject(const char* name, const RTObject_impl* rtobj); 00282 virtual void bindObject(const char* name, const RTM::ManagerServant* mgr); 00283 00303 virtual void unbindObject(const char* name); 00304 00320 virtual bool isAlive(); 00321 00322 private: 00323 Logger rtclog; 00324 CorbaNaming m_cosnaming; 00325 std::string m_endpoint; 00326 bool m_replaceEndpoint; 00327 std::map<std::string, RTObject_impl*> m_names; 00328 }; 00329 00353 class NamingManager 00354 { 00355 typedef coil::Mutex Mutex; 00356 typedef coil::Guard<Mutex> Guard; 00357 public: 00377 NamingManager(Manager* manager); 00378 00390 virtual ~NamingManager(void); 00391 00415 void registerNameServer(const char* method, const char* name_server); 00416 00439 void bindObject(const char* name, const RTObject_impl* rtobj); 00440 00464 void bindObject(const char* name, const RTM::ManagerServant* mgr); 00465 00482 void update(); 00483 00503 void unbindObject(const char* name); 00504 00520 void unbindAll(); 00521 00541 std::vector<RTObject_impl*> getObjects(); 00542 00543 protected: 00569 NamingBase* createNamingObj(const char* method, const char* name_server); 00570 00590 void bindCompsTo(NamingBase* ns); 00591 00613 void registerCompName(const char* name, const RTObject_impl* rtobj); 00614 00637 void registerMgrName(const char* name, const RTM::ManagerServant* mgr); 00638 00658 void unregisterCompName(const char* name); 00659 00680 void unregisterMgrName(const char* name); 00681 00701 class Names; 00702 void retryConnection(Names* ns); 00703 00704 protected: 00705 // Name Servers' method/name and object 00713 class Names 00714 { 00715 public: 00716 Names(const char* meth, const char* name, NamingBase* naming) 00717 : method(meth), nsname(name), ns(naming) 00718 { 00719 } 00720 00721 ~Names() 00722 { 00723 delete ns; 00724 } 00725 00726 std::string method; 00727 std::string nsname; 00728 NamingBase* ns; 00729 }; 00737 std::vector<Names*> m_names; 00745 Mutex m_namesMutex; 00746 00747 // Components' name and object 00755 struct Comps 00756 { 00757 Comps(const char* n, const RTObject_impl* obj) 00758 : name(n), rtobj(obj) 00759 {} 00760 std::string name; 00761 const RTObject_impl* rtobj; 00762 }; 00770 struct Mgr 00771 { 00772 Mgr(const char* n, const RTM::ManagerServant* obj) 00773 : name(n), mgr(obj) 00774 {} 00775 std::string name; 00776 const RTM::ManagerServant* mgr; 00777 }; 00785 std::vector<Comps*> m_compNames; 00793 Mutex m_compNamesMutex; 00801 std::vector<Mgr*> m_mgrNames; 00809 Mutex m_mgrNamesMutex; 00810 00818 Manager* m_manager; 00819 00827 Logger rtclog; 00828 }; // class NamingManager 00829 }; // namespace RTC 00830 00831 #endif // RTC_NAMINGMANAGER_H