diff options
Diffstat (limited to 'TAO/examples')
-rw-r--r-- | TAO/examples/POA/On_Demand_Loading/Servant_Manager.h | 9 | ||||
-rw-r--r-- | TAO/examples/POA/On_Demand_Loading/Server_Manager.cpp | 392 | ||||
-rw-r--r-- | TAO/examples/POA/On_Demand_Loading/server.cpp | 2 |
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$") |