Go to the documentation of this file.00001
00002
00003 #include "tao/AnyTypeCode/Any_Unknown_IDL_Type.h"
00004 #include "tao/AnyTypeCode/Marshal.h"
00005 #include "tao/AnyTypeCode/TypeCode.h"
00006 #include "tao/Valuetype_Adapter.h"
00007 #include "tao/ORB_Core.h"
00008 #include "tao/SystemException.h"
00009 #include "tao/CDR.h"
00010 #include "tao/debug.h"
00011
00012 #include "ace/Dynamic_Service.h"
00013 #include "ace/OS_NS_string.h"
00014
00015 ACE_RCSID (AnyTypeCode,
00016 Any_Unknown_IDL_Type,
00017 "$Id: Any_Unknown_IDL_Type.cpp 87936 2009-12-04 23:21:00Z dai_y $")
00018
00019 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00020
00021 TAO::Unknown_IDL_Type::LOCK const
00022 TAO::Unknown_IDL_Type::lock_i (void)
00023 {
00024 static LOCK base_lock_ (new ACE_Lock_Adapter<TAO_SYNCH_MUTEX>());
00025 return base_lock_;
00026 }
00027
00028 TAO::Unknown_IDL_Type::Unknown_IDL_Type (CORBA::TypeCode_ptr tc,
00029 TAO_InputCDR &cdr)
00030 : TAO::Any_Impl (0, tc, true)
00031 , lock_ (lock_i ())
00032 , cdr_ (static_cast<ACE_Message_Block*>(0), lock_.get ())
00033 {
00034 try
00035 {
00036 this->_tao_decode (cdr);
00037 }
00038 catch (::CORBA::Exception const &)
00039 {
00040 }
00041 }
00042
00043 TAO::Unknown_IDL_Type::Unknown_IDL_Type (CORBA::TypeCode_ptr tc)
00044 : TAO::Any_Impl (0, tc, true)
00045 , lock_ (lock_i ())
00046 , cdr_ (static_cast<ACE_Message_Block*>(0), lock_.get ())
00047 {
00048 }
00049
00050 TAO::Unknown_IDL_Type::~Unknown_IDL_Type (void)
00051 {
00052 }
00053
00054 CORBA::Boolean
00055 TAO::Unknown_IDL_Type::marshal_value (TAO_OutputCDR & cdr)
00056 {
00057 try
00058 {
00059
00060
00061 TAO_InputCDR for_reading (this->cdr_);
00062
00063 TAO::traverse_status const status =
00064 TAO_Marshal_Object::perform_append (this->type_,
00065 &for_reading,
00066 &cdr);
00067
00068 if (status != TAO::TRAVERSE_CONTINUE)
00069 {
00070 return false;
00071 }
00072 }
00073 catch (::CORBA::Exception const &)
00074 {
00075 return false;
00076 }
00077
00078 return true;
00079 }
00080
00081 const void *
00082 TAO::Unknown_IDL_Type::value (void) const
00083 {
00084 return this->cdr_.start ();
00085 }
00086
00087 void
00088 TAO::Unknown_IDL_Type::free_value (void)
00089 {
00090 ::CORBA::release (this->type_);
00091 }
00092
00093 TAO_InputCDR &
00094 TAO::Unknown_IDL_Type::_tao_get_cdr (void)
00095 {
00096 return this->cdr_;
00097 }
00098
00099 int
00100 TAO::Unknown_IDL_Type::_tao_byte_order (void) const
00101 {
00102 return this->cdr_.byte_order ();
00103 }
00104 void
00105 TAO::Unknown_IDL_Type::_tao_decode (TAO_InputCDR & cdr)
00106 {
00107
00108
00109
00110
00111
00112
00113 char const * const begin = cdr.rd_ptr ();
00114
00115
00116 TAO::traverse_status const status =
00117 TAO_Marshal_Object::perform_skip (this->type_, &cdr);
00118
00119 if (status != TAO::TRAVERSE_CONTINUE)
00120 {
00121 throw ::CORBA::MARSHAL ();
00122 }
00123
00124
00125 char const * const end = cdr.rd_ptr ();
00126
00127
00128
00129
00130
00131
00132 size_t const size = end - begin;
00133
00134 ACE_Message_Block new_mb (size + 2 * ACE_CDR::MAX_ALIGNMENT);
00135
00136 ACE_CDR::mb_align (&new_mb);
00137 ptrdiff_t offset = ptrdiff_t (begin) % ACE_CDR::MAX_ALIGNMENT;
00138
00139 if (offset < 0)
00140 {
00141 offset += ACE_CDR::MAX_ALIGNMENT;
00142 }
00143
00144 new_mb.rd_ptr (offset);
00145 new_mb.wr_ptr (offset + size);
00146
00147 ACE_OS::memcpy (new_mb.rd_ptr (), begin, size);
00148
00149 this->cdr_.reset (&new_mb, cdr.byte_order ());
00150 this->cdr_.char_translator (cdr.char_translator ());
00151 this->cdr_.wchar_translator (cdr.wchar_translator ());
00152
00153 this->cdr_.set_repo_id_map (cdr.get_repo_id_map ());
00154 this->cdr_.set_codebase_url_map (cdr.get_codebase_url_map ());
00155 this->cdr_.set_value_map (cdr.get_value_map ());
00156
00157
00158
00159 ACE_CDR::Octet major_version;
00160 ACE_CDR::Octet minor_version;
00161 cdr.get_version (major_version, minor_version);
00162 this->cdr_.set_version (major_version, minor_version);
00163 }
00164
00165 CORBA::Boolean
00166 TAO::Unknown_IDL_Type::to_object (CORBA::Object_ptr & obj) const
00167 {
00168 try
00169 {
00170 CORBA::TCKind const kind = TAO::unaliased_kind (this->type_);
00171
00172 if (kind != CORBA::tk_objref)
00173 {
00174 return false;
00175 }
00176
00177
00178
00179 TAO_InputCDR for_reading (this->cdr_);
00180
00181 return for_reading >> obj;
00182 }
00183 catch (::CORBA::Exception const &)
00184 {
00185 }
00186
00187 return false;
00188 }
00189
00190 CORBA::Boolean
00191 TAO::Unknown_IDL_Type::to_value (CORBA::ValueBase* & val) const
00192 {
00193 try
00194 {
00195 CORBA::TCKind const kind = TAO::unaliased_kind (this->type_);
00196
00197 if (kind != CORBA::tk_value)
00198 {
00199 return false;
00200 }
00201
00202 TAO_ORB_Core *orb_core = this->cdr_.orb_core ();
00203 if (orb_core == 0)
00204 {
00205 orb_core = TAO_ORB_Core_instance ();
00206
00207 if (TAO_debug_level > 0)
00208 {
00209 ACE_DEBUG ((LM_WARNING,
00210 ACE_TEXT ("TAO (%P|%t) WARNING: extracting ")
00211 ACE_TEXT ("valuetype using default ORB_Core\n")));
00212 }
00213 }
00214
00215
00216
00217 TAO_InputCDR for_reading (this->cdr_);
00218
00219 TAO_Valuetype_Adapter * const adapter =
00220 orb_core->valuetype_adapter ();
00221
00222 return adapter->stream_to_value (for_reading, val);
00223 }
00224 catch (::CORBA::Exception const &)
00225 {
00226 }
00227
00228 return false;
00229 }
00230
00231 CORBA::Boolean
00232 TAO::Unknown_IDL_Type::to_abstract_base (CORBA::AbstractBase_ptr & obj) const
00233 {
00234 try
00235 {
00236 CORBA::TCKind const kind = TAO::unaliased_kind (this->type_);
00237
00238 if (kind != CORBA::tk_abstract_interface)
00239 {
00240 return false;
00241 }
00242
00243 TAO_ORB_Core *orb_core = this->cdr_.orb_core ();
00244 if (orb_core == 0)
00245 {
00246 orb_core = TAO_ORB_Core_instance ();
00247
00248 if (TAO_debug_level > 0)
00249 {
00250 ACE_DEBUG ((LM_WARNING,
00251 ACE_TEXT ("TAO (%P|%t) WARNING: extracting ")
00252 ACE_TEXT ("abstract base using default ORB_Core\n")));
00253 }
00254 }
00255
00256
00257
00258 TAO_InputCDR for_reading (this->cdr_);
00259
00260 TAO_Valuetype_Adapter * const adapter =
00261 orb_core->valuetype_adapter ();
00262 CORBA::Boolean ret = adapter->stream_to_abstract_base (for_reading, obj);
00263
00264 return ret;
00265 }
00266 catch (::CORBA::Exception const &)
00267 {
00268 }
00269
00270 return false;
00271 }
00272
00273 TAO_END_VERSIONED_NAMESPACE_DECL