diff options
Diffstat (limited to 'modules/CIAO/DAnCE/RedirectionService/CCMObjectLocator.h')
-rw-r--r-- | modules/CIAO/DAnCE/RedirectionService/CCMObjectLocator.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/modules/CIAO/DAnCE/RedirectionService/CCMObjectLocator.h b/modules/CIAO/DAnCE/RedirectionService/CCMObjectLocator.h new file mode 100644 index 00000000000..cf92d6aa292 --- /dev/null +++ b/modules/CIAO/DAnCE/RedirectionService/CCMObjectLocator.h @@ -0,0 +1,105 @@ +// $Id$ + +#ifndef CCMOBJECTLOCATOR_H_ +#define CCMOBJECTLOCATOR_H_ + +#include "ace/Map_Manager.h" +#include "ace/Null_Mutex.h" +#include "ace/SStringfwd.h" +#include "ace/String_Base.h" +#include "tao/corba.h" +#include "tao/ORB.h" +#include "tao/Object.h" +#include "tao/PortableServer/PortableServer.h" +#include "tao/PortableServer/ServantLocatorC.h" + +#include "RedirectionService_Export.h" + +namespace DAnCE +{ + + class RedirectionService_Export CCMObjectLocator + : public PortableServer::ServantLocator + , public ::CORBA::LocalObject + { + public: + class TreeNode; + typedef ACE_Map_Manager<ACE_CString, TreeNode*, ACE_Null_Mutex> TNodes; + class RedirectionService_Export TreeNode + { + public: + static const char delimiter_ = '/'; + TreeNode() {}; + TreeNode (const TreeNode & src); + ~TreeNode(); + CORBA::Object_ptr getValue() const + { + return CORBA::Object::_duplicate (this->obj_.in()); + }; + CORBA::Object_ptr getValue (const char * path) const; + void setValue (CORBA::Object_ptr obj) + { + this->obj_ = CORBA::Object::_duplicate (obj); + }; + void addChild (const char * path, CORBA::Object_ptr obj = CORBA::Object::_nil()); + void addChild (const char * path, TreeNode & node); + void removeChild (const char * path); + int missingNodeLevel (const char * path); + static ACE_CString mergePath (const char * parent, const char * child); + private: + CORBA::Object_var obj_; + TNodes children_; + TreeNode * getChild (const char * path) const; + static ACE_CString splitPath (ACE_CString & path, bool first = true); + }; + + CCMObjectLocator (CORBA::ORB_ptr orb, PortableServer::POA_ptr parent_poa, const char * poa_name); + + virtual ~CCMObjectLocator(); + + virtual ::PortableServer::Servant preinvoke ( + const ::PortableServer::ObjectId & oid, + ::PortableServer::POA_ptr adapter, + const char * operation, + ::PortableServer::ServantLocator::Cookie & the_cookie); + + virtual void postinvoke ( + const ::PortableServer::ObjectId & /*oid*/, + ::PortableServer::POA_ptr /*adapter*/, + const char * /*operation*/, + ::PortableServer::ServantLocator::Cookie /*the_cookie*/, + ::PortableServer::Servant /*the_servant*/ + ); + + void start_register (const ACE_CString& plan); + + CORBA::Object_ptr register_object (const ACE_CString & plan + , const ACE_CString & inst + , const ACE_CString & port + , CORBA::Object_ptr obj); + + CORBA::Object_ptr register_object (const ACE_CString & plan + , const ACE_CString & inst + , CORBA::Object_ptr obj); + + void unregister_object (const ACE_CString & plan + , const ACE_CString & inst + , const ACE_CString & port); + + void finish_register (const ACE_CString& plan); + + void register_objects (const char * name, TreeNode & node); + + private: + TreeNode db_; + CORBA::ORB_var orb_; + PortableServer::POA_var myPOA_; + + TNodes transactions_; + CCMObjectLocator() {}; + // to ban the usage + }; // CCMObjectLocator + +} //DAnCE + +#endif /*CCMOBJECTLOCATOR_H_*/ |