change flasher part of NFIFlash to handle new style md5sum lines
[enigma2.git] / lib / python / python.cpp
1 #include <lib/base/eerror.h>
2                 /* avoid warnigs :) */
3 #undef _POSIX_C_SOURCE
4 #define _POSIX_C_SOURCE 200112L
5 extern "C" void init_enigma();
6 extern "C" void eBaseInit(void);
7 extern void bsodFatal();
8
9 #define SKIP_PART2
10 #include <lib/python/python.h>
11 #undef SKIP_PART2
12
13 #ifdef PYTHON_REFCOUNT_DEBUG
14 ePyObject &ePyObject::operator=(PyObject *ob)
15 {
16         m_ob=ob;
17         m_file=0;
18         m_line=0;
19         m_from=m_to=0;
20         m_erased=false;
21         return *this;
22 }
23
24 ePyObject &ePyObject::operator=(const ePyObject &ob)
25 {
26         m_ob=ob.m_ob;
27         m_file=ob.m_file;
28         m_line=ob.m_line;
29         m_from=ob.m_from;
30         m_to=ob.m_to;
31         m_erased=ob.m_erased;
32         return *this;
33 }
34
35 ePyObject::operator PyObject*()
36 {
37         if (m_ob)
38         {
39                 if (!m_erased && m_ob->ob_refcnt > 0)
40                         return m_ob;
41                 eDebug("invalid access PyObject %s with refcount <= 0 %d",
42                         m_erased ? "deleted" : "undeleted", m_ob->ob_refcnt);
43                 if (m_file)
44                         eDebug("last modified in file %s line %d from %d to %d",
45                                 m_file, m_line, m_from, m_to);
46                 bsodFatal();
47         }
48         return 0;
49 }
50
51 void ePyObject::incref(const char *file, int line)
52 {
53         if (!m_ob)
54         {
55                 eDebug("invalid incref python object with null pointer %s %d!!!", file, line);
56                 if (m_file)
57                         eDebug("last modified in file %s line %d from %d to %d",
58                                 m_file, m_line, m_from, m_to);
59                 bsodFatal();
60         }
61         if (m_erased || m_ob->ob_refcnt <= 0)
62         {
63                 eDebug("invalid incref %s python object with refcounting value %d in file %s line %d!!!",
64                         m_erased ? "deleted" : "undeleted", m_ob->ob_refcnt, file, line);
65                 if (m_file)
66                         eDebug("last modified in file %s line %d from %d to %d",
67                                 m_file, m_line, m_from, m_to);
68                 bsodFatal();
69         }
70         if (m_ob->ob_refcnt == 0x7FFFFFFF)
71         {
72                 eDebug("invalid incref %s python object with refcounting value %d (MAX_INT!!!) in file %s line %d!!!",
73                         m_erased ? "deleted" : "undeleted", m_ob->ob_refcnt, file, line);
74                 if (m_file)
75                         eDebug("last modified in file %s line %d from %d to %d",
76                                 m_file, m_line, m_from, m_to);
77                 bsodFatal();
78         }
79         m_file = file;
80         m_line = line;
81         m_from = m_ob->ob_refcnt;
82         m_to = m_from+1;
83         Py_INCREF(m_ob);
84 }
85
86 void ePyObject::decref(const char *file, int line)
87 {
88         if (!m_ob)
89         {
90                 eDebug("invalid decref python object with null pointer %s %d!!!", file, line);
91                 if (m_file)
92                         eDebug("last modified in file %s line %d from %d to %d",
93                                 m_file, m_line, m_from, m_to);
94                 bsodFatal();
95         }
96         if (m_erased || m_ob->ob_refcnt <= 0)
97         {
98                 eDebug("invalid decref %s python object with refcounting value %d in file %s line %d!!!",
99                         m_erased ? "deleted" : "undeleted", m_ob->ob_refcnt, file, line);
100                 if (m_file)
101                         eDebug("last modified in file %s line %d from %d to %d",
102                                 m_file, m_line, m_from, m_to);
103                 bsodFatal();
104         }
105         m_file = file;
106         m_line = line;
107         m_from = m_ob->ob_refcnt;
108         m_to = m_from-1;
109         m_erased = !m_to;
110         Py_DECREF(m_ob);
111 }
112 #endif  // PYTHON_REFCOUNT_DEBUG
113
114 #define SKIP_PART1
115 #include <lib/python/python.h>
116 #undef SKIP_PART1
117
118 ePython::ePython()
119 {
120 //      Py_VerboseFlag = 1;
121         
122 //      Py_OptimizeFlag = 1;
123         
124         Py_Initialize();
125         PyEval_InitThreads();
126
127         init_enigma();
128         eBaseInit();
129 }
130
131 ePython::~ePython()
132 {
133         Py_Finalize();
134 }
135
136 int ePython::execFile(const char *file)
137 {
138         FILE *fp = fopen(file, "r");
139         if (!fp)
140                 return -ENOENT;
141         int ret = PyRun_SimpleFile(fp, file);
142         fclose(fp);
143         return ret;
144 }
145
146 int ePython::execute(const std::string &pythonfile, const std::string &funcname)
147 {
148         ePyObject pName, pModule, pDict, pFunc, pArgs, pValue;
149         pName = PyString_FromString(pythonfile.c_str());
150
151         pModule = PyImport_Import(pName);
152         Py_DECREF(pName);
153         
154         if (pModule)
155         {
156                 pDict = PyModule_GetDict(pModule);
157                 
158                 pFunc = PyDict_GetItemString(pDict, funcname.c_str());
159                 
160                 if (pFunc && PyCallable_Check(pFunc))
161                 {
162                         pArgs = PyTuple_New(0);
163                                 // implement arguments..
164                         pValue = PyObject_CallObject(pFunc, pArgs);
165                         Py_DECREF(pArgs);
166                         if (pValue)
167                         {
168                                 printf("Result of call: %ld\n", PyInt_AsLong(pValue));
169                                 Py_DECREF(pValue);
170                         } else
171                         {
172                                 Py_DECREF(pModule);
173                                 PyErr_Print();
174                                 return 1;
175                         }
176                 }
177         } else
178         {
179                 if (PyErr_Occurred())
180                         PyErr_Print();
181                 return 1;
182         }
183         return 0;
184 }
185
186 int ePython::call(ePyObject pFunc, ePyObject pArgs)
187 {
188         int res = -1;
189         ePyObject pValue;
190         if (pFunc && PyCallable_Check(pFunc))
191         {
192                 pValue = PyObject_CallObject(pFunc, pArgs);
193                 if (pValue)
194                 {
195                         if (PyInt_Check(pValue))
196                                 res = PyInt_AsLong(pValue);
197                         else
198                                 res = 0;
199                         Py_DECREF(pValue);
200                 } else
201                 {
202                         PyErr_Print();
203                         ePyObject FuncStr = PyObject_Str(pFunc);
204                         ePyObject ArgStr = PyObject_Str(pArgs);
205                         eDebug("(PyObject_CallObject(%s,%s) failed)", PyString_AS_STRING(FuncStr), PyString_AS_STRING(ArgStr));
206                         Py_DECREF(FuncStr);
207                         Py_DECREF(ArgStr);
208                         bsodFatal();
209                 }
210         }
211         return res;
212 }
213
214 ePyObject ePython::resolve(const std::string &pythonfile, const std::string &funcname)
215 {
216         ePyObject pName, pModule, pDict, pFunc;
217
218         pName = PyString_FromString(pythonfile.c_str());
219
220         pModule = PyImport_Import(pName);
221         Py_DECREF(pName);
222         
223         if (pModule)
224         {
225                 pDict = PyModule_GetDict(pModule);
226                 pFunc = PyDict_GetItemString(pDict, funcname.c_str());
227                 Py_XINCREF(pFunc);
228                 Py_DECREF(pModule);
229         } else if (PyErr_Occurred())
230                 PyErr_Print();
231         return pFunc;
232 }