X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2Fpython.cpp;h=119bff1c0bdd006c61c1a98755f0f7227dde9938;hp=a9ad32f69841a5cb820124f4f9261b87527e436f;hb=e03c732afb410b4d6b9f9540c36c33c941ee38f1;hpb=ddc3964ed95d01e72229dc9af968a327cd84e56c diff --git a/lib/python/python.cpp b/lib/python/python.cpp index a9ad32f..119bff1 100644 --- a/lib/python/python.cpp +++ b/lib/python/python.cpp @@ -1,10 +1,69 @@ #include +#include + /* avoid warnigs :) */ +#undef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200112L #include extern "C" void init_enigma(); +extern void bsodFatal(); + +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_OptimizeFlag = 1; + Py_Initialize(); init_enigma(); @@ -18,9 +77,8 @@ ePython::~ePython() int ePython::execute(const std::string &pythonfile, const std::string &funcname) { PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue; - pName = PyString_FromString(pythonfile.c_str()); - + pModule = PyImport_Import(pName); Py_DECREF(pName); @@ -55,3 +113,50 @@ 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(); + bsodFatal(); + } + } + 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; + } +}