00001
00002
00003 #include "tao/DynamicAny/DynEnum_i.h"
00004 #include "tao/DynamicAny/DynAnyFactory.h"
00005 #include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
00006 #include "tao/CDR.h"
00007
00008 #include "ace/OS_NS_string.h"
00009
00010
00011 ACE_RCSID (DynamicAny,
00012 DynEnum_i,
00013 "DynEnum_i.cpp,v 1.25 2006/03/10 07:19:08 jtc Exp")
00014
00015 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00016
00017 TAO_DynEnum_i::TAO_DynEnum_i (void)
00018 {
00019 }
00020
00021 TAO_DynEnum_i::~TAO_DynEnum_i (void)
00022 {
00023 }
00024
00025 void
00026 TAO_DynEnum_i::init_common (void)
00027 {
00028 this->ref_to_component_ = 0;
00029 this->container_is_destroying_ = 0;
00030 this->has_components_ = 0;
00031 this->destroyed_ = 0;
00032 this->current_position_ = -1;
00033 this->component_count_ = 0;
00034 }
00035
00036 void
00037 TAO_DynEnum_i::init (const CORBA::Any &any
00038 ACE_ENV_ARG_DECL)
00039 {
00040 CORBA::TypeCode_var tc = any.type ();
00041
00042 CORBA::TCKind kind =
00043 TAO_DynAnyFactory::unalias (tc.in ()
00044 ACE_ENV_ARG_PARAMETER);
00045 ACE_CHECK;
00046
00047 if (kind != CORBA::tk_enum)
00048 {
00049 ACE_THROW (DynamicAny::DynAnyFactory::InconsistentTypeCode ());
00050 }
00051
00052 this->type_ = tc;
00053
00054 TAO::Any_Impl *impl = any.impl ();
00055
00056 if (impl->encoded ())
00057 {
00058 TAO::Unknown_IDL_Type *unk =
00059 dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
00060
00061
00062
00063 TAO_InputCDR for_reading (unk->_tao_get_cdr ());
00064 for_reading.read_ulong (this->value_);
00065 }
00066 else
00067 {
00068 TAO_OutputCDR out;
00069 impl->marshal_value (out);
00070 TAO_InputCDR in (out);
00071 in.read_ulong (this->value_);
00072 }
00073
00074 this->init_common ();
00075 }
00076
00077 void
00078 TAO_DynEnum_i::init (CORBA::TypeCode_ptr tc
00079 ACE_ENV_ARG_DECL)
00080 {
00081 CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc
00082 ACE_ENV_ARG_PARAMETER);
00083 ACE_CHECK;
00084
00085 if (kind != CORBA::tk_enum)
00086 {
00087 ACE_THROW (DynamicAny::DynAnyFactory::InconsistentTypeCode ());
00088 }
00089
00090 this->type_ = CORBA::TypeCode::_duplicate (tc);
00091
00092 this->value_ = 0;
00093
00094 this->init_common ();
00095 }
00096
00097
00098
00099 TAO_DynEnum_i *
00100 TAO_DynEnum_i::_narrow (CORBA::Object_ptr _tao_objref
00101 ACE_ENV_ARG_DECL_NOT_USED)
00102 {
00103 if (CORBA::is_nil (_tao_objref))
00104 {
00105 return 0;
00106 }
00107
00108 return dynamic_cast<TAO_DynEnum_i *> (_tao_objref);
00109 }
00110
00111
00112
00113 char *
00114 TAO_DynEnum_i::get_as_string (ACE_ENV_SINGLE_ARG_DECL)
00115 ACE_THROW_SPEC ((
00116 CORBA::SystemException
00117 ))
00118 {
00119 const char *retval =
00120 this->type_.in ()->member_name (this->value_
00121 ACE_ENV_ARG_PARAMETER);
00122 ACE_CHECK_RETURN (0);
00123
00124 return CORBA::string_dup (retval);
00125 }
00126
00127 void
00128 TAO_DynEnum_i::set_as_string (const char *value_as_string
00129 ACE_ENV_ARG_DECL)
00130 ACE_THROW_SPEC ((
00131 CORBA::SystemException,
00132 DynamicAny::DynAny::InvalidValue
00133 ))
00134 {
00135 CORBA::ULong count =
00136 this->type_.in ()->member_count (ACE_ENV_SINGLE_ARG_PARAMETER);
00137 ACE_CHECK;
00138
00139 CORBA::ULong i;
00140 const char *temp = 0;
00141
00142 for (i = 0; i < count; ++i)
00143 {
00144 temp = this->type_.in ()->member_name (i
00145 ACE_ENV_ARG_PARAMETER);
00146 ACE_CHECK;
00147
00148 if (!ACE_OS::strcmp (value_as_string,
00149 temp))
00150 {
00151 break;
00152 }
00153 }
00154
00155 if (i < count)
00156 {
00157 this->value_ = i;
00158 }
00159 else
00160 {
00161 ACE_THROW (DynamicAny::DynAny::InvalidValue ());
00162 }
00163 }
00164
00165 CORBA::ULong
00166 TAO_DynEnum_i::get_as_ulong (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00167 ACE_THROW_SPEC ((
00168 CORBA::SystemException
00169 ))
00170 {
00171 return this->value_;
00172 }
00173
00174 void
00175 TAO_DynEnum_i::set_as_ulong (CORBA::ULong value_as_ulong
00176 ACE_ENV_ARG_DECL)
00177 ACE_THROW_SPEC ((
00178 CORBA::SystemException,
00179 DynamicAny::DynAny::InvalidValue
00180 ))
00181 {
00182 CORBA::ULong max =
00183 this->type_.in ()->member_count (ACE_ENV_SINGLE_ARG_PARAMETER);
00184 ACE_CHECK;
00185
00186 if (value_as_ulong < max)
00187 {
00188 this->value_ = value_as_ulong;
00189 }
00190 else
00191 {
00192 ACE_THROW (DynamicAny::DynAny::InvalidValue ());
00193 }
00194 }
00195
00196
00197
00198 void
00199 TAO_DynEnum_i::from_any (const CORBA::Any& any
00200 ACE_ENV_ARG_DECL)
00201 ACE_THROW_SPEC ((
00202 CORBA::SystemException,
00203 DynamicAny::DynAny::TypeMismatch,
00204 DynamicAny::DynAny::InvalidValue
00205 ))
00206 {
00207 CORBA::TypeCode_var tc = any.type ();
00208 CORBA::TCKind kind = TAO_DynAnyFactory::unalias (tc.in ()
00209 ACE_ENV_ARG_PARAMETER);
00210 ACE_CHECK;
00211
00212 if (kind == CORBA::tk_enum)
00213 {
00214
00215 TAO::Any_Impl *impl = any.impl ();
00216
00217 if (impl->encoded ())
00218 {
00219 TAO::Unknown_IDL_Type *unk =
00220 dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
00221
00222
00223
00224 TAO_InputCDR for_reading (unk->_tao_get_cdr ());
00225 for_reading.read_ulong (this->value_);
00226 }
00227 else
00228 {
00229 TAO_OutputCDR out;
00230 impl->marshal_value (out);
00231 TAO_InputCDR in (out);
00232 in.read_ulong (this->value_);
00233 }
00234 }
00235 else
00236 {
00237 ACE_THROW (DynamicAny::DynAny::TypeMismatch ());
00238 }
00239 }
00240
00241 CORBA::Any_ptr
00242 TAO_DynEnum_i::to_any (ACE_ENV_SINGLE_ARG_DECL)
00243 ACE_THROW_SPEC ((
00244 CORBA::SystemException
00245 ))
00246 {
00247 TAO_OutputCDR out_cdr;
00248
00249 out_cdr.write_ulong (this->value_);
00250
00251 CORBA::Any *retval;
00252 ACE_NEW_THROW_EX (retval,
00253 CORBA::Any,
00254 CORBA::NO_MEMORY ());
00255 ACE_CHECK_RETURN (0);
00256
00257 TAO_InputCDR in_cdr (out_cdr);
00258 TAO::Unknown_IDL_Type *unk = 0;
00259 ACE_NEW_THROW_EX (unk,
00260 TAO::Unknown_IDL_Type (this->type_.in (),
00261 in_cdr),
00262 CORBA::NO_MEMORY ());
00263 ACE_CHECK_RETURN (0);
00264
00265 retval->replace (unk);
00266 return retval;
00267 }
00268
00269 CORBA::Boolean
00270 TAO_DynEnum_i::equal (DynamicAny::DynAny_ptr rhs
00271 ACE_ENV_ARG_DECL)
00272 ACE_THROW_SPEC ((
00273 CORBA::SystemException
00274 ))
00275 {
00276 CORBA::TypeCode_var tc = rhs->type (ACE_ENV_SINGLE_ARG_PARAMETER);
00277 ACE_CHECK_RETURN (0);
00278
00279 CORBA::Boolean equivalent = tc->equivalent (this->type_.in ()
00280 ACE_ENV_ARG_PARAMETER);
00281 ACE_CHECK_RETURN (0);
00282
00283 if (!equivalent)
00284 {
00285 return 0;
00286 }
00287
00288 CORBA::Any_var any = rhs->to_any (ACE_ENV_SINGLE_ARG_PARAMETER);
00289 ACE_CHECK_RETURN (0);
00290
00291 TAO::Any_Impl *impl = any->impl ();
00292 CORBA::ULong value;
00293
00294 if (impl->encoded ())
00295 {
00296 TAO::Unknown_IDL_Type *unk =
00297 dynamic_cast<TAO::Unknown_IDL_Type *> (impl);
00298
00299
00300
00301 TAO_InputCDR for_reading (unk->_tao_get_cdr ());
00302 for_reading.read_ulong (value);
00303 }
00304 else
00305 {
00306 TAO_OutputCDR out;
00307 impl->marshal_value (out);
00308 TAO_InputCDR in (out);
00309 in.read_ulong (value);
00310 }
00311
00312 return value == this->value_;
00313 }
00314
00315 void
00316 TAO_DynEnum_i::destroy (ACE_ENV_SINGLE_ARG_DECL)
00317 ACE_THROW_SPEC ((
00318 CORBA::SystemException
00319 ))
00320 {
00321 if (this->destroyed_)
00322 {
00323 ACE_THROW (CORBA::OBJECT_NOT_EXIST ());
00324 }
00325
00326 if (!this->ref_to_component_ || this->container_is_destroying_)
00327 {
00328 this->destroyed_ = 1;
00329 }
00330 }
00331
00332 DynamicAny::DynAny_ptr
00333 TAO_DynEnum_i::current_component (ACE_ENV_SINGLE_ARG_DECL)
00334 ACE_THROW_SPEC ((
00335 CORBA::SystemException,
00336 DynamicAny::DynAny::TypeMismatch
00337 ))
00338 {
00339 if (this->destroyed_)
00340 {
00341 ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
00342 DynamicAny::DynAny::_nil ());
00343 }
00344
00345 ACE_THROW_RETURN (DynamicAny::DynAny::TypeMismatch (),
00346 DynamicAny::DynAny::_nil ());
00347 }
00348
00349 TAO_END_VERSIONED_NAMESPACE_DECL