diff options
Diffstat (limited to 'modules/CIAO/RACE/Input_Adapters/LocationUpdater/Injector.cpp')
-rw-r--r-- | modules/CIAO/RACE/Input_Adapters/LocationUpdater/Injector.cpp | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/modules/CIAO/RACE/Input_Adapters/LocationUpdater/Injector.cpp b/modules/CIAO/RACE/Input_Adapters/LocationUpdater/Injector.cpp new file mode 100644 index 00000000000..7b22e519922 --- /dev/null +++ b/modules/CIAO/RACE/Input_Adapters/LocationUpdater/Injector.cpp @@ -0,0 +1,185 @@ +/** + * @file Injector.cpp + * @author Will Otte <wotte@dre.vanderbilt.edu> + * + * $Id$ + */ + +#include "Input_Adapters/LocationUpdater/LocationUpdaterC.h" +#include "ace/OS.h" +#include "ace/Get_Opt.h" +#include "ace/SString.h" +#include "orbsvcs/CosNamingC.h" +#include "ace/Auto_Ptr.h" + +#include <iostream> +using namespace std; + +namespace CIAO +{ + namespace RACE + { + namespace Injector + { + const char *package_uri = 0; + const char *plan_uri = 0; + const char *iia_ior_file = 0; + const char *iia_name = "RACE::InteractiveInput"; + + bool teardown = false; + + static void + usage (const ACE_TCHAR* program) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("Usage %s\n") + ACE_TEXT ("-d <Flatten deployment plan URI>\n") + ACE_TEXT ("-p <Toplevel Package URI>\n") + ACE_TEXT ("-t <Teardown plan>\n") + ACE_TEXT ("-k <Interactive_Input_Adaptor IOR, " + "use naming service if not present\n"), + program)); + } + + static bool + parse_args (int argc, + ACE_TCHAR *argv[]) + { + ACE_Get_Opt get_opt (argc, + argv, + ACE_TEXT ("d:p:k:thn:")); + int c; + + while ((c = get_opt ()) != EOF) + { + switch (c) + { + case 'd': + plan_uri = get_opt.opt_arg (); + break; + + case 'p': + package_uri = get_opt.opt_arg (); + break; + + case 'k': + iia_ior_file = get_opt.opt_arg (); + break; + + case 't': + teardown = true; + break; + + case 'n': + iia_name = get_opt.opt_arg (); + + case 'h': + default: + usage (argv[0]); + return false; + } + } + + return true; + } + + CORBA::Object_ptr + fetch_reference_naming (CORBA::ORB_ptr orb, + const ACE_CString &name) + { + ACE_ERROR ((LM_ERROR, "Resolving via nameservice...\n")); + using namespace CosNaming; + // Resolve naming service + CORBA::Object_var tmp = + orb->resolve_initial_references ("NameService"); + + NamingContext_var pns = + NamingContext::_narrow (tmp.in ()); + + Name ns_name; + CORBA::ULong i = 0; + + ACE_Tokenizer tok ( name.rep ()); + tok.delimiter_replace (':', 0); + tok.delimiter_replace ('/', 0); + + char *name_element = 0; + while ((name_element = tok.next ()) != 0) + { + ns_name.length (ns_name.length () + 1); + ns_name[i].id = CORBA::string_dup (name_element); + ++i; + } + + + return pns->resolve (ns_name); + } + + static int + run_main_implementation (int argc, ACE_TCHAR *argv[]) + { + try + { + CORBA::ORB_var orb = + CORBA::ORB_init (argc, argv, ""); + + if (!parse_args (argc, argv)) + return -1; + + + // Resolve our input adapter... + CORBA::Object_var tmp; + + cout << "resolving: " << iia_ior_file << endl; + + if (iia_ior_file != 0) + tmp = orb->string_to_object (iia_ior_file); + else // must be a name.... + tmp = fetch_reference_naming (orb.in (), iia_name); + + CIAO::RACE::LocationUpdater_var iia + = CIAO::RACE::LocationUpdater::_narrow (tmp.in ()); + + // Create deploy input event. + CIAO::RACE::Deploy_Input_var input = + new OBV_CIAO::RACE::Deploy_Input; + + input->plan_uri (plan_uri); + input->package_uri (package_uri); + + if (teardown) + { + input->command (::CIAO::RACE::TEARDOWN); + } + else + { + input->command (::CIAO::RACE::DEPLOY); + } + + + + // Get the consumer for the IIA + ::CIAO::RACE::Deploy_InputConsumer_var consumer = + iia->get_consumer_deployment (); + + // push the event + consumer->push_Deploy_Input (input.in ()); + + } + catch (...) + { + ACE_ERROR ((LM_ERROR, + "(%P|%t) Injector: Unknown exception\n")); + return -1; + } + + return 0; + } + } + } +} + +int main (int argc, ACE_TCHAR **argv) +{ + return CIAO::RACE::Injector::run_main_implementation (argc, argv); +} |