summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp532
1 files changed, 532 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp b/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp
new file mode 100644
index 00000000000..666af7b030e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/IFRService/ComponentContainer_i.cpp
@@ -0,0 +1,532 @@
+/* -*- C++ -*- */
+// $Id$
+
+#include "orbsvcs/IFRService/ComponentContainer_i.h"
+#include "orbsvcs/IFRService/Repository_i.h"
+#include "orbsvcs/IFRService/InterfaceDef_i.h"
+#include "orbsvcs/IFRService/ComponentDef_i.h"
+#include "orbsvcs/IFRService/ValueDef_i.h"
+#include "orbsvcs/IFRService/IFR_Service_Utils.h"
+#include "ace/SString.h"
+
+ACE_RCSID (IFRService,
+ ComponentContainer_i,
+ "$Id$")
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+const char *TAO_ComponentContainer_i::tmp_name_holder_ = 0;
+
+TAO_ComponentContainer_i::TAO_ComponentContainer_i (TAO_Repository_i *repo)
+ : TAO_IRObject_i (repo),
+ TAO_Container_i (repo)
+{
+}
+
+TAO_ComponentContainer_i::~TAO_ComponentContainer_i (void)
+{
+}
+
+CORBA::ComponentIR::ComponentDef_ptr
+TAO_ComponentContainer_i::create_component (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces
+ )
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::ComponentDef::_nil ());
+
+ this->update_key ();
+
+ return this->create_component_i (id,
+ name,
+ version,
+ base_component,
+ supports_interfaces);
+}
+
+CORBA::ComponentIR::ComponentDef_ptr
+TAO_ComponentContainer_i::create_component_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::ComponentDef_ptr base_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces
+ )
+{
+ TAO_ComponentContainer_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (
+ this->def_kind (),
+ CORBA::dk_Component,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_ComponentContainer_i::same_as_tmp_name,
+ version,
+ "defns"
+ );
+
+ if (! CORBA::is_nil (base_component))
+ {
+ const char *base_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_component);
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base valuetypes is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ComponentDef_i::name_clash,
+ new_key,
+ this->repo_,
+ CORBA::dk_Component);
+
+ // Store the id for this - that's what ComponentDescription takes.
+ ACE_TString base_id;
+ this->repo_->config ()->get_string_value (TAO_IFR_Service_Utils::tmp_key_,
+ "id",
+ base_id);
+ this->repo_->config ()->set_string_value (new_key,
+ "base_component",
+ base_id);
+ }
+
+ CORBA::ULong count = supports_interfaces.length ();
+ CORBA::ULong i = 0;
+
+ if (count > 0)
+ {
+ ACE_Configuration_Section_Key supports_key;
+ this->repo_->config ()->open_section (new_key,
+ "supported",
+ 1,
+ supports_key);
+
+ this->repo_->config ()->set_integer_value (supports_key,
+ "count",
+ count);
+
+ const char *supported_path = 0;
+ char *stringified = 0;
+
+ for (i = 0; i < count; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supports_interfaces[i]
+ );
+ this->repo_->config ()->set_string_value (supports_key,
+ stringified,
+ supported_path);
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Component,
+ path.c_str (),
+ this->repo_);
+
+ return CORBA::ComponentIR::ComponentDef::_narrow (obj.in ());
+}
+
+CORBA::ComponentIR::HomeDef_ptr
+TAO_ComponentContainer_i::create_home (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::HomeDef_ptr base_home,
+ CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces,
+ CORBA::ValueDef_ptr primary_key
+ )
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::HomeDef::_nil ());
+
+ this->update_key ();
+
+ return this->create_home_i (id,
+ name,
+ version,
+ base_home,
+ managed_component,
+ supports_interfaces,
+ primary_key);
+}
+
+CORBA::ComponentIR::HomeDef_ptr
+TAO_ComponentContainer_i::create_home_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::ComponentIR::HomeDef_ptr base_home,
+ CORBA::ComponentIR::ComponentDef_ptr managed_component,
+ const CORBA::InterfaceDefSeq &supports_interfaces,
+ CORBA::ValueDef_ptr primary_key
+ )
+{
+ TAO_ComponentContainer_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (
+ this->def_kind (),
+ CORBA::dk_Home,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_ComponentContainer_i::same_as_tmp_name,
+ version,
+ "defns"
+ );
+
+ char *base_path = 0;
+
+ if (! CORBA::is_nil (base_home))
+ {
+ base_path = TAO_IFR_Service_Utils::reference_to_path (base_home);
+ this->repo_->config ()->set_string_value (new_key,
+ "base_home",
+ base_path);
+ }
+
+ if (! CORBA::is_nil (managed_component))
+ {
+ base_path =
+ TAO_IFR_Service_Utils::reference_to_path (managed_component);
+ this->repo_->config ()->set_string_value (new_key,
+ "managed",
+ base_path);
+ }
+
+ CORBA::ULong length = supports_interfaces.length ();
+ CORBA::ULong i = 0;
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key supports_key;
+ this->repo_->config ()->open_section (new_key,
+ "supported",
+ 1,
+ supports_key);
+ this->repo_->config ()->set_integer_value (supports_key,
+ "count",
+ length);
+
+ char *supported_path = 0;
+ char *stringified = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supports_interfaces[i]
+ );
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (supports_key,
+ stringified,
+ supported_path);
+ }
+ }
+
+ if (! CORBA::is_nil (primary_key))
+ {
+ char *primary_key_path =
+ TAO_IFR_Service_Utils::reference_to_path (primary_key);
+ this->repo_->config ()->set_string_value (new_key,
+ "primary_key",
+ primary_key_path);
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Home,
+ path.c_str (),
+ this->repo_);
+
+ return CORBA::ComponentIR::HomeDef::_narrow (obj.in ());
+}
+
+CORBA::ComponentIR::EventDef_ptr
+TAO_ComponentContainer_i::create_event (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ )
+{
+ TAO_IFR_WRITE_GUARD_RETURN (CORBA::ComponentIR::EventDef::_nil ());
+
+ this->update_key ();
+
+ return this->create_event_i (id,
+ name,
+ version,
+ is_custom,
+ is_abstract,
+ base_value,
+ is_truncatable,
+ abstract_base_values,
+ supported_interfaces,
+ initializers);
+}
+
+CORBA::ComponentIR::EventDef_ptr
+TAO_ComponentContainer_i::create_event_i (
+ const char *id,
+ const char *name,
+ const char *version,
+ CORBA::Boolean is_custom,
+ CORBA::Boolean is_abstract,
+ CORBA::ValueDef_ptr base_value,
+ CORBA::Boolean is_truncatable,
+ const CORBA::ValueDefSeq &abstract_base_values,
+ const CORBA::InterfaceDefSeq &supported_interfaces,
+ const CORBA::ExtInitializerSeq &initializers
+ )
+{
+ TAO_ComponentContainer_i::tmp_name_holder_ = name;
+ ACE_Configuration_Section_Key new_key;
+ ACE_TString path =
+ TAO_IFR_Service_Utils::create_common (
+ this->def_kind (),
+ CORBA::dk_Event,
+ this->section_key_,
+ new_key,
+ this->repo_,
+ id,
+ name,
+ &TAO_ComponentContainer_i::same_as_tmp_name,
+ version,
+ "defns"
+ );
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_custom",
+ (CORBA::ULong) is_custom);
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_abstract",
+ (CORBA::ULong) is_abstract);
+
+ this->repo_->config ()->set_integer_value (new_key,
+ "is_truncatable",
+ (CORBA::ULong) is_truncatable);
+
+ if (!CORBA::is_nil (base_value))
+ {
+ const char *base_path =
+ TAO_IFR_Service_Utils::reference_to_path (base_value);
+
+ // Get the servant's key into the temporary key holder, because
+ // the name clash checker for base valuetypes is static, and has
+ // no other way to know about a specific key.
+ this->repo_->config ()->expand_path (
+ this->repo_->root_key (),
+ base_path,
+ TAO_IFR_Service_Utils::tmp_key_,
+ 0
+ );
+ TAO_IFR_Service_Utils::name_exists (&TAO_ValueDef_i::name_clash,
+ new_key,
+ this->repo_,
+ CORBA::dk_Value);
+
+ ACE_TString base_value_id;
+ this->repo_->config ()->get_string_value (TAO_IFR_Service_Utils::tmp_key_,
+ "id",
+ base_value_id);
+
+ this->repo_->config ()->set_string_value (new_key,
+ "base_value",
+ base_value_id);
+ }
+
+ CORBA::ULong length = abstract_base_values.length ();
+ CORBA::ULong i = 0;
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key bases_key;
+ this->repo_->config ()->open_section (new_key,
+ "abstract_bases",
+ 1,
+ bases_key);
+
+ char *base_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ base_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ abstract_base_values[i]
+ );
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (bases_key,
+ stringified,
+ base_path);
+ }
+ }
+
+ length = supported_interfaces.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key supported_key;
+ this->repo_->config ()->open_section (new_key,
+ "supported",
+ 1,
+ supported_key);
+
+ this->repo_->config ()->set_integer_value (supported_key,
+ "count",
+ length);
+ char *supported_path = 0;
+
+ for (i = 0; i < length; ++i)
+ {
+ supported_path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ supported_interfaces[i]
+ );
+ char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->set_string_value (supported_key,
+ stringified,
+ supported_path);
+ }
+ }
+
+ length = initializers.length ();
+
+ if (length > 0)
+ {
+ ACE_Configuration_Section_Key initializers_key;
+ this->repo_->config ()->open_section (new_key,
+ "initializers",
+ 1,
+ initializers_key);
+
+ CORBA::ULong count = 0;
+ char *path = 0;
+ char *stringified = 0;
+ ACE_Configuration_Section_Key initializer_key;
+ ACE_Configuration_Section_Key outer_key;
+ ACE_Configuration_Section_Key inner_key;
+ ACE_TString excep_path;
+
+ for (i = 0; i < length; ++i)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (i);
+ this->repo_->config ()->open_section (initializers_key,
+ stringified,
+ 1,
+ initializer_key);
+ this->repo_->config ()->set_string_value (
+ initializer_key,
+ "name",
+ initializers[i].name.in ()
+ );
+
+ count = initializers[i].members.length ();
+
+ if (count > 0)
+ {
+ this->repo_->config ()->open_section (initializer_key,
+ "params",
+ 1,
+ outer_key);
+
+ this->repo_->config ()->set_integer_value (outer_key,
+ "count",
+ count);
+
+ for (CORBA::ULong j = 0; j < count; ++j)
+ {
+ stringified = TAO_IFR_Service_Utils::int_to_string (j);
+ this->repo_->config ()->open_section (outer_key,
+ stringified,
+ 1,
+ inner_key);
+
+ this->repo_->config ()->set_string_value (
+ inner_key,
+ "arg_name",
+ initializers[i].members[j].name.in ()
+ );
+
+ path =
+ TAO_IFR_Service_Utils::reference_to_path (
+ initializers[i].members[j].type_def.in ()
+ );
+
+ this->repo_->config ()->set_string_value (inner_key,
+ "arg_path",
+ path);
+ }
+ }
+
+ count = initializers[i].exceptions.length ();
+
+ if (count > 0)
+ {
+ this->repo_->config ()->open_section (initializer_key,
+ "excepts",
+ 1,
+ outer_key);
+
+ this->repo_->config ()->set_integer_value (outer_key,
+ "count",
+ count);
+
+ for (CORBA::ULong k = 0; k < count; ++k)
+ {
+ this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ initializers[i].exceptions[k].id.in (),
+ excep_path
+ );
+
+ stringified = TAO_IFR_Service_Utils::int_to_string (k);
+ this->repo_->config ()->set_string_value (outer_key,
+ stringified,
+ excep_path);
+ }
+ }
+ }
+ }
+
+ // Create the object reference.
+ CORBA::Object_var obj =
+ TAO_IFR_Service_Utils::create_objref (CORBA::dk_Event,
+ path.c_str (),
+ this->repo_);
+
+ return CORBA::ComponentIR::EventDef::_narrow (obj.in ());
+}
+
+int
+TAO_ComponentContainer_i::same_as_tmp_name (const char *name)
+{
+ return
+ ACE_OS::strcmp (TAO_ComponentContainer_i::tmp_name_holder_, name) == 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL