diff options
Diffstat (limited to 'TAO/tao/Object.cpp')
-rw-r--r-- | TAO/tao/Object.cpp | 613 |
1 files changed, 0 insertions, 613 deletions
diff --git a/TAO/tao/Object.cpp b/TAO/tao/Object.cpp deleted file mode 100644 index 6b8e9cd116c..00000000000 --- a/TAO/tao/Object.cpp +++ /dev/null @@ -1,613 +0,0 @@ -// @(#) $Id$ -// -// Copyright 1994-1995 by Sun Microsystems Inc. -// All Rights Reserved -// -// ORB: CORBA_Object operations - -#include "tao/Object.h" -#include "tao/Object_Adapter.h" -#include "tao/Stub.h" -#include "tao/Servant_Base.h" -#include "tao/Request.h" -#include "tao/varout.h" -#include "tao/GIOP.h" -#include "tao/ORB_Core.h" -#include "tao/Invocation.h" -#include "tao/Connector_Registry.h" -#include "tao/debug.h" -#include "ace/Auto_Ptr.h" - -#if !defined (__ACE_INLINE__) -# include "tao/Object.i" -#endif /* ! __ACE_INLINE__ */ - -ACE_RCSID(tao, Object, "$Id$") - -CORBA_Object::~CORBA_Object (void) -{ - if (this->protocol_proxy_) - 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_) - { - // Which collocation strategy should we use? - if (this->protocol_proxy_->servant_orb_var ()->orb_core ()->get_collocation_strategy () == TAO_ORB_Core::THRU_POA) - { - TAO_Object_Adapter::Servant_Upcall servant_upcall - (*this->_stubobj ()->servant_orb_var ()->orb_core ()->object_adapter ()); - servant_upcall.prepare_for_upcall (this->_object_key (), - "_is_a", - ACE_TRY_ENV); - ACE_CHECK_RETURN (0); - return servant_upcall.servant ()->_is_a (type_id, ACE_TRY_ENV); - } - - // Direct collocation strategy is used. - if (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 (this->_stubobj ()->type_id.in () != 0 - && ACE_OS::strcmp (type_id, - this->_stubobj ()->type_id.in ()) == 0) - return 1; - - CORBA::Boolean _tao_retval = 0; - - TAO_Stub *istub = this->_stubobj (); - if (istub == 0) - ACE_THROW_RETURN (CORBA::INTERNAL (), _tao_retval); - - - TAO_GIOP_Twoway_Invocation _tao_call ( - istub, - "_is_a", - istub->orb_core () - ); - - - // Loop until we succeed or we raise an exception. - // @@ Nanbor: Do we still need to clear the environment variable? - // ACE_TRY_ENV.clear (); - for (;;) - { - _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 (), _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 (TAO_DEFAULT_MINOR_CODE, 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 (TAO_DEFAULT_MINOR_CODE, 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_; -} - -// Quickly hash an object reference's representation data. Used to -// create hash tables. - -CORBA::ULong -CORBA_Object::_hash (CORBA::ULong maximum, - CORBA::Environment &ACE_TRY_ENV) -{ - return this->_stubobj ()->hash (maximum, ACE_TRY_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 &) - ACE_THROW_SPEC (()) -{ - if (other_obj == this) - { - return 1; - } - - return this->_stubobj ()->is_equivalent (other_obj); -} - -// TAO's extensions - -TAO_ObjectKey * -CORBA::Object::_key (CORBA::Environment &) -{ - if (this->_stubobj () && this->_stubobj ()->profile_in_use ()) - return this->_stubobj ()->profile_in_use ()->_key (); - - ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) Null stub obj!!!\n"), 0); -} - -const TAO_ObjectKey & -CORBA::Object::_object_key (void) -{ - return this->_stubobj ()->profile_in_use ()->object_key (); -} - -// @@ 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) - -// 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) -{ - // If the object is collocated then try locally.... - if (this->is_collocated_) - { - // Which collocation strategy should we use? - if (this->protocol_proxy_->servant_orb_var ()->orb_core ()->get_collocation_strategy () == TAO_ORB_Core::THRU_POA) - { - TAO_Object_Adapter::Servant_Upcall servant_upcall - (*this->_stubobj ()->servant_orb_var ()->orb_core ()->object_adapter ()); - servant_upcall.prepare_for_upcall (this->_object_key (), - "_non_existent", - ACE_TRY_ENV); - ACE_CHECK_RETURN (0); - return servant_upcall.servant ()->_non_existent (ACE_TRY_ENV); - } - - // Direct collocation strategy is used. - if (this->servant_ != 0) - return this->servant_->_non_existent (ACE_TRY_ENV); - } - - CORBA::Boolean _tao_retval = 0; - - TAO_Stub *istub = this->_stubobj (); - if (istub == 0) - ACE_THROW_RETURN (CORBA::INTERNAL (), _tao_retval); - - - TAO_GIOP_Twoway_Invocation _tao_call ( - istub, - "_non_existent", - istub->orb_core () - ); - - - // ACE_TRY_ENV.clear (); - 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 (TAO_DEFAULT_MINOR_CODE, 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 (), _tao_retval); - return _tao_retval; -} - -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 &ACE_TRY_ENV) -{ - // Since we don't really support Context, anything but a null pointer - // is a no-no. - if (ctx) - { - ACE_THROW (CORBA::NO_IMPLEMENT ()); - } - request = new CORBA::Request (this, - operation, - arg_list, - result, - req_flags, - ACE_TRY_ENV); -} - -void -CORBA_Object::_create_request (CORBA::Context_ptr ctx, - const CORBA::Char *operation, - CORBA::NVList_ptr arg_list, - CORBA::NamedValue_ptr result, - CORBA::ExceptionList_ptr, - CORBA::ContextList_ptr, - CORBA::Request_ptr &request, - CORBA::Flags req_flags, - CORBA::Environment &ACE_TRY_ENV) -{ - // Since we don't really support Context, anything but a null pointer - // is a no-no. - if (ctx) - { - ACE_THROW (CORBA::NO_IMPLEMENT ()); - } - request = new CORBA::Request (this, - operation, - arg_list, - result, - req_flags, - ACE_TRY_ENV); -} - -CORBA::Request_ptr -CORBA_Object::_request (const CORBA::Char *operation, - CORBA::Environment &ACE_TRY_ENV) -{ - // ACE_TRY_ENV.clear (); - return new CORBA::Request (this, - operation, - ACE_TRY_ENV); -} - -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::INTERNAL (), _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 (TAO_DEFAULT_MINOR_CODE, 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 (), _tao_retval); -#else - ACE_UNUSED_ARG (_tao_retval); - ACE_THROW_RETURN (CORBA::MARSHAL (), _tao_retval); -#endif -} - -CORBA::ImplementationDef_ptr -CORBA_Object::_get_implementation (CORBA::Environment &) -{ - return 0; -} - -#endif /* TAO_HAS_MINIMUM_CORBA */ - -// **************************************************************** - -#if defined (TAO_HAS_CORBA_MESSAGING) -CORBA::Policy_ptr -CORBA_Object::_get_policy ( - CORBA::PolicyType type, - CORBA::Environment &ACE_TRY_ENV) -{ - return this->_stubobj ()->get_policy (type, ACE_TRY_ENV); -} - -CORBA::Policy_ptr -CORBA_Object::_get_client_policy ( - CORBA::PolicyType type, - CORBA::Environment &ACE_TRY_ENV) -{ - return this->_stubobj ()->get_client_policy (type, ACE_TRY_ENV); -} - -CORBA::Object_ptr -CORBA_Object::_set_policy_overrides ( - const CORBA::PolicyList & policies, - CORBA::SetOverrideType set_add, - CORBA::Environment &ACE_TRY_ENV) -{ - TAO_Stub* stub = - this->_stubobj ()->set_policy_overrides (policies, - set_add, - ACE_TRY_ENV); - ACE_CHECK_RETURN (CORBA::Object::_nil ()); - - return new CORBA_Object (stub, - this->servant_, - this->is_collocated_); -} - -CORBA::PolicyList * -CORBA_Object::_get_policy_overrides ( - const CORBA::PolicyTypeSeq & types, - CORBA::Environment &ACE_TRY_ENV) -{ - return this->_stubobj ()->get_policy_overrides (types, ACE_TRY_ENV); -} - -CORBA::Boolean -CORBA_Object::_validate_connection ( - CORBA::PolicyList_out inconsistent_policies, - CORBA::Environment &ACE_TRY_ENV) -{ - return this->_stubobj ()->validate_connection (inconsistent_policies, - ACE_TRY_ENV); -} - -#endif /* TAO_HAS_CORBA_MESSAGING */ - -// **************************************************************** - -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 (CORBA::Boolean) cdr.good_bit (); - } - - TAO_Stub *stubobj = x->_stubobj (); - - if (stubobj == 0) - return 0; - - // STRING, a type ID hint - if ((cdr << stubobj->type_id.in ()) == 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 (CORBA::Boolean) 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 (CORBA::Boolean) cdr.good_bit (); - } - - // get a profile container to store all profiles in the IOR. - TAO_MProfile mp (profile_count); - - TAO_ORB_Core *orb_core = cdr.orb_core (); - if (orb_core == 0) - { - orb_core = TAO_ORB_Core_instance (); - if (TAO_debug_level > 0) - { - ACE_DEBUG ((LM_DEBUG, - "WARNING: extracting object from default ORB_Core\n")); - } - } - - TAO_Connector_Registry *connector_registry = - orb_core->connector_registry (); - for (CORBA::ULong i = 0; i != profile_count && cdr.good_bit (); ++i) - { - TAO_Profile *pfile = - connector_registry->create_profile (cdr); - if (pfile != 0) - mp.give_profile (pfile); - } - - // make sure we got some profiles! - if (mp.profile_count () != profile_count) - { - ACE_DEBUG ((LM_DEBUG, - "TAO (%P|%t) could not create all " - "the profiles\n")); - 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, - cdr.orb_core ()), 0); - - if (objdata == 0) - return 0; - - // Figure out if the servant is collocated. - TAO_ServantBase *servant = 0; - TAO_SERVANT_LOCATION servant_location = - objdata->orb_core ()->orb ()->_get_collocated_servant (objdata, - servant); - - int collocated = 0; - if (servant_location != TAO_SERVANT_NOT_FOUND) - collocated = 1; - - // Create a new CORBA_Object and give it the TAO_Stub just created. - ACE_NEW_RETURN (x, - CORBA_Object (objdata, - servant, - (CORBA::Boolean) collocated), - 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 (CORBA::Boolean) 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,CORBA_Object_var>; -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,CORBA_Object_var> -#pragma instantiate auto_ptr<TAO_MProfile> -#pragma instantiate ACE_Auto_Basic_Ptr<TAO_MProfile> - -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |