00001
00019 #ifndef NamingManager_h
00020 #define 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 virtual void bindObject(const char* name, const RTM::ManagerServant* mgr) = 0;
00114
00132 virtual void unbindObject(const char* name) = 0;
00133 };
00134
00158 class NamingOnCorba
00159 : public virtual NamingBase
00160 {
00161 public:
00183 NamingOnCorba(CORBA::ORB_ptr orb, const char* names)
00184 : m_cosnaming(orb, names)
00185 {};
00186
00198 virtual ~NamingOnCorba(void){};
00199
00223 virtual void bindObject(const char* name, const RTObject_impl* rtobj);
00224 virtual void bindObject(const char* name, const RTM::ManagerServant* mgr);
00225
00245 virtual void unbindObject(const char* name);
00246
00247 private:
00248 CorbaNaming m_cosnaming;
00249 std::map<std::string, RTObject_impl*> m_names;
00250 };
00251
00275 class NamingManager
00276 {
00277 typedef coil::Mutex Mutex;
00278 typedef coil::Guard<Mutex> Guard;
00279 public:
00299 NamingManager(Manager* manager);
00300
00312 virtual ~NamingManager(void);
00313
00337 void registerNameServer(const char* method, const char* name_server);
00338
00360 void bindObject(const char* name, const RTObject_impl* rtobj);
00361 void bindObject(const char* name, const RTM::ManagerServant* mgr);
00362
00379 void update();
00380
00400 void unbindObject(const char* name);
00401
00417 void unbindAll();
00418
00438 std::vector<RTObject_impl*> getObjects();
00439
00440 protected:
00466 NamingBase* createNamingObj(const char* method, const char* name_server);
00467
00487 void bindCompsTo(NamingBase* ns);
00488
00510 void registerCompName(const char* name, const RTObject_impl* rtobj);
00511 void registerMgrName(const char* name, const RTM::ManagerServant* mgr);
00512
00532 void unregisterCompName(const char* name);
00533 void unregisterMgrName(const char* name);
00534
00535 protected:
00536
00544 struct Names
00545 {
00546 Names(const char* meth, const char* name, NamingBase* naming)
00547 : method(meth), nsname(name), ns(naming)
00548 {
00549 }
00550 std::string method;
00551 std::string nsname;
00552 NamingBase* ns;
00553 };
00561 std::vector<Names*> m_names;
00562 Mutex m_namesMutex;
00563
00564
00572 struct Comps
00573 {
00574 Comps(const char* n, const RTObject_impl* obj)
00575 : name(n), rtobj(obj)
00576 {}
00577 std::string name;
00578 const RTObject_impl* rtobj;
00579 };
00580 struct Mgr
00581 {
00582 Mgr(const char* n, const RTM::ManagerServant* obj)
00583 : name(n), mgr(obj)
00584 {}
00585 std::string name;
00586 const RTM::ManagerServant* mgr;
00587 };
00595 std::vector<Comps*> m_compNames;
00596 Mutex m_compNamesMutex;
00597 std::vector<Mgr*> m_mgrNames;
00598 Mutex m_mgrNamesMutex;
00599
00607 Manager* m_manager;
00608
00616 Logger rtclog;
00617 };
00618 };
00619
00620 #endif // NamingManager_h