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 const char PickelizedPyObjRdExtServer::ACCESS_REPR[]="RdExt";
32 PickelizedPyObjRdExtServer::PickelizedPyObjRdExtServer(DataScopeServerBase *father, const std::string& varName, const SALOME::ByteVec& value):PickelizedPyObjServerModifiable(father,varName,value)
37 PickelizedPyObjRdExtServer::PickelizedPyObjRdExtServer(DataScopeServerBase *father, const std::string& varName, PyObject *obj):PickelizedPyObjServerModifiable(father,varName,obj)
41 PickelizedPyObjRdExtServer::~PickelizedPyObjRdExtServer()
46 * Called remotely -> to protect against throw
48 SALOME::PickelizedPyObjRdExtServer_ptr PickelizedPyObjRdExtServer::invokePythonMethodOn(const char *method, const SALOME::ByteVec& args)
51 throw Exception("PickelizedPyObjRdExtServer::invokePythonMethodOn : self is NULL !");
53 FromByteSeqToCpp(args,argsCpp);
54 PyObject *argsPy(getPyObjFromPickled(argsCpp));
55 checkRdExtnessOf(method,argsPy);
57 PyObject *selfMeth(PyObject_GetAttrString(_self,method));
60 std::ostringstream oss; oss << "PickelizedPyObjRdExtServer::invokePythonMethodOn : Method \"" << method << "\" is not available !";
61 throw Exception(oss.str());
63 PyObject *res(PyObject_CallObject(selfMeth,argsPy));// self can have been modified by this call !
68 std::ostringstream oss; oss << "PickelizedPyObjRdExtServer::invokePythonMethodOn : Problem during invokation serverside of Method \"" << method << "\" !";
69 throw Exception(oss.str());
71 PickelizedPyObjRdExtServer *ret(new PickelizedPyObjRdExtServer(_father,DataScopeServer::BuildTmpVarNameFrom(getVarNameCpp()),res));
72 PortableServer::POA_var poa(_father->getPOA());
73 PortableServer::ObjectId_var id(poa->activate_object(ret));
74 CORBA::Object_var obj(poa->id_to_reference(id));
75 return SALOME::PickelizedPyObjRdExtServer::_narrow(obj);
78 void PickelizedPyObjRdExtServer::checkRdExtnessOf(const std::string& methodName, PyObject *argsPy)
83 throw Exception("PickelizedPyObjRdExtServer::checkRdExtnessOf : self is NULL !");
85 if(PyTuple_Check(_self)==1 || PyString_Check(_self)==1 || PyInt_Check(_self)==1 || PyBool_Check(_self)==1 || PyFloat_Check(_self)==1)
86 return ;//_self is tuple, str, int or float -> immutable in python. So no method can break the RdExtness of _self.
87 if(PyList_Check(_self)==1)
88 checkListRdExtnessOf(methodName,argsPy);
89 else if(PyDict_Check(_self)==1)
90 checkDictRdExtnessOf(methodName,argsPy);
92 throw Exception("PickelizedPyObjRdExtServer::checkRdExtnessOf : Supported python types are [list,tuple,dict,str,int,float] !");
95 void PickelizedPyObjRdExtServer::checkListRdExtnessOf(const std::string& methodName, PyObject *argsPy)
97 static const char *THE_RDEXT_METH_OF_LIST[]={"__getitem__","append","extend","insert","reverse","sort"};
98 for(std::size_t i=0;i<sizeof(THE_RDEXT_METH_OF_LIST)/sizeof(const char *);i++)
99 if(methodName==THE_RDEXT_METH_OF_LIST[i])
102 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 !";
103 throw Exception(oss.str());
106 void PickelizedPyObjRdExtServer::checkDictRdExtnessOf(const std::string& methodName, PyObject *argsPy)
108 static const char *THE_RDEXT_METH_OF_DICT[]={"__getitem__","get","items","keys","setdefault","update","values"};
109 for(std::size_t i=0;i<sizeof(THE_RDEXT_METH_OF_DICT)/sizeof(const char *);i++)
110 if(methodName==THE_RDEXT_METH_OF_DICT[i])
112 if(methodName=="__setitem__")
114 checkDictSetitemRdExtness(argsPy);
118 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 !";
119 throw Exception(oss.str());
122 void PickelizedPyObjRdExtServer::checkDictSetitemRdExtness(PyObject *argsPy)
124 if(PyTuple_Check(argsPy)==0)
127 throw Exception("PickelizedPyObjRdExtServer::checkDictSetitemRdExtness : args of dic(self).__setitem__ is not a tuple !");
129 if(PyTuple_Size(argsPy)!=2)
132 throw Exception("PickelizedPyObjRdExtServer::checkDictSetitemRdExtness : tuple of dic(self).__setitem__ has not a size equal to 2 !");
134 if(PyDict_GetItem(_self,PyTuple_GetItem(argsPy,0))!=0)
135 {// argsPy[0] is already a key of _self -> __setitem__ is NOT RdExt !
137 throw Exception("PickelizedPyObjRdExtServer::checkDictSetitemRdExtness : specified key of __setitem__ already exists ! RdExt property is not applied !");
141 std::string PickelizedPyObjRdExtServer::getAccessStr() const
143 return std::string(ACCESS_REPR);