00001
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, const RTM::ManagerServant* mgr) = 0;
00133
00151 virtual void unbindObject(const char* name) = 0;
00152
00168 virtual bool isAlive() = 0;
00169 };
00170
00194 class NamingOnCorba
00195 : public virtual NamingBase
00196 {
00197 public:
00219 NamingOnCorba(CORBA::ORB_ptr orb, const char* names);
00220
00232 virtual ~NamingOnCorba(void){};
00233
00257 virtual void bindObject(const char* name, const RTObject_impl* rtobj);
00275 virtual void bindObject(const char* name, const RTM::ManagerServant* mgr);
00276
00296 virtual void unbindObject(const char* name);
00297
00313 virtual bool isAlive();
00314
00315 private:
00316 Logger rtclog;
00317 CorbaNaming m_cosnaming;
00318 std::string m_endpoint;
00319 bool m_replaceEndpoint;
00320 std::map<std::string, RTObject_impl*> m_names;
00321 };
00322
00346 class NamingManager
00347 {
00348 typedef coil::Mutex Mutex;
00349 typedef coil::Guard<Mutex> Guard;
00350 public:
00370 NamingManager(Manager* manager);
00371
00383 virtual ~NamingManager(void);
00384
00408 void registerNameServer(const char* method, const char* name_server);
00409
00431 void bindObject(const char* name, const RTObject_impl* rtobj);
00455 void bindObject(const char* name, const RTM::ManagerServant* mgr);
00456
00473 void update();
00474
00494 void unbindObject(const char* name);
00495
00511 void unbindAll();
00512
00532 std::vector<RTObject_impl*> getObjects();
00533
00534 protected:
00560 NamingBase* createNamingObj(const char* method, const char* name_server);
00561
00581 void bindCompsTo(NamingBase* ns);
00582
00604 void registerCompName(const char* name, const RTObject_impl* rtobj);
00627 void registerMgrName(const char* name, const RTM::ManagerServant* mgr);
00628
00648 void unregisterCompName(const char* name);
00669 void unregisterMgrName(const char* name);
00670
00690 class Names;
00691 void retryConnection(Names* ns);
00692
00693 protected:
00694
00702 class Names
00703 {
00704 public:
00705 Names(const char* meth, const char* name, NamingBase* naming)
00706 : method(meth), nsname(name), ns(naming)
00707 {
00708 }
00709
00710 ~Names()
00711 {
00712 delete ns;
00713 }
00714
00715 std::string method;
00716 std::string nsname;
00717 NamingBase* ns;
00718 };
00726 std::vector<Names*> m_names;
00734 Mutex m_namesMutex;
00735
00736
00744 struct Comps
00745 {
00746 Comps(const char* n, const RTObject_impl* obj)
00747 : name(n), rtobj(obj)
00748 {}
00749 std::string name;
00750 const RTObject_impl* rtobj;
00751 };
00759 struct Mgr
00760 {
00761 Mgr(const char* n, const RTM::ManagerServant* obj)
00762 : name(n), mgr(obj)
00763 {}
00764 std::string name;
00765 const RTM::ManagerServant* mgr;
00766 };
00774 std::vector<Comps*> m_compNames;
00782 Mutex m_compNamesMutex;
00790 std::vector<Mgr*> m_mgrNames;
00798 Mutex m_mgrNamesMutex;
00799
00807 Manager* m_manager;
00808
00816 Logger rtclog;
00817 };
00818 };
00819
00820 #endif // RTC_NAMINGMANAGER_H