diff options
Diffstat (limited to 'TAO/tests/Quoter/FactoryFinder_Impl.cpp')
-rw-r--r-- | TAO/tests/Quoter/FactoryFinder_Impl.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/TAO/tests/Quoter/FactoryFinder_Impl.cpp b/TAO/tests/Quoter/FactoryFinder_Impl.cpp new file mode 100644 index 00000000000..40783931001 --- /dev/null +++ b/TAO/tests/Quoter/FactoryFinder_Impl.cpp @@ -0,0 +1,152 @@ +// $Id$ + +// ============================================================================ +// +// = FILENAME +// FactoryFinder_Impl.cpp +// +// = DESCRIPTION +// A Factory Finder for the Quoter example. This example conforms +// to the CosLifeCycle Factory Finder notion. +// +// = AUTHOR +// Michael Kircher (mk1@cs.wustl.edu) +// +// ============================================================================ + +#include "ace/Get_Opt.h" +#include "tao/corba.h" +#include "FactoryFinderImpl.h" +#include "QuoterC.h" + +static const char usage [] = +"[-? |\n[-O[RBport] ORB port number]]"; + +// Constructor +QuoterFactoryFinderImpl::QuoterFactoryFinderImpl (void) +{ +} + +// Destructor. +QuoterFactoryFinderImpl::~QuoterFactoryFinderImpl (void) +{ +} + + +CosLifeCycle::Factories * +QuoterFactoryFinderImpl::find_factories (const CosLifeCycle::Key &factory_key, + CORBA::Environment &_env_there) +{ + CORBA::Environment env_here; + + // fill in the name of the Quoter Factory + CosNaming::Name factoryName (1); // max = 1 + factoryName.length (1); + factoryName[0].id = CORBA::string_dup ("quoter_factory"); + // or + + // Get a reference to the ORB. + CORBA::ORB_ptr orb_ptr = TAO_ORB_Core_instance ()->orb (); + + // Get the Naming Service object reference. + CORBA::Object_var namingObj_var = + orb_ptr->resolve_initial_references ("NameService"); + + if (CORBA::is_nil (namingObj_var.in ())) + ACE_ERROR ((LM_ERROR, + " (%P|%t) Unable get the Naming Service.\n")); + + // Narrow the object reference to a Naming Context. + CosNaming::NamingContext_var namingContext_var = + CosNaming::NamingContext::_narrow (namingObj_var.in (), + env_here); + + // see if there is an exception, if yes then throw the NoFactory exception + if (env_here.exception () != 0) // throw a NoFactory exception + { + _env_there.exception (new CosLifeCycle::NoFactory (factory_key)); + return 0; + } + + // Get the IDL_Quoter naming context. + CosNaming::Name quoterContextName (1); // max = 1 + quoterContextName.length (1); + quoterContextName[0].id = CORBA::string_dup ("IDL_Quoter"); + + CORBA::Object_var quoterNamingObj_var = + namingContext_var->resolve (quoterContextName, env_here); + + // see if there is an exception, if yes then throw the NoFactory exception + if (env_here.exception () != 0) // throw a NoFactory exception + { + _env_there.exception (new CosLifeCycle::NoFactory (factory_key)); + return 0; + } + + CosNaming::NamingContext_var quoterNamingContext_var = + CosNaming::NamingContext::_narrow (quoterNamingObj_var.in (), + env_here); + + // see if there is an exception, if yes then throw the NoFactory exception + if (env_here.exception () != 0) // throw a NoFactory exception + { + _env_there.exception (new CosLifeCycle::NoFactory (factory_key)); + return 0; + } + + + // ** now a proper reference to the quoter naming context is available + + // Take the key supplied to search for a Quoter Factory + //CosNaming::Name factoryName = (CosNaming::Name) factory_key; + + // Try to get a reference to a Quoter Factory + CORBA::Object_var quoterFactoryObject_var = + quoterNamingContext_var->resolve (factoryName, env_here); + + // see if there is an exception, if yes then throw the NoFactory exception + if (env_here.exception () != 0) // throw a NoFactory exception + { + _env_there.exception (new CosLifeCycle::NoFactory (factory_key)); + return 0; + } + + // were able to get a reference to Quoter Factory + + // Check if it is a valid Quoter Factory reference + if (CORBA::is_nil (quoterFactoryObject_var.in())) + { // throw a NoFactory exception + _env_there.exception (new CosLifeCycle::NoFactory (factory_key)); + return 0; + } + else { + + // create a sequence of factories object + CosLifeCycle::Factories *factories_ptr = new CosLifeCycle::Factories (1); + + // See if there is an exception, if yes then throw the NoFactory + // exception. + if (env_here.exception () != 0) + { + // Throw a NoFactory exception. + _env_there.exception (new CosLifeCycle::NoFactory (factory_key)); + return 0; + } + + // using the Naming Service only one reference is available + factories_ptr->length (1); + + // Check if it is a valid Quoter Factory reference. + if (CORBA::is_nil (quoterFactoryObject_var.in ())) // throw a NoFactory exception. + { + _env_there.exception (new CosLifeCycle::NoFactory (factory_key)); + return 0; + } + + // insert the object reference + (*factories_ptr)[0] = CORBA::Object::_duplicate (quoterFactoryObject_var.ptr()); + + ACE_DEBUG ((LM_DEBUG,"Have reference to a Quoter Factory.\n")); + return factories_ptr; + } +} |