DynEnum_i.cpp

Go to the documentation of this file.
00001 // DynEnum_i.cpp,v 1.25 2006/03/10 07:19:08 jtc Exp
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       // We don't want unk's rd_ptr to move, in case we are shared by
00062       // another Any, so we use this to copy the state, not the buffer.
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       // Get the CDR stream of the Any, if there isn't one, make one.
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           // We don't want unk's rd_ptr to move, in case we are shared by
00223           // another Any, so we use this to copy the state, not the buffer.
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       // We don't want unk's rd_ptr to move, in case we are shared by
00300       // another Any, so we use this to copy the state, not the buffer.
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

Generated on Thu Nov 9 13:02:09 2006 for TAO_DynamicAny by doxygen 1.3.6