diff options
Diffstat (limited to 'TAO/CIAO/ciao/Container_Impl.h')
-rw-r--r-- | TAO/CIAO/ciao/Container_Impl.h | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/TAO/CIAO/ciao/Container_Impl.h b/TAO/CIAO/ciao/Container_Impl.h new file mode 100644 index 00000000000..3d984be2836 --- /dev/null +++ b/TAO/CIAO/ciao/Container_Impl.h @@ -0,0 +1,161 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Container_Impl.h + * + * $Id$ + * + * This file contains implementation for the servant of + * Components::Deployment::Container interface. + * + * @author Nanbor Wang <nanbor@cs.wustl.edu> + */ +//============================================================================= + + +#ifndef CIAO_CONTAINER_IMPL_H +#define CIAO_CONTAINER_IMPL_H +#include "ace/pre.h" + +#include "ace/config-all.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "CCM_DeploymentS.h" +#include "Container_Base.h" +#include "Object_Set_T.h" + +namespace CIAO +{ + + struct home_installation_info + { + CORBA::String_var executor_dll_; + CORBA::String_var servant_dll_; + CORBA::String_var servant_entrypt_; + }; + + /** + * @class Container_Impl + * + * @brief Servant implementation for Components::Deployment::Container + * + * This class implements the Components::Deployment::Container + * interface as defined by the CCM spcification. As the interface + * implies, this is actually part of the deployment interface and is + * used to manage the lifecycle of the installed components and + * homes. + */ + class CIAO_SERVER_Export Container_Impl + : public virtual POA_Components::Deployment::Container, + public virtual PortableServer::RefCountServantBase + { + public: + /// Constructor + Container_Impl (CORBA::ORB_ptr o, + PortableServer::POA_ptr p, + Components::Deployment::ComponentServer_ptr server); + + /// Destructor + virtual ~Container_Impl (void); + + /// Get the containing POA. This operation does *not* + /// increase the reference count of the POA. + virtual PortableServer::POA_ptr _default_POA (void); + + /// Initialize the container with a name. + int init (const Components::ConfigValues &options, + Components::Deployment::ComponentInstallation_ptr installation + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + /// Components::Deployment::Container defined attributes/operations. + + virtual ::Components::ConfigValues * configuration (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual ::Components::Deployment::ComponentServer_ptr get_component_server (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual ::Components::CCMHome_ptr install_home (const char * id, + const char * entrypt, + const Components::ConfigValues & config + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException, + Components::Deployment::UnknownImplId, + Components::Deployment::ImplEntryPointNotFound, + Components::Deployment::InstallationFailure, + Components::InvalidConfiguration)); + + virtual void remove_home (Components::CCMHome_ptr href + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException, + Components::RemoveFailure)); + + virtual ::Components::CCMHomes * get_homes (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException)); + + virtual void remove (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException, + Components::RemoveFailure)); + + // ------------------- CIAO Internal Operations ------------------------ + /// Set the cached object reference. + void set_objref (Components::Deployment::Container_ptr o + ACE_ENV_ARG_DECL_WITH_DEFAULTS); + + /// Get the cached object reference. This operation will invoke + /// _this if there's no cached reference available. Notice that + /// this method does *NOT* increase the reference count of the + /// cached reference. + Components::Deployment::Container_ptr get_objref (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS); + +protected: + /// parse ConfigValues + void parse_config_values (const char *exe_id, + const Components::ConfigValues &options, + struct home_installation_info &component_install_info + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException, + Components::Deployment::UnknownImplId, + Components::Deployment::ImplEntryPointNotFound, + Components::InvalidConfiguration)); + + /// Keep a pointer to the managing ORB serving this servant. + CORBA::ORB_var orb_; + + /// Keep a pointer to the managing POA. + PortableServer::POA_var poa_; + + /// Internal container implementation. + CIAO::Container *container_; + + /// Cached ConfigValues. + Components::ConfigValues_var config_; + + /// Cached Container reference (of ourselves.) + Components::Deployment::Container_var objref_; + + /// Cached ComponentServer. + Components::Deployment::ComponentServer_var comserv_; + + /// And a reference to the ServerActivator that created us. + Components::Deployment::ComponentInstallation_var installation_; + + /// Synchronize access to the object set. + TAO_SYNCH_MUTEX lock_; + + /// Keep a list of managed CCMHome. + Object_Set<Components::CCMHome, Components::CCMHome_var> home_set_; + }; +} + +#if defined (__ACE_INLINE__) +# include "Container_Impl.inl" +#endif /* __ACE_INLINE__ */ + +#include "ace/post.h" +#endif /* CIAO_CONTAINER_IMPL_H */ |