diff options
Diffstat (limited to 'TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp')
-rw-r--r-- | TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp | 1396 |
1 files changed, 1396 insertions, 0 deletions
diff --git a/TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp b/TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp new file mode 100644 index 00000000000..af7eceb62cc --- /dev/null +++ b/TAO/orbsvcs/IFR_Service/InterfaceDef_i.cpp @@ -0,0 +1,1396 @@ +/* -*- C++ -*- */ +// $Id$ + +#include "InterfaceDef_i.h" +#include "Repository_i.h" +#include "AttributeDef_i.h" +#include "OperationDef_i.h" +#include "Servant_Factory.h" + +ACE_RCSID(IFR_Service, InterfaceDef_i, "$Id$") + +TAO_InterfaceDef_i::TAO_InterfaceDef_i ( + TAO_Repository_i *repo, + ACE_Configuration_Section_Key section_key + ) + : TAO_IRObject_i (repo, section_key), + TAO_Container_i (repo, section_key), + TAO_Contained_i (repo, section_key), + TAO_IDLType_i (repo, section_key) +{ +} + +TAO_InterfaceDef_i::~TAO_InterfaceDef_i (void) +{ +} + +CORBA::DefinitionKind +TAO_InterfaceDef_i::def_kind (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return CORBA::dk_Interface; +} + +void +TAO_InterfaceDef_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_InterfaceDef_i::destroy_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // Destroy our members. + TAO_Container_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + // This will get rid of the repo ids, which Contained_i::destroy()'s + // call to remove_section (recursive = 1) will not get, and also + // destroy the attribute's anonymous type, if any. + this->destroy_special ("attrs" ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + this->destroy_special ("ops" ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + // Destroy ourself. + TAO_Contained_i::destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; +} + +CORBA_Contained::Description * +TAO_InterfaceDef_i::describe (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_IFR_READ_GUARD_RETURN (0); + + return this->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER); +} + +CORBA_Contained::Description * +TAO_InterfaceDef_i::describe_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + CORBA_Contained::Description *desc_ptr = 0; + ACE_NEW_THROW_EX (desc_ptr, + CORBA_Contained::Description, + CORBA::NO_MEMORY ()); + ACE_CHECK_RETURN (0); + + CORBA_Contained::Description_var retval = desc_ptr; + + retval->kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + CORBA_InterfaceDescription ifd; + + ifd.name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + ifd.id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + ACE_TString container_id; + + this->repo_->config ()->get_string_value (this->section_key_, + "container_id", + container_id); + + ifd.defined_in = container_id.c_str (); + + ifd.version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + CORBA::ULong i = 0; + CORBA_InterfaceDefSeq_var bases = this->base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + CORBA::ULong length = bases->length (); + + CORBA_RepositoryIdSeq repo_ids (length); + + repo_ids.length (length); + + PortableServer::ObjectId_var oid; + CORBA::String_var base_path; + ACE_Configuration_Section_Key base_key; + + for (i = 0; i < length; ++i) + { + oid = + this->repo_->ir_poa ()->reference_to_id (bases[i] + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + base_path = + PortableServer::ObjectId_to_string (oid.in ()); + + this->repo_->config ()->expand_path (this->repo_->root_key (), + base_path.in (), + base_key, + 0); + + TAO_InterfaceDef_i impl (this->repo_, + base_key); + + repo_ids[i] = impl.id_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + } + + ifd.base_interfaces = repo_ids; + + retval->value <<= ifd; + + return retval._retn (); +} + +CORBA::TypeCode_ptr +TAO_InterfaceDef_i::type (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_IFR_READ_GUARD_RETURN (CORBA::TypeCode::_nil ()); + + return this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER); +} + +CORBA::TypeCode_ptr +TAO_InterfaceDef_i::type_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_TString id; + + this->repo_->config ()->get_string_value (this->section_key_, + "id", + id); + + ACE_TString name; + + this->repo_->config ()->get_string_value (this->section_key_, + "name", + name); + + return this->repo_->tc_factory ()->create_interface_tc (id.c_str (), + name.c_str () + ACE_ENV_ARG_PARAMETER); +} + +CORBA_InterfaceDefSeq * +TAO_InterfaceDef_i::base_interfaces (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_IFR_READ_GUARD_RETURN (0); + + return this->base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER); +} + +CORBA_InterfaceDefSeq * +TAO_InterfaceDef_i::base_interfaces_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue; + ACE_Unbounded_Queue<ACE_TString> path_queue; + + this->base_interfaces_recursive (kind_queue, + path_queue); + + size_t size = kind_queue.size (); + + CORBA_InterfaceDefSeq *seq = 0; + ACE_NEW_THROW_EX (seq, + CORBA_InterfaceDefSeq (size), + CORBA::NO_MEMORY ()); + ACE_CHECK_RETURN (0); + + seq->length (size); + CORBA_InterfaceDefSeq_var retval = seq; + + for (CORBA::ULong i = 0; i < size; ++i) + { + CORBA::DefinitionKind def_kind; + kind_queue.dequeue_head (def_kind); + + ACE_TString path; + path_queue.dequeue_head (path); + + CORBA::Object_var obj = + this->repo_->servant_factory ()->create_objref ( + def_kind, + path.c_str () + ACE_ENV_ARG_PARAMETER + ); + ACE_CHECK_RETURN (0); + + retval[i] = CORBA_InterfaceDef::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + } + + return retval._retn (); +} + +void +TAO_InterfaceDef_i::base_interfaces (const CORBA_InterfaceDefSeq &base_interfaces + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_IFR_WRITE_GUARD; + + this->base_interfaces_i (base_interfaces + ACE_ENV_ARG_PARAMETER); +} + +void +TAO_InterfaceDef_i::base_interfaces_i (const CORBA_InterfaceDefSeq &base_interfaces + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + // If we are an abstract interface, all our base interfaces must be + // abstract as well. + CORBA::DefinitionKind def_kind = this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + if (def_kind == CORBA::dk_AbstractInterface) + { + CORBA::ULong length = base_interfaces.length (); + + for (CORBA::ULong i = 0; i < length; ++i) + { + def_kind = base_interfaces[i]->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + if (def_kind != CORBA::dk_AbstractInterface) + { + ACE_THROW (CORBA::BAD_PARAM (11, + CORBA::COMPLETED_NO)); + } + } + } + + // Remove the old base interfaces. + this->repo_->config ()->remove_section (this->section_key_, + "inherited", + 0); + + CORBA::ULong length = base_interfaces.length (); + + ACE_Configuration_Section_Key inherited_key; + + this->repo_->config ()->open_section (this->section_key_, + "inherited", + 1, + inherited_key); + + CORBA::String_var name, inherited_path, section_name; + PortableServer::ObjectId_var oid; + ACE_Configuration_Section_Key base_key; + + for (CORBA::ULong i = 0; i < length; i++) + { + oid = + this->repo_->ir_poa ()->reference_to_id (base_interfaces[i] + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + inherited_path = + PortableServer::ObjectId_to_string (oid.in ()); + + this->repo_->config ()->expand_path (this->repo_->root_key (), + inherited_path.in (), + base_key, + 0); + + TAO_InterfaceDef_i impl (this->repo_, + base_key); + + name = impl.name_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + // None of these names can clash with any we may already have. + if (TAO_Container_i::name_exists (name.in ())) + return; + + section_name = this->int_to_string (i); + + this->repo_->config ()->set_string_value (inherited_key, + section_name.in (), + inherited_path.in ()); + } +} + +CORBA::Boolean +TAO_InterfaceDef_i::is_a (const char *interface_id + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_IFR_READ_GUARD_RETURN (0); + + return this->is_a_i (interface_id + ACE_ENV_ARG_PARAMETER); +} + +CORBA::Boolean +TAO_InterfaceDef_i::is_a_i (const char *interface_id + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + if (ACE_OS::strcmp (interface_id, "IDL:omg.org/CORBA/Object:1.0") == 0) + { + return 1; + } + + CORBA::String_var id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + // Is it our type? + if (ACE_OS::strcmp (id.in (), interface_id) == 0) + return 1; + + // Is it one of our ancestors' types? + CORBA_InterfaceDefSeq_var bases = this->base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + CORBA::ULong length = bases->length (); + + PortableServer::ObjectId_var oid; + CORBA::String_var base_path; + ACE_Configuration_Section_Key base_key; + + for (CORBA::ULong i = 0; i < length; i++) + { + oid = + this->repo_->ir_poa ()->reference_to_id (bases[i] + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + base_path = + PortableServer::ObjectId_to_string (oid.in ()); + + this->repo_->config ()->expand_path (this->repo_->root_key (), + base_path.in (), + base_key, + 0); + + TAO_InterfaceDef_i impl (this->repo_, + base_key); + + CORBA::Boolean success = impl.is_a_i (interface_id + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + if (success == 1) + return 1; + } + + return 0; +} + +CORBA_InterfaceDef::FullInterfaceDescription * +TAO_InterfaceDef_i::describe_interface (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_IFR_READ_GUARD_RETURN (0); + + return this->describe_interface_i (ACE_ENV_SINGLE_ARG_PARAMETER); +} + +CORBA_InterfaceDef::FullInterfaceDescription * +TAO_InterfaceDef_i::describe_interface_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + CORBA_InterfaceDef::FullInterfaceDescription *fifd = 0; + ACE_NEW_RETURN (fifd, + CORBA_InterfaceDef::FullInterfaceDescription, + 0); + + CORBA_InterfaceDef::FullInterfaceDescription_var retval = fifd; + + fifd->name = this->name_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + fifd->id = this->id_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + ACE_TString container_id; + + this->repo_->config ()->get_string_value (this->section_key_, + "container_id", + container_id); + + fifd->defined_in = container_id.c_str (); + + fifd->version = this->version_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + CORBA::ULong i = 0; + ACE_TString section_name; + ACE_Unbounded_Queue<ACE_Configuration_Section_Key> key_queue; + + // Operations + this->inherited_operations (key_queue); + + ACE_Configuration_Section_Key ops_key; + int status = + this->repo_->config ()->open_section (this->section_key_, + "ops", + 0, + ops_key); + + u_int count = 0; + + if (status == 0) + { + this->repo_->config ()->get_integer_value (ops_key, + "count", + count); + + for (u_int j = 0; j < count; ++j) + { + ACE_Configuration_Section_Key op_key; + CORBA::String_var section_name = this->int_to_string (j); + status = + this->repo_->config ()->open_section (ops_key, + section_name.in (), + 0, + op_key); + + if (status == 0) + key_queue.enqueue_tail (op_key); + } + } + + size_t size = key_queue.size (); + fifd->operations.length (size); + + for (i = 0; i < size; ++i) + { + ACE_Configuration_Section_Key key; + key_queue.dequeue_head (key); + + TAO_OperationDef_i op (this->repo_, + key); + + fifd->operations[i] = op.make_description (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + } + + // Attributes + this->inherited_attributes (key_queue); + + ACE_Configuration_Section_Key attrs_key; + status = + this->repo_->config ()->open_section (this->section_key_, + "attrs", + 0, + attrs_key); + + count = 0; + + if (status == 0) + { + this->repo_->config ()->get_integer_value (attrs_key, + "count", + count); + + for (u_int j = 0; j < count; ++j) + { + ACE_Configuration_Section_Key attr_key; + CORBA::String_var section_name = this->int_to_string (j); + status = + this->repo_->config ()->open_section (attrs_key, + section_name.in (), + 0, + attr_key); + + if (status == 0) + key_queue.enqueue_tail (attr_key); + } + } + + size = key_queue.size (); + fifd->attributes.length (size); + + for (i = 0; i < size; ++i) + { + ACE_Configuration_Section_Key key; + key_queue.dequeue_head (key); + + TAO_AttributeDef_i attr (this->repo_, + key); + + fifd->attributes[i] = attr.make_description (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + } + + CORBA_InterfaceDefSeq_var bases = this->base_interfaces_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + CORBA::ULong length = bases->length (); + + CORBA_RepositoryIdSeq repo_ids (length); + + repo_ids.length (length); + + PortableServer::ObjectId_var oid; + CORBA::String_var base_path; + ACE_Configuration_Section_Key base_key; + + for (i = 0; i < length; ++i) + { + oid = + this->repo_->ir_poa ()->reference_to_id (bases[i] + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + base_path = + PortableServer::ObjectId_to_string (oid.in ()); + + this->repo_->config ()->expand_path (this->repo_->root_key (), + base_path.in (), + base_key, + 0); + + TAO_InterfaceDef_i impl (this->repo_, + base_key); + + repo_ids[i] = impl.id_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + } + + fifd->base_interfaces = repo_ids; + + fifd->type = this->type_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (0); + + return retval._retn (); +} + +CORBA_AttributeDef_ptr +TAO_InterfaceDef_i::create_attribute ( + const char *id, + const char *name, + const char *version, + CORBA_IDLType_ptr type, + CORBA::AttributeMode mode + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_IFR_WRITE_GUARD_RETURN (CORBA_AttributeDef::_nil ()); + + return this->create_attribute_i (id, + name, + version, + type, + mode + ACE_ENV_ARG_PARAMETER); +} + +CORBA_AttributeDef_ptr +TAO_InterfaceDef_i::create_attribute_i ( + const char *id, + const char *name, + const char *version, + CORBA_IDLType_ptr type, + CORBA::AttributeMode mode + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + CORBA::Boolean bad_params = this->pre_exist (id, + name + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_AttributeDef::_nil ()); + + if (bad_params) + return CORBA_AttributeDef::_nil (); + + bad_params = this->check_inherited_attrs (name + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_AttributeDef::_nil ()); + + if (bad_params) + return CORBA_AttributeDef::_nil (); + + ACE_Configuration_Section_Key attrs_key; + + // Create/open section for attributes. + this->repo_->config ()->open_section (this->section_key_, + "attrs", + 1, + attrs_key); + + ACE_Configuration_Section_Key new_key; + + // Common to all IR objects created in CORBA_Container. + ACE_TString path = this->create_common (attrs_key, + new_key, + id, + name, + version, + "attrs\\", + CORBA::dk_Attribute); + + // Store the path to the attribute's type definition. + PortableServer::ObjectId_var oid = + this->repo_->ir_poa ()->reference_to_id (type + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_AttributeDef::_nil ()); + + CORBA::String_var type_path = + PortableServer::ObjectId_to_string (oid.in ()); + + this->repo_->config ()->set_string_value (new_key, + "type_path", + type_path.in ()); + + // Store the attribute's mode. + this->repo_->config ()->set_integer_value (new_key, + "mode", + mode); + + // Create the set and/or get operations for this attribute. + this->create_attr_ops (id, + name, + version, + type, + mode + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA::AttributeDef::_nil ()); + +#if 0 // CCM specific. + + CORBA::ULong i = 0; + + CORBA::ULong length = get_exceptions.length (); + + if (length > 0) + { + // Open a section for the 'get' exceptions. + ACE_Configuration_Section_Key get_excepts_key; + + this->repo_->config ()->open_section (new_key, + "get_excepts", + 1, + get_excepts_key); + + // Store the paths to the 'get' exceptions. + for (i = 0; i < length; ++i) + { + PortableServer::ObjectId_var oid = + this->repo_->ir_poa ()->reference_to_id (get_exceptions[i] + ACE_ENV_ARG_PARAMETER); + + ACE_CHECK_RETURN (CORBA_AttributeDef::_nil ()); + + CORBA::String_var get_except_path = + PortableServer::ObjectId_to_string (oid.in ()); + + CORBA::String_var section_name = this->int_to_string (i); + + this->repo_->config ()->set_string_value (get_excepts_key, + section_name.in (), + get_except_path.in ()); + } + } + + length = put_exceptions.length (); + + if (length > 0) + { + // Open a section for the 'put' exceptions. + ACE_Configuration_Section_Key put_excepts_key; + + this->repo_->config ()->open_section (new_key, + "put_excepts", + 1, + put_excepts_key); + + // Store the paths to the 'put' exceptions. + for (i = 0; i < length; ++i) + { + PortableServer::ObjectId_var oid = + this->repo_->ir_poa ()->reference_to_id (put_exceptions[i] + ACE_ENV_ARG_PARAMETER); + + ACE_CHECK_RETURN (CORBA_AttributeDef::_nil ()); + + CORBA::String_var put_except_path = + PortableServer::ObjectId_to_string (oid.in ()); + + CORBA::String_var section_name = this->int_to_string (i); + + this->repo_->config ()->set_string_value (put_excepts_key, + section_name.in (), + put_except_path.in ()); + } + } + +#endif /* CCM specific. */ + + // Create the object reference. + CORBA::Object_var obj = + this->repo_->servant_factory ()->create_objref (CORBA::dk_Attribute, + path.c_str () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_AttributeDef::_nil ()); + + CORBA_AttributeDef_var retval = + CORBA_AttributeDef::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_AttributeDef::_nil ()); + + return retval._retn (); +} + +CORBA_OperationDef_ptr +TAO_InterfaceDef_i::create_operation (const char *id, + const char *name, + const char *version, + CORBA_IDLType_ptr result, + CORBA::OperationMode mode, + const CORBA_ParDescriptionSeq ¶ms, + const CORBA_ExceptionDefSeq &exceptions, + const CORBA_ContextIdSeq &contexts + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + TAO_IFR_WRITE_GUARD_RETURN (CORBA_OperationDef::_nil ()); + + return this->create_operation_i (id, + name, + version, + result, + mode, + params, + exceptions, + contexts + ACE_ENV_ARG_PARAMETER); +} + +CORBA_OperationDef_ptr +TAO_InterfaceDef_i::create_operation_i (const char *id, + const char *name, + const char *version, + CORBA_IDLType_ptr result, + CORBA::OperationMode mode, + const CORBA_ParDescriptionSeq ¶ms, + const CORBA_ExceptionDefSeq &exceptions, + const CORBA_ContextIdSeq &contexts + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + CORBA::Boolean bad_params = this->pre_exist (id, + name + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); + + if (bad_params) + { + return CORBA_OperationDef::_nil (); + } + + ACE_Configuration_Section_Key ops_key; + + // Create/open section for attributes. + this->repo_->config ()->open_section (this->section_key_, + "ops", + 1, + ops_key); + + ACE_Configuration_Section_Key new_key; + + // Common to all IR objects created in CORBA_Container. + ACE_TString path = this->create_common (ops_key, + new_key, + id, + name, + version, + "ops\\", + CORBA::dk_Operation); + + CORBA::TypeCode_var rettype = result->type (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); + CORBA::TCKind kind = rettype->kind (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); + + // Oneway operations cannot have a non-void return type. + if (mode == CORBA::OP_ONEWAY && kind != CORBA::tk_void) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (31, + CORBA::COMPLETED_NO), + CORBA_OperationDef::_nil ()); + } + + // Get the path to our return type and store it. + PortableServer::ObjectId_var oid = + this->repo_->ir_poa ()->reference_to_id (result + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); + + CORBA::String_var result_path = + PortableServer::ObjectId_to_string (oid.in ()); + + this->repo_->config ()->set_string_value (new_key, + "result", + result_path.in ()); + + // Store the operation mode. + this->repo_->config ()->set_integer_value (new_key, + "mode", + mode); + + CORBA::ULong i = 0; + + // Store the operation's parameter info. + CORBA::ULong length = params.length (); + + if (length > 0) + { + ACE_Configuration_Section_Key params_key; + + this->repo_->config ()->open_section (new_key, + "params", + 1, + params_key); + + this->repo_->config ()->set_integer_value (params_key, + "count", + length); + + for (i = 0; i < length; ++i) + { + // Oneway operations cannot have INOUT or OUT parameters. + if (mode == CORBA::OP_ONEWAY && params[i].mode != CORBA::PARAM_IN) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (31, + CORBA::COMPLETED_NO), + CORBA_OperationDef::_nil ()); + } + + ACE_Configuration_Section_Key param_key; + CORBA::String_var section_name = this->int_to_string (i); + + this->repo_->config ()->open_section (params_key, + section_name.in (), + 1, + param_key); + + this->repo_->config ()->set_string_value (param_key, + "name", + params[i].name.in ()); + PortableServer::ObjectId_var oid = + this->repo_->ir_poa ()->reference_to_id (params[i].type_def.in () + ACE_ENV_ARG_PARAMETER); + + ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); + + CORBA::String_var type_path = + PortableServer::ObjectId_to_string (oid.in ()); + + this->repo_->config ()->set_string_value (param_key, + "type_path", + type_path.in ()); + + this->repo_->config ()->set_integer_value (param_key, + "mode", + params[i].mode); + } + } + + // Store the operation's exception info. + length = exceptions.length (); + + if (length > 0) + { + // Oneway operations cannot throw any user exceptions. + if (mode == CORBA::OP_ONEWAY) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (31, + CORBA::COMPLETED_NO), + CORBA_OperationDef::_nil ()); + } + + ACE_Configuration_Section_Key excepts_key; + + this->repo_->config ()->open_section (new_key, + "excepts", + 1, + excepts_key); + + for (i = 0; i < length; ++i) + { + PortableServer::ObjectId_var oid = + this->repo_->ir_poa ()->reference_to_id (exceptions[i] + ACE_ENV_ARG_PARAMETER); + + ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); + + CORBA::String_var type_path = + PortableServer::ObjectId_to_string (oid.in ()); + + CORBA::String_var section_name = this->int_to_string (i); + + this->repo_->config ()->set_string_value (excepts_key, + section_name.in (), + type_path.in ()); + } + } + + // Store the operation's context info. + length = contexts.length (); + + if (length > 0) + { + ACE_Configuration_Section_Key contexts_key; + + this->repo_->config ()->open_section (new_key, + "contexts", + 1, + contexts_key); + + for (i = 0; i < length; ++i) + { + CORBA::String_var section_name = this->int_to_string (i); + + this->repo_->config ()->set_string_value (contexts_key, + section_name.in (), + contexts[i].in ()); + } + } + + // Create the object reference. + CORBA::Object_var obj = + this->repo_->servant_factory ()->create_objref (CORBA::dk_Operation, + path.c_str () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); + + CORBA_OperationDef_var retval = + CORBA_OperationDef::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (CORBA_OperationDef::_nil ()); + + return retval._retn (); +} + +void +TAO_InterfaceDef_i::interface_contents ( + ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue, + ACE_Unbounded_Queue<ACE_TString> &path_queue, + CORBA::DefinitionKind limit_type, + CORBA::Boolean exclude_inherited + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_TString id; + this->repo_->config ()->get_string_value (this->section_key_, + "id", + id); + + ACE_TString path; + this->repo_->config ()->get_string_value (this->repo_->repo_ids_key (), + id.c_str (), + path); + + ACE_TString section_name; + int index = 0; + + // Attributes + if (limit_type == CORBA::dk_Attribute + || limit_type == CORBA::dk_all) + { + ACE_Configuration_Section_Key attrs_key; + this->repo_->config ()->open_section (this->section_key_, + "attrs", + 0, + attrs_key); + + while (this->repo_->config ()->enumerate_sections (attrs_key, + index++, + section_name) + == 0) + { + kind_queue.enqueue_tail (CORBA::dk_Attribute); + + path_queue.enqueue_tail ( + path + "\\attrs\\" + section_name.c_str () + ); + } + } + + // Operations + if (limit_type == CORBA::dk_Operation + || limit_type == CORBA::dk_all) + { + index = 0; + + ACE_Configuration_Section_Key ops_key; + this->repo_->config ()->open_section (this->section_key_, + "ops", + 0, + ops_key); + + while (this->repo_->config ()->enumerate_sections (ops_key, + index++, + section_name) + == 0) + { + kind_queue.enqueue_tail (CORBA::dk_Operation); + + path_queue.enqueue_tail ( + path + "\\ops\\" + section_name.c_str () + ); + } + } + + if (exclude_inherited == 0) + { + // Must recurse through the base interfaces. + ACE_Configuration_Section_Key inherited_key; + this->repo_->config ()->open_section (this->section_key_, + "inherited", + 0, + inherited_key); + + ACE_TString base_path; + ACE_Configuration_Section_Key base_key; + ACE_Configuration::VALUETYPE type; + index = 0; + + while (this->repo_->config ()->enumerate_values (inherited_key, + index++, + section_name, + type) + == 0) + { + this->repo_->config ()->get_string_value (inherited_key, + section_name.c_str (), + base_path); + + this->repo_->config ()->expand_path (this->repo_->root_key (), + base_path, + base_key, + 0); + + TAO_InterfaceDef_i base_iface (this->repo_, + base_key); + + base_iface.interface_contents (kind_queue, + path_queue, + limit_type, + exclude_inherited + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } + } +} + +void +TAO_InterfaceDef_i::destroy_special (const char *sub_section + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_Configuration_Section_Key sub_key; + this->repo_->config ()->open_section (this->section_key_, + sub_section, + 0, + sub_key); + + ACE_TString section_name; + int index = 0; + while (this->repo_->config ()->enumerate_sections (sub_key, + index++, + section_name) + == 0) + { + ACE_Configuration_Section_Key member_key; + this->repo_->config ()->open_section (sub_key, + section_name.c_str (), + 0, + member_key); + + if (ACE_OS::strcmp (sub_section, "attrs") == 0) + { + TAO_AttributeDef_i attr (this->repo_, + member_key); + + attr.destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + } + else + { + TAO_OperationDef_i op (this->repo_, + member_key); + + op.destroy_i (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + } + } + +} + +void +TAO_InterfaceDef_i::create_attr_ops (const char *id, + const char *name, + const char *version, + CORBA_IDLType_ptr type, + CORBA::AttributeMode mode + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_CString the_get_name ("_get_"); + + ACE_CString start (id); + + int pos = start.find (name); + + ACE_CString piece (start.substr (pos)); + + ACE_CString the_get_id (start.substr (0, pos) + the_get_name + piece); + + the_get_name += name; + + CORBA_ParDescriptionSeq params (0); + CORBA_ExceptionDefSeq excepts (0); + CORBA_ContextIdSeq contexts (0); + + CORBA_OperationDef_var the_get_op = + this->create_operation_i (the_get_id.c_str (), + the_get_name.c_str (), + version, + type, + CORBA::OP_NORMAL, + params, + excepts, + contexts + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + if (mode == CORBA::ATTR_NORMAL) + { + ACE_CString the_set_name ("_set_"); + + ACE_CString the_set_id (start.substr (0, pos) + the_set_name + piece); + + the_set_name += name; + + CORBA_PrimitiveDef_var rettype = + this->repo_->get_primitive (CORBA::pk_void + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + params.length (1); + + params[0].name = name; + params[0].type = CORBA::TypeCode::_duplicate (CORBA::_tc_void); + params[0].type_def = CORBA::IDLType::_duplicate (type); + params[0].mode = CORBA::PARAM_IN; + + CORBA_OperationDef_var the_set_op = + this->create_operation_i (the_set_id.c_str (), + the_set_name.c_str (), + version, + rettype.in (), + CORBA::OP_NORMAL, + params, + excepts, + contexts + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } +} + +void +TAO_InterfaceDef_i::base_interfaces_recursive ( + ACE_Unbounded_Queue<CORBA::DefinitionKind> &kind_queue, + ACE_Unbounded_Queue<ACE_TString> &path_queue + ) +{ + ACE_Configuration_Section_Key inherited_key; + this->repo_->config ()->open_section (this->section_key_, + "inherited", + 0, + inherited_key); + + int index = 0; + int status = 0; + u_int kind = 0; + ACE_Configuration::VALUETYPE type; + ACE_TString section_name, inherited_path; + CORBA::DefinitionKind def_kind = CORBA::dk_none; + ACE_Configuration_Section_Key base_key; + + while (this->repo_->config ()->enumerate_values (inherited_key, + index++, + section_name, + type) + == 0) + { + this->repo_->config ()->get_string_value (inherited_key, + section_name.c_str (), + inherited_path); + + status = + this->repo_->config ()->expand_path (this->repo_->root_key (), + inherited_path, + base_key, + 0); + + if (status == 0) + { + TAO_InterfaceDef_i tmp (this->repo_, + base_key); + + tmp.base_interfaces_recursive (kind_queue, + path_queue); + + path_queue.enqueue_tail (inherited_path); + + this->repo_->config ()->get_integer_value (base_key, + "def_kind", + kind); + + def_kind = ACE_static_cast (CORBA::DefinitionKind, kind); + + kind_queue.enqueue_tail (def_kind); + } + } +} + +void +TAO_InterfaceDef_i::inherited_attributes ( + ACE_Unbounded_Queue<ACE_Configuration_Section_Key> &key_queue + ) +{ + ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue; + ACE_Unbounded_Queue<ACE_TString> path_queue; + + this->base_interfaces_recursive (kind_queue, + path_queue); + + size_t size = path_queue.size (); + ACE_Configuration_Section_Key base_key, attrs_key, attr_key; + int status = 0; + ACE_TString path_name; + u_int count = 0; + + for (size_t i = 0; i < size; ++i) + { + path_queue.dequeue_head (path_name); + + status = + this->repo_->config ()->expand_path (this->repo_->root_key (), + path_name, + base_key, + 0); + + if (status == 0) + { + this->repo_->config ()->open_section (base_key, + "attrs", + 0, + attrs_key); + + this->repo_->config ()->get_integer_value (attrs_key, + "count", + count); + + for (u_int j = 0; j < count; ++j) + { + this->repo_->config ()->open_section (attrs_key, + this->int_to_string (j), + 0, + attr_key); + + key_queue.enqueue_tail (attr_key); + } + } + } +} + +void +TAO_InterfaceDef_i::inherited_operations ( + ACE_Unbounded_Queue<ACE_Configuration_Section_Key> &key_queue + ) +{ + ACE_Unbounded_Queue<CORBA::DefinitionKind> kind_queue; + ACE_Unbounded_Queue<ACE_TString> path_queue; + + this->base_interfaces_recursive (kind_queue, + path_queue); + + size_t size = path_queue.size (); + ACE_Configuration_Section_Key base_key, ops_key, op_key; + int status = 0; + ACE_TString path_name; + u_int count = 0; + + for (size_t i = 0; i < size; ++i) + { + path_queue.dequeue_head (path_name); + + status = + this->repo_->config ()->expand_path (this->repo_->root_key (), + path_name, + base_key, + 0); + + if (status == 0) + { + this->repo_->config ()->open_section (base_key, + "ops", + 0, + ops_key); + + this->repo_->config ()->get_integer_value (ops_key, + "count", + count); + + for (u_int j = 0; j < count; ++j) + { + this->repo_->config ()->open_section (ops_key, + this->int_to_string (j), + 0, + op_key); + + key_queue.enqueue_tail (op_key); + } + } + } +} + +CORBA::Boolean +TAO_InterfaceDef_i::check_inherited_attrs (const char *name + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + ACE_Unbounded_Queue<ACE_Configuration_Section_Key> key_queue; + + this->inherited_attributes (key_queue); + + size_t size = key_queue.size (); + ACE_Configuration_Section_Key attr_key; + ACE_TString attr_name; + + for (u_int i = 0; i < size; ++i) + { + key_queue.dequeue_head (attr_key); + + this->repo_->config ()->get_string_value (attr_key, + "name", + attr_name); + + if (attr_name == name) + { + ACE_THROW_RETURN (CORBA::BAD_PARAM (5, + CORBA::COMPLETED_NO), + 1); + } + } + + return 0; +} |