DynAnyUtils_T.cpp

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=============================================================================
00004 /**
00005  *  @file    DynAnyUtils_T.cpp
00006  *
00007  *  $Id: DynAnyUtils_T.cpp 78012 2007-04-13 19:56:11Z dai_y $
00008  *
00009  *  Implementation of templatized common code used in Dynamic Any
00010  *
00011  *  @author Jeff Parsons <j.parsons@vanderbilt.edu>
00012  */
00013 //=============================================================================
00014 
00015 #ifndef TAO_DYNANYUTILS_T_CPP
00016 #define TAO_DYNANYUTILS_T_CPP
00017 
00018 #include "tao/DynamicAny/DynAnyUtils_T.h"
00019 
00020 #include "tao/DynamicAny/DynAny_i.h"
00021 #include "tao/DynamicAny/DynArray_i.h"
00022 #include "tao/DynamicAny/DynEnum_i.h"
00023 #include "tao/DynamicAny/DynSequence_i.h"
00024 #include "tao/DynamicAny/DynStruct_i.h"
00025 #include "tao/DynamicAny/DynUnion_i.h"
00026 
00027 #include "tao/DynamicAny/DynAnyFactory.h"
00028 
00029 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00030 
00031 namespace TAO
00032 {
00033   template<typename T>
00034   void
00035   DynAnyBasicTypeUtils<T>::insert_value (const T &val,
00036                                          TAO_DynCommon *the_dynany)
00037   {
00038     if (the_dynany->destroyed ())
00039       {
00040         throw ::CORBA::OBJECT_NOT_EXIST ();
00041       }
00042 
00043     if (the_dynany->has_components ())
00044       {
00045         DynamicAny::DynAny_var cc = the_dynany->check_component ();
00046         TAO_DynCommon *dc = dynamic_cast<TAO_DynCommon *> (cc.in ());
00047         DynAnyBasicTypeUtils<T>::insert_value (val, dc);
00048       }
00049     else
00050       {
00051         the_dynany->check_type (BasicTypeTraits<T>::tc_value);
00052         CORBA::Any &my_any = the_dynany->the_any ();
00053         typedef typename TAO::BasicTypeTraits<T>::insert_type i_type;
00054         i_type insert_arg (val);
00055         my_any <<= insert_arg;
00056       }
00057   }
00058 
00059   template<typename T>
00060   typename BasicTypeTraits<T>::return_type
00061   DynAnyBasicTypeUtils<T>::get_value (TAO_DynCommon *the_dynany)
00062   {
00063     if (the_dynany->destroyed ())
00064       {
00065         throw ::CORBA::OBJECT_NOT_EXIST ();
00066       }
00067 
00068     if (the_dynany->has_components ())
00069       {
00070         DynamicAny::DynAny_var cc = the_dynany->check_component ();
00071         TAO_DynCommon *dc = dynamic_cast<TAO_DynCommon *> (cc.in ());
00072         return DynAnyBasicTypeUtils<T>::get_value (dc);
00073       }
00074     else
00075       {
00076         typedef typename BasicTypeTraits<T>::return_type ret_type;
00077         typedef typename BasicTypeTraits<T>::extract_type ext_type;
00078         ret_type retval = ret_type ();
00079         ext_type extval (retval);
00080         const CORBA::Any &my_any = the_dynany->the_any ();
00081 
00082         if (!(my_any >>= extval))
00083           {
00084             throw DynamicAny::DynAny::TypeMismatch ();
00085           }
00086 
00087         return BasicTypeTraits<T>::convert (extval);
00088       }
00089   }
00090 
00091   template<typename T>
00092   void
00093   DynAnyFlagUtils<T>::set_flag_t (DynamicAny::DynAny_ptr component,
00094                                   CORBA::Boolean destroying)
00095   {
00096     T *tmp = T::_narrow (component);
00097 
00098     if (destroying)
00099       {
00100         tmp->container_is_destroying (true);
00101       }
00102     else
00103       {
00104         tmp->ref_to_component (true);
00105       }
00106   }
00107 
00108   template<typename DA_IMPL, typename ANY_TC>
00109   DynamicAny::DynAny_ptr
00110   CreateDynAnyUtils<DA_IMPL, ANY_TC>::create_dyn_any_t (ANY_TC any_tc)
00111   {
00112     DA_IMPL *p = 0;
00113     ACE_NEW_THROW_EX (p,
00114                       DA_IMPL,
00115                       CORBA::NO_MEMORY ());
00116 
00117     ACE_Auto_Basic_Ptr<DA_IMPL> dp (p);
00118     p->init (any_tc);
00119 
00120     return dp.release ();
00121   }
00122 
00123   namespace MakeDynAnyUtils
00124   {
00125     template<typename ANY_TC>
00126     DynamicAny::DynAny_ptr
00127     make_dyn_any_t (CORBA::TypeCode_ptr tc, ANY_TC any_tc)
00128     {
00129       switch (TAO_DynAnyFactory::unalias (tc))
00130         {
00131           case CORBA::tk_null:
00132           case CORBA::tk_void:
00133           case CORBA::tk_short:
00134           case CORBA::tk_long:
00135           case CORBA::tk_ushort:
00136           case CORBA::tk_ulong:
00137           case CORBA::tk_float:
00138           case CORBA::tk_double:
00139           case CORBA::tk_longlong:
00140           case CORBA::tk_ulonglong:
00141           case CORBA::tk_longdouble:
00142           case CORBA::tk_boolean:
00143           case CORBA::tk_char:
00144           case CORBA::tk_wchar:
00145           case CORBA::tk_octet:
00146           case CORBA::tk_any:
00147           case CORBA::tk_TypeCode:
00148           case CORBA::tk_objref:
00149           case CORBA::tk_string:
00150           case CORBA::tk_wstring:
00151             return
00152               CreateDynAnyUtils<
00153                 TAO_DynAny_i,
00154                 ANY_TC>::create_dyn_any_t (any_tc);
00155           case CORBA::tk_struct:
00156           case CORBA::tk_except:
00157             return
00158               CreateDynAnyUtils<
00159                 TAO_DynStruct_i,
00160                 ANY_TC>::create_dyn_any_t (any_tc);
00161           case CORBA::tk_sequence:
00162             if (TAO_DynCommon::is_basic_type_seq (tc))
00163               {
00164                 return
00165                   CreateDynAnyUtils<
00166                     TAO_DynAny_i,
00167                     ANY_TC>::create_dyn_any_t (any_tc);
00168               }
00169             else
00170               {
00171                 return
00172                   CreateDynAnyUtils<
00173                     TAO_DynSequence_i,
00174                     ANY_TC>::create_dyn_any_t (any_tc);
00175               }
00176           case CORBA::tk_union:
00177             return
00178               CreateDynAnyUtils<
00179                 TAO_DynUnion_i,
00180                 ANY_TC>::create_dyn_any_t (any_tc);
00181           case CORBA::tk_enum:
00182             return
00183               CreateDynAnyUtils<
00184                 TAO_DynEnum_i,
00185                 ANY_TC>::create_dyn_any_t (any_tc);
00186           case CORBA::tk_array:
00187             return
00188               CreateDynAnyUtils<
00189                 TAO_DynArray_i,
00190                 ANY_TC>::create_dyn_any_t (any_tc);
00191         case CORBA::tk_fixed:
00192         case CORBA::tk_value:
00193         case CORBA::tk_value_box:
00194         case CORBA::tk_abstract_interface:
00195         case CORBA::tk_component:
00196         case CORBA::tk_home:
00197           throw ::CORBA::NO_IMPLEMENT ();
00198         case CORBA::tk_native:
00199           throw DynamicAny::DynAnyFactory::InconsistentTypeCode ();
00200         default:
00201           break;
00202         }
00203 
00204       return DynamicAny::DynAny::_nil ();
00205     }
00206   }
00207 }
00208 
00209 TAO_END_VERSIONED_NAMESPACE_DECL
00210 
00211 #endif /* TAO_DYNANYUTILS_T_CPP */

Generated on Sun Jan 27 13:36:28 2008 for TAO_DynamicAny by doxygen 1.3.6