-// Copyright (C) 2006-2019 CEA/DEN, EDF R&D
+// Copyright (C) 2006-2022 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include "TypeCode.hxx"
#include "Cstr2d.hxx"
#include "SALOME_GenericObj.hh"
+#include "PythonNode.hxx"
#include <iostream>
#include <iomanip>
{
namespace ENGINE
{
- void printbin(const std::string& bin)
- {
- register char c;
- for(int i=0;i<bin.length();i++)
- {
- c=bin[i];
- if (c < ' ' || c >= 0x7f)
- {
- fprintf(stderr,"\\x%02x",c & 0xff);
- }
- else
- fprintf(stderr,"%c",c);
- }
- fprintf(stderr,"\n");
- }
-
std::string getImplName(ImplType impl)
{
switch(impl)
inline TOUT convertObjref(const TypeCode *t,TIN o,TIN2 aux)
{
int protocol=-1;
- if(IMPLOUT==XMLImpl || IMPLOUT==NEUTRALImpl)
+ if(IMPLOUT==XMLImpl)
+ protocol=0;//to avoid presence of \0 into XML generated file
+ if(IMPLOUT==NEUTRALImpl)
protocol=4;
std::string d=convertToYacsObjref<IMPLIN,TIN,TIN2,IMPLOUT,TOUT>::convert(t,o,aux,protocol);
DEBTRACE( d );
if (PyUnicode_Check(o))
{
Py_ssize_t size;
- char *ptr = PyUnicode_AsUTF8AndSize(o, &size);
+ const char *ptr = PyUnicode_AsUTF8AndSize(o, &size);
if (!ptr)
throw YACS::ENGINE::ConversionException("Conversion from PyUnicode to string failed");
s.assign(ptr, size);
// the objref is used by Python as a string (prefix:value) keep it as a string
Py_ssize_t size;
std::string s;
- char *ptr = PyUnicode_AsUTF8AndSize(o, &size);
+ const char *ptr = PyUnicode_AsUTF8AndSize(o, &size);
if (!ptr)
throw YACS::ENGINE::ConversionException("Conversion from PyUnicode to string failed");
s.assign(ptr, size);
}
if(strncmp(t->id(),"python",6)==0)
{
+ bool somthingToDo = YACS::ENGINE::PythonEntry::GetDestroyStatus(o);
+ if( somthingToDo )
+ YACS::ENGINE::PythonEntry::DoNotTouchFileIfProxy(o);
// It's a native Python object pickle it
PyObject* mod=PyImport_ImportModule("pickle");
PyObject *pickled=PyObject_CallMethod(mod,(char *)"dumps",(char *)"Oi",o,protocol);
+ if( somthingToDo )
+ YACS::ENGINE::PythonEntry::UnlinkOnDestructorIfProxy(o);
DEBTRACE(PyObject_Repr(pickled) );
Py_DECREF(mod);
if(pickled==NULL)
}
Py_ssize_t size;
std::string mystr;
- char *ptr = PyUnicode_AsUTF8AndSize(pystring, &size);
+ const char *ptr = PyUnicode_AsUTF8AndSize(pystring, &size);
if (!ptr)
throw YACS::ENGINE::ConversionException("Conversion from PyUnicode to string failed");
mystr.assign(ptr, size);
{
DEBTRACE("############### workaround to improve...");
}
- return mystr;
+ if(strncmp(t->id(),"python",6)==0 )
+ return FromBase64Safe(mystr);
+ else
+ return mystr;
}
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
{
static inline std::string convert(const TypeCode *t,std::string& o)
{
if(strncmp(t->id(),"python",6)==0 )
- return "<value><objref><![CDATA[" + o + "]]></objref></value>\n";
+ return "<value><objref><![CDATA[" + ToBase64(o) + "]]></objref></value>\n";
else if(strncmp(t->id(),"json",4)==0)
return "<value><objref><![CDATA[" + o + "]]></objref></value>\n";
else
{
static inline std::string convert(const TypeCode *t,YACS::ENGINE::Any* o,void*,int protocol)
{
- if(o->getType()->kind()==String)
+ if(o->getType()->kind()==String || o->getType()->kind()==Objref)
return o->getStringValue();
stringstream msg;
msg << "Problem in conversion: a objref(string) is expected " ;
{
//Check if objref is a GenericObj and register it if it is the case (workaround for bad management of GenericObj)
if(o=="" || (t->isA(Runtime::_tc_file)) || (strncmp(t->id(),"python",6)==0) || (strncmp(t->id(),"json",4)==0))
- return YACS::ENGINE::AtomAny::New(o);
+ return YACS::ENGINE::AtomAny::New(o, const_cast<TypeCode *>(t));
//Objref CORBA. prefix=IOR,corbaname,corbaloc
CORBA::Object_var obref;
else
DEBTRACE("It's a CORBA::Object but not a SALOME::GenericObj");
- return YACS::ENGINE::AtomAny::New(o);
+ return YACS::ENGINE::AtomAny::New(o, const_cast<TypeCode *>(t));
}
};
s=PyObject_ASCII(ob); // escape non ASCII characters and like repr(), which is not the same as str()...
}
Py_ssize_t size;
- char* characters=PyUnicode_AsUTF8AndSize(s, &size);
+ const char* characters = PyUnicode_AsUTF8AndSize(s, &size);
std::string ss( characters, size);
Py_DECREF(s);
PyGILState_Release(gstate);