working on move, edit mode and add remove service to context menu
[enigma2.git] / lib / python / python.cpp
index a9ad32f69841a5cb820124f4f9261b87527e436f..642d70ba9f3072f26e4773dbc8151453abb7b7f0 100644 (file)
@@ -1,8 +1,47 @@
 #include <lib/python/python.h>
 #include <lib/python/python.h>
+#include <lib/base/eerror.h>
 #include <Python.h>
 
 extern "C" void init_enigma();
 
 #include <Python.h>
 
 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();
 ePython::ePython()
 {
        Py_Initialize();
@@ -55,3 +94,49 @@ int ePython::execute(const std::string &pythonfile, const std::string &funcname)
        }
        return 0;
 }
        }
        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;
+       }
+}