Any_Basic_Impl_T.cpp

Go to the documentation of this file.
00001 // $Id: Any_Basic_Impl_T.cpp 77409 2007-02-26 23:48:49Z ossama $
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 /* ! __ACE_INLINE__ */
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       // We know this will work since the unencoded case is covered above.
00085       TAO::Unknown_IDL_Type * const unk =
00086         dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
00087 
00088       if (!unk)
00089         return false;
00090 
00091       // We don't want the rd_ptr of unk to move, in case it is
00092       // shared by another Any. This copies the state, not the buffer.
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       // Duplicated by Any_Impl base class constructor.
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 /* TAO_ANY_BASIC_IMPL_T_CPP */

Generated on Sun Jan 27 13:21:06 2008 for TAO_AnyTypeCode by doxygen 1.3.6