summaryrefslogtreecommitdiff
path: root/TAO/examples
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/examples')
-rw-r--r--TAO/examples/POA/On_Demand_Loading/Servant_Manager.h9
-rw-r--r--TAO/examples/POA/On_Demand_Loading/Server_Manager.cpp392
-rw-r--r--TAO/examples/POA/On_Demand_Loading/server.cpp2
3 files changed, 398 insertions, 5 deletions
diff --git a/TAO/examples/POA/On_Demand_Loading/Servant_Manager.h b/TAO/examples/POA/On_Demand_Loading/Servant_Manager.h
index a1d16ee6d54..a5065799eba 100644
--- a/TAO/examples/POA/On_Demand_Loading/Servant_Manager.h
+++ b/TAO/examples/POA/On_Demand_Loading/Servant_Manager.h
@@ -53,10 +53,6 @@ public:
// Returns an ObjectId when given an dll name and the factory method
// to be invoked in the dll.
- void parse_string (const char *s);
- // Parse the string to obtain the dll name and the symbol which will
- // get us the servant pointer.
-
PortableServer::Servant obtain_servant (const char *str,
PortableServer::POA_ptr poa,
long value);
@@ -71,6 +67,11 @@ public:
// The servant is destroyed and the dll that was dynamically linked
// is closed.
+ private:
+ void parse_string (const char *s);
+ // Parse the string to obtain the dll name and the symbol which will
+ // get us the servant pointer.
+
CORBA::ORB_var orb_;
// A reference to the ORB.
diff --git a/TAO/examples/POA/On_Demand_Loading/Server_Manager.cpp b/TAO/examples/POA/On_Demand_Loading/Server_Manager.cpp
new file mode 100644
index 00000000000..8cbe5df9154
--- /dev/null
+++ b/TAO/examples/POA/On_Demand_Loading/Server_Manager.cpp
@@ -0,0 +1,392 @@
+// $Id$
+
+//============================================================================
+//
+// = FILENAME
+// Server_Manager.cpp
+//
+// = DESCRIPTION
+// Helper class for the server application.
+//
+// = AUTHOR
+// Kirthika Parameswaran <kirthika@cs.wustl.edu>
+//
+//=============================================================================
+
+#include "Server_Manager.h"
+
+ACE_RCSID(On_Demand_Loading, Server_Manager, "$Id$")
+
+Server_i::Server_i(void)
+ :ior_output_file_ (0),
+ policies_ (4)
+{}
+
+Server_i::~Server_i(void)
+{}
+
+// This method parses the input.
+
+int
+Server_i::parse_args (int argc,
+ char **argv)
+{
+ ACE_Get_Opt get_opts (argc, argv, "f:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'f':
+ ior_output_file_ = get_opts.optarg;
+ break;
+
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "[-f ior_output_file] "
+ "\n",
+ argv [0]),
+ -1);
+ }
+
+ // Indicates successful parsing of command line.
+ return 0;
+}
+
+// The IORs obtained are written into files for further use.
+
+int
+Server_i::write_iors_to_file (const char *first_ior,
+ const char *second_ior)
+{
+ if (ior_output_file_ == 0)
+ // No filename was specified; simply return
+ return 0;
+
+ char ior_output_file_1[BUFSIZ];
+ char ior_output_file_2[BUFSIZ];
+
+ ACE_OS::sprintf (ior_output_file_1, "%s_1", ior_output_file_);
+ ACE_OS::sprintf (ior_output_file_2, "%s_2", ior_output_file_);
+
+ FILE *output_file_1 = ACE_OS::fopen (ior_output_file_1, "w");
+ FILE *output_file_2 = ACE_OS::fopen (ior_output_file_2, "w");
+
+ if (output_file_1 == 0 ||
+ output_file_2 == 0)
+ ACE_ERROR_RETURN ((LM_ERROR, "Cannot open output files for writing IORs: %s, %s\n",
+ ior_output_file_1,
+ ior_output_file_2),
+ -1);
+
+ int result = ACE_OS::fprintf (output_file_1,
+ "%s",
+ first_ior);
+ if (result <= 0
+ || ACE_static_cast (size_t,result) != ACE_OS::strlen (first_ior))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "ACE_OS::fprintf failed while writing %s to %s\n",
+ first_ior,
+ ior_output_file_1),
+ -1);
+
+ result = ACE_OS::fprintf (output_file_2,
+ "%s",
+ second_ior);
+ if (result <= 0
+ || ACE_static_cast (size_t,result) != ACE_OS::strlen (second_ior))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "ACE_OS::fprintf failed while writing %s to %s\n",
+ second_ior,
+ ior_output_file_2),
+ -1);
+ ACE_OS::fclose (output_file_1);
+ ACE_OS::fclose (output_file_2);
+ return 0;
+}
+
+// Initialisation of the ORB and POA.
+
+int
+Server_i::init (int argc, char **argv)
+{
+ CORBA::Environment TAO_TRY_ENV;
+
+ TAO_TRY
+ {
+ // Initialize the ORB.
+ orb_ = CORBA::ORB_init (argc, argv, 0, TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ int result = parse_args (argc, argv);
+ if (result != 0)
+ return result;
+
+ // Get an Object reference to RootPOA.
+ CORBA::Object_var obj =
+ orb_->resolve_initial_references ("RootPOA");
+
+ // Narrow the Object reference to a POA reference
+ root_poa_ = PortableServer::POA::_narrow (obj.in (),
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+
+ // Get the POAManager of RootPOA
+
+ poa_manager_ = root_poa_->the_POAManager (TAO_TRY_ENV);
+
+ TAO_CHECK_ENV;
+
+ }
+ TAO_CATCHANY
+ {
+ TAO_TRY_ENV.print_exception ("Server_i:init_poa ()");
+ return 1;
+ }
+ TAO_ENDTRY;
+
+ return 0;
+}
+
+// This method creates an poa with 4 policies of which the servent
+// retention policy decides whether the Servant Activator or the
+// Servant Locator would be used by the Servant Manager.
+
+PortableServer::POA_ptr
+Server_i::create_poa (const char* name,
+ int servant_retention_policy)
+{
+ CORBA::Environment TAO_TRY_ENV;
+ PortableServer::POA_ptr my_poa = 0;
+
+ TAO_TRY
+ {
+ policies_.length (4);
+
+ // ID Assignment Policy
+ policies_[0] =
+ root_poa_->create_id_assignment_policy (PortableServer::USER_ID,
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ // Lifespan Policy
+ policies_[1] =
+ root_poa_->create_lifespan_policy (PortableServer::PERSISTENT,
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ // Request Processing Policy
+ policies_[2] =
+ root_poa_->create_request_processing_policy (PortableServer::USE_SERVANT_MANAGER,
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+
+ // Servant Retention Policy
+ if (servant_retention_policy == 1)
+ policies_[3] =
+ root_poa_->create_servant_retention_policy (PortableServer::RETAIN,
+ TAO_TRY_ENV);
+
+ if (servant_retention_policy == 0)
+ policies_[3] =
+ root_poa_->create_servant_retention_policy (PortableServer::NON_RETAIN,
+ TAO_TRY_ENV);
+
+
+ TAO_CHECK_ENV;
+
+ // Create myPOA as the child of RootPOA with the above
+ // policies_. myPOA will use SERVANT_ACTIVATOR or SERVANT_LOCATOR depending upon the
+ // servant retention policy being RETAIN or NONRETAIN respectively.
+ my_poa = root_poa_->create_POA (name,
+ poa_manager_.in (),
+ policies_,
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+
+ // Destroy the policy objects as they have been passed to
+ // create_POA and no longer needed.
+ for (CORBA::ULong i = 0;
+ i < policies_.length () && TAO_TRY_ENV.exception () == 0;
+ ++i)
+ {
+ CORBA::Policy_ptr policy = policies_[i];
+ policy->destroy (TAO_TRY_ENV);
+ }
+ }
+ TAO_CATCHANY
+ {
+ TAO_TRY_ENV.print_exception ("Server_i:create_poa ()");
+ return 0;
+ }
+ TAO_ENDTRY;
+
+ return my_poa;
+}
+
+// The Servant Activator object is created and initialised.
+
+int
+Server_i::create_activator (PortableServer::POA_var first_poa)
+{
+ CORBA::Environment TAO_TRY_ENV;
+
+ TAO_TRY
+ {
+ // An Servant Activator object is created which will activate
+ // the servant on demand.
+ ACE_NEW_RETURN (servant_activator_impl_,
+ ServantActivator_i (orb_.in ()),
+ 0);
+
+ PortableServer::ServantActivator_var servant_activator =
+ servant_activator_impl_->_this (TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ // Set ServantActivator_i object as the servant_manager of
+ // firstPOA.
+ first_poa->set_servant_manager (servant_activator.in (),
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ // Create a reference with user created ID in firstPOA which
+ // uses the MyFooServantActivator. The servant dll name as
+ // well as the factory function in the dll are used in
+ // creating the objectId.
+
+ PortableServer::ObjectId_var first_foo_oid =
+ servant_activator_impl_->create_dll_object_id ("MyFoo",
+ "create_MyFoo");
+
+ first_foo_ = first_poa->create_reference_with_id (first_foo_oid.in (),
+ "IDL:Foo:1.0",
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ }
+ TAO_CATCHANY
+ {
+ TAO_TRY_ENV.print_exception ("Server_i:create_activator ()");
+ return 1;
+ }
+ TAO_ENDTRY;
+
+ return 0;
+}
+
+// The Servant Locator object is created and initialised.
+
+int
+Server_i::create_locator (PortableServer::POA_var second_poa)
+{
+ CORBA::Environment TAO_TRY_ENV;
+
+ TAO_TRY
+ {
+ // An Servant Locator object is created which will activate
+ // the servant on demand.
+ ACE_NEW_RETURN (servant_locator_impl_,
+ ServantLocator_i (orb_.in ()),
+ 0);
+
+ PortableServer::ServantLocator_var servant_locator =
+ servant_locator_impl_->_this (TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ // Set ServantLocator_i object as the servant Manager of
+ // secondPOA.
+
+ second_poa->set_servant_manager (servant_locator.in (),
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ // Try to create a reference with user created ID in
+ // second_poa which uses MyFooServantLocator. The servant dll
+ // name as well as the factory function in the dll are used in
+ // creating the objectId.
+ PortableServer::ObjectId_var second_foo_oid =
+ servant_locator_impl_->create_dll_object_id ("MyFoo",
+ "create_MyFoo");
+ second_foo_ = second_poa->create_reference_with_id (second_foo_oid.in (),
+ "IDL:Foo:1.0",
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+ }
+ TAO_CATCHANY
+ {
+ TAO_TRY_ENV.print_exception ("Server_i:create_locator ()");
+ return 1;
+ }
+ TAO_ENDTRY;
+
+ return 0;
+}
+
+// The execution process of the server.
+
+int
+Server_i::run (void)
+{
+ CORBA::Environment TAO_TRY_ENV;
+
+ TAO_TRY
+ {
+ // Invoke object_to_string on the references created in
+ // firstPOA and secondPOA.
+
+ CORBA::String_var first_foo_ior =
+ orb_->object_to_string (first_foo_.in (),
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ CORBA::String_var second_foo_ior =
+ orb_->object_to_string (second_foo_.in (),
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+
+ // Print the ior's of first_foo and second_foo.
+
+ ACE_DEBUG ((LM_DEBUG,"%s\n%s\n",
+ first_foo_ior.in (),
+ second_foo_ior.in ()));
+
+ int write_result = write_iors_to_file (first_foo_ior.in (),
+ second_foo_ior.in ());
+ if (write_result != 0)
+ return write_result;
+
+ // Set the poa_manager state to active, ready to process
+ // requests.
+ poa_manager_->activate (TAO_TRY_ENV);
+
+ TAO_CHECK_ENV;
+
+ // Run the ORB.
+ if (orb_->run () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%p\n",
+ "CORBA::ORB::run"),
+ -1);
+
+
+ // Destroy the root_poa_ and also first_poa and second_poa.
+ root_poa_->destroy (1,
+ 1,
+ TAO_TRY_ENV);
+ TAO_CHECK_ENV;
+ }
+ TAO_CATCHANY
+ {
+ TAO_TRY_ENV.print_exception ("Server_i:run ()");
+ return 1;
+ }
+ TAO_ENDTRY;
+
+ return 0;
+}
+
diff --git a/TAO/examples/POA/On_Demand_Loading/server.cpp b/TAO/examples/POA/On_Demand_Loading/server.cpp
index 7a63885babf..c6d29d79821 100644
--- a/TAO/examples/POA/On_Demand_Loading/server.cpp
+++ b/TAO/examples/POA/On_Demand_Loading/server.cpp
@@ -13,7 +13,7 @@
//
//=============================================================================
-#include "Server_i.h"
+#include "Server_Manager.h"
ACE_RCSID(On_Demand_Loading, server, "$Id$")