dynany.cc
来自「编译工具」· CC 代码 · 共 2,941 行 · 第 1/5 页
CC
2,941 行
value >>= doWrite(CORBA::tk_ulonglong);}#endif#ifdef HAS_LongDoublevoidDynAnyImpl::insert_longdouble(CORBA::LongDouble value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_longdouble);}#endifvoidDynAnyImpl::insert_wchar(CORBA::WChar value){ CHECK_NOT_DESTROYED; doWrite(CORBA::tk_wchar).marshalWChar(value);}voidDynAnyImpl::insert_wstring(const CORBA::WChar* value){ if( !value ) throw DynamicAny::DynAny::InvalidValue(); if ( tckind() != CORBA::tk_wstring ) throw DynamicAny::DynAny::TypeMismatch(); CORBA::ULong maxlen = actualTc()->NP_length(); cdrMemoryStream& buf = doWrite(CORBA::tk_wstring); try { buf.marshalWString(value,maxlen); } catch (CORBA::MARSHAL& ex) { if (ex.minor() == MARSHAL_WStringIsTooLong) throw DynamicAny::DynAny::InvalidValue(); else throw; }}voidDynAnyImpl::insert_any(const CORBA::Any& value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_any);}voidDynAnyImpl::insert_dyn_any(DynamicAny::DynAny_ptr value){ CHECK_NOT_DESTROYED; CORBA::Any_var a(to_any()); a.in() >>= doWrite(CORBA::tk_any);}CORBA::BooleanDynAnyImpl::get_boolean(){ CHECK_NOT_DESTROYED; return doRead(CORBA::tk_boolean).unmarshalBoolean();}CORBA::OctetDynAnyImpl::get_octet(){ CHECK_NOT_DESTROYED; return doRead(CORBA::tk_octet).unmarshalOctet();}CORBA::CharDynAnyImpl::get_char(){ CHECK_NOT_DESTROYED; return doRead(CORBA::tk_char).unmarshalChar();}CORBA::ShortDynAnyImpl::get_short(){ CHECK_NOT_DESTROYED; CORBA::Short value; value <<= doRead(CORBA::tk_short); return value;}CORBA::UShortDynAnyImpl::get_ushort(){ CHECK_NOT_DESTROYED; CORBA::UShort value; value <<= doRead(CORBA::tk_ushort); return value;}CORBA::LongDynAnyImpl::get_long(){ CHECK_NOT_DESTROYED; CORBA::Long value; value <<= doRead(CORBA::tk_long); return value;}CORBA::ULongDynAnyImpl::get_ulong(){ CHECK_NOT_DESTROYED; CORBA::ULong value; value <<= doRead(CORBA::tk_ulong); return value;}#ifndef NO_FLOATCORBA::FloatDynAnyImpl::get_float(){ CHECK_NOT_DESTROYED; CORBA::Float value; value <<= doRead(CORBA::tk_float); return value;}CORBA::DoubleDynAnyImpl::get_double(){ CHECK_NOT_DESTROYED; CORBA::Double value; value <<= doRead(CORBA::tk_double); return value;}#endifchar*DynAnyImpl::get_string(){ CHECK_NOT_DESTROYED; cdrMemoryStream& buf = doRead(CORBA::tk_string); CORBA::ULong length; CORBA::ULong maxlen = actualTc()->NP_length(); try { char* value = buf.unmarshalString(maxlen); return value; } catch (CORBA::MARSHAL& ex) { if (ex.minor() == MARSHAL_StringIsTooLong) throw DynamicAny::DynAny::InvalidValue(); else throw; }#ifndef __DECCXX return 0;#endif}CORBA::Object_ptrDynAnyImpl::get_reference(){ CHECK_NOT_DESTROYED; return CORBA::Object::_unmarshalObjRef(doRead(CORBA::tk_objref));}CORBA::TypeCode_ptrDynAnyImpl::get_typecode(){ CHECK_NOT_DESTROYED; return CORBA::TypeCode::unmarshalTypeCode(doRead(CORBA::tk_TypeCode));}#ifdef HAS_LongLongCORBA::LongLongDynAnyImpl::get_longlong(){ CHECK_NOT_DESTROYED; CORBA::LongLong value; value <<= doRead(CORBA::tk_longlong); return value;}CORBA::ULongLongDynAnyImpl::get_ulonglong(){ CHECK_NOT_DESTROYED; CORBA::ULongLong value; value <<= doRead(CORBA::tk_ulonglong); return value;}#endif#ifdef HAS_LongDoubleCORBA::LongDoubleDynAnyImpl::get_longdouble(){ CHECK_NOT_DESTROYED; CORBA::LongDouble value; value <<= doRead(CORBA::tk_longdouble); return value;}#endifCORBA::WCharDynAnyImpl::get_wchar(){ CHECK_NOT_DESTROYED; return doRead(CORBA::tk_wchar).unmarshalWChar();}CORBA::WChar*DynAnyImpl::get_wstring(){ CHECK_NOT_DESTROYED; cdrMemoryStream& buf = doRead(CORBA::tk_wstring); CORBA::ULong length; CORBA::ULong maxlen = actualTc()->NP_length(); CORBA::WChar* value = buf.unmarshalWString(maxlen); return value;}CORBA::Any*DynAnyImpl::get_any(){ cdrMemoryStream& buf = doRead(CORBA::tk_any); CORBA::Any* value = new CORBA::Any(); *value <<= buf; return value;}DynamicAny::DynAny_ptrDynAnyImpl::get_dyn_any(){ // This could be made faster by short-cutting the Any step, but it's // probably not worth the effort. cdrMemoryStream& buf = doRead(CORBA::tk_any); CORBA::Any a; a <<= buf; return factory_create_dyn_any(a);}// CORBA 2.5 sequence operations#define SEQUENCE_OPS(lcname, ucname) \void \DynAnyImpl::insert_##lcname##_seq(CORBA:: ucname##Seq& value) \{ \ CHECK_NOT_DESTROYED; \ throw DynamicAny::DynAny::TypeMismatch(); \} \\CORBA:: ucname##Seq* \DynAnyImpl::get_##lcname##_seq() \{ \ CHECK_NOT_DESTROYED; \ throw DynamicAny::DynAny::TypeMismatch(); \ return 0; \}SEQUENCE_OPS(boolean, Boolean)SEQUENCE_OPS(octet, Octet)SEQUENCE_OPS(char, Char)SEQUENCE_OPS(short, Short)SEQUENCE_OPS(ushort, UShort)SEQUENCE_OPS(long, Long)SEQUENCE_OPS(ulong, ULong)#ifndef NO_FLOATSEQUENCE_OPS(float, Float)SEQUENCE_OPS(double, Double)#endif#ifdef HAS_LongLongSEQUENCE_OPS(longlong, LongLong)SEQUENCE_OPS(ulonglong, ULongLong)#endif#ifdef HAS_LongDoubleSEQUENCE_OPS(longdouble, LongDouble)#endifSEQUENCE_OPS(wchar, WChar)#undef SEQUENCE_OPSCORBA::BooleanDynAnyImpl::seek(CORBA::Long index){ return 0;}voidDynAnyImpl::rewind(){ // no-op}CORBA::BooleanDynAnyImpl::next(){ return 0;}CORBA::ULongDynAnyImpl::component_count(){ return 0;}DynamicAny::DynAny_ptrDynAnyImpl::current_component(){ // The spec is slightly unclear about whether current_component on // base type DynAny should return nil or raise TypeMismatch. We // choose to raise the exception. throw DynamicAny::DynAny::TypeMismatch(); return 0;}///////////////////////////////// exposed private interface /////////////////////////////////intDynAnyImpl::NP_nodetype() const{ return dt_any;}//////////////// internal ////////////////voidDynAnyImpl::set_to_initial_value(){ switch (actualTc()->kind()) { case CORBA::tk_null: case CORBA::tk_void: ToDynAnyImpl(this)->setValid(); break; case CORBA::tk_short: insert_short(0); break; case CORBA::tk_long: insert_long(0); break; case CORBA::tk_ushort: insert_ushort(0); break; case CORBA::tk_ulong: insert_ulong(0); break;#ifndef NO_FLOAT case CORBA::tk_float: insert_float(0.0); break; case CORBA::tk_double: insert_double(0.0); break;#endif case CORBA::tk_boolean: insert_boolean(0); break; case CORBA::tk_char: insert_char(0); break; case CORBA::tk_octet: insert_octet(0); break; case CORBA::tk_any: { CORBA::Any a; insert_any(a); break; } case CORBA::tk_TypeCode: insert_typecode(CORBA::_tc_null); break; case CORBA::tk_objref: insert_reference(CORBA::Object::_nil()); break; case CORBA::tk_string: insert_string(_CORBA_String_helper::empty_string); break;#ifdef HAS_LongLong case CORBA::tk_longlong: insert_longlong(0); break; case CORBA::tk_ulonglong: insert_ulonglong(0); break;#endif#ifdef HAS_LongDouble case CORBA::tk_longdouble: insert_longdouble(0.0); break;#endif case CORBA::tk_wchar: insert_wchar(0); break; case CORBA::tk_wstring: insert_wstring(_CORBA_WString_helper::empty_wstring); break; default: // Should never get here. OMNIORB_ASSERT(0); }}intDynAnyImpl::copy_to(cdrMemoryStream& mbs){ cdrMemoryStream src(pd_buf, 1); try { tcParser::copyStreamToStream(tc(), src, mbs); } catch(CORBA::MARSHAL&) { return 0; } return 1;}intDynAnyImpl::copy_from(cdrMemoryStream& mbs){ try { setInvalid(); tcParser::copyStreamToMemStream_flush(tc(), mbs, pd_buf); setValid(); } catch(CORBA::MARSHAL&) { return 0; } return 1;}void*DynAnyImpl::_ptrToObjRef(const char* repoId){ if( omni::ptrStrMatch(repoId, DynAnyImpl::_PD_repoId) ) return (DynAnyImpl*) this; if( omni::ptrStrMatch(repoId, DynAnyImplBase::_PD_repoId) ) return (DynAnyImplBase*) 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;}////////////////////////////////////////////////////////////////////////////////////////////////// DynFixedImpl //////////////////////////////////////////////////////////////////////////////////////////////////DynFixedImpl::DynFixedImpl(TypeCode_base* tc, CORBA::Boolean is_root) : DynAnyImpl(tc, dt_fixed, is_root){}DynFixedImpl::~DynFixedImpl() {}//////////////////////// public interface ////////////////////////DynamicAny::DynAny_ptrDynFixedImpl::copy(){ CHECK_NOT_DESTROYED; DynFixedImpl* da = new DynFixedImpl(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*DynFixedImpl::get_value(){ CHECK_NOT_DESTROYED; CORBA::Fixed f; f.PR_setLimits(actualTc()->NP_fixed_digits(), actualTc()->NP_fixed_scale()); pd_buf.rewindInputPtr(); f <<= pd_buf; return f.NP_asString();}CORBA::BooleanDynFixedImpl::set_value(const char* val){ CHECK_NOT_DESTROYED; CORBA::Fixed f; f.PR_setLimits(actualTc()->NP_fixed_digits(), actualTc()->NP_fixed_scale()); try { CORBA::Boolean precise = f.NP_fromString(val); pd_buf.rewindPtrs(); f >>= pd_buf; setValid(); return precise; } catch (CORBA::DATA_CONVERSION& ex) { if (ex.minor() == DATA_CONVERSION_RangeError) { // Too many digits throw DynamicAny::DynAny::InvalidValue(); } else throw DynamicAny::DynAny::TypeMismatch(); }#ifndef __DECCXX return 0; // Never reach here#endif}///////////////////////////////// exposed private interface /////////////////////////////////intDynFixedImpl::NP_nodetype() const{ return dt_fixed;}voidDynFixedImpl::set_to_initial_value(){ set_value("0");}voidDynFixedImpl::_NP_incrRefCount(){ DynAnyImplBase::_NP_incrRefCount();}voidDynFixedImpl::_NP_decrRefCount(){ DynAnyImplBase::_NP_decrRefCount();}void*DynFixedImpl::_ptrToObjRef(const char* repoId){ if( omni::ptrStrMatch(repoId, DynAnyImpl::_PD_repoId) ) return (DynAnyImpl*) this; if( omni::ptrStrMatch(repoId, DynAnyImplBase::_PD_repoId) ) return (DynAnyImplBase*) this; if( omni::ptrStrMatch(repoId, DynamicAny::DynFixed::_PD_repoId) ) return (DynamicAny::DynFixed_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;}/////////////////////////////////////////////////////////////////////////////////////////////////// DynEnumImpl //////////////////////////////////////////////////////////////////////////////////////////////////DynEnumImpl::DynEnumImpl(TypeCode_base* tc, CORBA::Boolean is_root) : DynAnyImpl(tc, dt_enum, is_root){}DynEnumImpl::~DynEnumImpl() {}//////////////////////// public interface ////////////////////////
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?