diff options
Diffstat (limited to 'TAO/orbsvcs/examples/CosEC/Factory/FactoryDriver.cpp')
-rw-r--r-- | TAO/orbsvcs/examples/CosEC/Factory/FactoryDriver.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/TAO/orbsvcs/examples/CosEC/Factory/FactoryDriver.cpp b/TAO/orbsvcs/examples/CosEC/Factory/FactoryDriver.cpp new file mode 100644 index 00000000000..ce42d9e6b87 --- /dev/null +++ b/TAO/orbsvcs/examples/CosEC/Factory/FactoryDriver.cpp @@ -0,0 +1,148 @@ +// -*- C++ -*- +// $Id$ + +#include "FactoryDriver.h" +#include "tao/debug.h" +#include "ace/Get_Opt.h" + +FactoryDriver::FactoryDriver (const char* name) + :factoryName_ (name), + child_poa_name_ ("CosEC_ChildPOA"), + factory_servant_ (0) +{ + //No-Op. +} + +FactoryDriver::~FactoryDriver (void) +{ + //No-Op. +} + +int +FactoryDriver::parse_args (int argc, char *argv []) +{ + ACE_Get_Opt get_opts (argc, argv, "dr:"); + int c = 0; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'd': // debug flag. + TAO_debug_level++; + break; + + case 'r': + factoryName_ = get_opts.opt_arg (); + break; + + case '?': // display help for use of the server. + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s" + " [-r] <Factory Name>" + "\n", + argv [0]), + -1); + } + + // Indicates successful parsing of command line. + return 0; +} + +int +FactoryDriver::start (int argc, char *argv []) +{ + try + { + orb_ = CORBA::ORB_init (argc, + argv, + ""); + + if (this->parse_args (argc, argv) == -1) + return -1; + + // Ref counted servants are on the heap.. + ACE_NEW_RETURN (factory_servant_, + TAO_CosEventChannelFactory_i (), + -1); + + CORBA::Object_var poa_object = + orb_->resolve_initial_references("RootPOA"); + + if (CORBA::is_nil (poa_object.in ())) + ACE_ERROR_RETURN ((LM_ERROR, + " (%P|%t) Unable to initialize the POA.\n"), + -1); + + root_poa_ = + PortableServer::POA::_narrow (poa_object.in ()); + + PortableServer::POAManager_var poa_manager = + root_poa_->the_POAManager (); + + + poa_manager->activate (); + + + // Initialization of the naming service. + if (naming_client_.init (orb_.in ()) != 0) + ACE_ERROR_RETURN ((LM_ERROR, + "(%P|%t) Unable to initialize " + "the TAO_Naming_Client. \n"), + 1); + + CosNaming::NamingContext_var context = + naming_client_.get_context (); + + if (factory_servant_->init (root_poa_.in (), + child_poa_name_, + context.in ()) != 0) + ACE_ERROR_RETURN ((LM_ERROR, + "(%P|%t) Unable to initialize " + "the factory. \n"), + 1); + + // activate the factory in the root poa. + factory_ = factory_servant_->_this (); + + // Give the ownership to the POA. + factory_servant_->_remove_ref (); + + CORBA::String_var + str = orb_->object_to_string (factory_.in ()); + + ACE_DEBUG ((LM_DEBUG, + "CosEvent_Service: The Cos Event Channel Factory IOR is <%s>\n", + str.in ())); + + CosNaming::Name name (1); + name.length (1); + name[0].id = CORBA::string_dup (factoryName_); + naming_client_->rebind (name, + factory_.in ()); + + ACE_DEBUG ((LM_DEBUG, + "Registered with the naming service as %s\n", factoryName_)); + + orb_->run (); + } + catch (const CORBA::UserException& ue) + { + ue._tao_print_exception ("cosecfactory: "); + return 1; + } + catch (const CORBA::SystemException& se) + { + se._tao_print_exception ("cosecfactory: "); + return 1; + } + + return 0; +} + +int +FactoryDriver::stop (void) +{ + orb_->shutdown (); + return 0; +} |