summaryrefslogtreecommitdiff
path: root/TAO/tao/Valuetype/AbstractBase.cpp
diff options
context:
space:
mode:
authorparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-05-04 23:16:32 +0000
committerparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-05-04 23:16:32 +0000
commit643462b18154a6e7581674e5c1114e4a38a1348f (patch)
tree3e0c4010b8bba89d5b0b2b2a51db7b284a45038a /TAO/tao/Valuetype/AbstractBase.cpp
parent09c701aa0ec69b620bdb9db08c940430ff37c453 (diff)
downloadATCD-643462b18154a6e7581674e5c1114e4a38a1348f.tar.gz
ChangeLogTag: Sun May 4 18:06:59 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
Diffstat (limited to 'TAO/tao/Valuetype/AbstractBase.cpp')
-rw-r--r--TAO/tao/Valuetype/AbstractBase.cpp374
1 files changed, 374 insertions, 0 deletions
diff --git a/TAO/tao/Valuetype/AbstractBase.cpp b/TAO/tao/Valuetype/AbstractBase.cpp
new file mode 100644
index 00000000000..352ba691a2d
--- /dev/null
+++ b/TAO/tao/Valuetype/AbstractBase.cpp
@@ -0,0 +1,374 @@
+// "$Id$"
+
+#include "AbstractBase.h"
+#include "ValueBase.h"
+#include "ValueFactory.h"
+#include "tao/Stub.h"
+#include "tao/Profile.h"
+#include "tao/debug.h"
+
+#if !defined (__ACE_INLINE__)
+# include "AbstractBase.inl"
+#endif /* ! __ACE_INLINE__ */
+
+
+ACE_RCSID (Valuetype,
+ AbstractBase,
+ "$Id$")
+
+// ************************************************************
+// These are in CORBA namespace
+
+void
+CORBA::release (CORBA::AbstractBase_ptr obj)
+{
+ if (obj)
+ {
+ obj->_remove_ref ();
+ }
+}
+
+CORBA::Boolean
+CORBA::is_nil (CORBA::AbstractBase_ptr obj)
+{
+ return (obj == 0);
+}
+
+// ************************************************************
+
+int CORBA::AbstractBase::_tao_class_id = 0;
+
+CORBA::AbstractBase::AbstractBase (void)
+ : is_objref_ (0),
+ concrete_stubobj_ (0),
+ is_collocated_ (0),
+ servant_ (0),
+ is_local_ (0)
+{
+}
+
+CORBA::AbstractBase::AbstractBase (const CORBA::AbstractBase &rhs)
+ : is_objref_ (rhs.is_objref_),
+ concrete_stubobj_ (rhs.concrete_stubobj_),
+ is_collocated_ (rhs.is_collocated_),
+ servant_ (rhs.servant_),
+ is_local_ (rhs.is_local_)
+{
+ if (this->concrete_stubobj_ != 0)
+ {
+ (void) this->concrete_stubobj_->_incr_refcnt ();
+ }
+}
+
+CORBA::AbstractBase::AbstractBase (TAO_Stub * protocol_proxy,
+ CORBA::Boolean collocated,
+ TAO_Abstract_ServantBase * servant)
+ : is_objref_ (1),
+ concrete_stubobj_ (protocol_proxy),
+ is_collocated_ (collocated),
+ servant_ (servant),
+ is_local_ (protocol_proxy == 0 ? 1 : 0)
+{
+ if (this->concrete_stubobj_ != 0)
+ {
+ (void) this->concrete_stubobj_->_incr_refcnt ();
+ }
+}
+
+CORBA::AbstractBase::~AbstractBase (void)
+{
+ if (this->concrete_stubobj_ != 0)
+ {
+ (void) this->concrete_stubobj_->_decr_refcnt ();
+ }
+}
+
+CORBA::AbstractBase_ptr
+CORBA::AbstractBase::_duplicate (CORBA::AbstractBase_ptr obj)
+{
+ if (obj)
+ {
+ obj->_add_ref ();
+ }
+
+ return obj;
+}
+
+void *
+CORBA::AbstractBase::_tao_QueryInterface (ptrdiff_t type)
+{
+ void *retv = 0;
+
+ if (type == ACE_reinterpret_cast (
+ ptrdiff_t,
+ &CORBA::AbstractBase::_tao_class_id)
+ )
+ {
+ retv = ACE_reinterpret_cast (void*, this);
+ }
+
+ if (retv != 0)
+ {
+ this->_add_ref ();
+ }
+
+ return retv;
+}
+
+// These are non-pure virtual no-ops so we can instantiate the
+// class in the CDR extraction operator. The actual management
+// of the refcount will always be done in the derived class.
+void
+CORBA::AbstractBase::_add_ref (void)
+{
+}
+
+void
+CORBA::AbstractBase::_remove_ref (void)
+{
+}
+
+void
+CORBA::AbstractBase::_tao_any_destructor (void *x)
+{
+ CORBA::AbstractBase_ptr tmp = ACE_static_cast (CORBA::AbstractBase_ptr, x);
+ CORBA::release (tmp);
+}
+
+CORBA::Object_ptr
+CORBA::AbstractBase::_to_object (void)
+{
+ if (this->concrete_stubobj_ == 0)
+ {
+ return CORBA::Object::_nil ();
+ }
+
+ TAO_ORB_Core *orb_core = this->concrete_stubobj_->orb_core ();
+ this->concrete_stubobj_->_incr_refcnt ();
+
+ return orb_core->create_object (this->concrete_stubobj_);
+}
+
+CORBA::ValueBase *
+CORBA::AbstractBase::_to_value (void)
+{
+ if (this->is_objref_)
+ {
+ return 0;
+ }
+
+ CORBA::ValueBase *retval = this->_tao_to_value ();
+
+ if (retval == 0)
+ {
+ return retval;
+ }
+
+ retval->_add_ref ();
+ return retval;
+}
+
+CORBA::Boolean
+operator<< (TAO_OutputCDR &strm, const CORBA::AbstractBase_ptr abs)
+{
+ CORBA::Boolean discriminator = 0;
+
+ if (abs->_is_objref ())
+ {
+ discriminator = 1;
+
+ if (strm << ACE_OutputCDR::from_boolean (discriminator))
+ {
+ TAO_Stub *stubobj = abs->_stubobj ();
+
+ if (stubobj == 0)
+ {
+ return 0;
+ }
+
+ // STRING, a type ID hint
+ if ((strm << stubobj->type_id.in ()) == 0)
+ {
+ return 0;
+ }
+
+ const TAO_MProfile& mprofile = stubobj->base_profiles ();
+
+ CORBA::ULong profile_count = mprofile.profile_count ();
+
+ if ((strm << 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 (strm) == 0)
+ {
+ return 0;
+ }
+ }
+
+ return (CORBA::Boolean) strm.good_bit ();
+ }
+ }
+ else
+ {
+ discriminator = 0;
+
+ if (strm << ACE_OutputCDR::from_boolean (discriminator))
+ {
+ CORBA::Boolean retval = 1;
+
+ CORBA::ULong value_tag = TAO_OBV_GIOP_Flags::Value_tag_base
+ | TAO_OBV_GIOP_Flags::Type_info_single;
+
+ retval = strm.write_ulong (value_tag);
+
+ if (retval == 0)
+ {
+ return retval;
+ }
+
+ retval = strm << abs->_tao_obv_repository_id ();
+
+ if (retval == 0)
+ {
+ return retval;
+ }
+
+ return abs->_tao_marshal_v (strm);
+ }
+ }
+
+ return 0;
+}
+
+CORBA::Boolean
+operator>> (TAO_InputCDR &strm, CORBA::AbstractBase_ptr &abs)
+{
+ abs = 0;
+ CORBA::Boolean discriminator = 0;
+ ACE_InputCDR::to_boolean tb (discriminator);
+ TAO_ORB_Core *orb_core = 0;
+
+ if (strm >> tb)
+ {
+ if (discriminator == 0)
+ {
+ CORBA::ULong value_tag;
+
+ if (!strm.read_ulong (value_tag))
+ {
+ return 0;
+ }
+
+ if (TAO_OBV_GIOP_Flags::is_null_ref (value_tag))
+ {
+ // Ok, null reference unmarshaled.
+ return 1;
+ }
+
+ if (!TAO_OBV_GIOP_Flags::is_value_tag (value_tag))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("operator>> CORBA::AbstractBase ")
+ ACE_TEXT ("not value_tag\n")));
+ return 0;
+ }
+
+ CORBA::String_var repo_id_stream;
+
+ // It would be more efficient not to copy the string)
+ if (strm.read_string (repo_id_stream.inout ()) == 0)
+ {
+ return 0;
+ }
+
+ orb_core = strm.orb_core ();
+
+ if (orb_core == 0)
+ {
+ orb_core = TAO_ORB_Core_instance ();
+
+ if (TAO_debug_level > 0)
+ {
+ ACE_DEBUG ((LM_WARNING,
+ "TAO (%P|%t) WARNING: extracting "
+ "valuetype using default ORB_Core\n"));
+ }
+ }
+
+ CORBA::ValueFactory_var factory =
+ orb_core->orb ()->lookup_value_factory (repo_id_stream.in ());
+
+ // We should throw an exception, if there were an appropriate one.
+ if (factory.in() == 0)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%N:%l) OBV factory is null !!!\n")));
+ return 0;
+ }
+
+ abs = factory->create_for_unmarshal_abstract ();
+
+ return abs->_tao_unmarshal_v (strm);
+ }
+ else
+ {
+ CORBA::Object_var generic_objref;
+
+ if (strm >> generic_objref.inout ())
+ {
+ TAO_Stub *concrete_stubobj = generic_objref->_stubobj ();
+
+ CORBA::Boolean stores_orb =
+ ! CORBA::is_nil (concrete_stubobj->servant_orb_var ().ptr ());
+
+ if (stores_orb)
+ {
+ orb_core =
+ concrete_stubobj->servant_orb_var ()->orb_core ();
+ }
+
+ CORBA::Boolean collocated =
+ orb_core != 0
+ && orb_core->optimize_collocation_objects ()
+ && generic_objref->_is_collocated ();
+
+ ACE_NEW_RETURN (abs,
+ CORBA::AbstractBase (
+ concrete_stubobj,
+ collocated,
+ generic_objref->_servant ()),
+ 0);
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+CORBA::Boolean
+CORBA::AbstractBase::_tao_marshal_v (TAO_OutputCDR &)
+{
+ return 0;
+}
+
+CORBA::Boolean
+CORBA::AbstractBase::_tao_unmarshal_v (TAO_InputCDR &)
+{
+ return 0;
+}
+
+CORBA::ValueBase *
+CORBA::AbstractBase::_tao_to_value (void)
+{
+ return 0;
+}
+