X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ddc3964ed95d01e72229dc9af968a327cd84e56c..14b7e204d87ca1ad0d4f3056cf4b923495c261ef:/lib/python/python.cpp diff --git a/lib/python/python.cpp b/lib/python/python.cpp index a9ad32f6..642d70ba 100644 --- a/lib/python/python.cpp +++ b/lib/python/python.cpp @@ -1,8 +1,47 @@ #include +#include #include extern "C" void init_enigma(); +#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_Initialize(); @@ -55,3 +94,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; + } +}