diff options
Diffstat (limited to 'TAO/tao/CurrentC.cpp')
-rw-r--r-- | TAO/tao/CurrentC.cpp | 150 |
1 files changed, 114 insertions, 36 deletions
diff --git a/TAO/tao/CurrentC.cpp b/TAO/tao/CurrentC.cpp index bd80d7fbb07..bcf055e6936 100644 --- a/TAO/tao/CurrentC.cpp +++ b/TAO/tao/CurrentC.cpp @@ -1,33 +1,50 @@ -/* -*- C++ -*- $Id$ */ +/* -*- C++ -*- */ +// $Id$ // ****** Code generated by the The ACE ORB (TAO) IDL Compiler ******* -// TAO and the TAO IDL Compiler have been developed by the Center for -// Distributed Object Computing at Washington University, St. Louis. +// TAO ORB and the TAO IDL Compiler have been developed by Washington +// University Computer Science's Distributed Object Computing Group. // -// Information about TAO is available at: +// Information on TAO is available at // http://www.cs.wustl.edu/~schmidt/TAO.html #include "tao/CurrentC.h" -#include "tao/Sequence.h" +#include "tao/Stub.h" +#include "tao/Servant_Base.h" +#include "tao/Typecode.h" +#include "tao/Any.h" +#include "tao/POA_CORBA.h" +#include "tao/Environment.h" #if !defined (__ACE_INLINE__) #include "tao/CurrentC.i" #endif /* !defined INLINE */ -// default constructor -CORBA_Current::CORBA_Current (void) -{} +ACE_RCSID(tao, CurrentC, "$Id$") -// destructor -CORBA_Current::~CORBA_Current (void) -{} +CORBA_Current_ptr CORBA_Current::_duplicate (CORBA_Current_ptr obj) +{ + if (!CORBA::is_nil (obj)) + obj->_add_ref (); + + return obj; +} // end of _duplicate CORBA_Current_ptr CORBA_Current::_narrow ( CORBA::Object_ptr obj, CORBA::Environment &ACE_TRY_ENV ) { + if (CORBA::is_nil (obj)) + return CORBA_Current::_nil (); + if (! obj->_is_local ()) + { + CORBA::Boolean is_a = obj->_is_a ("IDL:CORBA_Current:1.0", ACE_TRY_ENV); + ACE_CHECK_RETURN (CORBA_Current::_nil ()); + if (is_a == 0) + return CORBA_Current::_nil (); + } return CORBA_Current::_unchecked_narrow (obj, ACE_TRY_ENV); } @@ -38,7 +55,25 @@ CORBA_Current_ptr CORBA_Current::_unchecked_narrow ( { if (CORBA::is_nil (obj)) return CORBA_Current::_nil (); - return + if (! obj->_is_local ()) + { + TAO_Stub* stub = obj->_stubobj (); + if (stub) + stub->_incr_refcnt (); + CORBA_Current_ptr default_proxy = CORBA_Current::_nil (); + + if (obj->_is_collocated () && _TAO_collocation_CORBA_Current_Stub_Factory_function_pointer != 0) + { + default_proxy = _TAO_collocation_CORBA_Current_Stub_Factory_function_pointer (obj); + } + if (CORBA::is_nil (default_proxy)) + ACE_NEW_RETURN (default_proxy, CORBA_Current (stub), CORBA_Current::_nil ()); + + return default_proxy; + + } + else + return ACE_reinterpret_cast ( CORBA_Current_ptr, @@ -53,28 +88,26 @@ CORBA_Current_ptr CORBA_Current::_unchecked_narrow ( ); } -CORBA_Current_ptr -CORBA_Current::_duplicate (CORBA_Current_ptr obj) +CORBA_Current_ptr CORBA_Current::_nil (void) { - if (!CORBA::is_nil (obj)) - obj->_add_ref (); - return obj; + return (CORBA_Current_ptr)NULL; +} // end of _nil + +void +CORBA_Current::_tao_any_destructor (void* x) +{ + CORBA_Current *tmp = ACE_static_cast (CORBA_Current*,x); + CORBA::release (tmp); } -void *CORBA_Current::_tao_QueryInterface (ptr_arith_t type) +CORBA::Boolean CORBA_Current::_is_a (const CORBA::Char *value, CORBA::Environment &ACE_TRY_ENV) { - void *retv = 0; - if (type == ACE_reinterpret_cast - (ptr_arith_t, - &CORBA_Current::_narrow)) - retv = ACE_reinterpret_cast (void*, this); - else if (type == ACE_reinterpret_cast (ptr_arith_t, &CORBA::Object::_narrow)) - retv = ACE_reinterpret_cast (void *, - ACE_static_cast (CORBA::Object_ptr, this)); - - if (retv) - this->_add_ref (); - return retv; + if ( + (!ACE_OS::strcmp ((char *)value, "IDL:omg.org/CORBA/Current:1.0")) || + (!ACE_OS::strcmp ((char *)value, "IDL:omg.org/CORBA/Object:1.0"))) + return 1; // success using local knowledge + else + return this->CORBA_Object::_is_a (value, ACE_TRY_ENV); // remote call } const char* CORBA_Current::_interface_repository_id (void) const @@ -82,9 +115,54 @@ const char* CORBA_Current::_interface_repository_id (void) const return "IDL:omg.org/CORBA/Current:1.0"; } -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) || \ - defined (ACE_HAS_GNU_REPO) - template class TAO_Object_Manager<CORBA_Current,CORBA_Current_var>; - #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) - # pragma instantiate TAO_Object_Manager<CORBA_Current,CORBA_Current_var> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ +CORBA_Current_ptr (*_TAO_collocation_CORBA_Current_Stub_Factory_function_pointer) ( + CORBA::Object_ptr obj + ) = 0; +void operator<<= (CORBA::Any &_tao_any, CORBA::Current_ptr _tao_elem) +{ + TAO_OutputCDR stream; + if (stream << _tao_elem) + { + _tao_any._tao_replace ( + CORBA::_tc_Current, + TAO_ENCAP_BYTE_ORDER, + stream.begin () + ); + } +} + +CORBA::Boolean operator>>= (const CORBA::Any &_tao_any, CORBA::Current_ptr &_tao_elem) +{ + ACE_TRY_NEW_ENV + { + _tao_elem = CORBA::Current::_nil (); + CORBA::TypeCode_var type = _tao_any.type (); + if (!type->equivalent (CORBA::_tc_Current, ACE_TRY_ENV)) // not equal + { + return 0; + } + ACE_TRY_CHECK; + TAO_InputCDR stream ( + _tao_any._tao_get_cdr (), + _tao_any._tao_byte_order () + ); + if (stream >> _tao_elem) + { + ((CORBA::Any *)&_tao_any)->_tao_replace ( + CORBA::_tc_Current, + 1, + _tao_elem, + CORBA::Current::_tao_any_destructor + ); + return 1; + } + } + ACE_CATCHANY + { + _tao_elem = CORBA::Current::_nil (); + return 0; + } + ACE_ENDTRY; + _tao_elem = CORBA::Current::_nil (); + return 0; +} |