summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/IFR_Service/Contained_i.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/IFR_Service/Contained_i.cpp')
-rw-r--r--TAO/orbsvcs/IFR_Service/Contained_i.cpp1182
1 files changed, 1182 insertions, 0 deletions
diff --git a/TAO/orbsvcs/IFR_Service/Contained_i.cpp b/TAO/orbsvcs/IFR_Service/Contained_i.cpp
new file mode 100644
index 00000000000..a4cf9266e73
--- /dev/null
+++ b/TAO/orbsvcs/IFR_Service/Contained_i.cpp
@@ -0,0 +1,1182 @@
+/* -*- C++ -*- */
+// $Id$
+
+#include "concrete_classes.h"
+#include "Servant_Factory.h"
+#include "ace/Auto_Ptr.h"
+
+ACE_RCSID(IFR_Service, Contained_i, "$Id$")
+
+TAO_Contained_i::TAO_Contained_i (
+ TAO_Repository_i *repo,
+ ACE_Configuration_Section_Key section_key
+ )
+ : TAO_IRObject_i (repo, section_key)
+{
+}
+
+TAO_Contained_i::~TAO_Contained_i (void)
+{
+}
+
+void
+TAO_Contained_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+void
+TAO_Contained_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ id);
+
+ // We'll get the last segment of this below.
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ id.c_str (),
+ path);
+
+ // Remove the repo id.
+ this->repo_->config ()->remove_value (this->repo_->repo_ids_key (),
+ id.c_str ());
+
+ // Remove the database entry.
+ ACE_TString container_id;
+ ACE_Configuration_Section_Key parent_key;
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ if (container_id == "")
+ {
+ parent_key = this->repo_->root_key ();
+ }
+ else
+ {
+ ACE_TString parent_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ container_id.c_str (),
+ parent_path);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ parent_path,
+ parent_key,
+ 0);
+ }
+
+ ACE_Configuration_Section_Key defns_key;
+ this->repo_->config ()->open_section (parent_key,
+ "defns",
+ 0,
+ defns_key);
+
+ ACE_TString last_seg = path.substr (path.rfind ('\\') + 1);
+ this->repo_->config ()->remove_section (defns_key,
+ last_seg.c_str (),
+ 1);
+}
+
+char *
+TAO_Contained_i::id (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ return this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+char *
+TAO_Contained_i::id_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString retval;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ retval);
+
+ return CORBA::string_dup (retval.c_str ());
+}
+
+void
+TAO_Contained_i::id (const char *id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->id_i (id
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Contained_i::id_i (const char *id
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString tmp;
+ if (this->repo_->config ()->get_string_value (
+ this->repo_->repo_ids_key (),
+ id,
+ tmp
+ )
+ == 0)
+ {
+ // Repository id already exists.
+ ACE_THROW (CORBA::BAD_PARAM (2, CORBA::COMPLETED_NO));
+ }
+
+ // Get the old id.
+ ACE_TString old_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "id",
+ old_id);
+
+ ACE_TString path;
+
+ // Fetch our path.
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ old_id.c_str (),
+ path);
+
+ // Remove the old id.
+ this->repo_->config ()->remove_value (this->repo_->repo_ids_key (),
+ old_id.c_str ());
+
+ // Save our path under the new id.
+ this->repo_->config ()->set_string_value (this->repo_->repo_ids_key (),
+ id,
+ path.c_str ());
+
+ // Store the new id locally as well.
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "id",
+ id);
+}
+
+char *
+TAO_Contained_i::name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ return this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+char *
+TAO_Contained_i::name_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString retval;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "name",
+ retval);
+
+ return CORBA::string_dup (retval.c_str ());
+}
+
+char *
+TAO_Contained_i::version (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ return this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+char *
+TAO_Contained_i::version_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString retval;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "version",
+ retval);
+
+ return CORBA::string_dup (retval.c_str ());
+}
+
+void
+TAO_Contained_i::name (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->name_i (name
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Contained_i::name_i (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Check if name already exists in this container.
+ CORBA::Boolean exists = this->name_exists (name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (exists)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (3, CORBA::COMPLETED_NO));
+ }
+
+ // Reset the local name.
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "name",
+ name);
+
+ // Update the absolute name.
+ ACE_TString absolute_name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "absolute_name",
+ absolute_name);
+
+ absolute_name = absolute_name.substr (0, absolute_name.rfind (':') + 1);
+ absolute_name += name;
+
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "absolute_name",
+ absolute_name);
+
+ this->contents_name_update (absolute_name,
+ this->section_key_);
+}
+
+void
+TAO_Contained_i::version (const char *version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->version_i (version
+ ACE_ENV_ARG_PARAMETER);
+}
+
+void
+TAO_Contained_i::version_i (const char *version
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->repo_->config ()->set_string_value (this->section_key_,
+ "version",
+ version);
+}
+
+CORBA_Container_ptr
+TAO_Contained_i::defined_in (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA_Container::_nil ());
+
+ return this->defined_in_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA_Container_ptr
+TAO_Contained_i::defined_in_i (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ if (container_id == "")
+ // The repository itself it our container.
+ return this->repo_->repo_objref (); // already duplicated.
+
+ ACE_TString container_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ container_id.c_str (),
+ container_path);
+
+ ACE_Configuration_Section_Key container_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ container_path,
+ container_key);
+
+ u_int kind = 0;
+ this->repo_->config ()->get_integer_value (container_key,
+ "def_kind",
+ kind);
+
+ CORBA::DefinitionKind def_kind =
+ ACE_static_cast (CORBA::DefinitionKind, kind);
+
+ CORBA::Object_var obj =
+ this->repo_->servant_factory ()->create_objref (def_kind,
+ container_path.c_str ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA_Container::_nil ());
+
+ CORBA_Container_var retval = CORBA_Container::_narrow (obj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA_Container::_nil ());
+
+ return retval._retn ();
+}
+
+char *
+TAO_Contained_i::absolute_name (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (0);
+
+ return this->absolute_name_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+char *
+TAO_Contained_i::absolute_name_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString absolute_name;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "absolute_name",
+ absolute_name);
+
+ return CORBA::string_dup (absolute_name.c_str ());
+}
+
+CORBA_Repository_ptr
+TAO_Contained_i::containing_repository (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_READ_GUARD_RETURN (CORBA_Repository::_nil ());
+
+ return this->containing_repository_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+CORBA_Repository_ptr
+TAO_Contained_i::containing_repository_i (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->repo_->repo_objref ();
+}
+
+void
+TAO_Contained_i::move (CORBA_Container_ptr new_container,
+ const char *new_name,
+ const char *new_version
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ TAO_IFR_WRITE_GUARD;
+
+ this->move_i (new_container,
+ new_name,
+ new_version,
+ 1
+ ACE_ENV_ARG_PARAMETER);
+}
+
+CORBA::Boolean
+TAO_Contained_i::name_exists (const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString container_id;
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ if (container_id == "")
+ {
+ return this->repo_->name_exists (name
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ ACE_TString container_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ container_id.c_str (),
+ container_path);
+
+ ACE_Configuration_Section_Key container_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ container_path,
+ container_key,
+ 0);
+
+ ACE_Configuration_Section_Key defns_key;
+ this->repo_->config ()->open_section (container_key,
+ "defns",
+ 0,
+ defns_key);
+
+ ACE_TString section_name;
+ int index = 0;
+
+ while (this->repo_->config ()->enumerate_sections (defns_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key defn_key;
+ this->repo_->config ()->open_section (defns_key,
+ section_name.c_str (),
+ 0,
+ defn_key);
+
+ ACE_TString defn_name;
+ this->repo_->config ()->get_string_value (defn_key,
+ "name",
+ defn_name);
+
+ if (defn_name == name)
+ return 1;
+ }
+
+ return 0;
+}
+
+void
+TAO_Contained_i::contents_name_update (ACE_TString stem,
+ ACE_Configuration_Section_Key key)
+{
+ ACE_Configuration_Section_Key defns_key;
+ if (this->repo_->config ()->open_section (key,
+ "defns",
+ 0,
+ defns_key)
+ != 0)
+ {
+ return;
+ }
+
+ int index = 0;
+ ACE_TString sub_section;
+ while (this->repo_->config ()->enumerate_sections (defns_key,
+ index++,
+ sub_section)
+ == 0)
+ {
+ ACE_Configuration_Section_Key defn_key;
+
+ this->repo_->config ()->open_section (defns_key,
+ sub_section.c_str (),
+ 0,
+ defn_key);
+
+ ACE_TString name;
+ this->repo_->config ()->get_string_value (defn_key,
+ "name",
+ name);
+
+ ACE_TString absolute_name = stem + "::" + name;
+ this->repo_->config ()->set_string_value (defn_key,
+ "absolute_name",
+ absolute_name);
+
+ this->contents_name_update (absolute_name,
+ defn_key);
+ }
+}
+
+void
+TAO_Contained_i::move_i (CORBA_Container_ptr new_container,
+ const char *new_name,
+ const char *new_version,
+ CORBA::Boolean cleanup
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ CORBA_Repository_var my_repo =
+ this->containing_repository_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::DefinitionKind container_dk =
+ new_container->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_Configuration_Section_Key container_key;
+ TAO_Container_i *container_impl = 0;
+
+ // Check that we're not trying to move to a different repository,
+ // and set the container impl, used in each switch case below.
+ if (container_dk == CORBA::dk_Repository)
+ {
+ if (my_repo.in () != new_container)
+ {
+ ACE_THROW (CORBA::BAD_PARAM (4, CORBA::COMPLETED_NO));
+ }
+
+ container_key = this->repo_->root_key ();
+
+ container_impl = this->repo_;
+ }
+ else
+ {
+ PortableServer::ObjectId_var oid =
+ this->repo_->ir_poa ()->reference_to_id (new_container
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::String_var container_path =
+ PortableServer::ObjectId_to_string (oid.in ());
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ container_path.in (),
+ container_key,
+ 0);
+
+ TAO_Contained_i *impl =
+ this->repo_->servant_factory ()->create_contained (container_key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ auto_ptr<TAO_Contained_i> safety (impl);
+
+ CORBA_Repository_var your_repo =
+ impl->containing_repository_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (my_repo.in () != your_repo.in ())
+ {
+ ACE_THROW (CORBA::BAD_PARAM (4, CORBA::COMPLETED_NO));
+ }
+
+ container_impl =
+ this->repo_->servant_factory ()->create_container (container_key
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ CORBA::DefinitionKind my_dk = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::String_var id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // If an exception is thrown, this must be restored.
+ ACE_TString my_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ id.in (),
+ my_path);
+
+ // Remove the repo id, because the create_* function call will add it
+ // again with a different path value.
+ this->repo_->config ()->remove_value (this->repo_->repo_ids_key (),
+ id.in ());
+
+ ACE_TRY
+ {
+ // Call the appropriate create function.
+ switch (my_dk)
+ {
+ case CORBA::dk_Enum:
+ {
+ TAO_EnumDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_EnumMemberSeq_var members = impl.members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Struct
+ || container_dk == CORBA::dk_Union
+ || container_dk == CORBA::dk_Exception)
+ {
+ this->move_pre_process (new_container,
+ my_path.c_str (),
+ new_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ CORBA_EnumDef_var new_defn =
+ container_impl->create_enum_i (id.in (),
+ new_name,
+ new_version,
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ case CORBA::dk_Alias:
+ {
+ TAO_AliasDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_IDLType_var otype = impl.original_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ container_impl->create_alias_i (id.in (),
+ new_name,
+ new_version,
+ otype.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ case CORBA::dk_Native:
+ {
+ container_impl->create_native_i (id.in (),
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ case CORBA::dk_ValueBox:
+ {
+ TAO_ValueBoxDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_IDLType_var otype = impl.original_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ container_impl->create_value_box_i (id.in (),
+ new_name,
+ new_version,
+ otype.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ case CORBA::dk_Struct:
+ {
+ TAO_StructDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_StructMemberSeq_var members = impl.members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Struct
+ || container_dk == CORBA::dk_Union
+ || container_dk == CORBA::dk_Exception)
+ {
+ this->move_pre_process (new_container,
+ my_path.c_str (),
+ new_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ CORBA_StructDef_var new_defn =
+ container_impl->create_struct_i (id.in (),
+ new_name,
+ new_version,
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Union:
+ {
+ TAO_UnionDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_IDLType_var disc_type =
+ impl.discriminator_type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA_UnionMemberSeq_var members = impl.members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Struct
+ || container_dk == CORBA::dk_Union
+ || container_dk == CORBA::dk_Exception)
+ {
+ this->move_pre_process (new_container,
+ my_path.c_str (),
+ new_name
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+
+ CORBA_UnionDef_var new_defn =
+ container_impl->create_union_i (id.in (),
+ new_name,
+ new_version,
+ disc_type.in (),
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Module:
+ {
+ CORBA_ModuleDef_var new_defn =
+ container_impl->create_module_i (id.in (),
+ new_name,
+ new_version
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Exception:
+ {
+ TAO_ExceptionDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_StructMemberSeq_var members = impl.members_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA_ExceptionDef_var new_defn =
+ container_impl->create_exception_i (id.in (),
+ new_name,
+ new_version,
+ members.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Interface:
+ {
+ TAO_InterfaceDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_InterfaceDefSeq_var bases =
+ impl.base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA_InterfaceDef_var new_defn =
+ container_impl->create_interface_i (id.in (),
+ new_name,
+ new_version,
+ bases.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->move_contents (new_defn.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ break;
+ }
+ case CORBA::dk_Constant:
+ {
+ TAO_ConstantDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_IDLType_var type_def = impl.type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Any_var value = impl.value_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ container_impl->create_constant_i (id.in (),
+ new_name,
+ new_version,
+ type_def.in (),
+ value.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ case CORBA::dk_Attribute:
+ {
+ TAO_AttributeDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_IDLType_var type_def = impl.type_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::AttributeMode mode = impl.mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Interface)
+ {
+ TAO_InterfaceDef_i idef (this->repo_,
+ container_key);
+
+ idef.create_attribute_i (id.in (),
+ new_name,
+ new_version,
+ type_def.in (),
+ mode
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ else if (container_dk == CORBA::dk_Value)
+ {
+ TAO_ValueDef_i vdef (this->repo_,
+ container_key);
+
+ vdef.create_attribute_i (id.in (),
+ new_name,
+ new_version,
+ type_def.in (),
+ mode
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ else
+ {
+ ACE_THROW (CORBA::BAD_PARAM (4, CORBA::COMPLETED_NO));
+ }
+ }
+ case CORBA::dk_Operation:
+ {
+ TAO_OperationDef_i impl (this->repo_,
+ this->section_key_);
+
+ CORBA_IDLType_var result = impl.result_def_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::OperationMode mode = impl.mode_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA_ParDescriptionSeq_var params = impl.params_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA_ExceptionDefSeq_var exceptions =
+ impl.exceptions_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA_ContextIdSeq_var contexts = impl.contexts_i (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (container_dk == CORBA::dk_Interface)
+ {
+ TAO_InterfaceDef_i idef (this->repo_,
+ container_key);
+
+ idef.create_operation_i (id.in (),
+ new_name,
+ new_version,
+ result.in (),
+ mode,
+ params.in (),
+ exceptions.in (),
+ contexts.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ else if (container_dk == CORBA::dk_Value)
+ {
+ TAO_ValueDef_i vdef (this->repo_,
+ container_key);
+
+ vdef.create_operation_i (id.in (),
+ new_name,
+ new_version,
+ result.in (),
+ mode,
+ params.in (),
+ exceptions.in (),
+ contexts.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ break;
+ }
+ else
+ {
+ ACE_THROW (CORBA::BAD_PARAM (4, CORBA::COMPLETED_NO));
+ }
+ }
+ case CORBA::dk_Value:
+ case CORBA::dk_Home:
+ case CORBA::dk_Component:
+ case CORBA::dk_Factory:
+ case CORBA::dk_Finder:
+ case CORBA::dk_PrimaryKey:
+ case CORBA::dk_Provides:
+ case CORBA::dk_Uses:
+ case CORBA::dk_Emits:
+ case CORBA::dk_Publishes:
+ case CORBA::dk_Consumes:
+ case CORBA::dk_ValueMember:
+ // TODO
+ default:
+ break;
+ }
+ }
+ ACE_CATCHANY
+ {
+ // If the move was not successful, we must restore this.
+ this->repo_->config ()->set_string_value (
+ this->repo_->repo_ids_key (),
+ id.in (),
+ my_path.c_str ()
+ );
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+ ACE_CHECK;
+
+ if (cleanup)
+ {
+ // Remove the old database entry.
+ ACE_TString container_id;
+ ACE_Configuration_Section_Key parent_key;
+
+ this->repo_->config ()->get_string_value (this->section_key_,
+ "container_id",
+ container_id);
+
+ if (container_id == "")
+ {
+ parent_key = this->repo_->root_key ();
+ }
+ else
+ {
+ ACE_TString parent_path;
+ this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (),
+ container_id.c_str (),
+ parent_path);
+
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ parent_path,
+ parent_key,
+ 0);
+ }
+
+ ACE_Configuration_Section_Key defns_key;
+ this->repo_->config ()->open_section (parent_key,
+ "defns",
+ 0,
+ defns_key);
+
+ ACE_TString last_seg = my_path.substr (my_path.rfind ('\\') + 1);
+ this->repo_->config ()->remove_section (defns_key,
+ last_seg.c_str (),
+ 1);
+ }
+
+ if (container_dk != CORBA::dk_Repository)
+ delete container_impl;
+}
+
+void
+TAO_Contained_i::move_pre_process (CORBA_Container_ptr container,
+ const char *contained_path,
+ const char *name
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ PortableServer::ObjectId_var container_oid =
+ this->repo_->ir_poa ()->reference_to_id (container
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::String_var container_path =
+ PortableServer::ObjectId_to_string (container_oid.in ());
+
+ ACE_Configuration_Section_Key container_key;
+ this->repo_->config ()->expand_path (this->repo_->root_key (),
+ container_path.in (),
+ container_key,
+ 0);
+
+ ACE_Configuration_Section_Key refs_key;
+ this->repo_->config ()->open_section (container_key,
+ "refs",
+ 0,
+ refs_key);
+
+ int index = 0;
+ ACE_TString section_name;
+ while (this->repo_->config ()->enumerate_sections (refs_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key ref_key;
+ this->repo_->config ()->open_section (refs_key,
+ section_name.c_str (),
+ 0,
+ ref_key);
+
+ ACE_TString ref_name;
+ this->repo_->config ()->get_string_value (ref_key,
+ "name",
+ ref_name);
+
+ ACE_TString path;
+ this->repo_->config ()->get_string_value (ref_key,
+ "path",
+ path);
+
+ if (ref_name == name && path == contained_path)
+ {
+ ref_name += this->repo_->extension ();
+ this->repo_->config ()->set_string_value (ref_key,
+ "name",
+ ref_name);
+
+ break;
+ }
+ }
+}
+
+void
+TAO_Contained_i::move_contents (CORBA_Container_ptr new_container
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_TString name;
+ ACE_TString version;
+
+ ACE_Configuration_Section_Key defns_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "defns",
+ 0,
+ defns_key);
+
+ if (status == 0)
+ {
+ u_int count = 0;
+ this->repo_->config ()->get_integer_value (defns_key,
+ "count",
+ count);
+
+ for (u_int i = 0; i < count; ++i)
+ {
+ ACE_Configuration_Section_Key defn_key;
+ CORBA::String_var section_name = this->int_to_string (i);
+ status =
+ this->repo_->config ()->open_section (defns_key,
+ section_name.in (),
+ 0,
+ defn_key);
+
+ if (status == 0)
+ {
+ this->repo_->config ()->get_string_value (defn_key,
+ "name",
+ name);
+
+ this->repo_->config ()->get_string_value (defn_key,
+ "version",
+ version);
+
+ TAO_Contained_i *impl =
+ this->repo_->servant_factory ()->create_contained (
+ defn_key
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+
+ auto_ptr<TAO_Contained_i> safety (impl);
+
+ impl->move_i (new_container,
+ name.c_str (),
+ version.c_str (),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ }
+
+ CORBA::DefinitionKind kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ // Specific to InterfaceDef_i and ValueDef_i
+ if (kind == CORBA::dk_Interface || kind == CORBA::dk_Value)
+ {
+ int index = 0;
+ ACE_TString section_name;
+
+ // Attributes
+ ACE_Configuration_Section_Key attrs_key;
+ int status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "attrs",
+ 0,
+ attrs_key);
+
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (attrs_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key attr_key;
+ this->repo_->config ()->open_section (attrs_key,
+ section_name.c_str (),
+ 0,
+ attr_key);
+
+ this->repo_->config ()->get_string_value (attr_key,
+ "name",
+ name);
+
+ this->repo_->config ()->get_string_value (attr_key,
+ "version",
+ version);
+
+ TAO_AttributeDef_i impl (this->repo_,
+ attr_key);
+
+ impl.move_i (new_container,
+ name.c_str (),
+ version.c_str (),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+
+ index = 0;
+
+ // Operations
+ ACE_Configuration_Section_Key ops_key;
+ status =
+ this->repo_->config ()->open_section (this->section_key_,
+ "ops",
+ 0,
+ ops_key);
+
+ if (status == 0)
+ {
+ while (this->repo_->config ()->enumerate_sections (ops_key,
+ index++,
+ section_name)
+ == 0)
+ {
+ ACE_Configuration_Section_Key op_key;
+ this->repo_->config ()->open_section (ops_key,
+ section_name.c_str (),
+ 0,
+ op_key);
+
+ this->repo_->config ()->get_string_value (op_key,
+ "name",
+ name);
+
+ this->repo_->config ()->get_string_value (op_key,
+ "version",
+ version);
+
+ TAO_OperationDef_i impl (this->repo_,
+ op_key);
+
+ impl.move_i (new_container,
+ name.c_str (),
+ version.c_str (),
+ 0
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+ }
+ }
+}