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