00001
00002
00003 #ifndef TAO_ANY_BASIC_IMPL_T_CPP
00004 #define TAO_ANY_BASIC_IMPL_T_CPP
00005
00006 #include "tao/AnyTypeCode/Any_Basic_Impl_T.h"
00007 #include "tao/AnyTypeCode/Any.h"
00008 #include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
00009 #include "tao/AnyTypeCode/Marshal.h"
00010 #include "tao/SystemException.h"
00011 #include "tao/CDR.h"
00012
00013 #include "ace/Auto_Ptr.h"
00014
00015 #if !defined (__ACE_INLINE__)
00016 # include "tao/AnyTypeCode/Any_Basic_Impl_T.inl"
00017 #endif
00018
00019 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00020
00021 template<typename T>
00022 TAO::Any_Basic_Impl_T<T>::Any_Basic_Impl_T (CORBA::TypeCode_ptr tc,
00023 const T & val)
00024 : Any_Impl (0,
00025 tc),
00026 value_ (val)
00027 {
00028 }
00029
00030 template<typename T>
00031 TAO::Any_Basic_Impl_T<T>::~Any_Basic_Impl_T (void)
00032 {
00033 }
00034
00035 template<typename T>
00036 void
00037 TAO::Any_Basic_Impl_T<T>::insert (CORBA::Any & any,
00038 CORBA::TypeCode_ptr tc,
00039 const T & value)
00040 {
00041 Any_Basic_Impl_T<T> *new_impl = 0;
00042 ACE_NEW (new_impl,
00043 Any_Basic_Impl_T (tc,
00044 value));
00045 any.replace (new_impl);
00046 }
00047
00048 template<typename T>
00049 CORBA::Boolean
00050 TAO::Any_Basic_Impl_T<T>::extract (const CORBA::Any & any,
00051 CORBA::TypeCode_ptr tc,
00052 T & _tao_elem)
00053 {
00054 try
00055 {
00056 CORBA::TypeCode_ptr any_tc = any._tao_get_typecode ();
00057 CORBA::Boolean const _tao_equiv = any_tc->equivalent (tc);
00058 if (_tao_equiv == false)
00059 {
00060 return false;
00061 }
00062
00063 TAO::Any_Impl * const impl = any.impl ();
00064
00065 if (impl && !impl->encoded ())
00066 {
00067 TAO::Any_Basic_Impl_T<T> * const narrow_impl =
00068 dynamic_cast<TAO::Any_Basic_Impl_T<T> *> (impl);
00069
00070 if (narrow_impl == 0)
00071 {
00072 return false;
00073 }
00074
00075 _tao_elem = narrow_impl->value_;
00076 return true;
00077 }
00078
00079 TAO::Any_Basic_Impl_T<T> * const replacement =
00080 TAO::Any_Basic_Impl_T<T>::create_empty (any_tc);
00081
00082 auto_ptr<TAO::Any_Basic_Impl_T<T> > replacement_safety (replacement);
00083
00084
00085 TAO::Unknown_IDL_Type * const unk =
00086 dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
00087
00088 if (!unk)
00089 return false;
00090
00091
00092
00093 TAO_InputCDR for_reading (unk->_tao_get_cdr ());
00094
00095 CORBA::Boolean const good_decode =
00096 replacement->demarshal_value (for_reading);
00097
00098 if (good_decode)
00099 {
00100 _tao_elem = replacement->value_;
00101 const_cast<CORBA::Any &> (any).replace (replacement);
00102 replacement_safety.release ();
00103 return true;
00104 }
00105
00106
00107 ::CORBA::release (any_tc);
00108 }
00109 catch (const ::CORBA::Exception&)
00110 {
00111 }
00112
00113 return false;
00114 }
00115
00116 template<typename T>
00117 CORBA::Boolean
00118 TAO::Any_Basic_Impl_T<T>::marshal_value (TAO_OutputCDR &cdr)
00119 {
00120 return (cdr << this->value_);
00121 }
00122
00123 template<typename T>
00124 const void *
00125 TAO::Any_Basic_Impl_T<T>::value (void) const
00126 {
00127 return &this->value_;
00128 }
00129
00130 template<typename T>
00131 TAO::Any_Basic_Impl_T<T> *
00132 TAO::Any_Basic_Impl_T<T>::create_empty (CORBA::TypeCode_ptr tc)
00133 {
00134 TAO::Any_Basic_Impl_T<T> * retval = 0;
00135 ACE_NEW_RETURN (retval,
00136 TAO::Any_Basic_Impl_T<T> (tc,
00137 static_cast<T> (0)),
00138 0);
00139 return retval;
00140 }
00141
00142 template<typename T>
00143 void
00144 TAO::Any_Basic_Impl_T<T>::_tao_decode (TAO_InputCDR &cdr)
00145 {
00146 if (! this->demarshal_value (cdr))
00147 {
00148 throw ::CORBA::MARSHAL ();
00149 }
00150 }
00151
00152 TAO_END_VERSIONED_NAMESPACE_DECL
00153
00154 #endif