1 // Copyright (C) 2006-2024 CEA, EDF
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #define private public
24 #define protected public
25 #include <omniORB4/CORBA.h>
26 #include <omniORB4/internal/typecode.h>
29 #include "TypeConversions.hxx"
30 #include "ConversionException.hxx"
31 #include "RuntimeSALOME.hxx"
32 #include "Salome_file_i.hxx"
33 #include "TypeCode.hxx"
35 #include "SALOME_GenericObj.hh"
36 #include "PythonNode.hxx"
46 int mkstemp(char *tmpl)
49 mktemp(tmpl); ret=open(tmpl,O_RDWR|O_BINARY|O_CREAT|O_EXCL|_O_SHORT_LIVED, _S_IREAD|_S_IWRITE);
55 #include "YacsTrace.hxx"
63 std::string getImplName(ImplType impl)
82 * Functions to return a CORBA TypeCode equivalent to a YACS TypeCode
85 typedef CORBA::TypeCode_ptr (*getCorbaTCFn)(const TypeCode *);
87 CORBA::TypeCode_ptr getCorbaTCNull(const TypeCode *t)
90 msg << "Conversion not implemented: kind= " << t->kind();
91 msg << " : " << __FILE__ << ":" << __LINE__;
92 throw YACS::ENGINE::ConversionException(msg.str());
95 CORBA::TypeCode_ptr getCorbaTCDouble(const TypeCode *t)
97 return CORBA::TypeCode::_duplicate(CORBA::_tc_double);
100 CORBA::TypeCode_ptr getCorbaTCInt(const TypeCode *t)
102 return CORBA::TypeCode::_duplicate(CORBA::_tc_long);
105 CORBA::TypeCode_ptr getCorbaTCString(const TypeCode *t)
107 return CORBA::TypeCode::_duplicate(CORBA::_tc_string);
110 CORBA::TypeCode_ptr getCorbaTCBool(const TypeCode *t)
112 return CORBA::TypeCode::_duplicate(CORBA::_tc_boolean);
115 CORBA::TypeCode_ptr getCorbaTCObjref(const TypeCode *t)
117 DEBTRACE( t->name() << " " << t->shortName() << " " << t->id());
118 CORBA::TypeCode_ptr tc;
119 if(strncmp(t->id(),"python",6)==0 )
120 tc= CORBA::TypeCode::_duplicate(Engines::_tc_fileBlock);
121 else if(strncmp(t->id(),"json",4)==0)
122 tc= CORBA::TypeCode::_duplicate(CORBA::_tc_string);
124 tc= getSALOMERuntime()->getOrb()->create_interface_tc(t->id(),t->shortName());
126 DEBTRACE("refcount CORBA tc Objref: " << ((omni::TypeCode_base*)tc)->pd_ref_count);
131 CORBA::TypeCode_ptr getCorbaTCSequence(const TypeCode *t)
133 CORBA::TypeCode_var content_type=getCorbaTC(t->contentType());
134 CORBA::TypeCode_ptr tc= getSALOMERuntime()->getOrb()->create_sequence_tc(0,content_type);
136 DEBTRACE("refcount CORBA content_type: " << ((omni::TypeCode_base*)content_type.in())->pd_ref_count);
137 DEBTRACE("refcount CORBA tc: " << ((omni::TypeCode_base*)tc)->pd_ref_count);
142 CORBA::TypeCode_ptr getCorbaTCStruct(const TypeCode *t)
144 CORBA::StructMemberSeq mseq;
145 YACS::ENGINE::TypeCodeStruct* tst=(YACS::ENGINE::TypeCodeStruct*)t;
146 int nMember=tst->memberCount();
147 mseq.length(nMember);
148 for(int i=0;i<nMember;i++)
150 const char * name=tst->memberName(i);
151 TypeCode* tm=tst->memberType(i);
152 mseq[i].name=CORBA::string_dup(name);
153 mseq[i].type=getCorbaTC(tm);
155 CORBA::TypeCode_ptr tc= getSALOMERuntime()->getOrb()->create_struct_tc(t->id(),t->shortName(),mseq);
157 DEBTRACE("refcount CORBA tc: " << ((omni::TypeCode_base*)tc)->pd_ref_count);
162 getCorbaTCFn getCorbaTCFns[]=
175 CORBA::TypeCode_ptr getCorbaTC(const TypeCode *t)
178 return getCorbaTCFns[tk](t);
182 * End of Functions to return a CORBA TypeCode equivalent to a YACS TypeCode
186 * Section that defines functions to check adaptation from one implementation to another
187 * isAdaptable is template function that checks if TypeCode t1 from implementation IMPLIN
188 * can be converted to TypeCode t2 from implementation IMPLOUT
189 * IMPLIN is the implementation of an output port
190 * IMPLOUT is the implementation of an input port
191 * If the check is True, the input port can be adapted to the output port
194 template <ImplType IMPLIN,ImplType IMPLOUT> inline int isAdaptable(const TypeCode *t1,const TypeCode* t2);
196 template <ImplType IMPLIN,ImplType IMPLOUT>
197 struct isAdaptableDouble
199 static inline int apply(const TypeCode *t1,const TypeCode* t2)
201 if(t1->kind() == Double)return 1;
202 if(t1->kind() == Int)return 1;
206 template <ImplType IMPLIN,ImplType IMPLOUT>
207 struct isAdaptableInt
209 static inline int apply(const TypeCode *t1,const TypeCode* t2)
211 if(t1->kind() == Int)return 1;
215 template <ImplType IMPLIN,ImplType IMPLOUT>
216 struct isAdaptableString
218 static inline int apply(const TypeCode *t1,const TypeCode* t2)
220 if(t1->kind() == String)return 1;
224 template <ImplType IMPLIN,ImplType IMPLOUT>
225 struct isAdaptableBool
227 static inline int apply(const TypeCode *t1,const TypeCode* t2)
229 if(t1->kind() == Bool)return 1;
230 if(t1->kind() == Int)return 1;
234 template <ImplType IMPLIN,ImplType IMPLOUT>
235 struct isAdaptableObjref
237 static inline int apply(const TypeCode *t1,const TypeCode* t2)
239 if(t1->kind() == Objref)
241 //The inport type must be more general than outport type
242 if( t1->isA(t2->id()) )
245 else if(t1->kind() == Sequence)
247 const TypeCodeSeq *t1c(dynamic_cast<const TypeCodeSeq *>(t1));
250 const TypeCode *t1cc(t1c->contentType());
253 if(t1cc->kind() == Objref && std::string(t1cc->id())==std::string(t2->id()))
259 template <ImplType IMPLIN,ImplType IMPLOUT>
260 struct isAdaptableSequence
262 static inline int apply(const TypeCode *t1,const TypeCode* t2)
264 if(t1->kind() == Sequence)
266 if(isAdaptable<IMPLIN,IMPLOUT>(t1->contentType(),t2->contentType()))
274 template <ImplType IMPLIN,ImplType IMPLOUT>
275 struct isAdaptableArray
277 static inline int apply(const TypeCode *t1,const TypeCode* t2)
282 template <ImplType IMPLIN,ImplType IMPLOUT>
283 struct isAdaptableStruct
285 static inline int apply(const TypeCode *t1,const TypeCode* t2)
287 if(t1->kind() == Struct)
297 * Function to check adaptation from implementation 1 (IMPLIN,t1) to implementation 2 (IMPLOUT,t2)
298 * t1 is the IMPLIN output port type
299 * t2 is the IMPLOUT input port type
301 template <ImplType IMPLIN,ImplType IMPLOUT>
302 inline int isAdaptable(const TypeCode *t1,const TypeCode* t2)
307 return isAdaptableDouble<IMPLIN,IMPLOUT>::apply(t1,t2);
309 return isAdaptableInt<IMPLIN,IMPLOUT>::apply(t1,t2);
311 return isAdaptableString<IMPLIN,IMPLOUT>::apply(t1,t2);
313 return isAdaptableBool<IMPLIN,IMPLOUT>::apply(t1,t2);
315 return isAdaptableObjref<IMPLIN,IMPLOUT>::apply(t1,t2);
317 return isAdaptableSequence<IMPLIN,IMPLOUT>::apply(t1,t2);
319 return isAdaptableArray<IMPLIN,IMPLOUT>::apply(t1,t2);
321 return isAdaptableStruct<IMPLIN,IMPLOUT>::apply(t1,t2);
328 //xxx to Python adaptations
329 int isAdaptableCorbaPyObject(const TypeCode *t1,const TypeCode *t2)
331 return isAdaptable<PYTHONImpl,CORBAImpl>(t1,t2);
333 int isAdaptableNeutralPyObject(const TypeCode * t1, const TypeCode * t2)
335 return isAdaptable<PYTHONImpl,NEUTRALImpl>(t1,t2);
337 int isAdaptablePyObjectPyObject(const TypeCode *t1,const TypeCode *t2)
339 return isAdaptable<PYTHONImpl,PYTHONImpl>(t1,t2);
342 //xxx to Neutral adaptations
343 int isAdaptableCorbaNeutral(const TypeCode *t1,const TypeCode *t2)
345 return isAdaptable<NEUTRALImpl,CORBAImpl>(t1,t2);
347 int isAdaptablePyObjectNeutral(const TypeCode *t1,const TypeCode *t2)
349 return isAdaptable<NEUTRALImpl,PYTHONImpl>(t1,t2);
351 int isAdaptableXmlNeutral(const TypeCode *t1,const TypeCode *t2)
353 return isAdaptable<NEUTRALImpl,XMLImpl>(t1,t2);
355 int isAdaptableNeutralNeutral(const TypeCode *t1, const TypeCode *t2)
357 return isAdaptableNeutralCorba(t1, t2);
360 //xxx to XML adaptations
361 int isAdaptableNeutralXml(const TypeCode * t1, const TypeCode * t2)
363 return isAdaptable<XMLImpl,NEUTRALImpl>(t1,t2);
366 //xxx to Corba adaptations
367 int isAdaptableNeutralCorba(const TypeCode *t1,const TypeCode *t2)
369 return isAdaptable<CORBAImpl,NEUTRALImpl>(t1,t2);
371 int isAdaptableXmlCorba(const TypeCode *t1,const TypeCode *t2)
373 return isAdaptable<CORBAImpl,XMLImpl>(t1,t2);
375 int isAdaptableCorbaCorba(const TypeCode *t1,const TypeCode *t2)
377 return isAdaptable<CORBAImpl,CORBAImpl>(t1,t2);
379 int isAdaptablePyObjectCorba(const TypeCode *t1,const TypeCode *t2)
381 return isAdaptable<CORBAImpl,PYTHONImpl>(t1,t2);
384 //! Basic template convertor from type TIN to Yacs<TOUT> type
386 * This convertor does nothing : throws exception
387 * It must be partially specialize for a specific type (TIN)
389 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
390 struct convertToYacsDouble
392 static inline double convert(const TypeCode *t,TIN o,TIN2 aux)
395 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLIN << " to: " << IMPLOUT;
396 msg << " : " << __FILE__ << ":" << __LINE__;
397 throw YACS::ENGINE::ConversionException(msg.str());
400 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
401 struct convertToYacsInt
403 static inline long convert(const TypeCode *t,TIN o,TIN2 aux)
406 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLIN << " to: " << IMPLOUT;
407 msg << " : " << __FILE__ << ":" << __LINE__;
408 throw YACS::ENGINE::ConversionException(msg.str());
411 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
412 struct convertToYacsString
414 static inline std::string convert(const TypeCode *t,TIN o,TIN2 aux)
417 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLIN << " to: " << IMPLOUT;
418 msg << " : " << __FILE__ << ":" << __LINE__;
419 throw YACS::ENGINE::ConversionException(msg.str());
422 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
423 struct convertToYacsBool
425 static inline bool convert(const TypeCode *t,TIN o,TIN2 aux)
428 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLIN << " to: " << IMPLOUT;
429 msg << " : " << __FILE__ << ":" << __LINE__;
430 throw YACS::ENGINE::ConversionException(msg.str());
433 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
434 struct convertToYacsObjref
436 static inline std::string convert(const TypeCode *t,TIN o,TIN2 aux,int protocol)
439 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLIN << " to: " << IMPLOUT;
440 msg << " : " << __FILE__ << ":" << __LINE__;
441 throw YACS::ENGINE::ConversionException(msg.str());
444 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
445 struct convertToYacsSequence
447 static inline void convert(const TypeCode *t,TIN o,TIN2 aux,std::vector<TOUT>& v)
450 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLIN << " to: " << IMPLOUT;
451 msg << " : " << __FILE__ << ":" << __LINE__;
452 throw YACS::ENGINE::ConversionException(msg.str());
455 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
456 struct convertToYacsArray
458 static inline void convert(const TypeCode *t,TIN o,TIN2 aux,std::vector<TOUT>& v)
461 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLIN << " to: " << IMPLOUT;
462 msg << " : " << __FILE__ << ":" << __LINE__;
463 throw YACS::ENGINE::ConversionException(msg.str());
466 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
467 struct convertToYacsStruct
469 static inline void convert(const TypeCode *t,TIN o,TIN2 aux,std::map<std::string,TOUT>& v)
472 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLIN << " to: " << IMPLOUT;
473 msg << " : " << __FILE__ << ":" << __LINE__;
474 throw YACS::ENGINE::ConversionException(msg.str());
478 //! Basic convertor from Yacs<TOUT> type to full TOUT type
482 template <ImplType IMPLOUT, class TOUT>
483 struct convertFromYacsDouble
485 static inline TOUT convert(const TypeCode *t,double o)
488 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLOUT;
489 msg << " : " << __FILE__ << ":" << __LINE__;
490 throw YACS::ENGINE::ConversionException(msg.str());
493 template <ImplType IMPLOUT, class TOUT>
494 struct convertFromYacsInt
496 static inline TOUT convert(const TypeCode *t,long o)
499 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLOUT;
500 msg << " : " << __FILE__ << ":" << __LINE__;
501 throw YACS::ENGINE::ConversionException(msg.str());
504 template <ImplType IMPLOUT, class TOUT>
505 struct convertFromYacsString
507 static inline TOUT convert(const TypeCode *t,std::string o)
510 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLOUT;
511 msg << " : " << __FILE__ << ":" << __LINE__;
512 throw YACS::ENGINE::ConversionException(msg.str());
515 template <ImplType IMPLOUT, class TOUT>
516 struct convertFromYacsBool
518 static inline TOUT convert(const TypeCode *t,bool o)
521 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLOUT;
522 msg << " : " << __FILE__ << ":" << __LINE__;
523 throw YACS::ENGINE::ConversionException(msg.str());
526 template <ImplType IMPLOUT, class TOUT>
527 struct convertFromYacsObjref
529 static inline TOUT convert(const TypeCode *t,std::string o)
532 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLOUT;
533 msg << " : " << __FILE__ << ":" << __LINE__;
534 throw YACS::ENGINE::ConversionException(msg.str());
537 template <ImplType IMPLOUT, class TOUT>
538 struct convertFromYacsSequence
540 static inline TOUT convert(const TypeCode *t,std::vector<TOUT>& v)
543 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLOUT;
544 msg << " : " << __FILE__ << ":" << __LINE__;
545 throw YACS::ENGINE::ConversionException(msg.str());
548 template <ImplType IMPLOUT, class TOUT>
549 struct convertFromYacsArray
551 static inline TOUT convert(const TypeCode *t,std::vector<TOUT>& v)
554 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLOUT;
555 msg << " : " << __FILE__ << ":" << __LINE__;
556 throw YACS::ENGINE::ConversionException(msg.str());
559 template <ImplType IMPLOUT, class TOUT>
560 struct convertFromYacsStruct
562 static inline TOUT convert(const TypeCode *t,std::map<std::string,TOUT>& v)
565 msg << "Conversion not implemented: kind= " << t->kind() << " Implementation: " << IMPLOUT;
566 msg << " : " << __FILE__ << ":" << __LINE__;
567 throw YACS::ENGINE::ConversionException(msg.str());
570 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
571 inline TOUT convertDouble(const TypeCode *t,TIN o,TIN2 aux)
573 double d=convertToYacsDouble<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux);
575 TOUT r=convertFromYacsDouble<IMPLOUT,TOUT>::convert(t,d);
578 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
579 inline TOUT convertInt(const TypeCode *t,TIN o,TIN2 aux)
581 long d=convertToYacsInt<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux);
583 TOUT r=convertFromYacsInt<IMPLOUT,TOUT>::convert(t,d);
586 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
587 inline TOUT convertString(const TypeCode *t,TIN o,TIN2 aux)
589 std::string d=convertToYacsString<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux);
591 TOUT r=convertFromYacsString<IMPLOUT,TOUT>::convert(t,d);
594 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
595 inline TOUT convertBool(const TypeCode *t,TIN o,TIN2 aux)
597 double d=convertToYacsBool<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux);
599 TOUT r=convertFromYacsBool<IMPLOUT,TOUT>::convert(t,d);
602 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
603 inline TOUT convertObjref(const TypeCode *t,TIN o,TIN2 aux)
607 protocol=0;//to avoid presence of \0 into XML generated file
608 if(IMPLOUT==NEUTRALImpl)
610 std::string d=convertToYacsObjref<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux,protocol);
612 TOUT r=convertFromYacsObjref<IMPLOUT,TOUT>::convert(t,d);
616 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
617 inline TOUT convertSequence(const TypeCode *t,TIN o,TIN2 aux)
620 convertToYacsSequence<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux,v);
621 TOUT r=convertFromYacsSequence<IMPLOUT,TOUT>::convert(t,v);
624 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
625 inline TOUT convertArray(const TypeCode *t,TIN o,TIN2 aux)
628 convertToYacsArray<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux,v);
629 TOUT r=convertFromYacsArray<IMPLOUT,TOUT>::convert(t,v);
632 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
633 inline TOUT convertStruct(const TypeCode *t,TIN o,TIN2 aux)
635 std::map<std::string,TOUT> v;
636 convertToYacsStruct<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux,v);
637 TOUT r=convertFromYacsStruct<IMPLOUT,TOUT>::convert(t,v);
641 template <ImplType IMPLIN,class TIN,class TIN2,ImplType IMPLOUT, class TOUT>
642 inline TOUT YacsConvertor(const TypeCode *t,TIN o,TIN2 aux)
648 return convertDouble<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>(t,o,aux);
650 return convertInt<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>(t,o,aux);
652 return convertString<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>(t,o,aux);
654 return convertBool<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>(t,o,aux);
656 return convertObjref<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>(t,o,aux);
658 return convertSequence<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>(t,o,aux);
660 return convertArray<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>(t,o,aux);
662 return convertStruct<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>(t,o,aux);
667 msg << "Conversion not implemented: kind= " << tk << " Implementation: " << IMPLOUT;
668 msg << " : " << __FILE__ << ":" << __LINE__;
669 throw YACS::ENGINE::ConversionException(msg.str());
672 //! ToYacs Convertor for PYTHONImpl
674 * This convertor converts Python object to YACS<TOUT> types
675 * Partial specialization for Python implementation with type PyObject* (PYTHONImpl)
677 template <ImplType IMPLOUT, class TOUT>
678 struct convertToYacsDouble<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>
680 static inline double convert(const TypeCode *t,PyObject* o,void*)
683 x=PyFloat_AsDouble(o);
684 if( PyErr_Occurred() )
686 PyErr_Restore(nullptr,nullptr,nullptr);
688 msg << "Not a python double. ";
690 msg << "kind=" << t->kind() ;
691 msg << " ( " << __FILE__ << ":" << __LINE__ << ")";
693 throw YACS::ENGINE::ConversionException(msg.str());
698 template <ImplType IMPLOUT, class TOUT>
699 struct convertToYacsInt<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>
701 static inline long convert(const TypeCode *t,PyObject* o,void*)
705 if( PyErr_Occurred() )
707 PyErr_Restore(nullptr,nullptr,nullptr);
709 msg << "Not a python integer. ";
711 msg << "kind=" << t->kind() ;
712 msg << " ( " << __FILE__ << ":" << __LINE__ << ")";
714 throw YACS::ENGINE::ConversionException(msg.str());
719 template <ImplType IMPLOUT, class TOUT>
720 struct convertToYacsString<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>
722 static inline std::string convert(const TypeCode *t,PyObject* o,void*)
725 if (PyUnicode_Check(o))
728 const char *ptr = PyUnicode_AsUTF8AndSize(o, &size);
730 throw YACS::ENGINE::ConversionException("Conversion from PyUnicode to string failed");
736 msg << "Not a python string. ";
738 msg << "kind=" << t->kind() ;
739 msg << " ( " << __FILE__ << ":" << __LINE__ << ")";
741 throw YACS::ENGINE::ConversionException(msg.str());
746 template <ImplType IMPLOUT, class TOUT>
747 struct convertToYacsBool<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>
749 static inline bool convert(const TypeCode *t,PyObject* o,void*)
754 else if(PyLong_Check(o))
755 l=(PyLong_AsLong(o)!=0);
759 msg << "Not a python boolean. ";
761 msg << "kind=" << t->kind() ;
762 msg << " ( " << __FILE__ << ":" << __LINE__ << ")";
764 throw YACS::ENGINE::ConversionException(msg.str());
769 template <ImplType IMPLOUT, class TOUT>
770 struct convertToYacsObjref<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>
772 static inline std::string convert(const TypeCode *t,PyObject* o,void*,int protocol)
774 if (PyUnicode_Check(o) && strncmp(t->id(),"python",6)!=0)
776 // the objref is used by Python as a string (prefix:value) keep it as a string
779 const char *ptr = PyUnicode_AsUTF8AndSize(o, &size);
781 throw YACS::ENGINE::ConversionException("Conversion from PyUnicode to string failed");
785 if(strncmp(t->id(),"python",6)==0)
787 bool somthingToDo = YACS::ENGINE::PythonEntry::GetDestroyStatus(o);
789 YACS::ENGINE::PythonEntry::DoNotTouchFileIfProxy(o);
790 // It's a native Python object pickle it
791 PyObject* mod=PyImport_ImportModule("pickle");
792 PyObject *pickled=PyObject_CallMethod(mod,(char *)"dumps",(char *)"Oi",o,protocol);
795 YACS::ENGINE::PythonEntry::UnlinkOnDestructorIfProxy(o);
796 YACS::ENGINE::PythonEntry::IfProxyDoSomething(o,"incrRef");
798 DEBTRACE(PyObject_Repr(pickled) );
803 throw YACS::ENGINE::ConversionException("Problem in convertToYacsObjref<PYTHONImpl");
805 std::string mystr(PyBytes_AsString(pickled),PyBytes_Size(pickled));
809 else if(strncmp(t->id(),"json",4)==0)
811 // It's a Python object convert it to json
812 PyObject* mod=PyImport_ImportModule("simplejson");
816 throw YACS::ENGINE::ConversionException("Problem in convertToYacsObjref<PYTHONImpl: no simplejson module");
818 PyObject *pickled=PyObject_CallMethod(mod,(char *)"dumps",(char *)"O",o);
823 throw YACS::ENGINE::ConversionException("Problem in convertToYacsObjref<PYTHONImpl");
825 std::string mystr=PyBytes_AsString(pickled);
831 // It should be a CORBA Object convert it to an IOR string
832 PyObject *pystring=PyObject_CallMethod(getSALOMERuntime()->getPyOrb(),(char *)"object_to_string",(char *)"O",o);
836 throw YACS::ENGINE::ConversionException("Problem in convertToYacsObjref<PYTHONImpl");
840 const char *ptr = PyUnicode_AsUTF8AndSize(pystring, &size);
842 throw YACS::ENGINE::ConversionException("Conversion from PyUnicode to string failed");
843 mystr.assign(ptr, size);
849 template <ImplType IMPLOUT, class TOUT>
850 struct convertToYacsSequence<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>
852 static inline void convert(const TypeCode *t,PyObject* o,void*,std::vector<TOUT>& v)
854 if(!PySequence_Check(o))
857 msg << "Problem in conversion: the python object is not a sequence " << std::endl;
859 msg << " ( " << __FILE__ << ":" << __LINE__ << ")";
861 throw YACS::ENGINE::ConversionException(msg.str());
863 int length=PySequence_Size(o);
864 GURU_YACSTRACE("convertToYacsSequence : length = " << length);
866 for(int i=0;i<length;i++)
868 PyObject *item=PySequence_ITEM(o,i);
869 GURU_YACSTRACE("convertToYacsSequence : analyze if proxy");
870 bool somthingToDo = YACS::ENGINE::PythonEntry::IsProxy(item);
873 GURU_YACSTRACE("convertToYacsSequence : it s proxy -> unlink");
874 YACS::ENGINE::PythonEntry::UnlinkOnDestructorIfProxy(item);
875 GURU_YACSTRACE("convertToYacsSequence : it s proxy -> incrRef");
876 YACS::ENGINE::PythonEntry::IfProxyDoSomething(item,"incrRef");
879 std::cerr <<"item[" << i << "]=";
880 PyObject_Print(item,stderr,Py_PRINT_RAW);
881 std::cerr << std::endl;
883 DEBTRACE( "item refcnt: " << item->ob_refcnt );
886 TOUT ro=YacsConvertor<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>(t->contentType(),item,0);
890 catch(ConversionException& ex)
893 msg << ex.what() << " for sequence element " << i;
894 throw YACS::ENGINE::ConversionException(msg.str(),false);
899 template <ImplType IMPLOUT, class TOUT>
900 struct convertToYacsStruct<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>
902 static inline void convert(const TypeCode *t,PyObject* o,void*,std::map<std::string,TOUT>& m)
904 DEBTRACE( "o refcnt: " << o->ob_refcnt );
905 PyObject *key, *value;
906 YACS::ENGINE::TypeCodeStruct* tst=(YACS::ENGINE::TypeCodeStruct*)t;
907 int nMember=tst->memberCount();
908 DEBTRACE("nMember="<<nMember);
909 for(int i=0;i<nMember;i++)
911 std::string name=tst->memberName(i);
912 DEBTRACE("Member name="<<name);
913 TypeCode* tm=tst->memberType(i);
914 value=PyDict_GetItemString(o, name.c_str());
917 //member name not present
918 //TODO delete all allocated objects in m
920 PyObject_Print(o,stderr,Py_PRINT_RAW);
921 std::cerr << std::endl;
924 msg << "member " << name << " not present " ;
925 throw YACS::ENGINE::ConversionException(msg.str());
927 DEBTRACE( "value refcnt: " << value->ob_refcnt );
930 TOUT ro=YacsConvertor<PYTHONImpl,PyObject*,void*,IMPLOUT,TOUT>(tm,value,0);
933 catch(ConversionException& ex)
935 std::string s=" for struct member "+name;
936 throw YACS::ENGINE::ConversionException(ex.what()+s,false);
941 /* End of ToYacs Convertor for PYTHONImpl */
943 //! FromYacs Convertor for PYTHONImpl
945 * Convert YACS<PyObject*> intermediate types to PyObject* types (PYTHONImpl)
948 struct convertFromYacsDouble<PYTHONImpl,PyObject*>
950 static inline PyObject* convert(const TypeCode *t,double o)
952 PyObject *pyob=PyFloat_FromDouble(o);
957 struct convertFromYacsInt<PYTHONImpl,PyObject*>
959 static inline PyObject* convert(const TypeCode *t,long o)
961 PyObject *pyob=PyLong_FromLong(o);
966 struct convertFromYacsString<PYTHONImpl,PyObject*>
968 static inline PyObject* convert(const TypeCode *t,std::string& o)
970 return PyUnicode_FromString(o.c_str());
974 struct convertFromYacsBool<PYTHONImpl,PyObject*>
976 static inline PyObject* convert(const TypeCode *t,bool o)
978 return PyBool_FromLong ((long)o);
982 struct convertFromYacsObjref<PYTHONImpl,PyObject*>
984 static inline PyObject* convert(const TypeCode *t,std::string& o)
991 if(t->isA(Runtime::_tc_file))
993 //It's an objref file. Convert it specially
994 return PyUnicode_FromString(o.c_str());
996 if(strncmp(t->id(),"python",6)==0) //ex: "python:obj:1.0"
998 //It's a python pickled object, unpickled it
999 PyObject* mod=PyImport_ImportModule("pickle");
1000 GURU_YACSTRACE("convertFromYacsObjref : unpickling...");
1001 Py_ssize_t l = o.length();
1002 PyObject *ob=PyObject_CallMethod(mod,(char *)"loads",(char *)"y#",o.c_str(),l);
1003 GURU_YACSTRACE("convertFromYacsObjref : unpickling done...");
1004 DEBTRACE(PyObject_Repr(ob));
1006 GURU_YACSTRACE("convertFromYacsObjref : Analyze if it's a proxy");
1007 bool somthingToDo = YACS::ENGINE::PythonEntry::IsProxy(ob);
1010 // no incrRef here because the incrRef has been done before dumps that construct o.
1011 GURU_YACSTRACE("convertFromYacsObjref : It's a proxy -> activate on deletion");
1012 YACS::ENGINE::PythonEntry::UnlinkOnDestructorIfProxy(ob);
1017 throw YACS::ENGINE::ConversionException("Problem in convertFromYacsObjref<PYTHONImpl");
1021 if(strncmp(t->id(),"json",4)==0)
1023 // It's a json object unpack it
1024 PyObject* mod=PyImport_ImportModule("simplejson");
1028 throw YACS::ENGINE::ConversionException("Problem in convertToYacsObjref<PYTHONImpl: no simplejson module");
1030 Py_ssize_t l = o.length();
1031 PyObject *ob=PyObject_CallMethod(mod,(char *)"loads",(char *)"y",o.c_str(),l);
1036 throw YACS::ENGINE::ConversionException("Problem in convertFromYacsObjref<PYTHONImpl");
1041 /* another way to convert IOR string to CORBA PyObject
1042 PyObject* ob= PyObject_CallMethod(getSALOMERuntime()->getPyOrb(),"string_to_object","s",o.c_str());
1043 DEBTRACE( "Objref python refcnt: " << ob->ob_refcnt );
1047 //Objref CORBA. prefix=IOR,corbaname,corbaloc
1048 CORBA::Object_var obref;
1051 obref = getSALOMERuntime()->getFromNS(o.c_str());
1053 DEBTRACE("obref refCount: " << obref->_PR_getobj()->pd_refCount);
1056 catch(CORBA::Exception& ex)
1058 DEBTRACE( "Can't get reference to object." );
1059 throw ConversionException("Can't get reference to object");
1062 if(obref->_non_existent())
1064 throw ConversionException("non_existent object");
1067 if( CORBA::is_nil(obref) )
1069 DEBTRACE( "Can't get reference to object (or it was nil)." );
1070 throw ConversionException("Can't get reference to object");
1073 if(!obref->_is_a(t->id()))
1076 msg << "Problem in conversion: an objref " << t->id() << " is expected " << endl;
1077 msg << "An objref of type " << obref->_PD_repoId << " is given " << endl;
1078 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1079 throw YACS::ENGINE::ConversionException(msg.str());
1082 DEBTRACE("obref refCount: " << obref->_PR_getobj()->pd_refCount);
1085 std::cerr << "_PD_repoId: " << obref->_PD_repoId << std::endl;
1086 std::cerr << "_mostDerivedRepoId: " << obref->_PR_getobj()->_mostDerivedRepoId() << std::endl;
1089 //hold_lock is true: caller is supposed to hold the GIL.
1090 //omniorb will not take the GIL
1091 PyObject* ob= getSALOMERuntime()->getApi()->cxxObjRefToPyObjRef(obref, 1);
1094 PyObject_Print(ob,stderr,Py_PRINT_RAW);
1095 std::cerr << std::endl;
1096 std::cerr << "obref is a generic: " << obref->_is_a("IDL:SALOME/GenericObj:1.0") << std::endl;
1097 PyObject_Print(getSALOMERuntime()->get_omnipy(),stderr,Py_PRINT_RAW);
1098 std::cerr << std::endl;
1101 //ob is a CORBA::Object. Try to convert it to more specific type SALOME/GenericObj
1102 if(obref->_is_a("IDL:SALOME/GenericObj:1.0"))
1104 PyObject *result = PyObject_CallMethod(getSALOMERuntime()->get_omnipy(), (char *)"narrow", (char *)"Osi",ob,"IDL:SALOME/GenericObj:1.0",1);
1106 PyErr_Clear();//Exception during narrow. Keep ob
1107 else if(result==Py_None)
1108 Py_DECREF(result); //Can't narrow. Keep ob
1111 //Can narrow. Keep result
1113 PyObject_Print(result,stderr,Py_PRINT_RAW);
1114 std::cerr << std::endl;
1122 DEBTRACE("obref refCount: " << obref->_PR_getobj()->pd_refCount);
1129 struct convertFromYacsSequence<PYTHONImpl,PyObject*>
1131 static inline PyObject* convert(const TypeCode *t,std::vector<PyObject*>& v)
1133 std::vector<PyObject*>::const_iterator iter;
1134 PyObject *pyob = PyList_New(v.size());
1136 for(iter=v.begin();iter!=v.end();iter++)
1138 PyObject* item=*iter;
1139 DEBTRACE( "item refcnt: " << item->ob_refcnt );
1140 PyList_SetItem(pyob,i,item);
1141 DEBTRACE( "item refcnt: " << item->ob_refcnt );
1148 struct convertFromYacsStruct<PYTHONImpl,PyObject*>
1150 static inline PyObject* convert(const TypeCode *t,std::map<std::string,PyObject*>& m)
1152 PyObject *pyob = PyDict_New();
1153 std::map<std::string, PyObject*>::const_iterator pt;
1154 for(pt=m.begin();pt!=m.end();pt++)
1156 std::string name=(*pt).first;
1157 PyObject* item=(*pt).second;
1158 DEBTRACE( "item refcnt: " << item->ob_refcnt );
1159 PyDict_SetItemString(pyob,name.c_str(),item);
1161 DEBTRACE( "item refcnt: " << item->ob_refcnt );
1163 DEBTRACE( "pyob refcnt: " << pyob->ob_refcnt );
1167 /* End of FromYacs Convertor for PYTHONImpl */
1169 //! ToYacs Convertor for XMLImpl
1171 * Partial specialization for XML implementation (XMLImpl)
1172 * This convertor converts xml object to YACS<TOUT> types
1174 template <ImplType IMPLOUT, class TOUT>
1175 struct convertToYacsDouble<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>
1177 static inline double convert(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur)
1180 cur = cur->xmlChildrenNode;
1183 if ((!xmlStrcmp(cur->name, (const xmlChar *)"double")))
1185 //wait a double, got a double
1187 s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
1190 DEBTRACE( "convertToYacsDouble " << (const char *)s );
1191 d=Cstr2d((const char *)s);
1196 DEBTRACE("############### workaround to improve...");
1200 else if ((!xmlStrcmp(cur->name, (const xmlChar *)"int")))
1202 //wait a double, got an int
1204 s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
1207 DEBTRACE( "convertToYacsDouble " << (const char *)s );
1208 d=Cstr2d((const char *)s);
1213 DEBTRACE("############### workaround to improve...");
1220 msg << "Problem in conversion from Xml to " << getImplName(IMPLOUT) << " with type: " << t->id() ;
1221 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1222 throw YACS::ENGINE::ConversionException(msg.str());
1225 template <ImplType IMPLOUT, class TOUT>
1226 struct convertToYacsInt<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>
1228 static inline long convert(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur)
1231 cur = cur->xmlChildrenNode;
1234 if ((!xmlStrcmp(cur->name, (const xmlChar *)"int")))
1237 s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
1240 DEBTRACE( "convertToYacsInt " << (const char *)s );
1241 d=atol((const char *)s);
1246 DEBTRACE("############### workaround to improve...");
1253 msg << "Problem in conversion from Xml to " << getImplName(IMPLOUT) << " with type: " << t->id() ;
1254 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1255 throw YACS::ENGINE::ConversionException(msg.str());
1258 template <ImplType IMPLOUT, class TOUT>
1259 struct convertToYacsString<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>
1261 static inline std::string convert(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur)
1263 cur = cur->xmlChildrenNode;
1266 if ((!xmlStrcmp(cur->name, (const xmlChar *)"string")))
1268 //wait a string, got a string
1270 s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
1272 DEBTRACE( "convertToYacsString " << (const char *)s );
1273 std::string mystr=std::string((const char *)s);
1280 msg << "Problem in conversion from Xml to " << getImplName(IMPLOUT) << " with type: " << t->id() ;
1281 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1282 throw YACS::ENGINE::ConversionException(msg.str());
1285 template <ImplType IMPLOUT, class TOUT>
1286 struct convertToYacsBool<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>
1288 static inline bool convert(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur)
1290 cur = cur->xmlChildrenNode;
1293 if ((!xmlStrcmp(cur->name, (const xmlChar *)"boolean")))
1295 //wait a boolean, got a boolean
1297 s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
1301 DEBTRACE( "convertToYacsBool " << (const char *)s );
1302 ob=atoi((const char*)s)!=0;
1307 DEBTRACE("############### workaround to improve...");
1314 msg << "Problem in conversion from Xml to " << getImplName(IMPLOUT) << " with type: " << t->id() ;
1315 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1316 throw YACS::ENGINE::ConversionException(msg.str());
1319 template <ImplType IMPLOUT, class TOUT>
1320 struct convertToYacsObjref<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>
1322 static inline std::string convert(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur,int protocol)
1324 cur = cur->xmlChildrenNode;
1327 if ((!xmlStrcmp(cur->name, (const xmlChar *)"objref")))
1329 //we wait a objref, we have got a objref
1331 std::string mystr = "";
1332 s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
1335 DEBTRACE( "convertToYacsObjref " << (const char *)s );
1336 mystr = (const char *)s;
1341 DEBTRACE("############### workaround to improve...");
1343 if(strncmp(t->id(),"python",6)==0 )
1344 return FromBase64Safe(mystr);
1348 else if ((!xmlStrcmp(cur->name, (const xmlChar *)"string")))// <- here case where pyobj value has been stored in XML. pyobj has kind==ObjRef. And the stored format is String ! EDF11027
1350 //wait a string, got a string
1352 s = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
1354 DEBTRACE( "convertToYacsString " << (const char *)s );
1355 std::string mystr=std::string((const char *)s);
1362 msg << "Problem in conversion from Xml to " << getImplName(IMPLOUT) << " with type: " << t->id() ;
1363 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1364 throw YACS::ENGINE::ConversionException(msg.str());
1367 template <ImplType IMPLOUT, class TOUT>
1368 struct convertToYacsSequence<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>
1370 static inline void convert(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur,std::vector<TOUT>& v)
1372 cur = cur->xmlChildrenNode;
1375 if ((!xmlStrcmp(cur->name, (const xmlChar *)"array")))
1377 DEBTRACE( "parse sequence " );
1378 xmlNodePtr cur1=cur->xmlChildrenNode;
1379 while (cur1 != NULL)
1381 if ((!xmlStrcmp(cur1->name, (const xmlChar *)"data")))
1383 DEBTRACE( "parse data " );
1384 xmlNodePtr cur2=cur1->xmlChildrenNode;
1385 while (cur2 != NULL)
1387 //collect all values
1388 if ((!xmlStrcmp(cur2->name, (const xmlChar *)"value")))
1390 TOUT ro=YacsConvertor<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>(t->contentType(),doc,cur2);
1394 } // end while value
1402 } // end while array
1405 template <ImplType IMPLOUT, class TOUT>
1406 struct convertToYacsStruct<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>
1408 static inline void convert(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur,std::map<std::string,TOUT>& m)
1410 YACS::ENGINE::TypeCodeStruct* tst=(YACS::ENGINE::TypeCodeStruct*)t;
1411 int nMember=tst->memberCount();
1412 DEBTRACE("nMember="<<nMember);
1413 std::map<std::string,TypeCode*> mtc;
1414 for(int i=0;i<nMember;i++)
1416 mtc[tst->memberName(i)]=tst->memberType(i);
1419 cur = cur->xmlChildrenNode;
1422 if ((!xmlStrcmp(cur->name, (const xmlChar *)"struct")))
1424 DEBTRACE( "parse struct " );
1425 xmlNodePtr cur1=cur->xmlChildrenNode;
1426 while (cur1 != NULL)
1428 if ((!xmlStrcmp(cur1->name, (const xmlChar *)"member")))
1430 DEBTRACE( "parse member " );
1431 xmlNodePtr cur2=cur1->xmlChildrenNode;
1432 while (cur2 != NULL)
1435 if ((!xmlStrcmp(cur2->name, (const xmlChar *)"name")))
1438 s = xmlNodeListGetString(doc, cur2->xmlChildrenNode, 1);
1439 std::string name= (char *)s;
1441 while (cur2 != NULL)
1443 if ((!xmlStrcmp(cur2->name, (const xmlChar *)"value")))
1445 TOUT ro=YacsConvertor<XMLImpl,xmlDocPtr,xmlNodePtr,IMPLOUT,TOUT>(mtc[name],doc,cur2);
1455 } // end while member/value
1458 } // end while member
1462 } // end while struct
1465 /* End of ToYacs Convertor for XMLImpl */
1467 //! FromYacs Convertor for XMLImpl
1469 * Convert YACS<std::string> intermediate types to std::string types (XMLImpl)
1472 struct convertFromYacsDouble<XMLImpl,std::string>
1474 static inline std::string convert(const TypeCode *t,double o)
1477 msg << "<value><double>" << setprecision(16) << o << "</double></value>\n";
1482 struct convertFromYacsInt<XMLImpl,std::string>
1484 static inline std::string convert(const TypeCode *t,long o)
1487 msg << "<value><int>" << o << "</int></value>\n";
1492 struct convertFromYacsString<XMLImpl,std::string>
1494 static inline std::string convert(const TypeCode *t,std::string& o)
1496 std::string msg="<value><string>";
1497 return msg+o+"</string></value>\n";
1501 struct convertFromYacsBool<XMLImpl,std::string>
1503 static inline std::string convert(const TypeCode *t,bool o)
1506 msg << "<value><boolean>" << o << "</boolean></value>\n";
1511 struct convertFromYacsObjref<XMLImpl,std::string>
1513 static inline std::string convert(const TypeCode *t,std::string& o)
1515 if(strncmp(t->id(),"python",6)==0 )
1516 return "<value><objref><![CDATA[" + ToBase64(o) + "]]></objref></value>\n";
1517 else if(strncmp(t->id(),"json",4)==0)
1518 return "<value><objref><![CDATA[" + o + "]]></objref></value>\n";
1520 return "<value><objref>" + o + "</objref></value>\n";
1525 struct convertFromYacsSequence<XMLImpl,std::string>
1527 static inline std::string convert(const TypeCode *t,std::vector<std::string>& v)
1529 std::vector<std::string>::const_iterator iter;
1531 xmlob << "<value><array><data>\n";
1532 for(iter=v.begin();iter!=v.end();iter++)
1536 xmlob << "</data></array></value>\n";
1537 DEBTRACE("Sequence= " << xmlob);
1542 struct convertFromYacsStruct<XMLImpl,std::string>
1544 static inline std::string convert(const TypeCode *t,std::map<std::string,std::string>& m)
1546 std::string result="<value><struct>\n";
1547 std::map<std::string, std::string>::const_iterator pt;
1548 for(pt=m.begin();pt!=m.end();pt++)
1550 std::string name=(*pt).first;
1551 std::string item=(*pt).second;
1552 result=result+"<member>\n";
1553 result=result+"<name>"+name+"</name>\n";
1555 result=result+"</member>\n";
1557 result=result+"</struct></value>\n";
1562 /* End of FromYacs Convertor for XMLImpl */
1564 //! ToYacs Convertor for NEUTRALImpl
1566 * This convertor converts Neutral objects to intermediate YACS<TOUT> types
1567 * Template : Partial specialization for Neutral implementation with types YACS::ENGINE::Any*
1569 template <ImplType IMPLOUT, class TOUT>
1570 struct convertToYacsDouble<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>
1572 static inline double convert(const TypeCode *t,YACS::ENGINE::Any* o,void*)
1574 if(o->getType()->kind()==Double)
1575 return o->getDoubleValue();
1576 else if(o->getType()->kind()==Int)
1577 return o->getIntValue();
1580 msg << "Problem in conversion: a double or int is expected " ;
1581 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1582 throw YACS::ENGINE::ConversionException(msg.str());
1585 template <ImplType IMPLOUT, class TOUT>
1586 struct convertToYacsInt<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>
1588 static inline long convert(const TypeCode *t,YACS::ENGINE::Any* o,void*)
1590 if(o->getType()->kind()==Int)
1591 return o->getIntValue();
1593 msg << "Problem in conversion: a int is expected " ;
1594 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1595 throw YACS::ENGINE::ConversionException(msg.str());
1598 template <ImplType IMPLOUT, class TOUT>
1599 struct convertToYacsString<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>
1601 static inline std::string convert(const TypeCode *t,YACS::ENGINE::Any* o,void*)
1603 if(o->getType()->kind()==String)
1604 return o->getStringValue();
1606 msg << "Problem in conversion: a string is expected " ;
1607 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1608 throw YACS::ENGINE::ConversionException(msg.str());
1611 template <ImplType IMPLOUT, class TOUT>
1612 struct convertToYacsBool<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>
1614 static inline bool convert(const TypeCode *t,YACS::ENGINE::Any* o,void*)
1616 if(o->getType()->kind()==Bool)
1617 return o->getBoolValue();
1618 else if(o->getType()->kind()==Int)
1619 return o->getIntValue() != 0;
1621 msg << "Problem in conversion: a bool or int is expected " ;
1622 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1623 throw YACS::ENGINE::ConversionException(msg.str());
1626 template <ImplType IMPLOUT, class TOUT>
1627 struct convertToYacsObjref<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>
1629 static inline std::string convert(const TypeCode *t,YACS::ENGINE::Any* o,void*,int protocol)
1631 if(o->getType()->kind()==String || o->getType()->kind()==Objref)
1632 return o->getStringValue();
1634 msg << "Problem in conversion: a objref(string) is expected " ;
1635 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1636 throw YACS::ENGINE::ConversionException(msg.str());
1639 template <ImplType IMPLOUT, class TOUT>
1640 struct convertToYacsSequence<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>
1642 static inline void convert(const TypeCode *t,YACS::ENGINE::Any* o,void*,std::vector<TOUT>& v)
1644 SequenceAny* sdata= (SequenceAny*)o;
1645 int length=sdata->size();
1647 for(int i=0;i<length;i++)
1649 TOUT ro=YacsConvertor<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>(t->contentType(),(*sdata)[i],0);
1654 template <ImplType IMPLOUT, class TOUT>
1655 struct convertToYacsStruct<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>
1657 static inline void convert(const TypeCode *t,YACS::ENGINE::Any* o,void*,std::map<std::string,TOUT>& m)
1659 StructAny * sdata = dynamic_cast<StructAny *>(o);
1660 YASSERT(sdata != NULL);
1661 const TypeCodeStruct * tst = dynamic_cast<const TypeCodeStruct *>(t);
1662 YASSERT(tst != NULL);
1663 for (int i=0 ; i<tst->memberCount() ; i++)
1665 string name = tst->memberName(i);
1666 TOUT ro=YacsConvertor<NEUTRALImpl,YACS::ENGINE::Any*,void*,IMPLOUT,TOUT>(tst->memberType(i),(*sdata)[name.c_str()],0);
1671 /* End of ToYacs Convertor for NEUTRALImpl */
1673 //! FromYacs Convertor for NEUTRALImpl
1675 * Convert YACS<YACS::ENGINE::Any*> intermediate types to YACS::ENGINE::Any* types (NEUTRALImpl)
1678 struct convertFromYacsDouble<NEUTRALImpl,YACS::ENGINE::Any*>
1680 static inline YACS::ENGINE::Any* convert(const TypeCode *t,double o)
1682 YACS::ENGINE::Any *ob=YACS::ENGINE::AtomAny::New(o);
1687 struct convertFromYacsInt<NEUTRALImpl,YACS::ENGINE::Any*>
1689 static inline YACS::ENGINE::Any* convert(const TypeCode *t,long o)
1691 return YACS::ENGINE::AtomAny::New((int)o);
1695 struct convertFromYacsString<NEUTRALImpl,YACS::ENGINE::Any*>
1697 static inline YACS::ENGINE::Any* convert(const TypeCode *t,std::string& o)
1699 return YACS::ENGINE::AtomAny::New(o);
1703 struct convertFromYacsBool<NEUTRALImpl,YACS::ENGINE::Any*>
1705 static inline YACS::ENGINE::Any* convert(const TypeCode *t,bool o)
1707 return YACS::ENGINE::AtomAny::New(o);
1711 struct convertFromYacsObjref<NEUTRALImpl,YACS::ENGINE::Any*>
1713 static inline YACS::ENGINE::Any* convert(const TypeCode *t,std::string& o)
1715 //Check if objref is a GenericObj and register it if it is the case (workaround for bad management of GenericObj)
1716 if(o=="" || (t->isA(Runtime::_tc_file)) || (strncmp(t->id(),"python",6)==0) || (strncmp(t->id(),"json",4)==0))
1717 return YACS::ENGINE::AtomAny::New(o, const_cast<TypeCode *>(t));
1719 //Objref CORBA. prefix=IOR,corbaname,corbaloc
1720 CORBA::Object_var obref;
1723 obref = getSALOMERuntime()->getOrb()->string_to_object(o.c_str());
1725 catch(CORBA::Exception& ex)
1727 throw ConversionException("Can't get reference to object");
1729 if(obref->_non_existent())
1730 throw ConversionException("non_existent object");
1731 if( CORBA::is_nil(obref) )
1732 throw ConversionException("Can't get reference to object");
1733 if(!obref->_is_a(t->id()))
1736 msg << "Problem in conversion: an objref " << t->id() << " is expected " << endl;
1737 msg << "An objref of type " << obref->_PD_repoId << " is given " << endl;
1738 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
1739 throw YACS::ENGINE::ConversionException(msg.str());
1742 SALOME::GenericObj_var gobj=SALOME::GenericObj::_narrow(obref);
1743 if(!CORBA::is_nil(gobj))
1745 DEBTRACE("It's a SALOME::GenericObj register it");
1749 DEBTRACE("It's a CORBA::Object but not a SALOME::GenericObj");
1751 return YACS::ENGINE::AtomAny::New(o, const_cast<TypeCode *>(t));
1756 struct convertFromYacsSequence<NEUTRALImpl,YACS::ENGINE::Any*>
1758 static inline YACS::ENGINE::Any* convert(const TypeCode *t,std::vector<YACS::ENGINE::Any*>& v)
1760 std::vector<YACS::ENGINE::Any*>::const_iterator iter;
1761 //Objref are managed as string within YACS::ENGINE::Any objs
1763 any=SequenceAny::New(t->contentType());
1764 for(iter=v.begin();iter!=v.end();iter++)
1766 any->pushBack(*iter);
1769 DEBTRACE( "refcnt: " << any->getRefCnt() );
1775 struct convertFromYacsStruct<NEUTRALImpl,YACS::ENGINE::Any*>
1777 static inline YACS::ENGINE::Any* convert(const TypeCode *t,std::map<std::string,YACS::ENGINE::Any*>& m)
1779 StructAny * any = StructAny::New((TypeCodeStruct *)t);
1780 std::map<std::string,YACS::ENGINE::Any*>::const_iterator it;
1781 for (it=m.begin() ; it!=m.end() ; it++)
1783 any->setEltAtRank(it->first.c_str(), it->second);
1784 it->second->decrRef();
1789 /* End of FromYacs Convertor for NEUTRALImpl */
1791 //! ToYacs Convertor for CORBAImpl
1793 * This convertor converts Corba objects to intermediate YACS<TOUT> types
1794 * Template : Partial specialization for CORBA implementation with types CORBA::Any*
1796 template <ImplType IMPLOUT, class TOUT>
1797 struct convertToYacsDouble<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>
1799 static inline double convert(const TypeCode *t,CORBA::Any* o,void*)
1801 CORBA::TypeCode_var tc = o->type();
1802 if (tc->equivalent(CORBA::_tc_double))
1808 if (tc->equivalent(CORBA::_tc_long))
1815 msg << "Problem in CORBA to TOUT conversion: kind= " << t->kind() ;
1816 msg << " : " << __FILE__ << ":" << __LINE__;
1817 throw YACS::ENGINE::ConversionException(msg.str());
1820 template <ImplType IMPLOUT, class TOUT>
1821 struct convertToYacsInt<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>
1823 static inline long convert(const TypeCode *t,CORBA::Any* o,void*)
1829 msg << "Problem in CORBA to TOUT conversion: kind= " << t->kind() ;
1830 msg << " : " << __FILE__ << ":" << __LINE__;
1831 throw YACS::ENGINE::ConversionException(msg.str());
1834 template <ImplType IMPLOUT, class TOUT>
1835 struct convertToYacsString<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>
1837 static inline std::string convert(const TypeCode *t,CORBA::Any* o,void*)
1843 msg << "Problem in CORBA to TOUT conversion: kind= " << t->kind() ;
1844 msg << " : " << __FILE__ << ":" << __LINE__;
1845 throw YACS::ENGINE::ConversionException(msg.str());
1848 template <ImplType IMPLOUT, class TOUT>
1849 struct convertToYacsBool<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>
1851 static inline bool convert(const TypeCode *t,CORBA::Any* o,void*)
1854 if(*o >>= CORBA::Any::to_boolean(b))
1857 msg << "Problem in Corba to TOUT conversion: kind= " << t->kind() ;
1858 msg << " : " << __FILE__ << ":" << __LINE__;
1859 throw YACS::ENGINE::ConversionException(msg.str());
1862 template <ImplType IMPLOUT, class TOUT>
1863 struct convertToYacsObjref<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>
1865 static inline std::string convert(const TypeCode *t,CORBA::Any* o,void*,int protocol)
1867 char file[]="/tmp/XXXXXX";
1868 if(t->isA(Runtime::_tc_file))
1870 Engines::Salome_file_ptr sf;
1872 Salome_file_i* f=new Salome_file_i();
1874 f->setDistributedFile(file);
1880 else if(strncmp(t->id(),"python",6)==0)
1883 Engines::fileBlock * buffer;
1886 s=(const char*)buffer->get_buffer();
1890 std::string mystr(s,buffer->length());
1894 PyGILState_STATE gstate = PyGILState_Ensure();
1895 PyObject* mod=PyImport_ImportModule("pickle");
1896 Py_ssize_t l = buffer->length();
1897 PyObject *ob=PyObject_CallMethod(mod,(char *)"loads",(char *)"y#",s,l);
1898 PyObject *pickled=PyObject_CallMethod(mod,(char *)"dumps",(char *)"Oi",ob,protocol);
1899 DEBTRACE(PyObject_Repr(pickled));
1900 std::string mystr=PyBytes_AsString(pickled);
1904 PyGILState_Release(gstate);
1909 msg << "Problem in CORBA (protocol python) to TOUT conversion: kind= " << t->kind() ;
1910 msg << " : " << __FILE__ << ":" << __LINE__;
1911 throw YACS::ENGINE::ConversionException(msg.str());
1913 else if(strncmp(t->id(),"json",4)==0)
1921 msg << "Problem in CORBA (protocol json) to TOUT conversion: kind= " << t->kind() ;
1922 msg << " : " << __FILE__ << ":" << __LINE__;
1923 throw YACS::ENGINE::ConversionException(msg.str());
1927 CORBA::Object_var ObjRef ;
1928 *o >>= CORBA::Any::to_object(ObjRef) ;
1929 CORBA::String_var objref = getSALOMERuntime()->getOrb()->object_to_string(ObjRef);
1930 return (char *)objref;
1934 template <ImplType IMPLOUT, class TOUT>
1935 struct convertToYacsSequence<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>
1937 static inline void convert(const TypeCode *t,CORBA::Any* o,void*,std::vector<TOUT>& v)
1939 CORBA::TypeCode_var tc=o->type();
1940 if (tc->kind() != CORBA::tk_sequence)
1943 msg << "Not a sequence corba type " << tc->kind();
1944 msg << " : " << __FILE__ << ":" << __LINE__;
1945 throw YACS::ENGINE::ConversionException(msg.str());
1947 DynamicAny::DynAny_ptr dynany=getSALOMERuntime()->getDynFactory()->create_dyn_any(*o);
1948 DynamicAny::DynSequence_ptr ds=DynamicAny::DynSequence::_narrow(dynany);
1949 CORBA::release(dynany);
1950 DynamicAny::AnySeq_var as=ds->get_elements();
1951 int len=as->length();
1953 for(int i=0;i<len;i++)
1956 DEBTRACE("refcount CORBA as[i]: " << ((omni::TypeCode_base*)as[i].pd_tc.in())->pd_ref_count);
1958 TOUT ro=YacsConvertor<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>(t->contentType(),&as[i],0);
1963 for(int i=0;i<len;i++)
1966 DEBTRACE("refcount CORBA as[i]: " << ((omni::TypeCode_base*)as[i].pd_tc.in())->pd_ref_count);
1971 template <ImplType IMPLOUT, class TOUT>
1972 struct convertToYacsStruct<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>
1974 static inline void convert(const TypeCode *t,CORBA::Any* o,void*,std::map<std::string,TOUT>& m)
1976 CORBA::TypeCode_var tc=o->type();
1977 DEBTRACE(tc->kind());
1978 if (tc->kind() != CORBA::tk_struct)
1981 msg << "Not a struct corba type " << tc->kind();
1982 msg << " : " << __FILE__ << ":" << __LINE__;
1983 throw YACS::ENGINE::ConversionException(msg.str());
1985 YACS::ENGINE::TypeCodeStruct* tst=(YACS::ENGINE::TypeCodeStruct*)t;
1986 DynamicAny::DynAny_ptr dynany=getSALOMERuntime()->getDynFactory()->create_dyn_any(*o);
1987 DynamicAny::DynStruct_ptr ds=DynamicAny::DynStruct::_narrow(dynany);
1988 CORBA::release(dynany);
1989 DynamicAny::NameValuePairSeq_var as=ds->get_members();
1990 int len=as->length();
1991 for(int i=0;i<len;i++)
1993 std::string name=as[i].id.in();
1995 CORBA::Any value=as[i].value;
1997 DEBTRACE("refcount CORBA value: " << ((omni::TypeCode_base*)value.pd_tc.in())->pd_ref_count);
1999 TOUT ro=YacsConvertor<CORBAImpl,CORBA::Any*,void*,IMPLOUT,TOUT>(tst->memberType(i),&value,0);
2006 /* End of ToYacs Convertor for CORBAImpl */
2008 //! FromYacs Convertor for CORBAImpl
2010 * Convert YACS<CORBA::Any*> intermediate types to CORBA::Any* types (CORBAImpl)
2013 struct convertFromYacsDouble<CORBAImpl,CORBA::Any*>
2015 static inline CORBA::Any* convert(const TypeCode *t,double o)
2017 CORBA::Any *any = new CORBA::Any();
2018 *any <<= (CORBA::Double)o;
2023 struct convertFromYacsInt<CORBAImpl,CORBA::Any*>
2025 static inline CORBA::Any* convert(const TypeCode *t,long o)
2027 CORBA::Any *any = new CORBA::Any();
2028 *any <<= (CORBA::Long)o;
2033 struct convertFromYacsString<CORBAImpl,CORBA::Any*>
2035 static inline CORBA::Any* convert(const TypeCode *t,std::string& o)
2037 CORBA::Any *any = new CORBA::Any();
2043 struct convertFromYacsBool<CORBAImpl,CORBA::Any*>
2045 static inline CORBA::Any* convert(const TypeCode *t,bool o)
2047 CORBA::Any *any = new CORBA::Any();
2048 *any <<= CORBA::Any::from_boolean(o);
2053 struct convertFromYacsObjref<CORBAImpl,CORBA::Any*>
2055 static inline CORBA::Any* convert(const TypeCode *t,std::string& o)
2057 CORBA::Object_var obref;
2059 if(t->isA(Runtime::_tc_file))
2061 //It's an objref file. Convert it specially
2062 Salome_file_i* aSalome_file = new Salome_file_i();
2065 aSalome_file->setLocalFile(o.c_str());
2066 obref = aSalome_file->_this();
2067 aSalome_file->_remove_ref();
2069 catch (const SALOME::SALOME_Exception& e)
2072 msg << e.details.text;
2073 msg << " : " << __FILE__ << ":" << __LINE__;
2074 throw YACS::ENGINE::ConversionException(msg.str());
2077 else if(strncmp(t->id(),"python",6)==0 )
2079 CORBA::Any *any = new CORBA::Any();
2080 Engines::fileBlock * buffer=new Engines::fileBlock();
2081 buffer->length(o.length());
2082 CORBA::Octet *buf=buffer->get_buffer();
2083 memcpy(buf,o.c_str(),o.length());
2087 else if(strncmp(t->id(),"json",4)==0)
2089 CORBA::Any *any = new CORBA::Any();
2097 obref=getSALOMERuntime()->getFromNS(o.c_str());
2099 catch(CORBA::Exception& ex)
2101 throw ConversionException("Can't get reference to object");
2103 if( CORBA::is_nil(obref) )
2105 throw ConversionException("Can't get reference to object");
2109 DEBTRACE("ObjRef refCount: " << obref->_PR_getobj()->pd_refCount);
2111 CORBA::Any *any = new CORBA::Any();
2114 DEBTRACE("ObjRef refCount: " << obref->_PR_getobj()->pd_refCount);
2121 struct convertFromYacsSequence<CORBAImpl,CORBA::Any*>
2123 static inline CORBA::Any* convert(const TypeCode *t,std::vector<CORBA::Any*>& v)
2125 CORBA::ORB_ptr orb=getSALOMERuntime()->getOrb();
2126 std::vector<CORBA::Any*>::const_iterator iter;
2128 // Build an Any from vector v
2130 if(t->contentType()->kind() == Objref)
2133 CORBA::TypeCode_var tc=getCorbaTC(t);
2135 DynamicAny::DynAny_var dynany=getSALOMERuntime()->getDynFactory()->create_dyn_any_from_type_code(tc);
2136 DynamicAny::DynSequence_var ds = DynamicAny::DynSequence::_narrow(dynany);
2137 ds->set_length(v.size());
2139 for(iter=v.begin();iter!=v.end();iter++)
2141 DynamicAny::DynAny_var temp=ds->current_component();
2142 CORBA::Any* a=*iter;
2143 //It seems that from_any does not support inherited objref: convert to CORBA::Object and insert reference
2146 CORBA::Object_var zzobj ;
2147 *a >>= CORBA::Any::to_object(zzobj) ;
2148 temp->insert_reference(zzobj);
2153 //delete intermediate any
2158 CORBA::Any *any=ds->to_any();
2164 struct convertFromYacsStruct<CORBAImpl,CORBA::Any*>
2166 static inline CORBA::Any* convert(const TypeCode *t,std::map<std::string,CORBA::Any*>& m)
2168 CORBA::ORB_ptr orb=getSALOMERuntime()->getOrb();
2170 YACS::ENGINE::TypeCodeStruct* tst=(YACS::ENGINE::TypeCodeStruct*)t;
2171 int nMember=tst->memberCount();
2172 DEBTRACE("nMember="<<nMember);
2174 CORBA::TypeCode_var tc=getCorbaTC(t);
2175 DynamicAny::DynAny_var dynany=getSALOMERuntime()->getDynFactory()->create_dyn_any_from_type_code(tc);
2176 DynamicAny::DynStruct_var ds = DynamicAny::DynStruct::_narrow(dynany);
2178 for(int i=0;i<nMember;i++)
2180 DynamicAny::DynAny_var temp=ds->current_component();
2181 const char * name=tst->memberName(i);
2182 DEBTRACE("Member name="<<name);
2183 //do not test member presence : test has been done in ToYacs convertor
2184 CORBA::Any* a=m[name];
2185 //It seems that from_any does not support inherited objref: convert to CORBA::Object and insert reference
2186 CORBA::TypeCode_var atc = tc->member_type(i);
2187 if(atc->kind()==CORBA::tk_objref)
2189 //special treatment for objref
2190 CORBA::Object_var zzobj ;
2191 *a >>= CORBA::Any::to_object(zzobj) ;
2192 temp->insert_reference(zzobj);
2198 //delete intermediate any
2202 CORBA::Any *any=ds->to_any();
2208 /* End of FromYacs Convertor for CORBAImpl */
2210 /* Some shortcuts for CORBA to CORBA conversion */
2212 inline CORBA::Any* convertDouble<CORBAImpl,CORBA::Any*,void*,CORBAImpl,CORBA::Any*>(const TypeCode *t,CORBA::Any* o,void* aux)
2214 CORBA::TypeCode_var tc = o->type();
2215 if (tc->equivalent(CORBA::_tc_double))
2219 if (tc->equivalent(CORBA::_tc_long))
2223 CORBA::Any *any = new CORBA::Any();
2224 *any <<= (CORBA::Double)d;
2228 msg << "Not a double or long corba type " << tc->kind();
2229 msg << " : " << __FILE__ << ":" << __LINE__;
2230 throw YACS::ENGINE::ConversionException(msg.str());
2233 inline CORBA::Any* convertInt<CORBAImpl,CORBA::Any*,void*,CORBAImpl,CORBA::Any*>(const TypeCode *t,CORBA::Any* o,void* aux)
2238 inline CORBA::Any* convertString<CORBAImpl,CORBA::Any*,void*,CORBAImpl,CORBA::Any*>(const TypeCode *t,CORBA::Any* o,void* aux)
2243 inline CORBA::Any* convertBool<CORBAImpl,CORBA::Any*,void*,CORBAImpl,CORBA::Any*>(const TypeCode *t,CORBA::Any* o,void* aux)
2248 inline CORBA::Any* convertObjref<CORBAImpl,CORBA::Any*,void*,CORBAImpl,CORBA::Any*>(const TypeCode *t,CORBA::Any* o,void* aux)
2253 inline CORBA::Any* convertStruct<CORBAImpl,CORBA::Any*,void*,CORBAImpl,CORBA::Any*>(const TypeCode *t,CORBA::Any* o,void* aux)
2257 /* End of shortcuts for CORBA to CORBA conversion */
2259 //! ToYacs Convertor for CPPImpl
2261 * This convertor converts Python object to YACS<TOUT> types
2262 * Partial specialization for Python implementation with type PyObject* (PYTHONImpl)
2264 template <ImplType IMPLOUT, class TOUT>
2265 struct convertToYacsDouble<CPPImpl,void*,const TypeCode*,IMPLOUT,TOUT>
2267 static inline double convert(const TypeCode *t,void* o,const TypeCode* intype)
2269 if(intype->kind()==YACS::ENGINE::Double)
2273 else if(intype->kind()==YACS::ENGINE::Int)
2278 msg << "Problem in Cpp to TOUT conversion: kind= " << t->kind() ;
2279 msg << " : " << __FILE__ << ":" << __LINE__;
2280 throw YACS::ENGINE::ConversionException(msg.str());
2283 template <ImplType IMPLOUT, class TOUT>
2284 struct convertToYacsInt<CPPImpl,void*,const TypeCode*,IMPLOUT,TOUT>
2286 static inline long convert(const TypeCode *t,void* o,const TypeCode* intype)
2288 if(intype->kind()==YACS::ENGINE::Int)
2293 msg << "Problem in Cpp to TOUT conversion: kind= " << t->kind() ;
2294 msg << " : " << __FILE__ << ":" << __LINE__;
2295 throw YACS::ENGINE::ConversionException(msg.str());
2298 /* End of ToYacs Convertor for CPPImpl */
2300 //Python conversions
2301 std::string convertPyObjectXml(const TypeCode *t,PyObject *data)
2303 return YacsConvertor<PYTHONImpl,PyObject*,void*,XMLImpl,std::string>(t,data,0);
2305 YACS::ENGINE::Any* convertPyObjectNeutral(const TypeCode *t,PyObject *data)
2307 return YacsConvertor<PYTHONImpl,PyObject*,void*,NEUTRALImpl,YACS::ENGINE::Any*>(t,data,0);
2309 CORBA::Any* convertPyObjectCorba(const TypeCode *t,PyObject *data)
2311 return YacsConvertor<PYTHONImpl,PyObject*,void*,CORBAImpl,CORBA::Any*>(t,data,0);
2313 PyObject* convertPyObjectPyObject(const TypeCode *t,PyObject *data)
2315 return YacsConvertor<PYTHONImpl,PyObject*,void*,PYTHONImpl,PyObject*>(t,data,0);
2318 std::string convertPyObjectToString(PyObject* ob)
2321 PyGILState_STATE gstate = PyGILState_Ensure();
2322 // TODO: separate treatment for string (maybe with bad encoding?) and other types of PyObject ?
2323 // Do we need str() or repr() and what are the possible causes of failure of str() ?
2324 // not clear, needs more analysis.
2326 if (s == NULL) // for instance string with bad encoding, non utf-8
2328 s=PyObject_ASCII(ob); // escape non ASCII characters and like repr(), which is not the same as str()...
2331 const char* characters = PyUnicode_AsUTF8AndSize(s, &size);
2332 std::string ss( characters, size);
2334 PyGILState_Release(gstate);
2339 PyObject* convertXmlPyObject(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur)
2341 return YacsConvertor<XMLImpl,xmlDocPtr,xmlNodePtr,PYTHONImpl,PyObject*>(t,doc,cur);
2343 YACS::ENGINE::Any* convertXmlNeutral(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur)
2345 return YacsConvertor<XMLImpl,xmlDocPtr,xmlNodePtr,NEUTRALImpl,YACS::ENGINE::Any*>(t,doc,cur);
2347 CORBA::Any* convertXmlCorba(const TypeCode *t,xmlDocPtr doc,xmlNodePtr cur)
2349 return YacsConvertor<XMLImpl,xmlDocPtr,xmlNodePtr,CORBAImpl,CORBA::Any*>(t,doc,cur);
2351 PyObject* convertXmlStrPyObject(const TypeCode *t,std::string data)
2356 doc = xmlParseMemory(data.c_str(), strlen(data.c_str()));
2359 std::stringstream msg;
2360 msg << "Problem in conversion: XML Document not parsed successfully ";
2361 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
2362 throw YACS::ENGINE::ConversionException(msg.str());
2364 cur = xmlDocGetRootElement(doc);
2368 std::stringstream msg;
2369 msg << "Problem in conversion: empty XML Document";
2370 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
2371 throw YACS::ENGINE::ConversionException(msg.str());
2375 if ((!xmlStrcmp(cur->name, (const xmlChar *)"value")))
2377 ob=convertXmlPyObject(t,doc,cur);
2385 std::stringstream msg;
2386 msg << "Problem in conversion: incorrect XML value";
2387 msg << " (" << __FILE__ << ":" << __LINE__ << ")";
2388 throw YACS::ENGINE::ConversionException(msg.str());
2392 //NEUTRAL conversions
2393 PyObject* convertNeutralPyObject(const TypeCode *t,YACS::ENGINE::Any* data)
2395 return YacsConvertor<NEUTRALImpl,YACS::ENGINE::Any*,void*,PYTHONImpl,PyObject*>(t,data,0);
2397 std::string convertNeutralXml(const TypeCode *t,YACS::ENGINE::Any* data)
2399 return YacsConvertor<NEUTRALImpl,YACS::ENGINE::Any*,void*,XMLImpl,std::string>(t,data,0);
2401 CORBA::Any* convertNeutralCorba(const TypeCode *t,YACS::ENGINE::Any* data)
2403 return YacsConvertor<NEUTRALImpl,YACS::ENGINE::Any*,void*,CORBAImpl,CORBA::Any*>(t,data,0);
2405 YACS::ENGINE::Any *convertNeutralNeutral(const TypeCode *t, YACS::ENGINE::Any* data)
2412 PyObject* convertCorbaPyObject(const TypeCode *t,CORBA::Any* data)
2414 return YacsConvertor<CORBAImpl,CORBA::Any*,void*,PYTHONImpl,PyObject*>(t,data,0);
2416 std::string convertCorbaXml(const TypeCode *t,CORBA::Any* data)
2418 return YacsConvertor<CORBAImpl,CORBA::Any*,void*,XMLImpl,std::string>(t,data,0);
2420 YACS::ENGINE::Any* convertCorbaNeutral(const TypeCode *t,CORBA::Any* data)
2422 return YacsConvertor<CORBAImpl,CORBA::Any*,void*,NEUTRALImpl,YACS::ENGINE::Any*>(t,data,0);
2424 CORBA::Any *convertCorbaCorba(const TypeCode *t,CORBA::Any *data)
2426 return YacsConvertor<CORBAImpl,CORBA::Any*,void*,CORBAImpl,CORBA::Any*>(t,data,0);
2429 //! Basic template checker from type TIN
2431 * This checker does nothing : throws exception
2432 * It must be partially specialize for a specific type (TIN)
2434 template <ImplType IMPLIN,class TIN,class TIN2>
2435 static inline bool checkDouble(const TypeCode *t,TIN o,TIN2 aux)
2438 msg << "Check not implemented for Implementation: " << IMPLIN ;
2439 msg << " : " << __FILE__ << ":" << __LINE__;
2440 throw YACS::ENGINE::ConversionException(msg.str());
2442 template <ImplType IMPLIN,class TIN,class TIN2>
2443 static inline bool checkInt(const TypeCode *t,TIN o,TIN2 aux)
2446 msg << "Check not implemented for Implementation: " << IMPLIN ;
2447 msg << " : " << __FILE__ << ":" << __LINE__;
2448 throw YACS::ENGINE::ConversionException(msg.str());
2450 template <ImplType IMPLIN,class TIN,class TIN2>
2451 static inline bool checkBool(const TypeCode *t,TIN o,TIN2 aux)
2454 msg << "Check not implemented for Implementation: " << IMPLIN ;
2455 msg << " : " << __FILE__ << ":" << __LINE__;
2456 throw YACS::ENGINE::ConversionException(msg.str());
2458 template <ImplType IMPLIN,class TIN,class TIN2>
2459 static inline bool checkString(const TypeCode *t,TIN o,TIN2 aux)
2462 msg << "Check not implemented for Implementation: " << IMPLIN ;
2463 msg << " : " << __FILE__ << ":" << __LINE__;
2464 throw YACS::ENGINE::ConversionException(msg.str());
2466 template <ImplType IMPLIN,class TIN,class TIN2>
2467 static inline bool checkObjref(const TypeCode *t,TIN o,TIN2 aux)
2470 msg << "Check not implemented for Implementation: " << IMPLIN ;
2471 msg << " : " << __FILE__ << ":" << __LINE__;
2472 throw YACS::ENGINE::ConversionException(msg.str());
2474 template <ImplType IMPLIN,class TIN,class TIN2>
2475 static inline bool checkSequence(const TypeCode *t,TIN o,TIN2 aux)
2478 msg << "Check not implemented for Implementation: " << IMPLIN ;
2479 msg << " : " << __FILE__ << ":" << __LINE__;
2480 throw YACS::ENGINE::ConversionException(msg.str());
2482 template <ImplType IMPLIN,class TIN,class TIN2>
2483 static inline bool checkStruct(const TypeCode *t,TIN o,TIN2 aux)
2486 msg << "Check not implemented for Implementation: " << IMPLIN ;
2487 msg << " : " << __FILE__ << ":" << __LINE__;
2488 throw YACS::ENGINE::ConversionException(msg.str());
2490 template <ImplType IMPLIN,class TIN,class TIN2>
2491 static inline bool checkArray(const TypeCode *t,TIN o,TIN2 aux)
2494 msg << "Check not implemented for Implementation: " << IMPLIN ;
2495 msg << " : " << __FILE__ << ":" << __LINE__;
2496 throw YACS::ENGINE::ConversionException(msg.str());
2499 template <ImplType IMPLIN,class TIN,class TIN2>
2500 inline bool YacsChecker(const TypeCode *t,TIN o,TIN2 aux)
2506 return checkDouble<IMPLIN,TIN,TIN2>(t,o,aux);
2508 return checkInt<IMPLIN,TIN,TIN2>(t,o,aux);
2510 return checkString<IMPLIN,TIN,TIN2>(t,o,aux);
2512 return checkBool<IMPLIN,TIN,TIN2>(t,o,aux);
2514 return checkObjref<IMPLIN,TIN,TIN2>(t,o,aux);
2516 return checkSequence<IMPLIN,TIN,TIN2>(t,o,aux);
2518 return checkArray<IMPLIN,TIN,TIN2>(t,o,aux);
2520 return checkStruct<IMPLIN,TIN,TIN2>(t,o,aux);
2525 msg << "Check not implemented for kind= " << tk ;
2526 msg << " : " << __FILE__ << ":" << __LINE__;
2527 throw YACS::ENGINE::ConversionException(msg.str());
2530 inline bool checkDouble<PYTHONImpl,PyObject*,void*>(const TypeCode *t,PyObject* o,void* aux)
2532 if (PyFloat_Check(o))
2534 else if(PyLong_Check(o))
2539 msg << "Not a python double ";
2540 throw YACS::ENGINE::ConversionException(msg.str());
2544 inline bool checkInt<PYTHONImpl,PyObject*,void*>(const TypeCode *t,PyObject* o,void* aux)
2546 if (PyLong_Check(o))
2551 msg << "Not a python integer ";
2552 throw YACS::ENGINE::ConversionException(msg.str());
2556 inline bool checkBool<PYTHONImpl,PyObject*,void*>(const TypeCode *t,PyObject* o,void* aux)
2558 if (PyBool_Check(o))
2560 else if(PyLong_Check(o))
2565 msg << "Not a python boolean " ;
2566 throw YACS::ENGINE::ConversionException(msg.str());
2571 inline bool checkString<PYTHONImpl,PyObject*,void*>(const TypeCode *t,PyObject* o,void* aux)
2573 if (PyUnicode_Check(o))
2578 msg << "Not a python string " ;
2579 throw YACS::ENGINE::ConversionException(msg.str());
2583 inline bool checkObjref<PYTHONImpl,PyObject*,void*>(const TypeCode *t,PyObject* o,void* aux)
2585 if (PyUnicode_Check(o))
2587 if(strncmp(t->id(),"python",6)==0) // a Python object is expected (it's always true)
2589 else if(strncmp(t->id(),"json",4)==0) // The python object must be json pickable
2591 // The python object should be json compliant (to improve)
2596 // The python object should be a CORBA obj (to improve)
2601 inline bool checkSequence<PYTHONImpl,PyObject*,void*>(const TypeCode *t,PyObject* o,void* aux)
2603 if(!PySequence_Check(o))
2606 msg << "python object is not a sequence " ;
2607 throw YACS::ENGINE::ConversionException(msg.str());
2609 int length=PySequence_Size(o);
2610 for(int i=0;i<length;i++)
2612 PyObject *item=PySequence_ITEM(o,i);
2615 YacsChecker<PYTHONImpl,PyObject*,void*>(t->contentType(),item,0);
2617 catch(ConversionException& ex)
2620 msg << ex.what() << " for sequence element " << i;
2621 throw YACS::ENGINE::ConversionException(msg.str(),false);
2628 inline bool checkStruct<PYTHONImpl,PyObject*,void*>(const TypeCode *t,PyObject* o,void* aux)
2631 if(!PyDict_Check(o))
2634 msg << "python object is not a dict " ;
2635 throw YACS::ENGINE::ConversionException(msg.str());
2637 YACS::ENGINE::TypeCodeStruct* tst=(YACS::ENGINE::TypeCodeStruct*)t;
2638 int nMember=tst->memberCount();
2639 for(int i=0;i<nMember;i++)
2641 std::string name=tst->memberName(i);
2642 TypeCode* tm=tst->memberType(i);
2643 value=PyDict_GetItemString(o, name.c_str());
2647 msg << "member " << name << " not present " ;
2648 throw YACS::ENGINE::ConversionException(msg.str());
2652 YacsChecker<PYTHONImpl,PyObject*,void*>(tm,value,0);
2654 catch(ConversionException& ex)
2656 std::string s=" for struct member "+name;
2657 throw YACS::ENGINE::ConversionException(ex.what()+s,false);
2663 bool checkPyObject(const TypeCode *t,PyObject* ob)
2665 return YacsChecker<PYTHONImpl,PyObject*,void*>(t,ob,0);