Orocos Real-Time Toolkit
2.6.0
|
00001 /*************************************************************************** 00002 tag: Peter Soetens Mon Jun 26 13:25:58 CEST 2006 CorbaConversion.hpp 00003 00004 CorbaConversion.hpp - description 00005 ------------------- 00006 begin : Mon June 26 2006 00007 copyright : (C) 2006 Peter Soetens 00008 email : peter.soetens@fmtc.be 00009 00010 *************************************************************************** 00011 * This library is free software; you can redistribute it and/or * 00012 * modify it under the terms of the GNU General Public * 00013 * License as published by the Free Software Foundation; * 00014 * version 2 of the License. * 00015 * * 00016 * As a special exception, you may use this file as part of a free * 00017 * software library without restriction. Specifically, if other files * 00018 * instantiate templates or use macros or inline functions from this * 00019 * file, or you compile this file and link it with other files to * 00020 * produce an executable, this file does not by itself cause the * 00021 * resulting executable to be covered by the GNU General Public * 00022 * License. This exception does not however invalidate any other * 00023 * reasons why the executable file might be covered by the GNU General * 00024 * Public License. * 00025 * * 00026 * This library is distributed in the hope that it will be useful, * 00027 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00028 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00029 * Lesser General Public License for more details. * 00030 * * 00031 * You should have received a copy of the GNU General Public * 00032 * License along with this library; if not, write to the Free Software * 00033 * Foundation, Inc., 59 Temple Place, * 00034 * Suite 330, Boston, MA 02111-1307 USA * 00035 * * 00036 ***************************************************************************/ 00037 00038 00039 #ifndef ORO_CORBA_CONVERSION_HPP 00040 #define ORO_CORBA_CONVERSION_HPP 00041 00042 #include <string> 00043 #include <vector> 00044 #include <map> 00045 00046 #include "corba.h" 00047 #ifdef CORBA_IS_TAO 00048 #include <tao/Version.h> 00049 #if TAO_MAJOR_VERSION == 1 && TAO_MINOR_VERSION <= 4 00050 #include <tao/Any.h> 00051 #else // TAO 1.5 and higher 00052 #include <tao/AnyTypeCode/Any.h> 00053 #endif 00054 #include <tao/CORBA_String.h> 00055 #else 00056 #include "corba.h" 00057 #include <omniORB4/stringtypes.h> 00058 #endif 00059 00060 #include "OrocosTypesC.h" 00061 #include "../../Logger.hpp" 00062 #include "../../internal/DataSourceTypeInfo.hpp" 00063 00064 00065 namespace RTT { 00066 namespace corba { 00067 00080 template<class Type> 00081 struct AnyConversion 00082 { 00086 typedef CORBA::Any CorbaType; 00090 typedef Type StdType; 00094 typedef RTT::corba::CAnySequence sequence; 00095 00103 static bool toStdType(StdType& tp, const CorbaType& cb) { 00104 Logger::log() << Logger::Error << "Failing conversion of CorbaType to type "<<internal::DataSourceTypeInfo<StdType>::getType()<<"." <<Logger::endl; 00105 return false; 00106 } 00107 00115 static bool toCorbaType(CorbaType& cb, const StdType& tp) { 00116 Logger::log() << Logger::Error << "Failing conversion of type "<<internal::DataSourceTypeInfo<StdType>::getType()<<"to a CorbaType." <<Logger::endl; 00117 return false; 00118 } 00119 00127 static bool update(const CORBA::Any& any, StdType tp) { 00128 Logger::log() << Logger::Error << "Failing conversion of type "<<internal::DataSourceTypeInfo<StdType>::getType()<<"." <<Logger::endl; 00129 return false; 00130 } 00131 00138 static CORBA::Any_ptr createAny( StdType tp ) { 00139 Logger::log() << Logger::Error << "Failing corba::Any creation of type "<<internal::DataSourceTypeInfo<StdType>::getType()<<"." <<Logger::endl; 00140 return new CORBA::Any(); 00141 } 00142 00150 static bool updateAny( StdType tp, CORBA::Any& any ) { 00151 Logger::log() << Logger::Error << "Failing corba::Any updating of type "<<internal::DataSourceTypeInfo<StdType>::getType()<<"." <<Logger::endl; 00152 return false; 00153 } 00154 }; 00155 00160 template<class Type, class _CorbaType = Type> 00161 struct AnyConversionHelper 00162 { 00163 typedef _CorbaType CorbaType; 00164 typedef Type StdType; 00165 static CorbaType toAny( Type t ) { 00166 //Logger::log() << Logger::Debug << "Converting type "<<internal::DataSourceTypeInfo<Type>::getType()<<" to same CORBA type." <<Logger::endl; 00167 return t; 00168 } 00169 00170 static Type& fromAny( Type& t ) { 00171 return t; 00172 } 00173 00174 static const Type& get(const Type& t) { 00175 return t; 00176 } 00177 00178 static bool toStdType(StdType& tp, const CorbaType& cb) { 00179 tp = cb; 00180 return true; 00181 } 00182 00183 static bool toCorbaType(CorbaType& cb, const StdType& tp) { 00184 cb = tp; 00185 return true; 00186 } 00187 00188 static bool update(const CORBA::Any& any, StdType& _value) { 00189 CorbaType temp; 00190 if ( any >>= temp ) { 00191 _value = temp; 00192 return true; 00193 } 00194 return false; 00195 } 00196 00197 static CORBA::Any_ptr createAny( const Type& t ) { 00198 CORBA::Any_ptr ret = new CORBA::Any(); 00199 //Logger::log() << Logger::Debug << "Creating corba::Any from "<<internal::DataSourceTypeInfo<Type>::getType()<<"." <<Logger::endl; 00200 *ret <<= toAny( static_cast<CorbaType>(t) ); 00201 return ret; 00202 } 00203 00204 static bool updateAny( const Type& t, CORBA::Any& any ) { 00205 //Logger::log() << Logger::Debug << "Updating corba::Any from "<<internal::DataSourceTypeInfo<Type>::getType()<<"." <<Logger::endl; 00206 any <<= toAny( static_cast<CorbaType>(t) ); 00207 return true; 00208 } 00209 }; 00210 00216 template<class T> 00217 struct AnyConversion< std::vector<T> > 00218 { 00219 typedef RTT::corba::CAnySequence sequence; 00220 00221 typedef typename AnyConversion<T>::sequence CorbaType; 00222 typedef std::vector<T> StdType; 00223 00224 static bool toStdType(StdType& tp, const CorbaType& cb) { 00225 bool res = true; 00226 tp.resize( cb.length() ); 00227 for (size_t i = 0; i != cb.length(); ++i) { 00228 res = res && AnyConversion<T>::toStdType(tp[i], cb[(CORBA::ULong)(i)]); 00229 } 00230 return res; 00231 } 00232 00233 static bool toCorbaType(CorbaType& cb, const StdType& tp) { 00234 bool res = true; 00235 cb.length( (CORBA::ULong)(tp.size()) ); 00236 for( size_t i = 0; i != tp.size(); ++i) 00237 res = res && AnyConversion<T>::toCorbaType(cb[(CORBA::ULong)(i)], tp[i]); 00238 return res; 00239 } 00240 00244 static bool toStdType(StdType& tp, const CORBA::Any& any) { 00245 return update(any, tp); 00246 } 00247 static bool toCorbaType(CORBA::Any& any, const StdType& tp) { 00248 return updateAny(tp, any); 00249 } 00250 00251 static CorbaType* toAny(const StdType& tp) { 00252 CorbaType* cb = new CorbaType(); 00253 toCorbaType(*cb, tp); 00254 return cb; 00255 } 00256 00257 static bool update(const CORBA::Any& any, StdType& _value) { 00258 CorbaType* result; 00259 if ( any >>= result ) { 00260 return toStdType(_value, *result); 00261 } 00262 return false; 00263 } 00264 00265 static CORBA::Any_ptr createAny( const StdType& t ) { 00266 CORBA::Any_ptr ret = new CORBA::Any(); 00267 *ret <<= toAny( t ); 00268 return ret; 00269 } 00270 00271 static bool updateAny( StdType const& t, CORBA::Any& any ) { 00272 any <<= toAny( t ); 00273 return true; 00274 } 00275 }; 00276 00282 template<class T1, class T2> 00283 struct AnyConversion<std::pair<T1, T2> > { 00284 typedef RTT::corba::PairSeq sequence; 00285 00286 typedef RTT::corba::Pair CorbaType; 00287 typedef std::pair<T1, T2> StdType; 00288 00289 static bool toStdType(StdType& tp, const CorbaType& cb) { 00290 return AnyConversion<T1>::update(cb.t1, tp.first) && AnyConversion<T2>::update(cb.t2, tp.second); 00291 } 00292 00293 static bool toCorbaType(CorbaType& cb, const StdType& tp) { 00294 return AnyConversion<T1>::updateAny(tp.first, cb.t1) && AnyConversion<T2>::updateAny(tp.second, cb.t2); 00295 } 00296 00297 static CorbaType* toAny(const StdType& tp) { 00298 CorbaType* cb = new CorbaType(); 00299 toCorbaType(*cb, tp); 00300 return cb; 00301 } 00302 00303 static StdType get(const CorbaType* cb) { 00304 StdType tp; 00305 toStdType(tp, *cb); 00306 return tp; 00307 } 00308 00309 static bool update(const CORBA::Any& any, StdType& _value) { 00310 CorbaType* result; 00311 if ( any >>= result ) { 00312 return toStdType(_value, *result); 00313 } 00314 return false; 00315 } 00316 00317 static CORBA::Any_ptr createAny( const StdType& t ) { 00318 CORBA::Any_ptr ret = new CORBA::Any(); 00319 *ret <<= toAny( t ); 00320 return ret; 00321 } 00322 00323 static bool updateAny( StdType const& t, CORBA::Any& any ) { 00324 any <<= toAny( t ); 00325 return true; 00326 } 00327 }; 00328 00334 template<class T1, class T2> 00335 struct AnyConversion<std::map<T1, T2> > { 00336 typedef RTT::corba::CAnySequence sequence; 00337 00338 typedef RTT::corba::PairSeq CorbaType; 00339 typedef std::map<T1, T2> StdType; 00340 00341 static bool toStdType(StdType& tp, const CorbaType& cb) { 00342 bool res = true; 00343 tp.clear(); 00344 00345 for (size_t i = 0; i != cb.length(); ++i) { 00346 std::pair<T1, T2> p; 00347 res = res && AnyConversion<std::pair<T1, T2> >::toStdType(p, cb[(CORBA::ULong)(i)]); 00348 tp.insert(p); 00349 } 00350 return res; 00351 } 00352 00353 static bool toCorbaType(CorbaType& cb, const StdType& tp) { 00354 bool res = true; 00355 cb.length(tp.size()); 00356 typename StdType::const_iterator it = tp.begin(); 00357 00358 for(size_t i = 0; i != tp.size(); i++) { 00359 res = res &&AnyConversion<std::pair<T1, T2> >::toCorbaType(cb[(CORBA::ULong)(i)], *it); 00360 it++; 00361 } 00362 return res; 00363 } 00364 00368 static bool toStdType(StdType& tp, const CORBA::Any& any) { 00369 return update(any, tp); 00370 } 00371 static bool toCorbaType(CORBA::Any& any, const StdType& tp) { 00372 return updateAny(tp, any); 00373 } 00374 00375 static CorbaType* toAny(const StdType& tp) { 00376 CorbaType* cb = new CorbaType(); 00377 toCorbaType(*cb, tp); 00378 return cb; 00379 } 00380 00381 static StdType get(const CorbaType* cb) { 00382 StdType sb; 00383 toStdType(sb, *cb); 00384 return sb; 00385 } 00386 00387 static bool update(const CORBA::Any& any, StdType& _value) { 00388 CorbaType* result; 00389 if ( any >>= result ) { 00390 return toStdType(_value, *result); 00391 } 00392 return false; 00393 } 00394 00395 static CORBA::Any_ptr createAny( const StdType& t ) { 00396 CORBA::Any_ptr ret = new CORBA::Any(); 00397 *ret <<= toAny( t ); 00398 return ret; 00399 } 00400 00401 static bool updateAny( StdType const& t, CORBA::Any& any ) { 00402 any <<= toAny( t ); 00403 return true; 00404 } 00405 }; 00406 } 00407 } 00408 00409 #endif