X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOMESDS%2FSALOMESDS_PickelizedPyObjServer.cxx;h=fba4c6b83ecb8a0f2fb73b5d0916b2271c20267f;hb=e43e8bd5d6ca0572b00f86cefdb63b0563e92ec8;hp=baba4b55dada2a18f7d72449e0e7da638e2f7cfd;hpb=7e6982e9ccf83f3ede551d990d5a80807dcf1a87;p=modules%2Fkernel.git diff --git a/src/SALOMESDS/SALOMESDS_PickelizedPyObjServer.cxx b/src/SALOMESDS/SALOMESDS_PickelizedPyObjServer.cxx index baba4b55d..fba4c6b83 100644 --- a/src/SALOMESDS/SALOMESDS_PickelizedPyObjServer.cxx +++ b/src/SALOMESDS/SALOMESDS_PickelizedPyObjServer.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -27,13 +27,13 @@ using namespace SALOMESDS; -PickelizedPyObjServer::PickelizedPyObjServer(DataScopeServer *father, const std::string& varName, const SALOME::ByteVec& value):BasicDataServer(father,varName),_self(0) +PickelizedPyObjServer::PickelizedPyObjServer(DataScopeServerBase *father, const std::string& varName, const SALOME::ByteVec& value):BasicDataServer(father,varName),_self(0) { setSerializedContentInternal(value); } //! obj is consumed -PickelizedPyObjServer::PickelizedPyObjServer(DataScopeServer *father, const std::string& varName, PyObject *obj):BasicDataServer(father,varName),_self(0) +PickelizedPyObjServer::PickelizedPyObjServer(DataScopeServerBase *father, const std::string& varName, PyObject *obj):BasicDataServer(father,varName),_self(0) { setNewPyObj(obj); } @@ -52,35 +52,92 @@ SALOME::ByteVec *PickelizedPyObjServer::fetchSerializedContent() return FromCppToByteSeq(pickelize(_self)); } +bool PickelizedPyObjServer::isDict() +{ + if(PyDict_Check(_self)) + return true; + else + return false; +} + +void PickelizedPyObjServer::checkKeyNotAlreadyPresent(PyObject *key) +{ + checkKeyPresence(key,false); +} + +void PickelizedPyObjServer::checkKeyPresent(PyObject *key) +{ + checkKeyPresence(key,true); +} + +void PickelizedPyObjServer::addKeyValueHard(PyObject * /*key*/, PyObject * /*value*/) +{ + std::ostringstream oss; oss << "PickelizedPyObjServer::addKeyValueHard : var \"" << getVarNameCpp() << "\" is not permitted to alter its value !"; + throw Exception(oss.str()); +} + +void PickelizedPyObjServer::removeKeyInVarErrorIfNotAlreadyExisting(PyObject * /*key*/) +{ + std::ostringstream oss; oss << "PickelizedPyObjServer::removeKeyInVarErrorIfNotAlreadyExisting : var \"" << getVarNameCpp() << "\" is not permitted to alter its value !"; + throw Exception(oss.str()); +} + void PickelizedPyObjServer::FromByteSeqToCpp(const SALOME::ByteVec& bsToBeConv, std::string& ret) { std::size_t sz(bsToBeConv.length()); ret.resize(sz,' '); char *buf(const_cast(ret.c_str())); for(std::size_t i=0;ilength(sz); + ret.length((CORBA::ULong)sz); //!< TODO: size_t to CORBA::ULong for(std::size_t i=0;igetPickler(),"loads")); + PyObject *selfMeth(PyObject_GetAttrString(dsb->getPickler(),"loads")); + PyObject *args(PyTuple_New(1)); PyTuple_SetItem(args,0,pickledDataPy); + PyObject *ret(PyObject_CallObject(selfMeth,args)); + Py_XDECREF(args); + Py_XDECREF(selfMeth); + return ret; +} + +//! New reference returned +PyObject *PickelizedPyObjServer::getPyObjFromPickled(const std::string& pickledData) +{ + return GetPyObjFromPickled(pickledData,_father); +} + +//! New reference returned +PyObject *PickelizedPyObjServer::GetPyObjFromPickled(const std::vector& pickledData, DataScopeServerBase *dsb) +{ + std::size_t sz(pickledData.size()); + PyObject *pickledDataPy(PyBytes_FromStringAndSize(NULL,sz));// agy : do not use PyUnicode_FromString because std::string hides a vector of byte. + char *buf(PyBytes_AS_STRING(pickledDataPy));// this buf can be used thanks to python documentation. + const unsigned char *inBuf(pickledData.data()); + std::copy(inBuf,inBuf+sz,buf); + PyObject *selfMeth(PyObject_GetAttrString(dsb->getPickler(),"loads")); PyObject *args(PyTuple_New(1)); PyTuple_SetItem(args,0,pickledDataPy); PyObject *ret(PyObject_CallObject(selfMeth,args)); Py_XDECREF(args); @@ -88,19 +145,25 @@ PyObject *PickelizedPyObjServer::getPyObjFromPickled(const std::string& pickledD return ret; } +//! New reference returned +PyObject *PickelizedPyObjServer::getPyObjFromPickled(const std::vector& pickledData) +{ + return GetPyObjFromPickled(pickledData,_father); +} + //! obj is consumed by this method. -std::string PickelizedPyObjServer::pickelize(PyObject *obj) +std::string PickelizedPyObjServer::Pickelize(PyObject *obj, DataScopeServerBase *dsb) { PyObject *args(PyTuple_New(2)); PyTuple_SetItem(args,0,obj); - PyTuple_SetItem(args,1,PyInt_FromLong(2));// because "assert(cPickle.HIGHEST_PROTOCOL is 2)" - PyObject *selfMeth(PyObject_GetAttrString(_father->getPickler(),"dumps")); + PyTuple_SetItem(args,1,PyLong_FromLong(3));// because "assert(pickle.HIGHEST_PROTOCOL is 3)" + PyObject *selfMeth(PyObject_GetAttrString(dsb->getPickler(),"dumps")); PyObject *retPy(PyObject_CallObject(selfMeth,args)); Py_XDECREF(selfMeth); Py_XDECREF(args); - std::size_t sz(PyString_Size(retPy)); + std::size_t sz(PyBytes_Size(retPy)); std::string ret(sz,'\0'); - const char *buf(PyString_AsString(retPy)); + const char *buf(PyBytes_AS_STRING(retPy)); char *inBuf(const_cast(ret.c_str())); for(std::size_t i=0;i