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 + -
显示快捷键?