X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ddc3964ed95d01e72229dc9af968a327cd84e56c..9938121132769969c336536523e76abccf8a6818:/lib/python/python.cpp diff --git a/lib/python/python.cpp b/lib/python/python.cpp index a9ad32f6..4ca77ab2 100644 --- a/lib/python/python.cpp +++ b/lib/python/python.cpp @@ -1,10 +1,66 @@ #include +#include + /* avoid warnigs :) */ +#undef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200112L #include extern "C" void init_enigma(); +DEFINE_REF(TestObj); + +TestObj::TestObj() +{ + eDebug("create %p", this); +} + +TestObj::~TestObj() +{ + eDebug("destroy %p", this); +} + +#if 0 +ePyObject::ePyObject(void *ptr): m_object(ptr) +{ + Py_XINCREF((PyObject*)ptr); +} + +ePyObject::ePyObject(ePyObject &p) +{ + m_object = p.m_object; + Py_XINCREF((PyObject*)m_object); +} + +ePyObject::ePyObject(): m_object(0) +{ +} + +ePyObject::~ePyObject() +{ + Py_XDECREF((PyObject*)m_object); +} + +ePyObject &ePyObject::operator=(ePyObject &p) +{ + Py_XDECREF((PyObject*)m_object); + m_object = p.m_object; + Py_XINCREF((PyObject*)m_object); + return *this; +} + +ePyObject &ePyObject::operator=(void *object) +{ + Py_XDECREF((PyObject*)m_object); + m_object = object; + Py_XINCREF((PyObject*)m_object); + return *this; +} +#endif + ePython::ePython() { +// Py_VerboseFlag = 1; + Py_Initialize(); init_enigma(); @@ -55,3 +111,49 @@ int ePython::execute(const std::string &pythonfile, const std::string &funcname) } return 0; } + +int ePython::call(PyObject *pFunc, PyObject *pArgs) +{ + int res = -1; + PyObject *pValue; + if (pFunc && PyCallable_Check(pFunc)) + { + pValue = PyObject_CallObject(pFunc, pArgs); + if (pValue != NULL) + { + if (PyInt_Check(pValue)) + res = PyInt_AsLong(pValue); + else + res = 0; + Py_DECREF(pValue); + } else + { + PyErr_Print(); + } + } + return res; +} + +PyObject *ePython::resolve(const std::string &pythonfile, const std::string &funcname) +{ + PyObject *pName, *pModule, *pDict, *pFunc; + + pName = PyString_FromString(pythonfile.c_str()); + + pModule = PyImport_Import(pName); + Py_DECREF(pName); + + if (pModule != NULL) + { + pDict = PyModule_GetDict(pModule); + pFunc = PyDict_GetItemString(pDict, funcname.c_str()); + Py_XINCREF(pFunc); + Py_DECREF(pModule); + return pFunc; + } else + { + if (PyErr_Occurred()) + PyErr_Print(); + return 0; + } +}