summaryrefslogtreecommitdiff
path: root/modules/CIAO/ciao/Server_init.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/CIAO/ciao/Server_init.cpp')
-rw-r--r--modules/CIAO/ciao/Server_init.cpp234
1 files changed, 234 insertions, 0 deletions
diff --git a/modules/CIAO/ciao/Server_init.cpp b/modules/CIAO/ciao/Server_init.cpp
new file mode 100644
index 00000000000..790b3b7b963
--- /dev/null
+++ b/modules/CIAO/ciao/Server_init.cpp
@@ -0,0 +1,234 @@
+// $Id$
+
+#include "Server_init.h"
+#include "CIAO_common.h"
+#include "CCM_ComponentC.h"
+#include "CCM_StandardConfiguratorC.h"
+#include "Cookies.h"
+
+#include "ace/OS_NS_stdio.h"
+namespace CIAO
+{
+ int
+ Server_init (CORBA::ORB_ptr o)
+ {
+ CIAO_REGISTER_VALUE_FACTORY (o, CIAO::Map_Key_Cookie_init,
+ Components::Cookie);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::PortDescription_init,
+ Components::PortDescription);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::FacetDescription_init,
+ Components::FacetDescription);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::ConnectionDescription_init,
+ Components::ConnectionDescription);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::ReceptacleDescription_init,
+ Components::ReceptacleDescription);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::ConsumerDescription_init,
+ Components::ConsumerDescription);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::EmitterDescription_init,
+ Components::EmitterDescription);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::SubscriberDescription_init,
+ Components::SubscriberDescription);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::PublisherDescription_init,
+ Components::PublisherDescription);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::ConfigValue_init,
+ Components::ConfigValue);
+ CIAO_REGISTER_VALUE_FACTORY (o, Components::ComponentPortDescription_init,
+ Components::ComponentPortDescription);
+ return 0;
+ }
+
+ namespace Utility
+ {
+ int write_IOR (const char *pathname, const char *ior)
+ {
+ FILE* ior_output_file_ = ACE_OS::fopen (pathname, "w");
+
+ if (ior_output_file_)
+ {
+ ACE_OS::fprintf (ior_output_file_,
+ "%s",
+ ior);
+ ACE_OS::fclose (ior_output_file_);
+ return 0;
+ }
+
+ return -1;
+ }
+
+ // --------------------------------------------------------------
+ // Implementation of NameUtility class
+ // --------------------------------------------------------------
+
+ void NameUtility::CreateContextPath (const CosNaming::NamingContextExt_ptr nc,
+ const CosNaming::Name& name)
+ {
+ bool isNotFound = false;
+ CORBA::ULong lengthMissing = 0;
+ CORBA::ULong OriginalLength = name.length();
+ CosNaming::Name tmpName;
+ CosNaming::NamingContext_var tmpCtxVar;
+
+ try
+ {
+ tmpCtxVar = nc->bind_new_context(name);
+ ACE_DEBUG ((LM_DEBUG, "Bound Context.\n\n"));
+ }
+ catch (const CosNaming::NamingContext::AlreadyBound&)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Context Already Bound.\n\n"));
+ }
+ catch (const CosNaming::NamingContext::NotFound& nf)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Context not found.\n\n"));
+ isNotFound = true;
+ lengthMissing = nf.rest_of_name.length();
+ }
+
+ if (lengthMissing == name.length())
+ {
+ ACE_ERROR ((LM_ERROR, "Null name length.\n\n"));
+ }
+
+ if (isNotFound)
+ {
+ for (CORBA::ULong l = OriginalLength-lengthMissing;
+ l < OriginalLength;
+ l++)
+ {
+ tmpName.length(l+1);
+ for (CORBA::ULong i=0; i <= l; i++)
+ {
+ tmpName[i] = name[i];
+
+ CORBA::String_var newSCName = nc->to_string(tmpName);
+ ACE_DEBUG ((LM_DEBUG, "What's left of the name:%s\n",
+ newSCName.in ()));
+ }
+
+ tmpCtxVar = nc->bind_new_context(tmpName);
+ ACE_DEBUG ((LM_DEBUG, "Bound New Context.\n"));
+ }
+ }
+ }
+
+ //---------------------------------------------------------------------------------------------
+ void NameUtility::BindObjectPath (const CosNaming::NamingContextExt_ptr nc,
+ const CosNaming::Name& name,
+ const CORBA::Object_var obj)
+ {
+ CosNaming::Name tmpName;
+ CORBA::String_var newSCName = nc->to_string(name);
+ ACE_DEBUG ((LM_DEBUG, "The name is: %s\n", newSCName.in ()));
+
+ try
+ {
+ nc->rebind(name, obj);
+ }
+
+ catch (const CosNaming::NamingContext::NotFound&)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Name not found, doing new bind.\n"));
+ nc->bind(name, obj);
+ }
+ }
+
+ //---------------------------------------------------------------------------------------------
+ CosNaming::BindingList *
+ NameUtility::listBindings (const CosNaming::NamingContext_ptr nc,
+ const CosNaming::Name& name,
+ CORBA::ULong max_list_size)
+ {
+ CosNaming::BindingList_var basicListV;
+ CosNaming::BindingIterator_var bIterV;
+
+ CORBA::Object_var objV;
+ CosNaming::NamingContext_var tmpContextV;
+
+ if (name.length() == 0)
+ {
+ tmpContextV = CosNaming::NamingContext::_duplicate(nc);
+ }
+ else
+ {
+ objV = nc->resolve(name);
+ tmpContextV = CosNaming::NamingContext::_narrow(objV.in ());
+ }
+ if (CORBA::is_nil (tmpContextV.in ()))
+ {
+ ACE_ERROR ((LM_ERROR, "listBindings: Nil context.\n"));
+ return 0;
+ }
+
+ tmpContextV->list(max_list_size, basicListV.out(), bIterV.out());
+
+ CORBA::Long max_remaining = max_list_size - basicListV->length();
+ CORBA::Boolean moreBindings = !CORBA::is_nil(bIterV.in ());
+
+ if (moreBindings)
+ {
+ while (moreBindings && (max_remaining > 0) )
+ {
+ CosNaming::BindingList_var tmpListV;
+
+ moreBindings = bIterV->next_n(max_remaining, tmpListV.out());
+
+ //Append 'tmpListV' to 'basicListV'
+ CORBA::ULong basicListLen = basicListV->length();
+ basicListV->length(basicListLen+tmpListV->length());
+ for (CORBA::ULong i=0; i < tmpListV->length(); i++)
+ {
+ (*basicListV)[i+basicListLen] = (*tmpListV)[i];
+ }
+
+ //Re-calculate 'max_remaining'
+ max_remaining = max_list_size - basicListV->length();
+ }
+ bIterV->destroy();
+ }
+
+ return basicListV._retn();
+ }
+
+ //---------------------------------------------------------------------------------------------
+ void
+ NameUtility::recursiveUnbind (const CosNaming::NamingContext_ptr nc,
+ const CosNaming::Name& name)
+ {
+ CORBA::Object_var objV;
+ CosNaming::NamingContext_var tmpContextV;
+
+ objV = nc->resolve(name);
+ tmpContextV = CosNaming::NamingContext::_narrow(objV.in ());
+ if (CORBA::is_nil(tmpContextV.in ()))
+ {
+ ACE_ERROR ((LM_ERROR, "recursiveUnbind: Nil context reference.\n"));
+ return;
+ }
+
+ CosNaming::BindingList_var blV;
+ CosNaming::Name tmpName;
+ tmpName.length(0);
+
+ blV = NameUtility::listBindings(tmpContextV.in(),
+ tmpName,
+ 10000); // 'max_list_size'
+
+ for (CORBA::ULong i=0; i<blV->length(); i++)
+ {
+ tmpName = (*blV)[i].binding_name;
+
+ if ((*blV)[i].binding_type==CosNaming::nobject)
+ {
+ tmpContextV->unbind(tmpName);
+ }
+ else if ( (*blV)[i].binding_type==CosNaming::ncontext)
+ {
+ NameUtility::recursiveUnbind(tmpContextV.in(), tmpName);
+ }
+ }
+ nc->unbind(name);
+ tmpContextV->destroy();
+ }
+
+ } /* namespace Utility */
+} /* namespace CIAO */