summaryrefslogtreecommitdiff
path: root/TAO/tao/Valuetype/AbstractBase_T.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/Valuetype/AbstractBase_T.cpp')
-rw-r--r--TAO/tao/Valuetype/AbstractBase_T.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/TAO/tao/Valuetype/AbstractBase_T.cpp b/TAO/tao/Valuetype/AbstractBase_T.cpp
new file mode 100644
index 00000000000..97e62fb07c1
--- /dev/null
+++ b/TAO/tao/Valuetype/AbstractBase_T.cpp
@@ -0,0 +1,78 @@
+// $Id$
+#ifndef TAO_ABSTRACT_BASE_T_C
+#define TAO_ABSTRACT_BASE_T_C
+
+#include "AbstractBase_T.h"
+#include "AbstractBase.h"
+#include "Stub.h"
+
+ACE_RCSID (Valuetype,
+ Abstractbase_T,
+ "$Id$")
+namespace TAO
+{
+ template<typename T> T *
+ AbstractBase_Narrow_Utils<T>::narrow (
+ CORBA::AbstractBase_ptr obj,
+ const char *repo_id,
+ Proxy_Broker_Factory pbf
+ ACE_ENV_ARG_DECL)
+ {
+ if (CORBA::AbstractBase::is_nil (obj))
+ {
+ return T::_nil ();
+ }
+
+ CORBA::Boolean is_it =
+ obj->_is_a (
+ repo_id
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK_RETURN (T::_nil ());
+
+ if (is_it == 0)
+ {
+ return T::_nil ();
+ }
+
+ return AbstractBase_Narrow_Utils<T>::unchecked_narrow (obj,
+ pbf);
+ }
+
+ template<typename T> T *
+ AbstractBase_Narrow_Utils<T>::unchecked_narrow (
+ CORBA::AbstractBase_ptr obj,
+ Proxy_Broker_Factory pbf)
+ {
+ if (CORBA::AbstractBase::is_nil (obj))
+ {
+ return T::_nil ();
+ }
+
+ T_ptr proxy = T::_nil ();
+
+ if (obj->_is_objref ())
+ {
+ TAO_Stub* stub = obj->_stubobj ();
+
+ bool collocated =
+ !CORBA::is_nil (stub->servant_orb_var ().ptr ())
+ && stub->servant_orb_var ()->orb_core ()->optimize_collocation_objects ()
+ && obj->_is_collocated ()
+ && pbf != 0;
+
+ ACE_NEW_RETURN (proxy,
+ T (obj->_stubobj (),
+ collocated ? 1 : 0,
+ obj->_servant ()),
+ T::_nil ());
+ }
+ else
+ {
+ proxy = T::_downcast (obj);
+ proxy->_add_ref ();
+ }
+
+ return proxy;
+ }
+}