X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/160f215065036a56fa709487a7f60239d98e8de3..7c12c1089cfbee5b0a390d5f3de37f85de210263:/lib/python/python.cpp diff --git a/lib/python/python.cpp b/lib/python/python.cpp index a9ad32f6..9e7e5c21 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,45 @@ int ePython::execute(const std::string &pythonfile, const std::string &funcname) } return 0; } + +void ePython::call(PyObject *pFunc, PyObject *pArgs) +{ + PyObject *pValue; + if (pFunc && PyCallable_Check(pFunc)) + { + pValue = PyObject_CallObject(pFunc, pArgs); + if (pValue != NULL) + { + printf("Result of call: %ld\n", PyInt_AsLong(pValue)); + Py_DECREF(pValue); + } else + { + PyErr_Print(); + } + } +} + +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); + eDebug("resolved to %p", pFunc); + return pFunc; + } else + { + if (PyErr_Occurred()) + PyErr_Print(); + return 0; + } +}