summaryrefslogtreecommitdiff
path: root/TAO/tests/DLL_ORB/Test_Server_Module.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/DLL_ORB/Test_Server_Module.cpp')
-rw-r--r--TAO/tests/DLL_ORB/Test_Server_Module.cpp233
1 files changed, 233 insertions, 0 deletions
diff --git a/TAO/tests/DLL_ORB/Test_Server_Module.cpp b/TAO/tests/DLL_ORB/Test_Server_Module.cpp
new file mode 100644
index 00000000000..9e82e3ab54c
--- /dev/null
+++ b/TAO/tests/DLL_ORB/Test_Server_Module.cpp
@@ -0,0 +1,233 @@
+// -*- C++ -*-
+
+#include "Test_Server_Module.h"
+
+ACE_RCSID (DLL_ORB,
+ Test_Server_Module,
+ "$Id$")
+
+#include "ace/Get_Opt.h"
+
+
+const char *ior_file = "test.ior";
+
+int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "o:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'o':
+
+ ior_file = get_opts.optarg;
+ break;
+
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Usage: -o IOR\n"),
+ -1);
+ }
+
+ return 0;
+}
+
+int
+Test_Server_Module::init (int argc, ACE_TCHAR *argv[])
+{
+ // -----------------------------------------------------------------
+ // Pre-ORB initialization steps necessary for proper DLL ORB
+ // support.
+ // -----------------------------------------------------------------
+ // Make sure TAO's singleton manager is initialized, and set to not
+ // register itself with the ACE_Object_Manager since it is under the
+ // control of the Service Configurator. If we register with the
+ // ACE_Object_Manager, then the ACE_Object_Manager will still hold
+ // (dangling) references to instances of objects created by this
+ // module and destroyed by this object when it is dynamically
+ // unloaded.
+ int register_with_object_manager = 0;
+
+ if (TAO_Singleton_Manager::instance ()->init (
+ register_with_object_manager) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Test_Server_Module::init -- ORB pre-initialization "
+ "failed."),
+ -1); // No CORBA exceptions available yet, so
+ // return an error status.
+
+
+ // -----------------------------------------------------------------
+ // Boilerplate CORBA/TAO server-side ORB initialization code.
+ // -----------------------------------------------------------------
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Add two to the new argc since
+ // "dummy -ORBSkipServiceConfigOpen" is being added to the argv
+ // vector.
+ int new_argc = argc + 2;
+
+ CORBA::StringSeq new_argv (new_argc);
+ new_argv.length (new_argc);
+
+ // Prevent the ORB from opening the Service Configurator file
+ // again since the Service Configurator file is already in the
+ // process of being opened.
+ new_argv[0] = CORBA::string_dup ("dummy");
+ new_argv[1] = CORBA::string_dup ("-ORBSkipServiceConfigOpen");
+
+ // Copy the remaining arguments into the new argument vector.
+ for (int i = new_argc - argc, j = 0;
+ j < argc;
+ ++i, ++j)
+ new_argv[i] = CORBA::string_dup (argv[j]);
+
+ // Initialize the ORB.
+ this->orb_ = CORBA::ORB_init (new_argc,
+ new_argv.get_buffer (),
+ 0,
+ ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (this->orb_.in ()))
+ return -1;
+
+ CORBA::Object_var poa_object =
+ this->orb_->resolve_initial_references ("RootPOA", ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (poa_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to initialize the POA.\n"),
+ 1);
+
+ this->poa_ =
+ PortableServer::POA::_narrow (poa_object.in (), ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ this->poa_manager_ = this->poa_->the_POAManager (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ this->poa_manager_->activate (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ if (::parse_args (new_argc, new_argv.get_buffer ()) != 0)
+ return -1;
+
+ CORBA::Object_var obj = this->servant_._this (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ CORBA::String_var ior =
+ this->orb_->object_to_string (obj.in (), ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Servant:\n<%s>\n",
+ ior.in ()));
+
+ // Write IOR to a file.
+ FILE *output_file= ACE_OS::fopen (ior_file, "w");
+ if (output_file == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot open output file <%s> for writing "
+ "IOR: %s",
+ ior.in ()),
+ 1);
+ ACE_OS::fprintf (output_file, "%s", ior.in ());
+ ACE_OS::fclose (output_file);
+
+ this->servant_.orb (this->orb_.in ());
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT ("Test_Server_Module::init"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+#if defined (ACE_HAS_THREADS)
+
+ // Become an Active Object so that the ORB will execute in a
+ // separate thread.
+ return this->activate ();
+
+#else
+
+ return 0;
+
+#endif /* ACE_HAS_THREADS */
+}
+
+int
+Test_Server_Module::fini (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Make sure the ORB is destroyed.
+ if (!CORBA::is_nil (this->orb_.in ()))
+ {
+ this->orb_->destroy (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ }
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT ("Test_Server_Module::fini"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ // ------------------------------------------------------------
+ // Pre-Test_Server_Module termination steps.
+ // ------------------------------------------------------------
+ // Explicitly clean up singletons created by TAO before
+ // unloading this module.
+ if (TAO_Singleton_Manager::instance ()->fini () == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Test_Server_Module::fini -- ORB pre-termination "
+ "failed."),
+ -1);
+
+ return 0;
+}
+
+int
+Test_Server_Module::svc (void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // Run the ORB event loop in its own thread.
+ this->orb_->run (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ ACE_TEXT ("Test_Server_Module::svc"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK_RETURN (-1);
+
+ return 0;
+}
+
+
+ACE_STATIC_SVC_DEFINE (Test_Server_Module,
+ ACE_TEXT ("Test_Server_Module"),
+ ACE_SVC_OBJ_T,
+ &ACE_SVC_NAME (Test_Server_Module),
+ ACE_Service_Type::DELETE_THIS
+ | ACE_Service_Type::DELETE_OBJ,
+ 0)
+
+ACE_FACTORY_DEFINE (Test_Server_Module, Test_Server_Module)