allow installing from multiple directories
[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/console.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/service/listboxservice.h>
74 #include <lib/nav/pcore.h>
75 #include <lib/actions/action.h>
76 #include <lib/gdi/gfont.h>
77 #include <lib/gdi/epng.h>
78 #include <lib/dvb/db.h>
79 #include <lib/dvb/frontendparms.h>
80 #include <lib/dvb/idvb.h>
81 #include <lib/dvb/dvb.h>
82 #include <lib/dvb/frontend.h>
83 #include <lib/dvb/volume.h>
84 #include <lib/dvb/sec.h>
85 #include <lib/dvb/epgcache.h>
86 #include <lib/dvb/dvbtime.h>
87 #include <lib/dvb/pmt.h>
88 #include <lib/components/scan.h>
89 #include <lib/components/file_eraser.h>
90 #include <lib/driver/avswitch.h>
91 #include <lib/driver/rfmod.h>
92 #include <lib/driver/misc_options.h>
93 #include <lib/driver/etimezone.h>
94 #include <lib/gdi/lcd.h>
95 #include <lib/mmi/mmi_ui.h>
96 #include <lib/dvb_ci/dvbci.h>
97 #include <lib/dvb_ci/dvbci_ui.h>
98 #include <lib/python/python.h>
99 #include <lib/gdi/picload.h>
100 %}
101
102 %feature("ref")   iObject "$this->AddRef(); /* eDebug(\"AddRef (%s:%d)!\", __FILE__, __LINE__); */ "
103 %feature("unref") iObject "$this->Release(); /* eDebug(\"Release! %s:%d\", __FILE__, __LINE__); */ "
104
105 /* this magic allows smartpointer to be used as OUTPUT arguments, i.e. call-by-reference-styled return value. */
106
107 %define %typemap_output_simple(Type)
108  %typemap(in,numinputs=0) Type *OUTPUT ($*1_ltype temp),
109               Type &OUTPUT ($*1_ltype temp)
110    "$1 = new Type;";
111  %fragment("t_out_helper"{Type},"header",
112      fragment="t_output_helper") {}
113  %typemap(argout,fragment="t_out_helper"{Type}) Type *OUTPUT, Type &OUTPUT
114    "$result = t_output_helper($result, (SWIG_NewPointerObj((void*)($1), $1_descriptor, 1)));"
115 %enddef
116
117 %define %typemap_output_ptr(Type)
118  %typemap(in,numinputs=0) Type *OUTPUT ($*1_ltype temp),
119               Type &OUTPUT ($*1_ltype temp)
120    "$1 = new Type;";
121  %fragment("t_out_helper"{Type},"header",
122      fragment="t_output_helper") {}
123  %typemap(argout,fragment="t_out_helper"{Type}) Type *OUTPUT, Type &OUTPUT
124                 // generate None if smartpointer is NULL
125    "$result = t_output_helper($result, ((*$1) ? SWIG_NewPointerObj((void*)($1), $1_descriptor, 1) : (delete $1, Py_INCREF(Py_None), Py_None)));"
126 %enddef
127
128
129 #define DEBUG
130 typedef long time_t;
131 %include "typemaps.i"
132 %include "std_string.i"
133 %include <lib/python/swig.h>
134 %include <lib/base/object.h>
135 %include <lib/base/eerror.h>
136
137 %immutable eSocketNotifier::activated;
138 %include <lib/base/ebase.h>
139 %include <lib/base/smartptr.h>
140 %include <lib/service/event.h>
141 %include <lib/service/iservice.h>
142 %include <lib/service/service.h>
143
144 // TODO: embed these...
145 %immutable eConsoleAppContainer::appClosed;
146 %immutable eConsoleAppContainer::dataAvail;
147 %immutable eConsoleAppContainer::dataSent;
148 %immutable eButton::selected;
149 %immutable eInput::changed;
150 %immutable eComponentScan::statusChanged;
151 %immutable eComponentScan::newService;
152 %immutable pNavigation::m_event;
153 %immutable pNavigation::m_record_event;
154 %immutable eListbox::selectionChanged;
155 %immutable eDVBCI_UI::ciStateChanged;
156 %immutable eSocket_UI::socketStateChanged;
157 %immutable eDVBResourceManager::frontendUseMaskChanged;
158 %immutable eAVSwitch::vcr_sb_notifier;
159 %immutable ePythonMessagePump::recv_msg;
160 %immutable eDVBLocalTimeHandler::m_timeUpdated;
161 %include <lib/base/message.h>
162 %include <lib/base/console.h>
163 %include <lib/base/nconfig.h>
164 %include <lib/driver/rc.h>
165 %include <lib/gdi/fb.h>
166 %include <lib/gdi/font.h>
167 %include <lib/gdi/gpixmap.h>
168 %include <lib/gdi/gfbdc.h>
169 %include <lib/gdi/epoint.h>
170 %include <lib/gdi/erect.h>
171 %include <lib/gdi/esize.h>
172 %include <lib/gui/ewidget.h>
173 %include <lib/gui/elabel.h>
174 %include <lib/gui/einput.h>
175 %include <lib/gui/einputstring.h>
176 %include <lib/gui/einputnumber.h>
177 %include <lib/gui/epixmap.h>
178 %include <lib/gui/ecanvas.h>
179 %include <lib/gui/ebutton.h>
180 %include <lib/gui/ewindow.h>
181 %include <lib/gui/eslider.h>
182 %include <lib/gui/epositiongauge.h>
183 %include <lib/gui/ewidgetdesktop.h>
184 %include <lib/gui/elistbox.h>
185 %include <lib/gui/elistboxcontent.h>
186 %include <lib/gui/ewindowstyle.h>
187 %include <lib/gui/ewindowstyleskinned.h>
188 %include <lib/gui/ewidgetanimation.h>
189 %include <lib/gui/evideo.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         if (SWIG_Python_ConvertPtr(obj, (void **)&res, SWIGTYPE_p_ePtrTgPixmap_t, SWIG_POINTER_EXCEPTION | 0))
270                 return -1;
271         if (!res)
272                 return -1;
273         result = *res;
274         return 0;
275 }
276 PyObject *New_eServiceReference(const eServiceReference &ref)
277 {
278     eServiceReference *result = new eServiceReference(ref);
279     return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_eServiceReference, 1);
280 }
281 PyObject *New_iRecordableServicePtr(const ePtr<iRecordableService> &ptr)
282 {
283     ePtr<iRecordableService> *result = new ePtr<iRecordableService>(ptr);
284     return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_ePtrTiRecordableService_t, 1);
285 }
286 %}
287
288 /* needed for service groups */
289
290 PyObject *getBestPlayableServiceReference(const eServiceReference &bouquet_ref, const eServiceReference &ignore);
291 %{
292 PyObject *getBestPlayableServiceReference(const eServiceReference &bouquet_ref, const eServiceReference &ignore)
293 {
294         eStaticServiceDVBBouquetInformation info;
295         if (info.isPlayable(bouquet_ref, ignore))
296                 return New_eServiceReference(info.getPlayableService());
297         Py_INCREF(Py_None);
298         return Py_None;
299 }
300 %}
301
302 void setTunerTypePriorityOrder(int);
303 %{
304 void setTunerTypePriorityOrder(int order)
305 {
306         eDVBFrontend::setTypePriorityOrder(order);
307 }
308 %}
309
310 /************** temp *****************/
311
312         /* need a better place for this, i agree. */
313 %{
314 extern void runMainloop();
315 extern void quitMainloop(int exit_code);
316 extern eApplication *getApplication();
317 extern int getPrevAsciiCode();
318 extern void addFont(const char *filename, const char *alias, int scale_factor, int is_replacement);
319 extern const char *getEnigmaVersionString();
320 extern void dump_malloc_stats(void);
321 %}
322
323 extern void addFont(const char *filename, const char *alias, int scale_factor, int is_replacement);
324 extern int getPrevAsciiCode();
325 extern void runMainloop();
326 extern void quitMainloop(int exit_code);
327 extern eApplication *getApplication();
328 extern const char *getEnigmaVersionString();
329 extern void dump_malloc_stats(void);