remoteidentity.cc
来自「编译工具」· CC 代码 · 共 359 行
CC
359 行
// -*- Mode: C++; -*-// Package : omniORB// remoteIdentity.cc Created on: 16/6/99// Author : David Riddoch (djr)//// Copyright (C) 1996-1999 AT&T Research 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:///* $Log: remoteIdentity.cc,v $ Revision 1.2.2.15 2002/07/03 15:49:51 dgrisby Correct debug flag, typos, bug report address. Revision 1.2.2.14 2001/09/19 17:26:53 dpg1 Full clean-up after orb->destroy(). Revision 1.2.2.13 2001/09/03 16:52:05 sll New signature for locateRequest. Now accept a calldescriptor argument. Revision 1.2.2.12 2001/09/03 13:28:59 sll Changed locateRequest to honour the same retry rule as normal invocation. Revision 1.2.2.11 2001/08/17 13:42:49 dpg1 callDescriptor::userException() no longer has to throw an exception. Revision 1.2.2.10 2001/08/15 10:26:14 dpg1 New object table behaviour, correct POA semantics. Revision 1.2.2.9 2001/08/03 17:41:24 sll System exception minor code overhaul. When a system exeception is raised, a meaning minor code is provided. Revision 1.2.2.8 2001/05/09 17:02:25 sll Throw omniORB::LOCATION_FORWARD with the right permanent flag. Revision 1.2.2.7 2001/04/18 18:18:04 sll Big checkin with the brand new internal APIs. Revision 1.2.2.6 2000/12/05 17:39:31 dpg1 New cdrStream functions to marshal and unmarshal raw strings. Revision 1.2.2.5 2000/11/15 17:25:45 sll cdrCountingStream must now be told explicitly what char and wchar codeset convertor to use. Revision 1.2.2.4 2000/11/09 12:27:59 dpg1 Huge merge from omni3_develop, plus full long long from omni3_1_develop. Revision 1.2.2.3 2000/11/03 19:12:07 sll Use new marshalling functions for byte, octet and char. Use get_octet_array instead of get_char_array and put_octet_array instead of put_char_array. Revision 1.2.2.2 2000/09/27 18:05:51 sll Use the new giop engine APIs to drive a remote call. Revision 1.2.2.1 2000/07/17 10:35:58 sll Merged from omni3_develop the diff between omni3_0_0_pre3 and omni3_0_0. Revision 1.3 2000/07/13 15:25:55 dpg1 Merge from omni3_develop for 3.0 release. Revision 1.1.2.5 2000/06/22 10:37:50 dpg1 Transport code now throws omniConnectionBroken exception rather than CORBA::COMM_FAILURE when things go wrong. This allows the invocation code to distinguish between transport problems and COMM_FAILURES propagated from the server side. exception.h renamed to exceptiondefs.h to avoid name clash on some platforms. Revision 1.1.2.4 1999/10/27 17:32:16 djr omni::internalLock and objref_rc_lock are now pointers. Revision 1.1.2.3 1999/10/14 16:22:16 djr Implemented logging when system exceptions are thrown. Revision 1.1.2.2 1999/09/28 10:54:35 djr Removed pretty-printing of object keys from object adapters. Revision 1.1.2.1 1999/09/22 14:27:06 djr Major rewrite of orbcore to support POA.*/#include <omniORB4/CORBA.h>#ifdef HAS_pch#pragma hdrstop#endif#include <remoteIdentity.h>#include <omniORB4/omniTransport.h>#include <omniORB4/IOP_C.h>#include <omniORB4/callDescriptor.h>#include <dynamicLib.h>#include <exceptiondefs.h>#include <giopStream.h>OMNI_NAMESPACE_BEGIN(omni)//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////class omniRemoteIdentity_RefHolder {public: inline omniRemoteIdentity_RefHolder(omniRemoteIdentity* id) : pd_id(id) { pd_id->pd_refCount++; omni::internalLock->unlock(); } inline ~omniRemoteIdentity_RefHolder() { omni::internalLock->lock(); if (--pd_id->pd_refCount == 0) delete pd_id; omni::internalLock->unlock(); }private: omniRemoteIdentity* pd_id;};OMNI_NAMESPACE_END(omni)OMNI_USING_NAMESPACE(omni)//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidomniRemoteIdentity::dispatch(omniCallDescriptor& call_desc){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1); omniRemoteIdentity_RefHolder rh(this); // omni::internalLock has been released by RefHolder constructor if( omniORB::traceInvocations ) { omniORB::logger l; l << "Invoke '" << call_desc.op() << "' on remote: " << this << '\n'; } IOP_C_Holder iop_client(pd_ior,key(),keysize(),pd_rope,&call_desc); cdrStream& s = ((IOP_C&)iop_client).getStream(); again: call_desc.initialiseCall(s); iop_client->InitialiseRequest(); // Wait for the reply. GIOP::ReplyStatusType rc; switch( (rc = iop_client->ReceiveReply()) ) { case GIOP::NO_EXCEPTION: // Unmarshal any result and out/inout arguments. call_desc.unmarshalReturnedValues(s); iop_client->RequestCompleted(); break; case GIOP::USER_EXCEPTION: { // Retrieve the Interface Repository ID of the exception. CORBA::String_var repoId(s.unmarshalRawString()); call_desc.userException(iop_client->getStream(), &(IOP_C&)iop_client, repoId); // Usually, the userException() call throws a user exception or // a system exception. In the DII case, it just stores the // exception and returns. break; } case GIOP::LOCATION_FORWARD: case GIOP::LOCATION_FORWARD_PERM: { CORBA::Object_var obj(CORBA::Object::_unmarshalObjRef(s)); iop_client->RequestCompleted(); throw omniORB::LOCATION_FORWARD(obj._retn(), (rc == GIOP::LOCATION_FORWARD_PERM) ? 1 : 0); } case GIOP::NEEDS_ADDRESSING_MODE: { GIOP::AddressingDisposition v; v <<= s; pd_ior->addr_mode(v); iop_client->RequestCompleted(); if (omniORB::trace(10)) { omniORB::logger log; log << "Remote invocation: GIOP::NEEDS_ADDRESSING_MODE: " << (int) v << " retry request.\n"; } goto again; } case GIOP::SYSTEM_EXCEPTION: OMNIORB_ASSERT(0); break; }}voidomniRemoteIdentity::gainRef(omniObjRef*){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1); pd_refCount++;}voidomniRemoteIdentity::loseRef(omniObjRef*){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1); if( --pd_refCount > 0 ) return; delete this;}voidomniRemoteIdentity::locateRequest(omniCallDescriptor& call_desc){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1); omniRemoteIdentity_RefHolder rh(this); if( omniORB::trace(10) ) { omniORB::logger l; l << "LocateRequest to remote: " << this << '\n'; } IOP_C_Holder iop_client(pd_ior,key(),keysize(),pd_rope,&call_desc); cdrStream& s = ((IOP_C&)iop_client).getStream(); GIOP::LocateStatusType rc; again: switch( (rc = iop_client->IssueLocateRequest()) ) { case GIOP::OBJECT_HERE: iop_client->RequestCompleted(); break; case GIOP::UNKNOWN_OBJECT: iop_client->RequestCompleted(); OMNIORB_THROW(OBJECT_NOT_EXIST,OBJECT_NOT_EXIST_NoMatch, CORBA::COMPLETED_NO); break; // dummy break case GIOP::OBJECT_FORWARD: case GIOP::OBJECT_FORWARD_PERM: { CORBA::Object_var obj(CORBA::Object::_unmarshalObjRef(s)); iop_client->RequestCompleted(); throw omniORB::LOCATION_FORWARD(obj._retn(), (rc == GIOP::OBJECT_FORWARD_PERM) ? 1 : 0); } case GIOP::LOC_NEEDS_ADDRESSING_MODE: { GIOP::AddressingDisposition v; v <<= s; pd_ior->addr_mode(v); iop_client->RequestCompleted(); if (omniORB::trace(10)) { omniORB::logger log; log << "Remote locateRequest: GIOP::NEEDS_ADDRESSING_MODE: " << (int) v << " retry request.\n"; } goto again; } case GIOP::LOC_SYSTEM_EXCEPTION: OMNIORB_ASSERT(0); break; }}omniRemoteIdentity::~omniRemoteIdentity(){ ASSERT_OMNI_TRACEDMUTEX_HELD(*omni::internalLock, 1); omniORB::logs(15, "omniRemoteIdentity deleted."); pd_rope->decrRefCount(); pd_ior->release(); if (--identity_count == 0) lastIdentityHasBeenDeleted();}omniIdentity::equivalent_fnomniRemoteIdentity::get_real_is_equivalent() const { return real_is_equivalent;}CORBA::BooleanomniRemoteIdentity::real_is_equivalent(const omniIdentity* id1, const omniIdentity* id2) { omniRemoteIdentity* rid1 = (omniRemoteIdentity*)id1; omniRemoteIdentity* rid2 = (omniRemoteIdentity*)id2; if (rid1->pd_rope != rid2->pd_rope) return 0; const CORBA::Octet* key1 = rid1->key(); int keysize1 = rid1->keysize(); const CORBA::Octet* key2 = rid2->key(); int keysize2 = rid2->keysize(); if (keysize1 != keysize2 || memcmp((void*)key1,(void*)key2,keysize1) != 0) // Object keys do not match return 0; return 1;}_CORBA_BooleanomniRemoteIdentity::inThisAddressSpace(){ return 0;}void*omniRemoteIdentity::thisClassCompare(omniIdentity* id, void* vfn){ classCompare_fn fn = (classCompare_fn)vfn; if (fn == omniRemoteIdentity::thisClassCompare) return (omniRemoteIdentity*)id; return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?