1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
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
19 // Author : Anthony GEAY (EDF R&D)
21 #include "SALOMESDS_PickelizedPyObjRdExtServer.hxx"
22 #include "SALOMESDS_DataScopeServer.hxx"
23 #include "SALOMESDS_Exception.hxx"
28 using namespace SALOMESDS;
30 PickelizedPyObjRdExtServer::PickelizedPyObjRdExtServer(DataScopeServer *father, const std::string& varName, const SALOME::ByteVec& value):PickelizedPyObjServer(father,varName,value)
35 PickelizedPyObjRdExtServer::PickelizedPyObjRdExtServer(DataScopeServer *father, const std::string& varName, PyObject *obj):PickelizedPyObjServer(father,varName,obj)
39 PickelizedPyObjRdExtServer::~PickelizedPyObjRdExtServer()
44 * Called remotely -> to protect against throw
46 SALOME::PickelizedPyObjRdExtServer_ptr PickelizedPyObjRdExtServer::invokePythonMethodOn(const char *method, const SALOME::ByteVec& args)
49 throw Exception("PickelizedPyObjRdExtServer::invokePythonMethodOn : self is NULL !");
51 FromByteSeqToCpp(args,argsCpp);
52 PyObject *argsPy(getPyObjFromPickled(argsCpp));
53 checkRdExtnessOf(method,argsPy);
55 PyObject *selfMeth(PyObject_GetAttrString(_self,method));
58 std::ostringstream oss; oss << "PickelizedPyObjRdExtServer::invokePythonMethodOn : Method \"" << method << "\" is not available !";
59 throw Exception(oss.str());
61 PyObject *res(PyObject_CallObject(selfMeth,argsPy));// self can have been modified by this call !
66 std::ostringstream oss; oss << "PickelizedPyObjRdExtServer::invokePythonMethodOn : Problem during invokation serverside of Method \"" << method << "\" !";
67 throw Exception(oss.str());
69 PickelizedPyObjRdExtServer *ret(new PickelizedPyObjRdExtServer(_father,DataScopeServer::BuildTmpVarNameFrom(getVarNameCpp()),res));
70 PortableServer::POA_var poa(_father->getPOA());
71 PortableServer::ObjectId_var id(poa->activate_object(ret));
72 CORBA::Object_var obj(poa->id_to_reference(id));
73 return SALOME::PickelizedPyObjRdExtServer::_narrow(obj);
76 void PickelizedPyObjRdExtServer::checkRdExtnessOf(const std::string& methodName, PyObject *argsPy)
81 throw Exception("PickelizedPyObjRdExtServer::checkRdExtnessOf : self is NULL !");
83 if(PyTuple_Check(_self)==1 || PyString_Check(_self)==1 || PyInt_Check(_self)==1 || PyBool_Check(_self)==1 || PyFloat_Check(_self)==1)
84 return ;//_self is tuple, str, int or float -> immutable in python. So no method can break the RdExtness of _self.
85 if(PyList_Check(_self)==1)
86 checkListRdExtnessOf(methodName,argsPy);
87 else if(PyDict_Check(_self)==1)
88 checkDictRdExtnessOf(methodName,argsPy);
90 throw Exception("PickelizedPyObjRdExtServer::checkRdExtnessOf : Supported python types are [list,tuple,dict,str,int,float] !");
93 void PickelizedPyObjRdExtServer::checkListRdExtnessOf(const std::string& methodName, PyObject *argsPy)
95 static const char *THE_RDEXT_METH_OF_LIST[]={"__getitem__","append","extend","insert","reverse","sort"};
96 for(std::size_t i=0;i<sizeof(THE_RDEXT_METH_OF_LIST)/sizeof(const char *);i++)
97 if(methodName==THE_RDEXT_METH_OF_LIST[i])
100 std::ostringstream oss; oss << "PickelizedPyObjRdExtServer::checkListRdExtnessOf : The method \"" << methodName << "\" is a method that can lead to a loss of data ! Supported method of \"list \"without loss of data are : __getitem__, append, extend, insert, reverse, sort !";
101 throw Exception(oss.str());
104 void PickelizedPyObjRdExtServer::checkDictRdExtnessOf(const std::string& methodName, PyObject *argsPy)
106 static const char *THE_RDEXT_METH_OF_DICT[]={"__getitem__","get","items","keys","setdefault","update","values"};
107 for(std::size_t i=0;i<sizeof(THE_RDEXT_METH_OF_DICT)/sizeof(const char *);i++)
108 if(methodName==THE_RDEXT_METH_OF_DICT[i])
110 if(methodName=="__setitem__")
112 checkDictSetitemRdExtness(argsPy);
116 std::ostringstream oss; oss << "PickelizedPyObjRdExtServer::checkDictRdExtnessOf : The method \"" << methodName << "\" is a method that can lead to a loss of data ! Supported method of \"list \"without loss of data are : __getitem__, __setitem__(with conditions), get, items, keys, setdefault, update, values !";
117 throw Exception(oss.str());
120 void PickelizedPyObjRdExtServer::checkDictSetitemRdExtness(PyObject *argsPy)
122 if(PyTuple_Check(argsPy)==0)
125 throw Exception("PickelizedPyObjRdExtServer::checkDictSetitemRdExtness : args of dic(self).__setitem__ is not a tuple !");
127 if(PyTuple_Size(argsPy)!=2)
130 throw Exception("PickelizedPyObjRdExtServer::checkDictSetitemRdExtness : tuple of dic(self).__setitem__ has not a size equal to 2 !");
132 if(PyDict_GetItem(_self,PyTuple_GetItem(argsPy,0))!=0)
133 {// argsPy[0] is already a key of _self -> __setitem__ is NOT RdExt !
135 throw Exception("PickelizedPyObjRdExtServer::checkDictSetitemRdExtness : specified key of __setitem__ already exists ! RdExt property is not applied !");