fix empty streams list crash, correctly show/hide color key buttons, re-implement...
[enigma2.git] / lib / python / enigma_python.i
1 /*
2   NOTE: you have two options when adding classes so that
3   they are callable *from* python.
4   
5    - either you %include the header file
6    - or you re-declare it
7    
8   In both cases, you must #include the required
9   header file (i.e. the header file itself), otherwise
10   enigma_python_wrap.cxx won't build.
11   
12         In case you import the whole header file,
13         please make sure that no unimportant stuff
14         is wrapped, as this makes the wrapper stuff
15         much more complex and it can probably break 
16         very easily because of missing typemaps etc.
17         
18         you could make use of dizzy macros to ensure
19         that some stuff is left out when parsed as SWIG
20         definitions, but be sure to not modify the binary 
21         representation. DON'T USE #ifdef SWIG_COMPILE
22         for leaving out stuff (unless you *really* know
23         what you are doing,of course!). you WILL break it.
24                 
25         The better way (with more work) is to re-declare
26         the class. It won't be compiled, so you can
27         leave out stuff as you like.
28
29
30
31 Oh, things like "operator= is private in this context" etc.
32 is usually caused by not marking PSignals as immutable. 
33 */
34
35 %module enigma
36 %{
37
38 #define SWIG_COMPILE
39 #include <lib/base/ebase.h>
40 #include <lib/base/smartptr.h>
41 #include <lib/base/eerror.h>
42 #include <lib/base/etpm.h>
43 #include <lib/base/nconfig.h>
44 #include <lib/base/message.h>
45 #include <lib/driver/rc.h>
46 #include <lib/service/event.h>
47 #include <lib/service/iservice.h>
48 #include <lib/service/service.h>
49 #include <lib/service/servicedvb.h>
50 #include <lib/gdi/fb.h>
51 #include <lib/gdi/font.h>
52 #include <lib/gdi/gpixmap.h>
53 #include <lib/gdi/gfbdc.h>
54 #include <lib/gui/ewidget.h>
55 #include <lib/gui/elabel.h>
56 #include <lib/gui/einput.h>
57 #include <lib/gui/einputstring.h>
58 #include <lib/gui/einputnumber.h>
59 #include <lib/gui/epixmap.h>
60 #include <lib/gui/ebutton.h>
61 #include <lib/gui/ewindow.h>
62 #include <lib/gui/ewidgetdesktop.h>
63 #include <lib/gui/ewindowstyle.h>
64 #include <lib/gui/ewindowstyleskinned.h>
65 #include <lib/gui/ewidgetanimation.h>
66 #include <lib/gui/eslider.h>
67 #include <lib/gui/epositiongauge.h>
68 #include <lib/gui/evideo.h>
69 #include <lib/gui/ecanvas.h>
70 #include <lib/python/connections.h>
71 #include <lib/gui/elistbox.h>
72 #include <lib/gui/elistboxcontent.h>
73 #include <lib/gui/esubtitle.h>
74 #include <lib/service/listboxservice.h>
75 #include <lib/nav/pcore.h>
76 #include <lib/actions/action.h>
77 #include <lib/gdi/gfont.h>
78 #include <lib/gdi/epng.h>
79 #include <lib/dvb/db.h>
80 #include <lib/dvb/frontendparms.h>
81 #include <lib/dvb/idvb.h>
82 #include <lib/dvb/dvb.h>
83 #include <lib/dvb/frontend.h>
84 #include <lib/dvb/volume.h>
85 #include <lib/dvb/sec.h>
86 #include <lib/dvb/epgcache.h>
87 #include <lib/dvb/dvbtime.h>
88 #include <lib/dvb/pmt.h>
89 #include <lib/components/scan.h>
90 #include <lib/components/file_eraser.h>
91 #include <lib/driver/avswitch.h>
92 #include <lib/driver/rfmod.h>
93 #include <lib/driver/misc_options.h>
94 #include <lib/driver/etimezone.h>
95 #include <lib/gdi/lcd.h>
96 #include <lib/mmi/mmi_ui.h>
97 #include <lib/dvb_ci/dvbci.h>
98 #include <lib/dvb_ci/dvbci_ui.h>
99 #include <lib/python/python.h>
100 #include <lib/gdi/picload.h>
101 %}
102
103 %feature("ref")   iObject "$this->AddRef(); /* eDebug(\"AddRef (%s:%d)!\", __FILE__, __LINE__); */ "
104 %feature("unref") iObject "$this->Release(); /* eDebug(\"Release! %s:%d\", __FILE__, __LINE__); */ "
105
106 /* this magic allows smartpointer to be used as OUTPUT arguments, i.e. call-by-reference-styled return value. */
107
108 %define %typemap_output_simple(Type)
109  %typemap(in,numinputs=0) Type *OUTPUT ($*1_ltype temp),
110               Type &OUTPUT ($*1_ltype temp)
111    "$1 = new Type;";
112  %fragment("t_out_helper"{Type},"header",
113      fragment="t_output_helper") {}
114  %typemap(argout,fragment="t_out_helper"{Type}) Type *OUTPUT, Type &OUTPUT
115    "$result = t_output_helper($result, (SWIG_NewPointerObj((void*)($1), $1_descriptor, 1)));"
116 %enddef
117
118 %define %typemap_output_ptr(Type)
119  %typemap(in,numinputs=0) Type *OUTPUT ($*1_ltype temp),
120               Type &OUTPUT ($*1_ltype temp)
121    "$1 = new Type;";
122  %fragment("t_out_helper"{Type},"header",
123      fragment="t_output_helper") {}
124  %typemap(argout,fragment="t_out_helper"{Type}) Type *OUTPUT, Type &OUTPUT
125                 // generate None if smartpointer is NULL
126    "$result = t_output_helper($result, ((*$1) ? SWIG_NewPointerObj((void*)($1), $1_descriptor, 1) : (delete $1, Py_INCREF(Py_None), Py_None)));"
127 %enddef
128
129
130 #define DEBUG
131 typedef long time_t;
132 %include "typemaps.i"
133 %include "std_string.i"
134 %include <lib/python/swig.h>
135 %include <lib/base/object.h>
136 %include <lib/base/eerror.h>
137
138 %immutable eSocketNotifier::activated;
139 %include <lib/base/ebase.h>
140 %include <lib/base/smartptr.h>
141 %include <lib/service/event.h>
142 %include <lib/service/iservice.h>
143 %include <lib/service/service.h>
144
145 // TODO: embed these...
146 %immutable ePicLoad::PictureData;
147 %immutable eButton::selected;
148 %immutable eInput::changed;
149 %immutable eComponentScan::statusChanged;
150 %immutable eComponentScan::newService;
151 %immutable pNavigation::m_event;
152 %immutable pNavigation::m_record_event;
153 %immutable eListbox::selectionChanged;
154 %immutable eDVBCI_UI::ciStateChanged;
155 %immutable eSocket_UI::socketStateChanged;
156 %immutable eDVBResourceManager::frontendUseMaskChanged;
157 %immutable eAVSwitch::vcr_sb_notifier;
158 %immutable ePythonMessagePump::recv_msg;
159 %immutable eDVBLocalTimeHandler::m_timeUpdated;
160 %include <lib/base/message.h>
161 %include <lib/base/etpm.h>
162 %include <lib/base/nconfig.h>
163 %include <lib/driver/rc.h>
164 %include <lib/gdi/fb.h>
165 %include <lib/gdi/font.h>
166 %include <lib/gdi/gpixmap.h>
167 %include <lib/gdi/gfbdc.h>
168 %include <lib/gdi/epoint.h>
169 %include <lib/gdi/erect.h>
170 %include <lib/gdi/esize.h>
171 %include <lib/gui/ewidget.h>
172 %include <lib/gui/elabel.h>
173 %include <lib/gui/einput.h>
174 %include <lib/gui/einputstring.h>
175 %include <lib/gui/einputnumber.h>
176 %include <lib/gui/epixmap.h>
177 %include <lib/gui/ecanvas.h>
178 %include <lib/gui/ebutton.h>
179 %include <lib/gui/ewindow.h>
180 %include <lib/gui/eslider.h>
181 %include <lib/gui/epositiongauge.h>
182 %include <lib/gui/ewidgetdesktop.h>
183 %include <lib/gui/elistbox.h>
184 %include <lib/gui/elistboxcontent.h>
185 %include <lib/gui/ewindowstyle.h>
186 %include <lib/gui/ewindowstyleskinned.h>
187 %include <lib/gui/ewidgetanimation.h>
188 %include <lib/gui/evideo.h>
189 %include <lib/gui/esubtitle.h>
190 %include <lib/service/listboxservice.h>
191 %include <lib/nav/pcore.h>
192 %include <lib/actions/action.h>
193 %include <lib/gdi/gfont.h>
194 %include <lib/gdi/epng.h>
195 %include <lib/dvb/volume.h>
196 %include <lib/dvb/sec.h>
197 %include <lib/dvb/epgcache.h>
198 %include <lib/dvb/frontendparms.h>
199 %include <lib/dvb/dvbtime.h>
200 %include <lib/dvb/idvb.h>
201 %include <lib/dvb/dvb.h>
202 %include <lib/dvb/frontend.h>
203 %include <lib/dvb/pmt.h>
204 %include <lib/components/scan.h>
205 %include <lib/components/file_eraser.h>
206 %include <lib/driver/avswitch.h>
207 %include <lib/driver/rfmod.h>
208 %include <lib/driver/misc_options.h>
209 %include <lib/driver/etimezone.h>
210 %include <lib/gdi/lcd.h>
211 %include <lib/mmi/mmi_ui.h>
212 %include <lib/dvb_ci/dvbci.h>
213 %include <lib/dvb_ci/dvbci_ui.h>
214 %include <lib/dvb/db.h>
215 %include <lib/python/python.h>
216 %include <lib/gdi/picload.h>
217 /**************  eptr  **************/
218
219 /**************  signals  **************/
220
221 template<class R> class PSignal0
222 {
223 public:
224         PyObject *get();
225 };
226
227 %template(PSignal0V) PSignal0<void>;
228
229 %typemap(out) PSignal0V {
230         $1 = $input->get();
231 }
232
233 template<class R, class P0> class PSignal1
234 {
235 public:
236         PyObject *get();
237 };
238
239 %template(PSignal1VI) PSignal1<void,int>;
240 %template(PSignal1VS) PSignal1<void,const char *c>;
241
242 %typemap(out) PSignal1VI {
243         $1 = $input->get();
244 }
245
246 %typemap(out) PSignal1VS {
247         $1 = $input->get();
248 }
249
250 template<class R, class P0, class P1> class PSignal2
251 {
252 public:
253         PyObject *get();
254 };
255
256 %template(PSignal2VoidIRecordableServiceInt) PSignal2<void,ePtr<iRecordableService>&,int>;
257
258 %typemap(out) PSignal2VoidIRecordableServiceInt {
259         $1 = $input->get();
260 }
261
262 %{
263 RESULT SwigFromPython(ePtr<gPixmap> &result, PyObject *obj)
264 {       
265         ePtr<gPixmap> *res;
266
267         res = 0;
268         result = 0;
269 #ifndef SWIGTYPE_p_ePtrT_gPixmap_t
270 #define SWIGTYPE_p_ePtrT_gPixmap_t SWIGTYPE_p_ePtrTgPixmap_t
271 #endif
272         if (SWIG_Python_ConvertPtr(obj, (void **)&res, SWIGTYPE_p_ePtrT_gPixmap_t, SWIG_POINTER_EXCEPTION | 0))
273                 return -1;
274         if (!res)
275                 return -1;
276         result = *res;
277         return 0;
278 }
279 PyObject *New_eServiceReference(const eServiceReference &ref)
280 {
281     eServiceReference *result = new eServiceReference(ref);
282     return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_eServiceReference, 1);
283 }
284 PyObject *New_iRecordableServicePtr(const ePtr<iRecordableService> &ptr)
285 {
286     ePtr<iRecordableService> *result = new ePtr<iRecordableService>(ptr);
287 #ifndef SWIGTYPE_p_ePtrT_iRecordableService_t
288 #define SWIGTYPE_p_ePtrT_iRecordableService_t SWIGTYPE_p_ePtrTiRecordableService_t
289 #endif
290     return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_ePtrT_iRecordableService_t, 1);
291 }
292 %}
293
294 /* needed for service groups */
295
296 PyObject *getBestPlayableServiceReference(const eServiceReference &bouquet_ref, const eServiceReference &ignore, bool simulate=false);
297 %{
298 PyObject *getBestPlayableServiceReference(const eServiceReference &bouquet_ref, const eServiceReference &ignore, bool simulate=false)
299 {
300         eStaticServiceDVBBouquetInformation info;
301         if (info.isPlayable(bouquet_ref, ignore, simulate))
302                 return New_eServiceReference(info.getPlayableService());
303         Py_INCREF(Py_None);
304         return Py_None;
305 }
306 %}
307
308 void setTunerTypePriorityOrder(int);
309 %{
310 void setTunerTypePriorityOrder(int order)
311 {
312         eDVBFrontend::setTypePriorityOrder(order);
313 }
314 %}
315
316 /************** temp *****************/
317
318         /* need a better place for this, i agree. */
319 %{
320 extern void runMainloop();
321 extern void quitMainloop(int exit_code);
322 extern eApplication *getApplication();
323 extern int getPrevAsciiCode();
324 extern void addFont(const char *filename, const char *alias, int scale_factor, int is_replacement);
325 extern const char *getEnigmaVersionString();
326 extern void dump_malloc_stats(void);
327 %}
328
329 extern void addFont(const char *filename, const char *alias, int scale_factor, int is_replacement);
330 extern int getPrevAsciiCode();
331 extern void runMainloop();
332 extern void quitMainloop(int exit_code);
333 extern eApplication *getApplication();
334 extern const char *getEnigmaVersionString();
335 extern void dump_malloc_stats(void);