diff options
Diffstat (limited to 'TAO/tao/Object.cpp')
-rw-r--r-- | TAO/tao/Object.cpp | 548 |
1 files changed, 0 insertions, 548 deletions
diff --git a/TAO/tao/Object.cpp b/TAO/tao/Object.cpp deleted file mode 100644 index 479f77266fa..00000000000 --- a/TAO/tao/Object.cpp +++ /dev/null @@ -1,548 +0,0 @@ -// @(#) $Id$ -// -// Copyright 1994-1995 by Sun Microsystems Inc. -// All Rights Reserved -// -// ORB: CORBA_Object operations - -#include "tao/Object.h" -#include "tao/Stub.h" -#include "tao/Servant_Base.h" -#include "tao/Request.h" -#include "tao/varout.h" -#include "tao/IIOP_Profile.h" -#include "tao/GIOP.h" -#include "tao/ORB_Core.h" -#include "tao/Invocation.h" -#include "ace/Auto_Ptr.h" - -#if !defined (__ACE_INLINE__) -# include "tao/Object.i" -#endif /* ! __ACE_INLINE__ */ - -ACE_RCSID(tao, Object, "$Id$") - -void -CORBA::release (CORBA_Object_ptr obj) -{ - if (obj) - obj->_decr_refcnt (); -} - -CORBA_Object::~CORBA_Object (void) -{ - this->protocol_proxy_->_decr_refcnt (); -} - -CORBA_Object::CORBA_Object (TAO_Stub *protocol_proxy, - TAO_ServantBase *servant, - CORBA::Boolean collocated) - : servant_ (servant), - is_collocated_ (collocated), - protocol_proxy_ (protocol_proxy), - refcount_ (1) -{ - // Notice that the refcount_ above is initialized to 1 because - // the semantics of CORBA Objects are such that obtaining one - // implicitly takes a reference. -} - -// IS_A ... ask the object if it's an instance of the type whose -// logical type ID is passed as a parameter. - -CORBA::Boolean -CORBA_Object::_is_a (const CORBA::Char *type_id, - CORBA::Environment &ACE_TRY_ENV) -{ - // If the object is collocated then try locally.... - if (this->is_collocated_ && this->servant_ != 0) - return this->servant_->_is_a (type_id, ACE_TRY_ENV); - - // NOTE: if istub->type_id is nonzero and we have local knowledge of - // it, we can answer this question without a costly remote call. - // - // That "local knowledge" could come from stubs or skeletons linked - // into this process in the best case, or a "near" repository in a - // slightly worse case. Or in a trivial case, if the ID being asked - // about is the ID we have recorded, we don't need to ask about the - // inheritance relationships at all! - // - // In real systems having local knowledge will be common, though as - // the systems built atop ORBs become richer it'll also become - // common to have the "real type ID" not be directly understood - // because it's more deeply derived than any locally known types. - // - // XXX if type_id is that of CORBA_Object, "yes, we comply" :-) - - if ( ACE_static_cast(const char *, this->_stubobj ()->type_id) != 0 - && ACE_OS::strcmp ((char *) type_id, (char *) this->_stubobj ()->type_id) == 0) - return 1; - - CORBA::Boolean _tao_retval = 0; - - TAO_Stub *istub = this->_stubobj (); - if (istub == 0) - ACE_THROW_RETURN (CORBA::INV_OBJREF (CORBA::COMPLETED_NO), _tao_retval); - - - TAO_GIOP_Twoway_Invocation _tao_call ( - istub, - "_is_a", - istub->orb_core () - ); - - - // Loop until we succeed or we raise an exception. - for (;;) - { - ACE_TRY_ENV.clear (); - _tao_call.start (ACE_TRY_ENV); - ACE_CHECK_RETURN (_tao_retval); - - TAO_OutputCDR &_tao_out = _tao_call.out_stream (); - if (!( - (_tao_out << type_id) - )) - ACE_THROW_RETURN (CORBA::MARSHAL (CORBA::COMPLETED_NO), _tao_retval); - - int _invoke_status = - _tao_call.invoke (0, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (_tao_retval); - - if (_invoke_status == TAO_INVOKE_RESTART) - continue; - // if (_invoke_status == TAO_INVOKE_EXCEPTION) - // cannot happen - if (_invoke_status != TAO_INVOKE_OK) - { - ACE_THROW_RETURN (CORBA::UNKNOWN (CORBA::COMPLETED_YES), _tao_retval); - - } - break; - } - TAO_InputCDR &_tao_in = _tao_call.inp_stream (); - if (!( - (_tao_in >> CORBA::Any::to_boolean (_tao_retval)) - )) - ACE_THROW_RETURN (CORBA::MARSHAL (CORBA::COMPLETED_YES), _tao_retval); - return _tao_retval; -} - -const char* -CORBA_Object::_interface_repository_id (void) const -{ - return "IDL:omg.org/CORBA/Object:1.0"; -} - -TAO_ServantBase * -CORBA_Object::_servant (void) const -{ - return this->servant_; -} - -CORBA::Boolean -CORBA_Object::_is_collocated (void) const -{ - return this->is_collocated_; -} - -// NON_EXISTENT ... send a simple call to the object, which will -// either elicit a FALSE response or a OBJECT_NOT_EXIST exception. In -// the latter case, return FALSE. - -CORBA::Boolean -CORBA_Object::_non_existent (CORBA::Environment &ACE_TRY_ENV) -{ - CORBA::Boolean _tao_retval = 0; - - TAO_Stub *istub = this->_stubobj (); - if (istub == 0) - ACE_THROW_RETURN (CORBA::INV_OBJREF (CORBA::COMPLETED_NO), _tao_retval); - - - TAO_GIOP_Twoway_Invocation _tao_call ( - istub, - "_non_existent", - istub->orb_core () - ); - - - for (;;) - { - ACE_TRY_ENV.clear (); - _tao_call.start (ACE_TRY_ENV); - ACE_CHECK_RETURN (_tao_retval); - - int _invoke_status = - _tao_call.invoke (0, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (_tao_retval); - - if (_invoke_status == TAO_INVOKE_RESTART) - continue; - // if (_invoke_status == TAO_INVOKE_EXCEPTION) - // cannot happen - if (_invoke_status != TAO_INVOKE_OK) - { - ACE_THROW_RETURN (CORBA::UNKNOWN (CORBA::COMPLETED_YES), _tao_retval); - - } - break; - - } - - TAO_InputCDR &_tao_in = _tao_call.inp_stream (); - if (!( - (_tao_in >> CORBA::Any::to_boolean (_tao_retval)) - )) - ACE_THROW_RETURN (CORBA::MARSHAL (CORBA::COMPLETED_NO), _tao_retval); - return _tao_retval; -} - -// Quickly hash an object reference's representation data. Used to -// create hash tables. - -CORBA::ULong -CORBA_Object::_hash (CORBA::ULong maximum, - CORBA::Environment &env) -{ - return this->_stubobj ()->hash (maximum, env); -} - -// Compare two object references to see if they point to the same -// object. Used in linear searches, as in hash buckets. -// -// XXX would be useful to also have a trivalued comparison predicate, -// such as strcmp(), to allow more comparison algorithms. - -CORBA::Boolean -CORBA_Object::_is_equivalent (CORBA_Object_ptr other_obj, - CORBA::Environment &env) -{ - if (other_obj == this) - { - env.clear (); - return 1; - } - - return this->_stubobj ()->is_equivalent (other_obj, env); -} - -// TAO's extensions - -TAO_ObjectKey * -CORBA::Object::_key (CORBA::Environment &env) -{ - if (this->_stubobj () && this->_stubobj ()->profile_in_use ()) - return this->_stubobj ()->profile_in_use ()->_key (env); - - ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) Null stub obj!!!\n"), 0); -} - - -// @@ This doesn't seemed to be used anyplace! It should go away!! FRED -void -CORBA::Object::_use_locate_requests (CORBA::Boolean use_it) -{ - if ( this->_stubobj () ) - this->_stubobj ()->use_locate_requests (use_it); - - return; -} - -#if !defined (TAO_HAS_MINIMUM_CORBA) - -void -CORBA_Object::_create_request (CORBA::Context_ptr ctx, - const CORBA::Char *operation, - CORBA::NVList_ptr arg_list, - CORBA::NamedValue_ptr result, - CORBA::Request_ptr &request, - CORBA::Flags req_flags, - CORBA::Environment &TAO_IN_ENV) -{ - // Since we don't really support Context, anything but a null pointer - // is a no-no. - if (ctx) - { - TAO_THROW(CORBA::NO_IMPLEMENT (CORBA::COMPLETED_NO)); - } - request = new CORBA::Request (this, operation, arg_list, result, req_flags); -} - -CORBA::Request_ptr -CORBA_Object::_request (const CORBA::Char *operation, - CORBA::Environment &TAO_IN_ENV) -{ - TAO_IN_ENV.clear (); - return new CORBA::Request (this, operation); -} - -CORBA::InterfaceDef_ptr -CORBA_Object::_get_interface (CORBA::Environment &ACE_TRY_ENV) -{ - // @@ TODO this method will require some modifications once the - // interface repository is implemented. The modifications are - // documented with @@ comments. - - // @@ this should use the _nil() method... - CORBA::InterfaceDef_ptr _tao_retval = 0; - - TAO_Stub *istub = this->_stubobj (); - if (istub == 0) - ACE_THROW_RETURN (CORBA::INV_OBJREF (CORBA::COMPLETED_NO), _tao_retval); - - - TAO_GIOP_Twoway_Invocation _tao_call ( - istub, - "_interface", - istub->orb_core () - ); - - for (;;) - { - _tao_call.start (ACE_TRY_ENV); - ACE_CHECK_RETURN (_tao_retval); - - int _invoke_status = - _tao_call.invoke (0, 0, ACE_TRY_ENV); - ACE_CHECK_RETURN (_tao_retval); - - if (_invoke_status == TAO_INVOKE_RESTART) - continue; - // if (_invoke_status == TAO_INVOKE_EXCEPTION) - // cannot happen - if (_invoke_status != TAO_INVOKE_OK) - { - ACE_THROW_RETURN (CORBA::UNKNOWN (CORBA::COMPLETED_YES), _tao_retval); - - } - break; - } - -#if 0 - TAO_InputCDR &_tao_in = _tao_call.inp_stream (); - // @@ The extraction operation (>>) for InterfaceDef will be - // defined, and thus this code will work. Right now we raise a - // MARSHAL exception.... - if (!( - (_tao_in >> _tao_retval) - )) - ACE_THROW_RETURN (CORBA::MARSHAL (CORBA::COMPLETED_NO), _tao_retval); -#else - ACE_UNUSED_ARG (_tao_retval); - ACE_THROW_RETURN (CORBA::MARSHAL (CORBA::COMPLETED_NO), _tao_retval); -#endif -} - -CORBA::ImplementationDef_ptr -CORBA_Object::_get_implementation (CORBA::Environment &) -{ - return 0; -} - -#endif /* TAO_HAS_MINIMUM_CORBA */ - -// **************************************************************** - -CORBA::Boolean -operator<< (TAO_OutputCDR& cdr, const CORBA_Object* x) -{ - if (x == 0) - { - // NIL objrefs ... marshal as empty type hint, no elements. - cdr.write_ulong (1); - cdr.write_char ('\0'); - cdr.write_ulong (0); - return cdr.good_bit (); - } - - TAO_Stub *stubobj = x->_stubobj (); - - if (stubobj == 0) - return 0; - - // STRING, a type ID hint - if ((cdr << stubobj->type_id) == 0) - return 0; - - const TAO_MProfile& mprofile = - stubobj->get_base_profiles (); - - CORBA::ULong profile_count = mprofile.profile_count (); - if ((cdr << profile_count) == 0) - return 0; - - // @@ The MProfile should be locked during this iteration, is there - // anyway to achieve that? - for (CORBA::ULong i = 0; i < profile_count; ++i) - { - const TAO_Profile* p = mprofile.get_profile (i); - if (p->encode (cdr) == 0) - return 0; - } - return cdr.good_bit (); -} - -CORBA::Boolean -operator>> (TAO_InputCDR& cdr, CORBA_Object*& x) -{ - CORBA::String_var type_hint; - - if ((cdr >> type_hint.inout ()) == 0) - return 0; - - CORBA::ULong profile_count; - if ((cdr >> profile_count) == 0) - return 0; - - if (profile_count == 0) - { - x = CORBA::Object::_nil (); - return cdr.good_bit (); - } - - // get a profile container to store all profiles in the IOR. - auto_ptr<TAO_MProfile> mp (new TAO_MProfile (profile_count)); - - while (profile_count-- != 0 && cdr.good_bit ()) - { - CORBA::ULong tag; - - // If there is an error we abort - if ((cdr >> tag) == 0) - continue; - - // @@ For now we just take IIOP_Profiles, FRED - // @@ fred: this is something that we *must* handle correctly, - // the TAO_Profile class must be concrete (or we must have a - // TAO_Generic_Profile class), any profile we don't anything - // about should be converted in one of those - // TAO_Generic_Profiles. - // Also: the right component to decide if we can handle a - // profile or not is the connector registry. - // Carlos. - // - if (tag != TAO_IOP_TAG_INTERNET_IOP) - { - ACE_DEBUG ((LM_DEBUG, - "unknown profile tag %d skipping\n", tag)); - cdr.skip_string (); - continue; - } - - // OK, we've got an IIOP profile. It's going to be - // encapsulated ProfileData. Create a new decoding stream and - // context for it, and tell the "parent" stream that this data - // isn't part of it any more. - - // ProfileData is encoded as a sequence of octet. So first get - // the length of the sequence. - CORBA::ULong encap_len; - if ((cdr >> encap_len) == 0) - continue; - - // Create the decoding stream from the encapsulation in the - // buffer, and skip the encapsulation. - TAO_InputCDR str (cdr, encap_len); - - if (str.good_bit () == 0 - || cdr.skip_bytes (encap_len) == 0) - continue; - - // get the default IIOP Profile and fill in the blanks - // with str. - // @@ use an auto_ptr<> here! - TAO_IIOP_Profile *pfile; - ACE_NEW_RETURN (pfile, TAO_IIOP_Profile, 0); - - int r = 0; - ACE_TRY_NEW_ENV - { - CORBA::Boolean continue_decoding; - r = pfile->parse (str, continue_decoding, ACE_TRY_ENV); - ACE_TRY_CHECK; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, - "IIOP_Profile::parse raised exception!" - " Shouldn't happen\n")); - ACE_TRY_ENV.print_exception ("IIOP_Profile::parse"); - pfile->_decr_refcnt (); - return 0; - } - ACE_ENDTRY; - - switch (r) - { - case -1: - pfile->_decr_refcnt (); - return 0; - case 0: - pfile->_decr_refcnt (); - break; - case 1: - default: - mp->give_profile (pfile); - // all other return values indicate success - // we do not decrement reference count on profile since we - // are giving it to the MProfile! - break; - } // switch - - } // while loop - - // make sure we got some profiles! - if (mp->profile_count () == 0) - { - ACE_DEBUG ((LM_DEBUG, - "no IIOP v%d.%d (or earlier) profile in IOR!\n", - TAO_IIOP_Profile::DEF_IIOP_MAJOR, - TAO_IIOP_Profile::DEF_IIOP_MINOR)); - return 0; - } - - // Ownership of type_hint is given to TAO_Stub - // TAO_Stub will make a copy of mp! - TAO_Stub *objdata; - ACE_NEW_RETURN (objdata, TAO_Stub (type_hint._retn (), - mp.get (), - cdr.orb_core ()), 0); - - if (objdata == 0) - return 0; - - // Create a new CORBA_Object and give it the TAO_Stub just - // created. - TAO_ServantBase *servant = - objdata->orb_core ()->orb ()->_get_collocated_servant (objdata); - - ACE_NEW_RETURN (x, CORBA_Object (objdata, servant, servant != 0), 0); - - // the corba proxy would have already incremented the reference count on - // the objdata. So we decrement it here by 1 so that the objdata is now - // fully owned by the corba_proxy that was created. - // objdata->_decr_refcnt (); - - return cdr.good_bit (); -} - -// **************************************************************** - -TAO_Object_Field::~TAO_Object_Field (void) -{ -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) - -template class TAO_Object_Field_T<CORBA_Object>; -template class auto_ptr<TAO_MProfile>; -template class ACE_Auto_Basic_Ptr<TAO_MProfile>; - -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) - -#pragma instantiate TAO_Object_Field_T<CORBA_Object> -#pragma instantiate auto_ptr<TAO_MProfile> -#pragma instantiate ACE_Auto_Basic_Ptr<TAO_MProfile> - -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |