📄 container_i.cpp
字号:
CORBA::String_var tmp;
TAO_Contained_i *impl = 0;
for (CORBA::ULong i = 0; i < ret_len; ++i)
{
ACE_TString contained_path (
TAO_IFR_Service_Utils::reference_to_path (contents[i])
);
impl = TAO_IFR_Service_Utils::path_to_contained (contained_path,
this->repo_);
desc = impl->describe_i (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
retval[i].contained_object = CORBA::Contained::_duplicate (contents[i]);
retval[i].kind = desc->kind;
retval[i].value = desc->value;
}
return retval._retn ();
}
CORBA::ModuleDef_ptr
TAO_Container_i::create_module (const char *id,
const char *name,
const char *version
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_IFR_WRITE_GUARD_RETURN (CORBA::ModuleDef::_nil ());
this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::ModuleDef::_nil ());
return this->create_module_i (id,
name,
version
ACE_ENV_ARG_PARAMETER);
}
CORBA::ModuleDef_ptr
TAO_Container_i::create_module_i (const char *id,
const char *name,
const char *version
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
// new_key is not needed when creating a module, but it is needed
// by most of the other creation methods, so a blank one gets passed in.
TAO_Container_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_Module,
this->section_key_,
new_key,
this->repo_,
id,
name,
&TAO_Container_i::same_as_tmp_name,
version,
"defns"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::ModuleDef::_nil ());
// Create the object reference.
CORBA::Object_var obj =
TAO_IFR_Service_Utils::create_objref (CORBA::dk_Module,
path.c_str (),
this->repo_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::ModuleDef::_nil ());
return CORBA::ComponentIR::ModuleDef::_narrow (obj.in ()
ACE_ENV_ARG_PARAMETER);
}
CORBA::ConstantDef_ptr
TAO_Container_i::create_constant (const char *id,
const char *name,
const char *version,
CORBA::IDLType_ptr type,
const CORBA::Any &value
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_IFR_WRITE_GUARD_RETURN (CORBA::ConstantDef::_nil ());
this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::ConstantDef::_nil ());
return this->create_constant_i (id,
name,
version,
type,
value
ACE_ENV_ARG_PARAMETER);
}
CORBA::ConstantDef_ptr
TAO_Container_i::create_constant_i (const char *id,
const char *name,
const char *version,
CORBA::IDLType_ptr type,
const CORBA::Any &value
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_Container_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_Constant,
this->section_key_,
new_key,
this->repo_,
id,
name,
&TAO_Container_i::same_as_tmp_name,
version,
"defns"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::ConstantDef::_nil ());
// Get the path to our type and store it.
char *type_path = TAO_IFR_Service_Utils::reference_to_path (type);
this->repo_->config ()->set_string_value (new_key,
"type_path",
type_path);
// Store the value.
ACE_Message_Block *mb = value._tao_get_cdr ();
CORBA::TypeCode_var val_tc = value.type ();
CORBA::TCKind kind = val_tc->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::ConstantDef::_nil ());
switch (kind)
{
// The data for these types requires alignment to an 8-byte
// boundary - the default for TAO CDR streams is 4.
case CORBA::tk_double:
case CORBA::tk_ulonglong:
case CORBA::tk_longlong:
case CORBA::tk_longdouble:
mb->rd_ptr (ACE_ptr_align_binary (mb->rd_ptr (),
ACE_CDR::MAX_ALIGNMENT));
break;
default:
break;
}
// Align the read pointer with the base, so mb->length()
// will be meaningful.
mb->crunch ();
this->repo_->config ()->set_binary_value (new_key,
"value",
mb->base (),
mb->length ());
// Create the object reference.
CORBA::Object_var obj =
TAO_IFR_Service_Utils::create_objref (CORBA::dk_Constant,
path.c_str (),
this->repo_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::ConstantDef::_nil ());
return CORBA::ConstantDef::_narrow (obj.in ()
ACE_ENV_ARG_PARAMETER);
}
CORBA::StructDef_ptr
TAO_Container_i::create_struct (const char *id,
const char *name,
const char *version,
const CORBA::StructMemberSeq &members
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_IFR_WRITE_GUARD_RETURN (CORBA::StructDef::_nil ());
this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::StructDef::_nil ());
return this->create_struct_i (id,
name,
version,
members
ACE_ENV_ARG_PARAMETER);
}
CORBA::StructDef_ptr
TAO_Container_i::create_struct_i (const char *id,
const char *name,
const char *version,
const CORBA::StructMemberSeq &members
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_Container_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_Struct,
this->section_key_,
new_key,
this->repo_,
id,
name,
&TAO_Container_i::same_as_tmp_name,
version,
"defns"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::StructDef::_nil ());
// Open a section for the struct's members.
ACE_Configuration_Section_Key refs_key;
this->repo_->config ()->open_section (new_key,
"refs",
1,
refs_key);
CORBA::ULong count = members.length ();
this->repo_->config ()->set_integer_value (refs_key,
"count",
count);
char *member_path = 0;
// Create a section for each member. We just store the
// member name and the path to its database entry.
for (CORBA::ULong i = 0; i < count; ++i)
{
ACE_Configuration_Section_Key member_key;
char *stringified = TAO_IFR_Service_Utils::int_to_string (i);
this->repo_->config ()->open_section (refs_key,
stringified,
1,
member_key);
this->repo_->config ()->set_string_value (member_key,
"name",
members[i].name.in ());
member_path =
TAO_IFR_Service_Utils::reference_to_path (members[i].type_def.in ());
this->repo_->config ()->set_string_value (member_key,
"path",
member_path);
}
CORBA::DefinitionKind def_kind =
this->def_kind (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::StructDef::_nil ());
if (def_kind == CORBA::dk_Struct
|| def_kind == CORBA::dk_Union
|| def_kind == CORBA::dk_Exception)
{
this->update_refs (path.c_str (),
name);
}
// Create the object reference.
CORBA::Object_var obj =
TAO_IFR_Service_Utils::create_objref (CORBA::dk_Struct,
path.c_str (),
this->repo_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::StructDef::_nil ());
return CORBA::StructDef::_narrow (obj.in ()
ACE_ENV_ARG_PARAMETER);
}
CORBA::UnionDef_ptr
TAO_Container_i::create_union (const char *id,
const char *name,
const char *version,
CORBA::IDLType_ptr discriminator_type,
const CORBA::UnionMemberSeq &members
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_IFR_WRITE_GUARD_RETURN (CORBA::UnionDef::_nil ());
this->update_key (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::UnionDef::_nil ());
return this->create_union_i (id,
name,
version,
discriminator_type,
members
ACE_ENV_ARG_PARAMETER);
}
CORBA::UnionDef_ptr
TAO_Container_i::create_union_i (const char *id,
const char *name,
const char *version,
CORBA::IDLType_ptr discriminator_type,
const CORBA::UnionMemberSeq &members
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
TAO_Container_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_Union,
this->section_key_,
new_key,
this->repo_,
id,
name,
&TAO_Container_i::same_as_tmp_name,
version,
"defns"
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::UnionDef::_nil ());
// Add a field to hold the path to the discriminator type.
char *disc_path =
TAO_IFR_Service_Utils::reference_to_path (discriminator_type);
this->repo_->config ()->set_string_value (new_key,
"disc_path",
disc_path);
ACE_Configuration_Section_Key refs_key;
// For the union's members.
this->repo_->config ()->open_section (new_key,
"refs",
1,
refs_key);
CORBA::ULong count = members.length ();
this->repo_->config ()->set_integer_value (refs_key,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -