dynany.cc
来自「编译工具」· CC 代码 · 共 2,941 行 · 第 1/5 页
CC
2,941 行
// -*- Mode: C++; -*-// Package : omniORB// DynAny.cc Created on: 12/02/98// Author : Sai-Lai Lo (sll)//// Copyright (C) 1996-1999 AT&T Laboratories Cambridge//// This file is part of the omniORB library//// The omniORB library is free software; you can redistribute it and/or// modify it under the terms of the GNU Library General Public// License as published by the Free Software Foundation; either// version 2 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU// Library General Public License for more details.//// You should have received a copy of the GNU Library General Public// License along with this library; if not, write to the Free// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA// 02111-1307, USA////// Description:// Implementation of type DynAny/* $Log: dynAny.cc,v $ Revision 1.11.2.19 2004/10/17 20:14:32 dgrisby Updated support for OpenVMS. Many thanks to Bruce Visscher. Revision 1.11.2.18 2003/11/20 13:37:13 dgrisby Remove incorrect warning message in DynAny destruction. Revision 1.11.2.17 2002/12/18 15:59:14 dgrisby Proper clean-up of recursive TypeCodes. Revision 1.11.2.16 2002/02/11 14:46:20 dpg1 Remove unnecessary ##s in macro. Revision 1.11.2.15 2001/11/14 17:13:41 dpg1 Long double support. Revision 1.11.2.14 2001/10/19 11:04:02 dpg1 Avoid confusing (to gcc 2.95) inheritance of refcount functions. Revision 1.11.2.13 2001/10/17 18:51:50 dpg1 Fix inevitable Windows problems. Revision 1.11.2.12 2001/10/17 16:44:02 dpg1 Update DynAny to CORBA 2.5 spec, const Any exception extraction. Revision 1.11.2.11 2001/09/24 10:41:08 dpg1 Minor codes for Dynamic library and omniORBpy. Revision 1.11.2.10 2001/08/22 13:29:46 dpg1 Re-entrant Any marshalling. Revision 1.11.2.9 2001/06/15 10:23:21 sll Changed the name of the internal create_dyn_any function to internal_create_dyn_any. Compilers which do not support namespace are confused by the original name. Revision 1.11.2.8 2001/06/13 20:10:04 sll Minor update to make the ORB compiles with MSVC++. Revision 1.11.2.7 2001/04/19 09:14:15 sll Scoped where appropriate with the omni namespace. Revision 1.11.2.6 2000/11/17 19:09:37 dpg1 Support codeset conversion in any. Revision 1.11.2.5 2000/11/09 12:27:53 dpg1 Huge merge from omni3_develop, plus full long long from omni3_1_develop. Revision 1.11.2.4 2000/11/03 19:07:32 sll Use new marshalling functions for byte, octet and char. Use get_octet_array instead of get_char_array. Revision 1.11.2.3 2000/10/06 16:40:53 sll Changed to use cdrStream. Revision 1.11.2.2 2000/09/27 17:25:41 sll Changed include/omniORB3 to include/omniORB4. Revision 1.11.2.1 2000/07/17 10:35:41 sll Merged from omni3_develop the diff between omni3_0_0_pre3 and omni3_0_0. Revision 1.12 2000/07/13 15:26:02 dpg1 Merge from omni3_develop for 3.0 release. Revision 1.8.6.5 2000/06/22 10:40:12 dpg1 exception.h renamed to exceptiondefs.h to avoid name clash on some platforms. Revision 1.8.6.4 1999/10/26 20:18:18 sll DynAny no longer do alias expansion on the typecode. In other words, all aliases in the typecode are preserved. Revision 1.8.6.3 1999/10/14 16:21:56 djr Implemented logging when system exceptions are thrown. Revision 1.8.6.2 1999/09/22 16:15:58 djr Removed MT locking. Revision 1.8.6.1 1999/09/22 14:26:30 djr Major rewrite of orbcore to support POA. Revision 1.8 1999/07/20 14:22:58 djr Accept nil ref in insert_reference(). Allow DynAny with type tk_void. Revision 1.7 1999/06/18 21:01:11 sll Use TypeCode equivalent() instead of equal(). Revision 1.6 1999/05/25 18:05:00 sll Added check for invalid arguments using magic numbers. Revision 1.5 1999/03/11 16:25:58 djr Updated copyright notice Revision 1.4 1999/01/07 16:58:16 djr New implementation using new version of TypeCode and Any. Revision 1.3 1998/08/25 18:52:59 sll Added signed-unsigned cast to keep egcs and gcc-2.7.2 happy. Revision 1.2 1998/08/14 13:45:31 sll Added pragma hdrstop to control pre-compile header if the compiler feature is available. Revision 1.1 1998/08/05 18:03:49 sll Initial revision*/#include <omniORB4/CORBA.h>#ifdef HAS_pch#pragma hdrstop#endif#include <dynAnyImpl.h>#include <tcParser.h>#include <anyP.h>#include <exceptiondefs.h>#include <initialiser.h>#include <initRefs.h>DynamicAny::DynAny::~DynAny() { pd_dynmagic = 0; }DynamicAny::DynFixed::~DynFixed() {}DynamicAny::DynEnum::~DynEnum() {}DynamicAny::DynStruct::~DynStruct() {}DynamicAny::DynUnion::~DynUnion() {}DynamicAny::DynSequence::~DynSequence() {}DynamicAny::DynArray::~DynArray() {}DynamicAny::DynAnyFactory::~DynAnyFactory() {}const char* DynamicAny::DynAny::_PD_repoId = "IDL:omg.org/DynamicAny/DynAny:1.0";const char* DynamicAny::DynFixed::_PD_repoId = "IDL:omg.org/DynamicAny/DynFixed:1.0";const char* DynamicAny::DynEnum::_PD_repoId = "IDL:omg.org/DynamicAny/DynEnum:1.0";const char* DynamicAny::DynStruct::_PD_repoId = "IDL:omg.org/DynamicAny/DynStruct:1.0";const char* DynamicAny::DynUnion::_PD_repoId = "IDL:omg.org/DynamicAny/DynUnion:1.0";const char* DynamicAny::DynSequence::_PD_repoId = "IDL:omg.org/DynamicAny/DynSequence:1.0";const char* DynamicAny::DynArray::_PD_repoId = "IDL:omg.org/DynamicAny/DynArray:1.0";const char* DynamicAny::DynAnyFactory::_PD_repoId = "IDL:omg.org/DynamicAny/DynAnyFactory:1.0";OMNI_NAMESPACE_BEGIN(omni)// Fake repository ids for implementation classesconst char* DynAnyImplBase::_PD_repoId = "omniorb:DynAnyImplBase";const char* DynAnyImpl::_PD_repoId = "omniorb:DynAnyImpl";const char* DynAnyConstrBase::_PD_repoId = "omniorb:DynAnyConstrBase";const char* DynUnionImpl::_PD_repoId = "omniorb:DynUnionImpl";// Note:// The constructors in this file NEVER throw exceptions. This// is to avoid a bug in MSVC 4 & 5, which happens when public// virtual inheritance is used.static DynAnyImplBase*internal_create_dyn_any(TypeCode_base* tc, CORBA::Boolean is_root);static DynUnionDisc*internal_create_dyn_any_discriminator(TypeCode_base* tc, DynUnionImpl* du);static DynamicAny::DynAny_ptrfactory_create_dyn_any(const CORBA::Any& value);static DynamicAny::DynAny_ptrfactory_create_dyn_any_from_type_code(CORBA::TypeCode_ptr type);///////////////////////////////////////////////////////////////////////////////////////////////// DynAnyImplBase /////////////////////////////////////////////////////////////////////////////////////////////////#define CHECK_NOT_DESTROYED \do { \ if (!DynamicAny::DynAny::PR_is_valid(this)) \ OMNIORB_THROW(BAD_PARAM, BAD_PARAM_InvalidDynAny, CORBA::COMPLETED_NO); \ if (destroyed()) \ OMNIORB_THROW(OBJECT_NOT_EXIST, OBJECT_NOT_EXIST_DynAnyDestroyed, \ CORBA::COMPLETED_NO); \} while(0)omni_tracedmutex DynAnyImplBase::refCountLock;DynAnyImplBase::~DynAnyImplBase(){ CORBA::release(pd_tc);}//////////////////////// public interface ////////////////////////CORBA::TypeCode_ptrDynAnyImplBase::type() const{ CHECK_NOT_DESTROYED; return CORBA::TypeCode::_duplicate(pd_tc);}voidDynAnyImplBase::from_any(const CORBA::Any& value){ CHECK_NOT_DESTROYED; CORBA::TypeCode_var value_tc = value.type(); if( !value_tc->equivalent(tc()) ) throw DynamicAny::DynAny::TypeMismatch(); cdrMemoryStream buf(((AnyP*)value.NP_pd())->theMemoryStream(), 1); if( !copy_from(buf) ) throw DynamicAny::DynAny::InvalidValue();}CORBA::Any*DynAnyImplBase::to_any(){ CHECK_NOT_DESTROYED; CORBA::Any* a = new CORBA::Any(tc(), 0); cdrMemoryStream& buf = ((AnyP*)a->NP_pd())->getWRableMemoryStream(); // <buf> should already be rewound. if( !copy_to(buf) ) { delete a; throw DynamicAny::DynAny::InvalidValue(); } return a;}voidDynAnyImplBase::destroy(){ if (is_root()) { omni_tracedmutex_lock sync(DynAnyImplBase::refCountLock); CHECK_NOT_DESTROYED; pd_destroyed = 1; // We don't actually do anything to destroy the data. } else CHECK_NOT_DESTROYED;}//////////////// internal ////////////////voidDynAnyImplBase::onDispose(){ // no-op}voidDynAnyImplBase::_NP_incrRefCount(){ omni_tracedmutex_lock sync(DynAnyImplBase::refCountLock); pd_refcount++;}voidDynAnyImplBase::_NP_decrRefCount(){ int do_delete = 0; { omni_tracedmutex_lock sync(DynAnyImplBase::refCountLock); if( pd_refcount > 0 ) pd_refcount--; if( pd_refcount == 0 && pd_is_root ) { do_delete = 1; // This hook allows derived types to detach their children // so that they will be destroyed when their ref count goes // to zero. onDispose(); } } if( do_delete ) delete this;}/////////////////////////////////////////////////////////////////////////////////////////////////// DynAnyImpl ///////////////////////////////////////////////////////////////////////////////////////////////////DynAnyImpl::DynAnyImpl(TypeCode_base* tc, int nodetype, CORBA::Boolean is_root) : DynAnyImplBase(tc, nodetype, is_root), pd_isValid(0){}DynAnyImpl::~DynAnyImpl(){}//////////////////////// public interface ////////////////////////voidDynAnyImpl::assign(DynamicAny::DynAny_ptr da){ CHECK_NOT_DESTROYED; if ( !DynamicAny::DynAny::PR_is_valid(da) ) OMNIORB_THROW(BAD_PARAM, BAD_PARAM_InvalidDynAny, CORBA::COMPLETED_NO); if( CORBA::is_nil(da) ) throw DynamicAny::DynAny::InvalidValue(); DynAnyImplBase* daib = ToDynAnyImplBase(da); if( !tc()->equivalent(daib->tc()) ) throw DynamicAny::DynAny::TypeMismatch(); DynAnyImpl* dai = ToDynAnyImpl(daib); if( !dai->isValid() ) throw DynamicAny::DynAny::InvalidValue(); dai->pd_buf.rewindInputPtr(); pd_buf.rewindPtrs(); dai->pd_buf.copy_to(pd_buf,dai->pd_buf.bufSize()); setValid();}DynamicAny::DynAny_ptrDynAnyImpl::copy(){ CHECK_NOT_DESTROYED; DynAnyImpl* da = new DynAnyImpl(TypeCode_collector::duplicateRef(tc()), dt_any, 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;}CORBA::BooleanDynAnyImpl::equal(DynamicAny::DynAny_ptr dyn_any){ CHECK_NOT_DESTROYED; if ( !DynamicAny::DynAny::PR_is_valid(dyn_any) ) OMNIORB_THROW(BAD_PARAM, BAD_PARAM_InvalidDynAny, CORBA::COMPLETED_NO); if( CORBA::is_nil(dyn_any) ) return 0; DynAnyImplBase* ib = ToDynAnyImplBase(dyn_any); if (!tc()->equivalent(ib->tc())) return 0; switch (actualTc()->kind()) { case CORBA::tk_any: { DynamicAny::DynAny_var a = get_dyn_any(); DynamicAny::DynAny_var b = dyn_any->get_dyn_any(); return a->equal(b); } case CORBA::tk_TypeCode: { // TypeCodes must be equal, not just equivalent. // We can't just compare the marshalled form, since they may // have different indirections. CORBA::TypeCode_var a = get_typecode(); CORBA::TypeCode_var b = dyn_any->get_typecode(); return a->equal(b); } case CORBA::tk_objref: { // Compare objrefs for equivalence. CORBA::Object_var a = get_reference(); CORBA::Object_var b = dyn_any->get_reference(); return a->_is_equivalent(b); } default: // With all other types supported by this class, it's sufficient // to see if the data in the memory buffers is identical. if (pd_buf.bufSize() != ib->pd_buf.bufSize()) return 0; return (!memcmp(pd_buf.bufPtr(), ib->pd_buf.bufPtr(), pd_buf.bufSize())); }}voidDynAnyImpl::insert_boolean(CORBA::Boolean value){ CHECK_NOT_DESTROYED; doWrite(CORBA::tk_boolean).marshalBoolean(value);}voidDynAnyImpl::insert_octet(CORBA::Octet value){ CHECK_NOT_DESTROYED; doWrite(CORBA::tk_octet).marshalOctet(value);}voidDynAnyImpl::insert_char(CORBA::Char value){ CHECK_NOT_DESTROYED; doWrite(CORBA::tk_char).marshalChar(value);}voidDynAnyImpl::insert_short(CORBA::Short value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_short);}voidDynAnyImpl::insert_ushort(CORBA::UShort value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_ushort);}voidDynAnyImpl::insert_long(CORBA::Long value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_long);}voidDynAnyImpl::insert_ulong(CORBA::ULong value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_ulong);}#ifndef NO_FLOATvoidDynAnyImpl::insert_float(CORBA::Float value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_float);}voidDynAnyImpl::insert_double(CORBA::Double value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_double);}#endifvoidDynAnyImpl::insert_string(const char* value){ CHECK_NOT_DESTROYED; if( !value ) throw DynamicAny::DynAny::InvalidValue(); if ( tckind() != CORBA::tk_string ) throw DynamicAny::DynAny::TypeMismatch(); CORBA::ULong maxlen = actualTc()->NP_length(); cdrMemoryStream& buf = doWrite(CORBA::tk_string); try { buf.marshalString(value,maxlen); } catch (CORBA::MARSHAL& ex) { if (ex.minor() == MARSHAL_StringIsTooLong) throw DynamicAny::DynAny::InvalidValue(); else throw; }}voidDynAnyImpl::insert_reference(CORBA::Object_ptr value){ CHECK_NOT_DESTROYED; if ( !CORBA::Object::_PR_is_valid(value) ) OMNIORB_THROW(BAD_PARAM, BAD_PARAM_InvalidObjectRef, CORBA::COMPLETED_NO); CORBA::Object::_marshalObjRef(value, doWrite(CORBA::tk_objref));}voidDynAnyImpl::insert_typecode(CORBA::TypeCode_ptr value){ CHECK_NOT_DESTROYED; if ( !CORBA::TypeCode::PR_is_valid(value) ) OMNIORB_THROW(BAD_PARAM, BAD_PARAM_InvalidTypeCode, CORBA::COMPLETED_NO); if( CORBA::is_nil(value) ) throw DynamicAny::DynAny::InvalidValue(); CORBA::TypeCode::marshalTypeCode(value, doWrite(CORBA::tk_TypeCode));}#ifdef HAS_LongLongvoidDynAnyImpl::insert_longlong(CORBA::LongLong value){ CHECK_NOT_DESTROYED; value >>= doWrite(CORBA::tk_longlong);}voidDynAnyImpl::insert_ulonglong(CORBA::ULongLong value){ CHECK_NOT_DESTROYED;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?