Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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