00001
00002
00003
00004
00005
00006 #include <boost/filesystem/path.hpp>
00007 #include <boost/filesystem/operations.hpp>
00008 #include <boost/filesystem/exception.hpp>
00009 #include <Base/PyObjectBase.h>
00010 #include <Base/Console.h>
00011 #include <Base/Exception.h>
00012 #include <CXX/Objects.hxx>
00013
00014 #define new DEBUG_CLIENTBLOCK
00015
00016 using Base::streq;
00017 using namespace Base;
00018
00020 PyTypeObject PersistencePy::Type = {
00021 PyObject_HEAD_INIT(&PyType_Type)
00022 0,
00023 "Base.Persistence",
00024 sizeof(PersistencePy),
00025 0,
00026
00027 PyDestructor,
00028 0,
00029 __getattr,
00030 __setattr,
00031 0,
00032 __repr,
00033 0,
00034 0,
00035 0,
00036 0,
00037 0,
00038 0,
00039 0,
00040 0,
00041
00042 0,
00043
00044 Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_CLASS,
00045 "This is a persistence class",
00046 0,
00047 0,
00048 0,
00049 0,
00050 0,
00051 0,
00052 Base::PersistencePy::Methods,
00053 0,
00054 Base::PersistencePy::GetterSetter,
00055 &Base::BaseClassPy::Type,
00056 0,
00057 0,
00058 0,
00059 0,
00060 __PyInit,
00061 0,
00062 Base::PersistencePy::PyMake,
00063 0,
00064 0,
00065 0,
00066 0,
00067 0,
00068 0,
00069 0,
00070 0
00071 };
00072
00074 PyMethodDef PersistencePy::Methods[] = {
00075 {NULL, NULL, 0, NULL}
00076 };
00077
00078
00079
00081 PyGetSetDef PersistencePy::GetterSetter[] = {
00082 {"Content",
00083 (getter) staticCallback_getContent,
00084 (setter) staticCallback_setContent,
00085 "Content of the object in XML representation",
00086 NULL
00087 },
00088 {"MemSize",
00089 (getter) staticCallback_getMemSize,
00090 (setter) staticCallback_setMemSize,
00091 "Memory size of the object in byte",
00092 NULL
00093 },
00094 {NULL, NULL, NULL, NULL, NULL}
00095 };
00096
00097
00098
00099
00100 PyObject * PersistencePy::staticCallback_getContent (PyObject *self, void * )
00101 {
00102 if (!((PyObjectBase*) self)->isValid()){
00103 PyErr_SetString(PyExc_ReferenceError, "This object is already deleted most likely through closing a document. This reference is no longer valid!");
00104 return NULL;
00105 }
00106
00107 try {
00108 return Py::new_reference_to(((PersistencePy*)self)->getContent());
00109 } catch (const Py::Exception&) {
00110
00111 return NULL;
00112 } catch (...) {
00113 PyErr_SetString(PyExc_Exception, "Unknown exception while reading attribute 'Content' of object 'Persistence'");
00114 return NULL;
00115 }
00116 }
00117
00118 int PersistencePy::staticCallback_setContent (PyObject *self, PyObject *value, void * )
00119 {
00120 if (!((PyObjectBase*) self)->isValid()){
00121 PyErr_SetString(PyExc_ReferenceError, "This object is already deleted most likely through closing a document. This reference is no longer valid!");
00122 return -1;
00123 }
00124 if (((PyObjectBase*) self)->isConst()){
00125 PyErr_SetString(PyExc_ReferenceError, "This object is immutable, you can not set any attribute or call a method");
00126 return -1;
00127 }
00128
00129 try {
00130 ((PersistencePy*)self)->setContent(Py::String(value,false));
00131 return 0;
00132 } catch (const Py::Exception&) {
00133
00134 return -1;
00135 } catch (...) {
00136 PyErr_SetString(PyExc_Exception, "Unknown exception while writing attribute 'Content' of object 'Persistence'");
00137 return -1;
00138 }
00139 }
00140
00141
00142
00143
00144 PyObject * PersistencePy::staticCallback_getMemSize (PyObject *self, void * )
00145 {
00146 if (!((PyObjectBase*) self)->isValid()){
00147 PyErr_SetString(PyExc_ReferenceError, "This object is already deleted most likely through closing a document. This reference is no longer valid!");
00148 return NULL;
00149 }
00150
00151 try {
00152 return Py::new_reference_to(((PersistencePy*)self)->getMemSize());
00153 } catch (const Py::Exception&) {
00154
00155 return NULL;
00156 } catch (...) {
00157 PyErr_SetString(PyExc_Exception, "Unknown exception while reading attribute 'MemSize' of object 'Persistence'");
00158 return NULL;
00159 }
00160 }
00161
00162 int PersistencePy::staticCallback_setMemSize (PyObject *self, PyObject * , void * )
00163 {
00164 if (!((PyObjectBase*) self)->isValid()){
00165 PyErr_SetString(PyExc_ReferenceError, "This object is already deleted most likely through closing a document. This reference is no longer valid!");
00166 return -1;
00167 }
00168
00169 PyErr_SetString(PyExc_AttributeError, "Attribute 'MemSize' of object 'Persistence' is read-only");
00170 return -1;
00171 }
00172
00173
00174
00175
00176
00177
00178 PyParentObject PersistencePy::Parents[] = { PARENTSBasePersistencePy };
00179
00180
00181
00182
00183 PersistencePy::PersistencePy(Persistence *pcObject, PyTypeObject *T)
00184 : BaseClassPy(reinterpret_cast<BaseClassPy::PointerType>(pcObject), T)
00185 {
00186 }
00187
00188 PyObject *PersistencePy::PyMake(struct _typeobject *, PyObject *, PyObject *)
00189 {
00190
00191 PyErr_SetString(PyExc_RuntimeError, "You cannot create directly an instance of 'PersistencePy'.");
00192
00193 return 0;
00194 }
00195
00196 int PersistencePy::PyInit(PyObject* , PyObject* )
00197 {
00198 return 0;
00199 }
00200
00201
00202
00203
00204 PersistencePy::~PersistencePy()
00205 {
00206 }
00207
00208
00209
00210
00211 PyObject *PersistencePy::_repr(void)
00212 {
00213 return Py_BuildValue("s", representation().c_str());
00214 }
00215
00216
00217
00218
00219 PyObject *PersistencePy::_getattr(char *attr)
00220 {
00221 try {
00222
00223 PyObject *r = getCustomAttributes(attr);
00224 if(r) return r;
00225 }
00226 #ifndef DONT_CATCH_CXX_EXCEPTIONS
00227 catch(const Base::Exception& e)
00228 {
00229 std::string str;
00230 str += "FreeCAD exception thrown (";
00231 str += e.what();
00232 str += ")";
00233 e.ReportException();
00234 PyErr_SetString(PyExc_Exception,str.c_str());
00235 return NULL;
00236 }
00237 catch(const std::exception& e)
00238 {
00239 std::string str;
00240 str += "FC++ exception thrown (";
00241 str += e.what();
00242 str += ")";
00243 Base::Console().Error(str.c_str());
00244 PyErr_SetString(PyExc_Exception,str.c_str());
00245 return NULL;
00246 }
00247 catch(const Py::Exception&)
00248 {
00249
00250 return NULL;
00251 }
00252 catch(...)
00253 {
00254 PyErr_SetString(PyExc_Exception,"Unknown C++ exception");
00255 return NULL;
00256 }
00257 #else // DONT_CATCH_CXX_EXCEPTIONS
00258 catch(const Base::Exception& e)
00259 {
00260 std::string str;
00261 str += "FreeCAD exception thrown (";
00262 str += e.what();
00263 str += ")";
00264 e.ReportException();
00265 PyErr_SetString(PyExc_Exception,str.c_str());
00266 return NULL;
00267 }
00268 catch(const Py::Exception&)
00269 {
00270
00271 return NULL;
00272 }
00273 #endif // DONT_CATCH_CXX_EXCEPTIONS
00274
00275 PyObject *rvalue = Py_FindMethod(Methods, this, attr);
00276 if (rvalue == NULL)
00277 {
00278 PyErr_Clear();
00279 return BaseClassPy::_getattr(attr);
00280 }
00281 else
00282 {
00283 return rvalue;
00284 }
00285 }
00286
00287 int PersistencePy::_setattr(char *attr, PyObject *value)
00288 {
00289 try {
00290
00291 int r = setCustomAttributes(attr, value);
00292 if(r==1) return 0;
00293 }
00294 #ifndef DONT_CATCH_CXX_EXCEPTIONS
00295 catch(const Base::Exception& e)
00296 {
00297 std::string str;
00298 str += "FreeCAD exception thrown (";
00299 str += e.what();
00300 str += ")";
00301 e.ReportException();
00302 PyErr_SetString(PyExc_Exception,str.c_str());
00303 return -1;
00304 }
00305 catch(const std::exception& e)
00306 {
00307 std::string str;
00308 str += "FC++ exception thrown (";
00309 str += e.what();
00310 str += ")";
00311 Base::Console().Error(str.c_str());
00312 PyErr_SetString(PyExc_Exception,str.c_str());
00313 return -1;
00314 }
00315 catch(const Py::Exception&)
00316 {
00317
00318 return -1;
00319 }
00320 catch(...)
00321 {
00322 PyErr_SetString(PyExc_Exception,"Unknown C++ exception");
00323 return -1;
00324 }
00325 #else // DONT_CATCH_CXX_EXCEPTIONS
00326 catch(const Base::Exception& e)
00327 {
00328 std::string str;
00329 str += "FreeCAD exception thrown (";
00330 str += e.what();
00331 str += ")";
00332 e.ReportException();
00333 PyErr_SetString(PyExc_Exception,str.c_str());
00334 return -1;
00335 }
00336 catch(const Py::Exception&)
00337 {
00338
00339 return -1;
00340 }
00341 #endif // DONT_CATCH_CXX_EXCEPTIONS
00342
00343 return BaseClassPy::_setattr(attr, value);
00344 }
00345
00346 Persistence *PersistencePy::getPersistencePtr(void) const
00347 {
00348 return static_cast<Persistence *>(_pcTwinPointer);
00349 }
00350
00351 #if 0
00352
00353
00354
00355
00356
00357
00358 std::string PersistencePy::representation(void) const
00359 {
00360 return std::string("<Persistence object>");
00361 }
00362
00363
00364
00365 Py::String PersistencePy::getContent(void) const
00366 {
00367
00368 throw Py::AttributeError("Not yet implemented");
00369 }
00370
00371 void PersistencePy::setContent(Py::String arg)
00372 {
00373 throw Py::AttributeError("Not yet implemented");
00374 }
00375
00376 Py::Int PersistencePy::getMemSize(void) const
00377 {
00378
00379 throw Py::AttributeError("Not yet implemented");
00380 }
00381
00382 PyObject *PersistencePy::getCustomAttributes(const char* attr) const
00383 {
00384 return 0;
00385 }
00386
00387 int PersistencePy::setCustomAttributes(const char* attr, PyObject *obj)
00388 {
00389 return 0;
00390 }
00391 #endif
00392
00393
00394