diff options
Diffstat (limited to 'TAO/CIAO/DAnCE/NodeApplication/NodeApplication.cpp')
-rw-r--r-- | TAO/CIAO/DAnCE/NodeApplication/NodeApplication.cpp | 192 |
1 files changed, 175 insertions, 17 deletions
diff --git a/TAO/CIAO/DAnCE/NodeApplication/NodeApplication.cpp b/TAO/CIAO/DAnCE/NodeApplication/NodeApplication.cpp index ca8654f9317..4bb0fc03df2 100644 --- a/TAO/CIAO/DAnCE/NodeApplication/NodeApplication.cpp +++ b/TAO/CIAO/DAnCE/NodeApplication/NodeApplication.cpp @@ -1,36 +1,194 @@ // $Id$ -#include "NodeApplication_Core.h" +#include "NodeApplication_Impl.h" +#include "NodeApplication_CallBackC.h" +#include "ciao/Server_init.h" #include "ciao/CIAO_common.h" +#include "ace/SString.h" +#include "ace/Get_Opt.h" +#include "ace/Env_Value_T.h" +#include "ace/Sched_Params.h" +#include "ace/OS_NS_errno.h" -void print_arg (int argc, char *argv[]) +const char *ior_file_name = 0; +const char *callback_ior = 0; +int use_callback = 1; + +int +parse_args (int argc, char *argv[]) { - for (int i = 0; i < argc; ++i) - ACE_DEBUG ((LM_DEBUG, "NodeApplication ARGV[%d] = %s\n", i, argv [i])); + ACE_Get_Arg_Opt<char> get_opts (argc, argv, "nk:o:"); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'n': + use_callback = 0; + break; + + + case 'o': // get the file name to write to + ior_file_name = get_opts.opt_arg (); + break; + + case 'k': // get the activator callback IOR + callback_ior = get_opts.opt_arg (); + break; + + case '?': // display help for use of the server. + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s\n" + "-n Do not use Callback (for testing)\n" + "-o <ior_output_file>\n" + "-k <NodeApplicationManager_callback_ior>\n" + "\n", + argv [0]), + -1); + } + + if (use_callback && callback_ior == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Callback IOR to NodeApplicationManager is required.\n"), + -1); + + return 0; } int -main (int argc, char *argv[]) +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { - ACE_TRY_NEW_ENV - { - ACE_DEBUG ((LM_DEBUG, "*** Starting NodeApplication\n")); + ACE_DECLARE_NEW_CORBA_ENV; - CIAO::NodeApplication_Options nodeapp_options; + ACE_TRY + { + // Initialize orb + CORBA::ORB_var orb = + CORBA::ORB_init (argc, + argv, + "" + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; - if (CIAO::debug_level () > 9) - print_arg (argc, argv); + CIAO::Server_init (orb.in ()); - if (nodeapp_options.parse_args (argc, argv) != 0) + if (parse_args (argc, argv) != 0) return -1; - CIAO::NodeApplication_Core nodeapp_core (nodeapp_options); + // Get reference to Root POA. + CORBA::Object_var obj + = orb->resolve_initial_references ("RootPOA" + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + PortableServer::POA_var poa + = PortableServer::POA::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // Activate POA manager + PortableServer::POAManager_var mgr + = poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + mgr->activate (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; - if (nodeapp_core.startup (argc, argv) != 0) + CIAO::NodeApplication_Impl *nodeapp_servant; + + ACE_NEW_RETURN (nodeapp_servant, + CIAO::NodeApplication_Impl (orb.in (), + poa.in ()), + -1); + + PortableServer::ServantBase_var safe_servant (nodeapp_servant); + + // CONFIGURING NodeApplication + PortableServer::ObjectId_var nodeapp_oid + = poa->activate_object (nodeapp_servant + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + obj = poa->id_to_reference (nodeapp_oid.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + Deployment::NodeApplication_var nodeapp_obj = + Deployment::NodeApplication::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (nodeapp_obj.in ())) ACE_ERROR_RETURN ((LM_ERROR, - "Unable to start up the NodeApplication_Core\n"), -1); + "Unable to activate NodeApplication object\n"), + -1); + + + Deployment::NodeApplicationManager_var nodeapp_man; + Deployment::Properties_var prop = new Deployment::Properties; + + if (use_callback) + { + obj = orb->string_to_object (callback_ior + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CIAO::NodeApplication_Callback_var nam_callback + = CIAO::NodeApplication_Callback::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + Deployment::Properties_out properties_out (prop.out ()); + + nodeapp_man + = nam_callback->register_node_application (nodeapp_obj.in (), + properties_out + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + + /** @@ We need to call NodeApplication servant's init method. + * But it's not sure to me where exactly we can get the + * Properties needed by the init method at this moment. There are two + * ways to set the property of the NodeApplication: + * 1. call init remotely from NodeApplicationManager + * 2. call init locally on the servant of NodeApplication. + */ + bool result = nodeapp_servant->init (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (result) + { + ACE_DEBUG ((LM_DEBUG, "NodeApplication Failed on creating and\ + initializing the session container!")); + return 1; + } + + CORBA::String_var str = orb->object_to_string (nodeapp_obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CIAO::Utility::write_IOR (ior_file_name, + str.in ()); + + // End Deployment part + if (CIAO::debug_level () > 10) + { + ACE_DEBUG ((LM_INFO, "NodeApplication IOR: %s\n", str.in ())); + + ACE_DEBUG ((LM_DEBUG, + "Running NodeApplication...\n")); + } // Run the main event loop for the ORB. - nodeapp_core.run_orb (); + orb->run (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + poa->destroy (1, 1 ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + orb->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; } ACE_CATCHANY { @@ -40,6 +198,6 @@ main (int argc, char *argv[]) } ACE_ENDTRY; - ACE_DEBUG ((LM_DEBUG, "CIAO (%P|%t) - This NodeApplication is destroyed!\n")); + ACE_DEBUG ((LM_DEBUG, "This NodeApplication is quitting now!\n")); return 0; } |