diff options
Diffstat (limited to 'TAO/CIAO/ciao/Container_Base.cpp')
-rw-r--r-- | TAO/CIAO/ciao/Container_Base.cpp | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/TAO/CIAO/ciao/Container_Base.cpp b/TAO/CIAO/ciao/Container_Base.cpp new file mode 100644 index 00000000000..110bbfd0217 --- /dev/null +++ b/TAO/CIAO/ciao/Container_Base.cpp @@ -0,0 +1,246 @@ +// $Id$ + +#include "Container_Base.h" +#include "ace/DLL.h" + +#if !defined (__ACE_INLINE__) +# include "Container_Base.inl" +#endif /* __ACE_INLINE__ */ + +//////////////////////////////////////////////////////////////// + +CIAO::Container::Container (CORBA::ORB_ptr o) + : orb_ (CORBA::ORB::_duplicate (o)) +{ +} + +CIAO::Container::~Container () +{ +} + +PortableServer::POA_ptr +CIAO::Container::the_POA (void) +{ + return this->poa_.in (); +} + +/////////////////////////////////////////////////////////////// + +ACE_Atomic_Op <ACE_Thread_Mutex, long> +CIAO::Session_Container::serial_number_ (0); + +CIAO::Session_Container::Session_Container (CORBA::ORB_ptr o) + : Container (o), + number_ (0) +{ +} + +CIAO::Session_Container::~Session_Container () +{ +} + +int +CIAO::Session_Container::init (const char *name + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + char buffer[MAXPATHLEN]; + + if (name == 0) + { + this->number_ = ++CIAO::Session_Container::serial_number_; + ACE_OS::sprintf (buffer, "CIAO::Session_Container-%d", + this->number_); + name = buffer; + } + + CORBA::Object_var poa_object = + this->orb_->resolve_initial_references("RootPOA" ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + if (CORBA::is_nil (poa_object.in ())) + ACE_ERROR_RETURN ((LM_ERROR, + " (%P|%t) Unable to initialize the POA.\n"), + -1); + + PortableServer::POA_var root_poa = + PortableServer::POA::_narrow (poa_object.in () ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + // Set up proper poa policies here. Default policies seems to be + // fine for session container. + CORBA::PolicyList policies (0); + + this->poa_ = root_poa->create_POA (name, + PortableServer::POAManager::_nil (), + policies + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + PortableServer::POAManager_var poa_manager = + this->poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + return 0; +} + +CORBA::Object_ptr +CIAO::Session_Container::install_servant (PortableServer::Servant p + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + PortableServer::ObjectId_var oid + = this->poa_->activate_object (p + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + CORBA::Object_var objref + = this->poa_->id_to_reference (oid + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return objref._retn (); +} + +CORBA::Object_ptr +CIAO::Session_Container::install_component (PortableServer::Servant p, + PortableServer::ObjectId_out oid + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + PortableServer::ObjectId_var id + = this->poa_->activate_object (p + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + CORBA::Object_var objref + = this->poa_->id_to_reference (id + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + oid = id._retn (); + + return objref._retn (); +} + +Components::CCMHome_ptr +CIAO::Session_Container::ciao_install_home (const char *exe_dll_name, + const char *exe_entrypt, + const char *sv_dll_name, + const char *sv_entrypt + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + Components::Deployment::UnknownImplId, + Components::Deployment::ImplEntryPointNotFound, + Components::Deployment::InstallationFailure)) +{ + ACE_DLL executor_dll, servant_dll; + + if (exe_dll_name == 0 || sv_dll_name == 0) + ACE_THROW_RETURN (Components::Deployment::UnknownImplId (), 0); + + if (executor_dll.open (exe_dll_name, + ACE_DEFAULT_SHLIB_MODE, + 0) != 0) + ACE_THROW_RETURN (Components::Deployment::UnknownImplId (), 0); + + if (servant_dll.open (sv_dll_name, + ACE_DEFAULT_SHLIB_MODE, + 0) != 0) + { + executor_dll.close (); + ACE_THROW_RETURN (Components::Deployment::UnknownImplId (), 0); + } + + if (exe_entrypt == 0 || sv_entrypt == 0) + ACE_THROW_RETURN (Components::Deployment::ImplEntryPointNotFound (), 0); + + HomeFactory hcreator = (HomeFactory) executor_dll.symbol (exe_entrypt); + ServantFactory screator = (ServantFactory) servant_dll.symbol (sv_entrypt); + + if (hcreator == 0 || screator == 0) + ACE_THROW_RETURN (Components::Deployment::ImplEntryPointNotFound (), 0); + + Components::HomeExecutorBase_var home_executor = hcreator (); + if (CORBA::is_nil (home_executor.in ())) + ACE_THROW_RETURN (Components::Deployment::InstallationFailure (), 0); + + PortableServer::Servant home_servant = screator (home_executor.in (), + this + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + if (home_servant == 0) + ACE_THROW_RETURN (Components::Deployment::InstallationFailure (), 0); + + PortableServer::ServantBase_var safe (home_servant); + + CORBA::Object_var objref = this->install_servant (home_servant + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + Components::CCMHome_var homeref = Components::CCMHome::_narrow (objref.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return homeref._retn (); + +} + +void +CIAO::Session_Container::ciao_uninstall_home (Components::CCMHome_ptr homeref + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + this->uninstall (homeref + ACE_ENV_ARG_PARAMETER); +} + +void +CIAO::Session_Container::uninstall (CORBA::Object_ptr objref + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + PortableServer::ObjectId_var oid + = this->poa_->reference_to_id (objref + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + this->poa_->deactivate_object (oid + ACE_ENV_ARG_PARAMETER); +} + +void +CIAO::Session_Container::uninstall (PortableServer::Servant svt + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + PortableServer::ObjectId_var oid + = this->poa_->servant_to_id (svt + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + this->poa_->deactivate_object (oid + ACE_ENV_ARG_PARAMETER); +} + +void +CIAO::Session_Container::uninstall_component (CORBA::Object_ptr objref, + PortableServer::ObjectId_out oid + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + PortableServer::ObjectId_var id + = this->poa_->reference_to_id (objref + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + this->poa_->deactivate_object (id + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + oid = id._retn (); +} |