dynsequence_i.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 851 行 · 第 1/2 页
CPP
851 行
/* -*- C++ -*- */
// DynSequence_i.cpp,v 1.24 2003/11/21 17:20:01 parsons Exp
#include "DynSequence_i.h"
#include "DynAnyFactory.h"
#include "tao/Marshal.h"
#include "tao/Any_Unknown_IDL_Type.h"
ACE_RCSID (DynamicAny,
DynSequence_i,
"DynSequence_i.cpp,v 1.24 2003/11/21 17:20:01 parsons Exp")
TAO_DynSequence_i::TAO_DynSequence_i (void)
{
}
TAO_DynSequence_i::~TAO_DynSequence_i (void)
{
}
void
TAO_DynSequence_i::init_common (void)
{
this->ref_to_component_ = 0;
this->container_is_destroying_ = 0;
this->has_components_ = 1;
this->destroyed_ = 0;
this->current_position_ = -1;
this->component_count_ = ACE_static_cast (CORBA::ULong,
this->da_members_.size ());
}
void
TAO_DynSequence_i::init (const CORBA::Any& any
ACE_ENV_ARG_DECL)
{
CORBA::TypeCode_var tc = any.type ();
CORBA::TCKind kind =
TAO_DynAnyFactory::unalias (tc.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (kind != CORBA::tk_sequence)
{
ACE_THROW (DynamicAny::DynAnyFactory::InconsistentTypeCode ());
}
this->type_ = tc;
// 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;
// If the any is a sequence, first 4 bytes of cdr hold the
// length.
cdr.read_ulong (length);
// Resize the array.
this->da_members_.size (length);
this->init_common ();
// Get the type of the sequence elments.
CORBA::TypeCode_var field_tc =
this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
for (CORBA::ULong i = 0; i < 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 recursive step will call the correct constructor
// based on the type of field_any.
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;
}
}
void
TAO_DynSequence_i::init (CORBA::TypeCode_ptr tc
ACE_ENV_ARG_DECL)
{
CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (kind != CORBA::tk_sequence)
{
ACE_THROW (DynamicAny::DynAnyFactory::InconsistentTypeCode ());
}
// Empty sequence.
this->da_members_.size (0);
this->init_common ();
this->type_ = CORBA::TypeCode::_duplicate (tc);
}
// ****************************************************************
TAO_DynSequence_i *
TAO_DynSequence_i::_narrow (CORBA::Object_ptr _tao_objref
ACE_ENV_ARG_DECL_NOT_USED)
{
if (CORBA::is_nil (_tao_objref))
{
return 0;
}
return dynamic_cast<TAO_DynSequence_i *> (_tao_objref);
}
// ****************************************************************
CORBA::TypeCode_ptr
TAO_DynSequence_i::get_element_type (ACE_ENV_SINGLE_ARG_DECL)
{
CORBA::TypeCode_var element_type =
CORBA::TypeCode::_duplicate (this->type_.in ());
// Strip away aliases (if any) on top of the outer type.
CORBA::TCKind kind = element_type->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
while (kind != CORBA::tk_sequence)
{
element_type = element_type->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
kind = element_type->kind (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
}
// Return the content type.
CORBA::TypeCode_ptr retval =
element_type->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::TypeCode::_nil ());
return retval;
}
// = Functions specific to DynSequence.
CORBA::ULong
TAO_DynSequence_i::get_length (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException
))
{
if (this->destroyed_)
{
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
0);
}
return this->component_count_;
}
void
TAO_DynSequence_i::set_length (CORBA::ULong length
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException,
DynamicAny::DynAny::InvalidValue
))
{
if (this->destroyed_)
{
ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
}
// CORBA::TypeCode::length() does not accept aliased type codes.
CORBA::TypeCode_var stripped_tc =
TAO_DynAnyFactory::strip_alias (this->type_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
CORBA::ULong bound = stripped_tc->length (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
if (bound > 0 && length > bound)
{
ACE_THROW (DynamicAny::DynAny::InvalidValue ());
}
// CORBA 2.3.1 has several explicit rules about resetting the
// current position, depending on the current value of the
// current position, the current size, and the new length.
if (length == 0)
{
this->current_position_ = -1;
}
else if (length > this->component_count_)
{
if (this->current_position_ == -1)
{
// Set it to the first new slot.
this->current_position_ = ACE_static_cast (CORBA::Long,
this->component_count_);
}
}
else if (length < this->component_count_)
{
// If the current position will no longer exist..
if (this->current_position_ >= ACE_static_cast (CORBA::Long,
length))
{
this->current_position_ = -1;
}
}
if (length > this->component_count_)
{
// Grow array first, then initialize new members.
this->da_members_.size (length);
CORBA::TypeCode_var elemtype =
stripped_tc->content_type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
for (CORBA::ULong i = this->component_count_; i < length; ++i)
{
this->da_members_[i] =
TAO_DynAnyFactory::make_dyn_any (elemtype.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
}
else if (length < this->component_count_)
{
// Destroy any dangling members first, then shrink array.
for (CORBA::ULong j = length; j < this->component_count_; ++j)
{
this->da_members_[j]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
}
this->da_members_.size (length);
}
// Now we can update component_count_.
this->component_count_ = length;
}
DynamicAny::AnySeq *
TAO_DynSequence_i::get_elements (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException
))
{
if (this->destroyed_)
{
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
0);
}
CORBA::ULong length = ACE_static_cast (CORBA::ULong,
this->da_members_.size ());
DynamicAny::AnySeq *elements;
ACE_NEW_THROW_EX (elements,
DynamicAny::AnySeq (length),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (0);
elements->length (length);
DynamicAny::AnySeq_var safe_retval = elements;
// Initialize each Any.
for (CORBA::ULong i = 0; i < length; ++i)
{
CORBA::Any_var tmp =
this->da_members_[i]->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
safe_retval[i] = tmp.in ();
}
return safe_retval._retn ();
}
void
TAO_DynSequence_i::set_elements (const DynamicAny::AnySeq & value
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 stripped_tc =
TAO_DynAnyFactory::strip_alias (this->type_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
CORBA::ULong length = value.length ();
CORBA::ULong bound = stripped_tc->length (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
if (bound > 0 && length > bound)
{
ACE_THROW (DynamicAny::DynAny::InvalidValue ());
}
// CORBA 2.4.2.
if (length == 0)
{
this->current_position_ = -1;
}
else
{
this->current_position_ = 0;
}
// If the array grows, we must do it now.
if (length > this->component_count_)
{
this->da_members_.size (length);
}
CORBA::TypeCode_var element_type =
this->get_element_type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
CORBA::TypeCode_var value_tc;
for (CORBA::ULong i = 0; i < length; ++i)
{
// Check each arg element for type match.
value_tc = value[i].type ();
CORBA::Boolean equivalent =
value_tc->equivalent (element_type.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (equivalent)
{
// Destroy any existing members.
if (i < this->component_count_)
{
this->da_members_[i]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
}
this->da_members_[i] =
TAO_DynAnyFactory::make_dyn_any (value[i]
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
}
else
{
ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
}
}
// Destroy any dangling members.
for (CORBA::ULong j = length; j < this->component_count_; ++j)
{
this->da_members_[j]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
}
// If the array shrinks, we must wait until now to do it.
if (length < this->component_count_)
{
this->da_members_.size (length);
}
// Now we can update component_count_.
this->component_count_ = length;
}
DynamicAny::DynAnySeq *
TAO_DynSequence_i::get_elements_as_dyn_any (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((
CORBA::SystemException
))
{
if (this->destroyed_)
{
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
0);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?