summaryrefslogtreecommitdiff
path: root/TAO/tests/Quoter/FactoryFinder_Impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/Quoter/FactoryFinder_Impl.cpp')
-rw-r--r--TAO/tests/Quoter/FactoryFinder_Impl.cpp152
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;
+ }
+}