summaryrefslogtreecommitdiff
path: root/TAO/examples/POA/On_Demand_Loading/Servant_Locator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/examples/POA/On_Demand_Loading/Servant_Locator.cpp')
-rw-r--r--TAO/examples/POA/On_Demand_Loading/Servant_Locator.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/TAO/examples/POA/On_Demand_Loading/Servant_Locator.cpp b/TAO/examples/POA/On_Demand_Loading/Servant_Locator.cpp
new file mode 100644
index 00000000000..d54ae5d09f7
--- /dev/null
+++ b/TAO/examples/POA/On_Demand_Loading/Servant_Locator.cpp
@@ -0,0 +1,98 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/examples/POA/On_Demand_Loading
+//
+// = FILENAME
+// Servant_Locator.cpp
+//
+// = DESCRIPTION
+// Implementation of ServantLocator_i class, used with a POA
+// having a NON_RETAIN policy.
+//
+// = AUTHOR
+// Kirthika Parameswaran <kirthika@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "Servant_Locator.h"
+
+ACE_RCSID (On_Demand_Activation,
+ Servant_Locator,
+ "$Id$")
+
+// Initialization.
+
+ServantLocator_i::ServantLocator_i (CORBA::ORB_ptr orb)
+ : servant_manager_ (orb)
+{
+}
+
+// This method associates an servant with the ObjectID.
+
+PortableServer::Servant
+ServantLocator_i::preinvoke (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr poa,
+ const char * /* operation */,
+ PortableServer::ServantLocator::Cookie &cookie)
+{
+ // Convert ObjectID to String.
+
+ CORBA::String_var s =
+ PortableServer::ObjectId_to_string (oid);
+
+ // If ObjectID string has a test substring create and return a
+ // test_i.
+
+ PortableServer::Servant servant =
+ this->servant_manager_.obtain_servant (s.in (),
+ poa);
+ if (servant != 0)
+ {
+ // Return the servant as the cookie , used as a check when
+ // postinvoke is called on this ServantLocator_i.
+
+ cookie = servant;
+ return servant;
+ }
+ else
+ throw CORBA::OBJECT_NOT_EXIST ();
+}
+
+// Since the servant gets invoked per operation, the servant has to be
+// destroyed per operation too. This is accomplished in the
+// postinvoke method.
+
+void
+ServantLocator_i::postinvoke (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr /* poa */,
+ const char * /* operation */,
+ PortableServer::ServantLocator::Cookie cookie,
+ PortableServer::Servant servant)
+{
+ // Check the passed servant with the cookie.
+
+ PortableServer::Servant my_servant =
+ reinterpret_cast<PortableServer::Servant> (cookie);
+
+ ACE_ASSERT (servant == my_servant);
+
+ this->servant_manager_.destroy_servant (servant,
+ oid);
+ // To avoid warning about unused variable with ACE_NDEBUG.
+ ACE_UNUSED_ARG (my_servant);
+}
+
+// This method returns an ObjectId when given an dll name and the
+// factory function to be invoked in the dll. The format of the
+// ObjectId is libname:factory_function.
+
+PortableServer::ObjectId_var
+ServantLocator_i::create_dll_object_id (const char *dllname,
+ const char *factory_function)
+{
+ return this->servant_manager_.create_dll_object_id (dllname,
+ factory_function);
+}