dynarray_i.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 679 行 · 第 1/2 页
CPP
679 行
}
void
TAO_DynArray_i::set_elements_as_dyn_any (
const DynamicAny::DynAnySeq & values
ACE_ENV_ARG_DECL
)
ACE_THROW_SPEC ((
CORBA::SystemException,
DynamicAny::DynAny::TypeMismatch,
DynamicAny::DynAny::InvalidValue
))
{
if (this->destroyed_)
{
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
}
CORBA::ULong length = ACE_static_cast (CORBA::ULong,
this->da_members_.size ());
if (values.length () != length)
{
ACE_THROW (DynamicAny::DynAny::InvalidValue ());
}
CORBA::TypeCode_var element_type =
this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
CORBA::TypeCode_var val_type;
CORBA::Boolean equivalent;
for (CORBA::ULong i = 0; i < length; ++i)
{
val_type = values[i]->type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
equivalent = val_type->equivalent (element_type.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (equivalent)
{
this->da_members_[i] =
values[i]->copy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
}
else
{
ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
}
}
}
// ****************************************************************
void
TAO_DynArray_i::from_any (const CORBA::Any& any
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException,
DynamicAny::DynAny::TypeMismatch,
DynamicAny::DynAny::InvalidValue
))
{
if (this->destroyed_)
{
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
}
CORBA::TypeCode_var tc = any.type ();
CORBA::Boolean equivalent =
this->type_.in ()->equivalent (tc.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (equivalent)
{
// Get the CDR stream of the argument.
ACE_Message_Block* mb = any._tao_get_cdr ();
bool type_known = false;
if (mb == 0)
{
ACE_NEW (mb,
ACE_Message_Block);
TAO_OutputCDR out;
any.impl ()->marshal_value (out);
ACE_CDR::consolidate (mb, out.begin ());
type_known = true;
}
TAO_InputCDR cdr (mb,
any._tao_byte_order ());
if (type_known)
{
mb->release ();
}
CORBA::ULong length = ACE_static_cast (CORBA::ULong,
this->da_members_.size ());
CORBA::ULong arg_length = this->get_tc_length (tc.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (length != arg_length)
{
ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
}
CORBA::TypeCode_var field_tc =
this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
for (CORBA::ULong i = 0; i < arg_length; ++i)
{
CORBA::Any field_any;
TAO::Unknown_IDL_Type *unk = 0;
ACE_NEW (unk,
TAO::Unknown_IDL_Type (field_tc.in (),
cdr.start (),
cdr.byte_order ()));
field_any.replace (unk);
this->da_members_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
this->da_members_[i] =
TAO_DynAnyFactory::make_dyn_any (field_any
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
// Move to the next field in the CDR stream.
(void) TAO_Marshal_Object::perform_skip (field_tc.in (),
&cdr
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
this->current_position_ = arg_length ? 0 : -1;
}
else
{
ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
}
}
CORBA::Any_ptr
TAO_DynArray_i::to_any (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException
))
{
if (this->destroyed_)
{
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
0);
}
CORBA::TypeCode_var field_tc =
this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
TAO_OutputCDR out_cdr;
CORBA::Any_var field_any;
size_t length = this->da_members_.size ();
bool type_known = false;
for (size_t i = 0; i < length; ++i)
{
// Recursive step.
field_any =
this->da_members_[i]->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
ACE_Message_Block* field_mb = field_any->_tao_get_cdr ();
if (field_mb == 0)
{
ACE_NEW_THROW_EX (field_mb,
ACE_Message_Block,
CORBA::NO_MEMORY ());
TAO_OutputCDR out;
field_any->impl ()->marshal_value (out);
ACE_CDR::consolidate (field_mb, out.begin ());
type_known = true;
}
TAO_InputCDR field_cdr (field_mb,
field_any->_tao_byte_order ());
if (type_known)
{
field_mb->release ();
type_known = false;
}
(void) TAO_Marshal_Object::perform_append (field_tc.in (),
&field_cdr,
&out_cdr
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
}
TAO_InputCDR in_cdr (out_cdr);
CORBA::Any_ptr retval = 0;
ACE_NEW_THROW_EX (retval,
CORBA::Any,
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
TAO::Unknown_IDL_Type *unk = 0;
ACE_NEW_THROW_EX (unk,
TAO::Unknown_IDL_Type (this->type_.in (),
in_cdr.start (),
in_cdr.byte_order ()),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
retval->replace (unk);
return retval;
}
CORBA::Boolean
TAO_DynArray_i::equal (DynamicAny::DynAny_ptr rhs
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException
))
{
if (this->destroyed_)
{
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
0);
}
CORBA::TypeCode_var tc = rhs->type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
CORBA::Boolean equivalent = tc->equivalent (this->type_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
if (!equivalent)
{
return 0;
}
DynamicAny::DynAny_var tmp;
CORBA::Boolean member_equal;
for (CORBA::ULong i = 0; i < this->component_count_; ++i)
{
rhs->seek (ACE_static_cast (CORBA::Long,
i)
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
tmp = rhs->current_component (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
// Recursive step.
member_equal = tmp->equal (this->da_members_[i].in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
if (!member_equal)
{
return 0;
}
}
return 1;
}
void
TAO_DynArray_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException
))
{
if (this->destroyed_)
{
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
}
if (!this->ref_to_component_ || this->container_is_destroying_)
{
// Do a deep destroy.
for (CORBA::ULong i = 0; i < this->component_count_; ++i)
{
this->set_flag (da_members_[i].in (),
1
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->da_members_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
}
this->destroyed_ = 1;
}
}
DynamicAny::DynAny_ptr
TAO_DynArray_i::current_component (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException,
DynamicAny::DynAny::TypeMismatch
))
{
if (this->destroyed_)
{
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
DynamicAny::DynAny::_nil ());
}
if (this->current_position_ == -1)
{
return DynamicAny::DynAny::_nil ();
}
CORBA::ULong index = ACE_static_cast (CORBA::ULong,
this->current_position_);
this->set_flag (this->da_members_[index].in (),
0
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (DynamicAny::DynAny::_nil ());
return DynamicAny::DynAny::_duplicate (
this->da_members_[index].in ()
);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?