summaryrefslogtreecommitdiff
path: root/modules/CIAO/ciao/Swapping_Container.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/ciao/Swapping_Container.cpp')
-rw-r--r--modules/CIAO/ciao/Swapping_Container.cpp247
1 files changed, 247 insertions, 0 deletions
diff --git a/modules/CIAO/ciao/Swapping_Container.cpp b/modules/CIAO/ciao/Swapping_Container.cpp
new file mode 100644
index 00000000000..aff7ab93113
--- /dev/null
+++ b/modules/CIAO/ciao/Swapping_Container.cpp
@@ -0,0 +1,247 @@
+// $Id$
+
+#include "Container_Base.h"
+#include "Swapping_Container.h"
+#include "ace/DLL.h"
+#include "tao/Utils/PolicyList_Destroyer.h"
+#include "ace/OS_NS_stdio.h"
+
+#if !defined (__ACE_INLINE__)
+# include "Swapping_Container.inl"
+#endif /* __ACE_INLINE__ */
+
+namespace CIAO
+{
+
+ ACE_Atomic_Op <ACE_SYNCH_MUTEX, unsigned long>
+ Swapping_Container::serial_number_ (0);
+
+ Swapping_Container::Swapping_Container (CORBA::ORB_ptr o,
+ Container_Impl *container_impl)
+ : Session_Container (o, container_impl),
+ number_ (0)
+ {
+ }
+
+ Swapping_Container::~Swapping_Container ()
+ {
+ }
+
+ PortableServer::POA_ptr
+ Swapping_Container::the_home_servant_POA (void) const
+ {
+ return this->home_servant_poa_.in ();
+ }
+
+ CORBA::Object_ptr
+ Swapping_Container::get_home_objref (PortableServer::Servant p)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ return this->the_home_servant_POA ()->servant_to_reference (p);
+ }
+
+ void
+ Swapping_Container::deactivate_facet (const PortableServer::ObjectId &oid)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ this->the_facet_cons_POA ()->deactivate_object (oid);
+ }
+
+ int
+ Swapping_Container::init (const char *name,
+ const CORBA::PolicyList *more_policies)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ char buffer[MAXPATHLEN];
+
+ if (name == 0)
+ {
+ this->number_ = ++Swapping_Container::serial_number_;
+ ACE_OS::sprintf (buffer, "CIAO::Swapping_Container-%ld",
+ this->number_);
+ name = buffer;
+ }
+
+ CORBA::Object_var poa_object =
+ this->orb_->resolve_initial_references("RootPOA");
+
+ 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 ());
+
+
+ this->create_servant_POA (name,
+ more_policies,
+ root_poa.in ());
+
+
+
+ this->create_home_servant_POA ("home servant POA",
+ more_policies,
+ root_poa.in ());
+
+ this->create_connections_POA (root_poa.in ());
+
+ PortableServer::POAManager_var poa_manager =
+ root_poa->the_POAManager ();
+
+ poa_manager->activate ();
+
+ return 0;
+ }
+
+ void
+ Swapping_Container::add_servant_map
+ (PortableServer::ObjectId &oid,
+ Dynamic_Component_Servant_Base* servant)
+ {
+ this->dsa_->add_servant_map (oid, servant);
+ }
+
+ void
+ Swapping_Container::delete_servant_map
+ (PortableServer::ObjectId &oid)
+ {
+ this->dsa_->delete_servant_map (oid);
+ }
+
+ void
+ Swapping_Container::create_home_servant_POA (const char *name,
+ const CORBA::PolicyList *p,
+ PortableServer::POA_ptr root)
+ {
+ CORBA::PolicyList policies (0);
+
+ if (p != 0)
+ policies = *p;
+
+ PortableServer::POAManager_var poa_manager =
+ root->the_POAManager ();
+
+
+ this->home_servant_poa_ =
+ root->create_POA (name,
+ poa_manager.in (),
+ policies);
+ }
+
+ void
+ Swapping_Container::create_connections_POA (
+ PortableServer::POA_ptr root)
+ {
+ PortableServer::POAManager_var poa_manager =
+ root->the_POAManager ();
+
+ TAO::Utils::PolicyList_Destroyer policies (3);
+ policies.length (3);
+
+ policies[0] =
+ root->create_id_assignment_policy (PortableServer::USER_ID);
+
+ policies[1] =
+ root->create_request_processing_policy
+ (PortableServer::USE_SERVANT_MANAGER);
+
+
+ // Servant Retention Policy
+ policies[2] =
+ root->create_servant_retention_policy (PortableServer::RETAIN);
+
+ this->facet_cons_poa_ =
+ root->create_POA ("facet_consumer_poa",
+ poa_manager.in (),
+ policies);
+
+ ACE_NEW_THROW_EX (this->sa_,
+ Servant_Activator (this->orb_.in ()),
+ CORBA::NO_MEMORY ());
+
+ this->facet_cons_poa_->set_servant_manager (
+ this->sa_);
+
+ }
+
+ void
+ Swapping_Container::create_servant_POA (const char *name,
+ const CORBA::PolicyList *p,
+ PortableServer::POA_ptr root)
+ {
+ // @@ Jai, see how this method more or less does things (like
+ // setting policies) like create_connections_POA (). Could you
+ // please refactor them into a seperate method?
+ CORBA::PolicyList policies (0);
+
+ if (p != 0)
+ policies = *p;
+
+ PortableServer::POAManager_var poa_manager =
+ root->the_POAManager ();
+
+ CORBA::ULong policy_length = policies.length ();
+ policies.length (policy_length + 1);
+ policies[policy_length] =
+ root->create_id_assignment_policy (PortableServer::USER_ID);
+
+ policy_length = policies.length ();
+ policies.length (policy_length + 1);
+ policies[policy_length] =
+ root->create_request_processing_policy (
+ PortableServer::USE_SERVANT_MANAGER);
+
+ policy_length = policies.length ();
+ policies.length (policy_length + 1);
+ policies[policy_length] =
+ root->create_servant_retention_policy (PortableServer::RETAIN);
+
+ this->component_poa_ =
+ root->create_POA (name,
+ poa_manager.in (),
+ policies);
+
+ ACE_NEW_THROW_EX (this->dsa_,
+ Dynamic_Component_Activator (this->orb_.in ()),
+ CORBA::NO_MEMORY ());
+
+ this->component_poa_->set_servant_manager (
+ this->dsa_);
+
+ }
+
+ void
+ Swapping_Container::ciao_uninstall_home (Components::CCMHome_ptr homeref)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ PortableServer::POA_ptr tmp = this->home_servant_poa_.in ();
+ PortableServer::ObjectId_var oid =
+ tmp->reference_to_id (homeref);
+
+ tmp->deactivate_object (oid.in ());
+ }
+
+ CORBA::Object_ptr
+ Swapping_Container::install_servant (PortableServer::Servant p,
+ Container::OA_Type t)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ PortableServer::POA_ptr tmp = 0;
+
+ if (t == Container::Component)
+ {
+ tmp = this->home_servant_poa_.in ();
+ }
+ else
+ tmp = this->facet_cons_poa_.in ();
+
+ PortableServer::ObjectId_var oid
+ = tmp->activate_object (p);
+
+ CORBA::Object_var objref
+ = tmp->id_to_reference (oid.in ());
+
+ return objref._retn ();
+ }
+}