dynany.cc
来自「编译工具」· CC 代码 · 共 2,941 行 · 第 1/5 页
CC
2,941 行
if( canAppendComponent(i) ) { AnyP* anyp = (AnyP*)a.NP_pd(); try { cdrMemoryStream src(anyp->theMemoryStream(), 1); tcParser::copyStreamToMemStream_flush(anyp->getTC(), src, pd_buf); } catch(CORBA::MARSHAL&) { // <pd_buf> may have been partly written to, so we can't // append to it any more. Appends are only allowed if // pd_n_in_buf == pd_n_really_in_buf so ... pd_n_really_in_buf++; return 0; } pd_n_in_buf++; pd_n_really_in_buf++; return 1; } if( i < pd_first_in_comp ) createComponent(i); cdrMemoryStream buf(((AnyP*)a.NP_pd())->theMemoryStream(), 1); return pd_components[i]->copy_from(buf);}////////////////////////////////////////////////////////////////////////////////////////////////// DynStructImpl /////////////////////////////////////////////////////////////////////////////////////////////////DynStructImpl::DynStructImpl(TypeCode_base* tc, CORBA::Boolean is_root) : DynAnyConstrBase(tc, dt_struct, is_root){ setNumComponents(actualTc()->NP_member_count());}DynStructImpl::~DynStructImpl(){}//////////////////////// public interface ////////////////////////DynamicAny::DynAny_ptrDynStructImpl::copy(){ CHECK_NOT_DESTROYED; DynStructImpl* da = new DynStructImpl(TypeCode_collector::duplicateRef(tc()), DYNANY_ROOT); try { da->assign(this); } catch(...) { da->_NP_decrRefCount(); throw; } return da;}char*DynStructImpl::current_member_name(){ CHECK_NOT_DESTROYED; if( pd_n_components == 0 ) throw DynamicAny::DynAny::TypeMismatch(); if( pd_curr_index < 0 ) throw DynamicAny::DynAny::InvalidValue(); return CORBA::string_dup(actualTc()->NP_member_name(pd_curr_index));}CORBA::TCKindDynStructImpl::current_member_kind(){ CHECK_NOT_DESTROYED; if( pd_n_components == 0 ) throw DynamicAny::DynAny::TypeMismatch(); if( pd_curr_index < 0 ) throw DynamicAny::DynAny::InvalidValue(); return actualTc()->NP_member_type(pd_curr_index)->kind();}DynamicAny::NameValuePairSeq*DynStructImpl::get_members(){ CHECK_NOT_DESTROYED; DynamicAny::NameValuePairSeq* nvps = new DynamicAny::NameValuePairSeq(); nvps->length(pd_n_components); for( unsigned i = 0; i < pd_n_components; i++ ) { (*nvps)[i].id = CORBA::string_dup(actualTc()->NP_member_name(i)); if( !component_to_any(i, (*nvps)[i].value) ) { delete nvps; OMNIORB_THROW(BAD_INV_ORDER, BAD_INV_ORDER_DynAnyNotInitialised, CORBA::COMPLETED_NO); } } return nvps;}voidDynStructImpl::set_members(const DynamicAny::NameValuePairSeq& nvps){ CHECK_NOT_DESTROYED; if( nvps.length() != pd_n_components ) throw DynamicAny::DynAny::InvalidValue(); for( unsigned i = 0; i < pd_n_components; i++ ) { if( ((const char*)(nvps[i].id))[0] != '\0' && strcmp((const char*)(nvps[i].id), actualTc()->NP_member_name(i)) ) throw DynamicAny::DynAny::TypeMismatch(); if( !component_from_any(i, nvps[i].value) ) throw DynamicAny::DynAny::TypeMismatch(); } pd_curr_index = (pd_n_components == 0) ? -1 : 0;}DynamicAny::NameDynAnyPairSeq*DynStructImpl::get_members_as_dyn_any(){ CHECK_NOT_DESTROYED; if (pd_n_in_buf != pd_first_in_comp) OMNIORB_THROW(BAD_INV_ORDER, BAD_INV_ORDER_DynAnyNotInitialised, CORBA::COMPLETED_NO); DynamicAny::NameDynAnyPairSeq* nvps = new DynamicAny::NameDynAnyPairSeq(); nvps->length(pd_n_components); createComponent(0); // All components are now in the buffer for( unsigned i = 0; i < pd_n_components; i++ ) { (*nvps)[i].id = CORBA::string_dup(actualTc()->NP_member_name(i)); pd_components[i]->_NP_incrRefCount(); (*nvps)[i].value = pd_components[i]; } return nvps;}voidDynStructImpl::set_members_as_dyn_any(const DynamicAny::NameDynAnyPairSeq& nvps){ CHECK_NOT_DESTROYED; if( nvps.length() != pd_n_components ) throw DynamicAny::DynAny::InvalidValue(); pd_n_in_buf = 0; pd_first_in_comp = 0; CORBA::TypeCode_var tc; for( unsigned i = 0; i < pd_n_components; i++ ) { if( ((const char*)(nvps[i].id))[0] != '\0' && strcmp((const char*)(nvps[i].id), actualTc()->NP_member_name(i)) ) throw DynamicAny::DynAny::TypeMismatch(); tc = nvps[i].value->type(); if( !tc->equivalent(nthComponentTC(i)) ) { pd_first_in_comp = pd_n_components; throw DynamicAny::DynAny::TypeMismatch(); } pd_components[i] = ToDynAnyImplBase(nvps[i].value); pd_components[i]->_NP_incrRefCount(); } pd_curr_index = (pd_n_components == 0) ? -1 : 0;}///////////////////////////////// exposed private interface /////////////////////////////////intDynStructImpl::NP_nodetype() const{ return dt_struct;}//////////////// internal ////////////////TypeCode_base*DynStructImpl::nthComponentTC(unsigned n){ if( n >= pd_n_components ) throw omniORB::fatalException(__FILE__,__LINE__, "DynStructImpl::nthComponentTC() - n out of bounds"); return actualTc()->NP_member_type(n);}DynAnyConstrBase::SeqLocationDynStructImpl::prepareSequenceWrite(CORBA::TCKind kind, CORBA::ULong len){ // Note that we ignore then length here. When the insert function // tries to call insert on the sub-component, that call will check // the length. const TypeCode_base* tc = actualTc(); if (pd_curr_index < 0) throw DynamicAny::DynAny::InvalidValue(); const TypeCode_base* ctc; ctc = TypeCode_base::NP_expand(nthComponentTC(pd_curr_index)); CORBA::TCKind k = ctc->NP_kind(); if ((k == CORBA::tk_sequence || k == CORBA::tk_array) && TypeCode_base::NP_expand(ctc->NP_content_type())->NP_kind() == kind) { return SEQ_COMPONENT; } throw DynamicAny::DynAny::TypeMismatch();#ifdef NEED_DUMMY_RETURN return SEQ_COMPONENT;#endif}DynAnyConstrBase::SeqLocationDynStructImpl::prepareSequenceRead(CORBA::TCKind kind){ const TypeCode_base* tc = actualTc(); if (pd_curr_index < 0) throw DynamicAny::DynAny::InvalidValue(); const TypeCode_base* ctc; ctc = TypeCode_base::NP_expand(nthComponentTC(pd_curr_index)); CORBA::TCKind k = ctc->NP_kind(); if ((k == CORBA::tk_sequence || k == CORBA::tk_array) && TypeCode_base::NP_expand(ctc->NP_content_type())->NP_kind() == kind) { return SEQ_COMPONENT; } throw DynamicAny::DynAny::TypeMismatch();#ifdef NEED_DUMMY_RETURN return SEQ_COMPONENT;#endif}voidDynStructImpl::_NP_incrRefCount(){ DynAnyImplBase::_NP_incrRefCount();}voidDynStructImpl::_NP_decrRefCount(){ DynAnyImplBase::_NP_decrRefCount();}void*DynStructImpl::_ptrToObjRef(const char* repoId){ if( omni::ptrStrMatch(repoId, DynAnyConstrBase::_PD_repoId) ) return (DynAnyConstrBase*) this; if( omni::ptrStrMatch(repoId, DynAnyImplBase::_PD_repoId) ) return (DynAnyImplBase*) this; if( omni::ptrStrMatch(repoId, DynamicAny::DynStruct::_PD_repoId) ) return (DynamicAny::DynStruct_ptr) this; if( omni::ptrStrMatch(repoId, DynamicAny::DynAny::_PD_repoId) ) return (DynamicAny::DynAny_ptr) this; if( omni::ptrStrMatch(repoId, CORBA::Object::_PD_repoId) ) return (CORBA::Object_ptr) this; return 0;}///////////////////////////////////////////////////////////////////////////////////////////////// DynUnionDisc ///////////////////////////////////////////////////////////////////////////////////////////////////DynUnionDisc::~DynUnionDisc(){}voidDynUnionDisc::assign(DynamicAny::DynAny_ptr da){ DynAnyImpl::assign(da); if( pd_union ) pd_union->discriminatorHasChanged();}voidDynUnionDisc::insert_boolean(CORBA::Boolean value){ CHECK_NOT_DESTROYED; doWrite(CORBA::tk_boolean).marshalBoolean(value); if( pd_union ) pd_union->discriminatorHasChanged();}voidDynUnionDisc::insert_octet(CORBA::Octet value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}voidDynUnionDisc::insert_char(CORBA::Char value){ CHECK_NOT_DESTROYED; doWrite(CORBA::tk_char).marshalChar(value); if( pd_union ) pd_union->discriminatorHasChanged();}voidDynUnionDisc::insert_short(CORBA::Short value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_short); if( pd_union ) pd_union->discriminatorHasChanged();}voidDynUnionDisc::insert_ushort(CORBA::UShort value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_ushort); if( pd_union ) pd_union->discriminatorHasChanged();}voidDynUnionDisc::insert_long(CORBA::Long value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_long); if( pd_union ) pd_union->discriminatorHasChanged();}voidDynUnionDisc::insert_ulong(CORBA::ULong value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_ulong); if( pd_union ) pd_union->discriminatorHasChanged();}#ifndef NO_FLOATvoidDynUnionDisc::insert_float(CORBA::Float value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}voidDynUnionDisc::insert_double(CORBA::Double value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}#endifvoidDynUnionDisc::insert_string(const char* value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}voidDynUnionDisc::insert_reference(CORBA::Object_ptr value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}voidDynUnionDisc::insert_typecode(CORBA::TypeCode_ptr value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}#ifdef HAS_LongLongvoidDynUnionDisc::insert_longlong(CORBA::LongLong value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_longlong); if( pd_union ) pd_union->discriminatorHasChanged();}voidDynUnionDisc::insert_ulonglong(CORBA::ULongLong value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_ulonglong); if( pd_union ) pd_union->discriminatorHasChanged();}#endif#ifdef HAS_LongDoublevoidDynUnionDisc::insert_longdouble(CORBA::LongDouble value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}#endifvoidDynUnionDisc::insert_wchar(CORBA::WChar value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}voidDynUnionDisc::insert_wstring(const CORBA::WChar* value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}voidDynUnionDisc::insert_any(const CORBA::Any& value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}voidDynUnionDisc::insert_dyn_any(DynamicAny::DynAny_ptr value){ CHECK_NOT_DESTROYED; // Not a legal discriminator type. throw DynamicAny::DynAny::InvalidValue();}///////////////////////////////// exposed private interface /////////////////////////////////intDynUnionDisc::NP_nodetype() const{ return dt_disc;}voidDynUnionDisc::set_to_initial_value(){ // Choose a value corresponding to the first case OMNIORB_ASSERT(pd_union); set_value(pd_union->actualTc()->NP_member_label_val(0));}voidDynUnionDisc::set_value(TypeCode_union::Discriminator v){ switch( tckind() ) { case CORBA::tk_char: insert_char((CORBA::Char)v); break; case CORBA::tk_boolean: insert_boolean((CORBA::Boolean)v); break; case CORBA::tk_short: insert_short((CORBA::Short)v); break; case CORBA::tk_ushort: insert_ushort((CORBA::UShort)v); break; case CORBA::tk_long: insert_long((CORBA::Long)v); break; case CORBA::tk_ulong: insert_ulong((CORBA::ULong)v); break;#ifdef HAS_LongLong case CORBA::tk_longlong: insert_longlong((CORBA::LongLong)v); break; case CORBA::tk_ulonglong: insert_ulonglong((CORBA::ULongLong)v); break;#endif default: throw omniORB::fatalException(__FILE__,__LINE__, "DynUnionDisc::set_value() - illegal disciminator type"); }}/////////////////////////////////////////////////////////////////////////////////////////////// DynUnionEnumDisc /////////////////////////////////////////////////////////////////////////////////////////////////DynUnionEnumDisc::DynUnionEnumDisc(TypeCode_base* tc, DynUnionImpl* un) : DynUnionDisc(tc, dt_enumdisc, un){}DynUnionEnumDisc::~DynUnionEnumDisc() {}//////////////////////// public interface ////////////////////////DynamicAny::DynAny_ptrDynUnionEnumDisc::copy(){ CHECK_NOT_DESTROYED; DynEnumImpl* da = new DynEnumImpl(TypeCode_collector::duplicateRef(tc()), DYNANY_ROOT); try { da->assign(this); } catch(DynamicAny::DynAny::TypeMismatch&) { OMNIORB_ASSERT(0); // This should never happen since the types always match -- they // are the same TypeCode. } catch(...) { da->_NP_decrRefCount(); throw; } return da;}char*DynUnionEnumDisc::get_as_string(){ CHECK_NOT_DESTROYED; CORBA::ULong val; { if( !isValid() ) OMNIORB_THROW(BAD_PARAM, BAD_PARAM_InvalidDynAny, CORBA::COMPLETED_NO); pd_buf.rewindInputPtr(); val <<= pd_buf; } if( val >= act
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?