3905a7fc23b2a77671b8d16ec3ccb3bfe7632a1e
[enigma2.git] / lib / service / iservice.h
1 #ifndef __lib_dvb_iservice_h
2 #define __lib_dvb_iservice_h
3
4 #include <lib/python/swig.h>
5 #include <lib/python/python.h>
6 #include <lib/base/object.h>
7 #include <string>
8 #include <connection.h>
9 #include <list>
10
11 class eServiceEvent;
12
13 class eServiceReference
14 {
15 public:
16         enum
17         {
18                 idInvalid=-1,
19                 idStructure,    // service_id == 0 is root
20                 idDVB,
21                 idFile,
22                 idUser=0x1000
23         };
24         int type;
25
26         enum
27         {
28                 isDirectory=1,          // SHOULD enter  (implies mustDescent)
29                 mustDescent=2,          // cannot be played directly - often used with "isDirectory" (implies canDescent)
30                 /*
31                         for example:
32                                 normal services have none of them - they can be fed directly into the "play"-handler.
33                                 normal directories have both of them set - you cannot play a directory directly and the UI should descent into it.
34                                 playlists have "mustDescent", but not "isDirectory" - you don't want the user to browse inside the playlist (unless he really wants)
35                                 services with sub-services have none of them, instead the have the "canDecsent" flag (as all of the above)
36                 */
37                 canDescent=4,                   // supports enterDirectory/leaveDirectory
38                 flagDirectory=isDirectory|mustDescent|canDescent,
39                 shouldSort=8,                   // should be ASCII-sorted according to service_name. great for directories.
40                 hasSortKey=16,          // has a sort key in data[3]. not having a sort key implies 0.
41                 sort1=32,                                       // sort key is 1 instead of 0
42                 isMarker=64,                    // Marker
43                 isGroup=128                     // is a group of services
44         };
45         int flags; // flags will NOT be compared.
46
47         inline int getSortKey() const { return (flags & hasSortKey) ? data[3] : ((flags & sort1) ? 1 : 0); }
48
49 #ifndef SWIG
50         int data[8];
51         std::string path;
52 #endif
53         std::string getPath() { return path; }
54         void setPath( const std::string &n ) { path=n; }
55
56         unsigned int getUnsignedData(unsigned int num) const
57         {
58                 if ( num < sizeof(data)/sizeof(int) )
59                         return data[num];
60                 return 0;
61         }
62
63         int getData(unsigned int num) const
64         {
65                 if ( num < sizeof(data)/sizeof(int) )
66                         return data[num];
67                 return 0;
68         }
69
70         void setUnsignedData(unsigned int num, unsigned int val)
71         {
72                 if ( num < sizeof(data)/sizeof(int) )
73                         data[num] = val;
74         }
75
76         void setData(unsigned int num, int val)
77         {
78                 if ( num < sizeof(data)/sizeof(int) )
79                         data[num] = val;
80         }
81
82 // only for override service names in bouquets or to give servicerefs a name which not have a
83 // real existing service ( for dvb eServiceDVB )
84 #ifndef SWIG
85         std::string name;
86 #endif
87         std::string getName() { return name; }
88         void setName( const std::string &n ) { name=n; }
89
90         eServiceReference()
91                 : type(idInvalid), flags(0)
92         {
93                 memset(data, 0, sizeof(data));
94         }
95 #ifndef SWIG
96         eServiceReference(int type, int flags)
97                 : type(type), flags(flags)
98         {
99                 memset(data, 0, sizeof(data));
100         }
101         eServiceReference(int type, int flags, int data0)
102                 : type(type), flags(flags)
103         {
104                 memset(data, 0, sizeof(data));
105                 data[0]=data0;
106         }
107         eServiceReference(int type, int flags, int data0, int data1)
108                 : type(type), flags(flags)
109         {
110                 memset(data, 0, sizeof(data));
111                 data[0]=data0;
112                 data[1]=data1;
113         }
114         eServiceReference(int type, int flags, int data0, int data1, int data2)
115                 : type(type), flags(flags)
116         {
117                 memset(data, 0, sizeof(data));
118                 data[0]=data0;
119                 data[1]=data1;
120                 data[2]=data2;
121         }
122         eServiceReference(int type, int flags, int data0, int data1, int data2, int data3)
123                 : type(type), flags(flags)
124         {
125                 memset(data, 0, sizeof(data));
126                 data[0]=data0;
127                 data[1]=data1;
128                 data[2]=data2;
129                 data[3]=data3;
130         }
131         eServiceReference(int type, int flags, int data0, int data1, int data2, int data3, int data4)
132                 : type(type), flags(flags)
133         {
134                 memset(data, 0, sizeof(data));
135                 data[0]=data0;
136                 data[1]=data1;
137                 data[2]=data2;
138                 data[3]=data3;
139                 data[4]=data4;
140         }
141 #endif
142         eServiceReference(int type, int flags, const std::string &path)
143                 : type(type), flags(flags), path(path)
144         {
145                 memset(data, 0, sizeof(data));
146         }
147         eServiceReference(const std::string &string);
148         std::string toString() const;
149         std::string toCompareString() const;
150         bool operator==(const eServiceReference &c) const
151         {
152                 if (type != c.type)
153                         return 0;
154                 return (memcmp(data, c.data, sizeof(int)*8)==0) && (path == c.path);
155         }
156         bool operator!=(const eServiceReference &c) const
157         {
158                 return !(*this == c);
159         }
160         bool operator<(const eServiceReference &c) const
161         {
162                 if (type < c.type)
163                         return 1;
164
165                 if (type > c.type)
166                         return 0;
167
168                 int r=memcmp(data, c.data, sizeof(int)*8);
169                 if (r)
170                         return r < 0;
171                 return path < c.path;
172         }
173         operator bool() const
174         {
175                 return valid();
176         }
177         
178         int valid() const
179         {
180                 return type != idInvalid;
181         }
182 };
183
184 SWIG_ALLOW_OUTPUT_SIMPLE(eServiceReference);
185
186 extern PyObject *New_eServiceReference(const eServiceReference &ref); // defined in enigma_python.i
187
188 #ifndef SWIG
189 #ifdef PYTHON_REFCOUNT_DEBUG
190 inline ePyObject Impl_New_eServiceReference(const char* file, int line, const eServiceReference &ref)
191 {
192         return ePyObject(New_eServiceReference(ref), file, line);
193 }
194 #define NEW_eServiceReference(ref) Impl_New_eServiceReference(__FILE__, __LINE__, ref)
195 #else
196 inline ePyObject Impl_New_eServiceReference(const eServiceReference &ref)
197 {
198         return New_eServiceReference(ref);
199 }
200 #define NEW_eServiceReference(ref) Impl_New_eServiceReference(ref)
201 #endif
202 #endif // SWIG
203
204 typedef long long pts_t;
205
206         /* the reason we have the servicereference as additional argument is
207            that we don't have to create one object for every entry in a possibly
208            large list, provided that no state information is nessesary to deliver
209            the required information. Anyway - ref *must* be the same as the argument
210            to the info() or getIServiceInformation call! */
211
212         /* About the usage of SWIG_VOID:
213            SWIG_VOID(real_returntype_t) hides a return value from swig. This is used for
214            the "superflouus" RESULT return values.
215            
216            Python code has to check the returned pointer against 0. This works,
217            as all functions returning instances in smartpointers AND having a 
218            RESULT have to BOTH return non-zero AND set the pointer to zero.
219            
220            Python code thus can't check for the reason, but the reason isn't
221            user-servicable anyway. If you want to return a real reason which
222            goes beyong "it just doesn't work", use extra variables for this,
223            not the RESULT.
224            
225            Hide the result only if there is another way to check for failure! */
226            
227 class eServiceEvent;
228
229 SWIG_IGNORE(iStaticServiceInformation);
230 class iStaticServiceInformation: public iObject
231 {
232 #ifdef SWIG
233         iStaticServiceInformation();
234         ~iStaticServiceInformation();
235 #endif
236 public:
237         virtual SWIG_VOID(RESULT) getName(const eServiceReference &ref, std::string &SWIG_OUTPUT)=0;
238
239                 // doesn't need to be implemented, should return -1 then.
240         virtual int getLength(const eServiceReference &ref);
241         virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time=-1);
242                 // returns true when not implemented
243         virtual int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
244
245         virtual int getInfo(const eServiceReference &ref, int w);
246         virtual std::string getInfoString(const eServiceReference &ref,int w);
247         virtual PyObject *getInfoObject(const eServiceReference &ref, int w);
248
249         virtual int setInfo(const eServiceReference &ref, int w, int v);
250         virtual int setInfoString(const eServiceReference &ref, int w, const char *v);
251 };
252 SWIG_TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
253
254 class iServiceInformation_ENUMS
255 {
256 #ifdef SWIG
257         iServiceInformation_ENUMS();
258         ~iServiceInformation_ENUMS();
259 #endif
260 public:
261         enum {
262                 sIsCrypted,             /* is encrypted (no indication if decrypt was possible) */
263                 sAspect,                /* aspect ratio: 0=4:3, 1=16:9, 2=whatever we need */
264                 sIsMultichannel,        /* multichannel *available* (probably not selected) */
265
266                         /* "user serviceable info" - they are not reliable. Don't use them for anything except the service menu!
267                            that's also the reason why they are so globally defined.
268                            again - if somebody EVER tries to use this information for anything else than simply displaying it,
269                            i will change this to return a user-readable text like "zero x zero three three" (and change the
270                            exact spelling in every version) to stop that! */
271
272                 sVideoPID,
273                 sAudioPID,
274                 sPCRPID,
275                 sPMTPID,
276                 sTXTPID,
277
278                 sSID,
279                 sONID,
280                 sTSID,
281                 sNamespace,
282                 sProvider,
283
284                 sDescription,
285                 sServiceref,
286                 sTimeCreate,            /* unix time or string */
287
288                 sTitle,
289                 sArtist,
290                 sAlbum,
291                 sComment,
292                 sTracknumber,
293                 sGenre,
294                 sCAIDs,
295                 sVideoType,             /* MPEG2 MPEG4 */
296
297                 sTags,                          /* space seperated list of tags */
298
299                 sDVBState,                      /* states as defined in pmt handler (as events there) */
300
301                 sVideoHeight,
302                 sVideoWidth,
303
304                 sTransponderData,       /* transponderdata as python dict */
305
306                 sUser = 0x100
307         };
308         enum {
309                 resNA = -1,
310                 resIsString = -2,
311                 resIsPyObject = -3
312         };
313 };
314
315 /* some words to structs like struct iServiceInformation_ENUMS
316 For some classes we need in python just the SmartPointer Variants.
317 So we prevent building wrapper classes for the non smart pointer classes with the SWIG_IGNORE makro.
318 But now we have the problem that swig do not export enums for smart pointer classes (i dont know why).
319 So we move all enum's to own classes (with _ENUMS as name ending) and let our real
320 class inherit from the *_ENUMS class. This *_ENUMS classes are normally exportet via swig to python.
321 But in the python code we doesn't like to write iServiceInformation_ENUMS.sVideoType....
322 we like to write iServiceInformation.sVideoType.
323 So until swig have no Solution for this Problem we call in lib/python/Makefile.am a python script named
324 enigma_py_patcher.py to remove the "_ENUMS" strings in enigma.py at all needed locations. */
325
326 SWIG_IGNORE(iServiceInformation);
327 class iServiceInformation: public iServiceInformation_ENUMS, public iObject
328 {
329 #ifdef SWIG
330         iServiceInformation();
331         ~iServiceInformation();
332 #endif
333 public:
334         virtual SWIG_VOID(RESULT) getName(std::string &SWIG_OUTPUT)=0;
335         virtual SWIG_VOID(RESULT) getEvent(ePtr<eServiceEvent> &SWIG_OUTPUT, int nownext);
336
337         virtual int getInfo(int w);
338         virtual std::string getInfoString(int w);
339         virtual PyObject *getInfoObject(int w);
340
341         virtual int setInfo(int w, int v);
342         virtual int setInfoString(int w, const char *v);
343 };
344 SWIG_TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
345
346 class iFrontendInformation_ENUMS
347 {
348 #ifdef SWIG
349         iFrontendInformation_ENUMS();
350         ~iFrontendInformation_ENUMS();
351 #endif
352 public:
353         enum {
354                 bitErrorRate,
355                 signalPower,
356                 signalQuality,
357                 lockState,
358                 syncState,
359                 frontendNumber,
360                 signalQualitydB,
361         };
362 };
363
364 SWIG_IGNORE(iFrontendInformation);
365 class iFrontendInformation: public iFrontendInformation_ENUMS, public iObject
366 {
367 #ifdef SWIG
368         iFrontendInformation();
369         ~iFrontendInformation();
370 #endif
371 public:
372         virtual int getFrontendInfo(int w)=0;
373         virtual PyObject *getFrontendData()=0;
374         virtual PyObject *getFrontendStatus()=0;
375         virtual PyObject *getTransponderData(bool original)=0;
376         virtual PyObject *getAll(bool original)=0; // a sum of getFrontendData/Status/TransponderData
377 };
378 SWIG_TEMPLATE_TYPEDEF(ePtr<iFrontendInformation>, iFrontendInformationPtr);
379
380 SWIG_IGNORE(iPauseableService);
381 class iPauseableService: public iObject
382 {
383 #ifdef SWIG
384         iPausableService();
385         ~iPausableService();
386 #endif
387 public:
388         virtual RESULT pause()=0;
389         virtual RESULT unpause()=0;
390
391                 /* hm. */
392         virtual RESULT setSlowMotion(int ratio=0)=0;
393         virtual RESULT setFastForward(int ratio=0)=0;
394 };
395 SWIG_TEMPLATE_TYPEDEF(ePtr<iPauseableService>, iPauseableServicePtr);
396
397 class iSeekableService_ENUMS
398 {
399 #ifdef SWIG
400         iSeekableService_ENUMS();
401         ~iSeekableService_ENUMS();
402 #endif
403 public:
404         enum { dirForward = +1, dirBackward = -1 };
405 };
406
407 SWIG_IGNORE(iSeekableService);
408 class iSeekableService: public iSeekableService_ENUMS, public iObject
409 {
410 #ifdef SWIG
411         iSeekableService();
412         ~iSeekableService();
413 #endif
414 public:
415         virtual RESULT getLength(pts_t &SWIG_OUTPUT)=0;
416         virtual RESULT seekTo(pts_t to)=0;
417         virtual RESULT seekRelative(int direction, pts_t to)=0;
418         virtual RESULT getPlayPosition(pts_t &SWIG_OUTPUT)=0;
419                 /* if you want to do several seeks in a row, you can enable the trickmode.
420                    audio will be switched off, sync will be disabled etc. */
421         virtual RESULT setTrickmode(int trick=0)=0;
422         virtual RESULT isCurrentlySeekable()=0;
423 };
424 SWIG_TEMPLATE_TYPEDEF(ePtr<iSeekableService>, iSeekableServicePtr);
425
426 struct iAudioTrackInfo
427 {
428 #ifndef SWIG
429         std::string m_description;
430         std::string m_language; /* iso639 */
431         int m_pid; /* for association with the stream. */
432 #endif
433         std::string getDescription() { return m_description; }
434         std::string getLanguage() { return m_language; }
435         int getPID() { return m_pid; }
436 };
437 SWIG_ALLOW_OUTPUT_SIMPLE(iAudioTrackInfo);
438
439 SWIG_IGNORE(iAudioTrackSelection);
440 class iAudioTrackSelection: public iObject
441 {
442 #ifdef SWIG
443         iAudioTrackSelection();
444         ~iAudioTrackSelection();
445 #endif
446 public:
447         virtual int getNumberOfTracks()=0;
448         virtual RESULT selectTrack(unsigned int i)=0;
449         virtual SWIG_VOID(RESULT) getTrackInfo(struct iAudioTrackInfo &SWIG_OUTPUT, unsigned int n)=0;
450         virtual int getCurrentTrack()=0;
451 };
452 SWIG_TEMPLATE_TYPEDEF(ePtr<iAudioTrackSelection>, iAudioTrackSelectionPtr);
453
454 class iAudioChannelSelection_ENUMS
455 {
456 #ifdef SWIG
457         iAudioChannelSelection_ENUMS();
458         ~iAudioChannelSelection_ENUMS();
459 #endif
460 public:
461         enum { LEFT, STEREO, RIGHT };
462 };
463
464 SWIG_IGNORE(iAudioChannelSelection);
465 class iAudioChannelSelection: public iAudioChannelSelection_ENUMS, public iObject
466 {
467 #ifdef SWIG
468         iAudioChannelSelection();
469         ~iAudioChannelSelection();
470 #endif
471 public:
472         virtual int getCurrentChannel()=0;
473         virtual RESULT selectChannel(int i)=0;
474 };
475 SWIG_TEMPLATE_TYPEDEF(ePtr<iAudioChannelSelection>, iAudioChannelSelectionPtr);
476
477 SWIG_IGNORE(iAudioDelay);
478 class iAudioDelay: public iObject
479 {
480 #ifdef SWIG
481         iAudioDelay();
482         ~iAudioDelay();
483 #endif
484 public:
485         virtual int getAC3Delay()=0;
486         virtual int getPCMDelay()=0;
487         virtual void setAC3Delay(int)=0;
488         virtual void setPCMDelay(int)=0;
489 };
490 SWIG_TEMPLATE_TYPEDEF(ePtr<iAudioDelay>, iAudioDelayPtr);
491
492 class iRdsDecoder_ENUMS
493 {
494 #ifdef SWIG
495         iRdsDecoder_ENUMS();
496         ~iRdsDecoder_ENUMS();
497 #endif
498 public:
499         enum { RadioText, RtpText };
500 };
501
502 SWIG_IGNORE(iRdsDecoder);
503 class iRdsDecoder: public iObject, public iRdsDecoder_ENUMS
504 {
505 #ifdef SWIG
506         iRdsDecoder();
507         ~iRdsDecoder();
508 #endif
509 public:
510         virtual std::string getText(int x=RadioText)=0;
511         virtual void showRassSlidePicture()=0;
512         virtual void showRassInteractivePic(int page, int subpage)=0;
513         virtual SWIG_PYOBJECT(ePyObject) getRassInteractiveMask()=0;
514 };
515 SWIG_TEMPLATE_TYPEDEF(ePtr<iRdsDecoder>, iRdsDecoderPtr);
516
517 SWIG_IGNORE(iSubserviceList);
518 class iSubserviceList: public iObject
519 {
520 #ifdef SWIG
521         iSubserviceList();
522         ~iSubserviceList();
523 #endif
524 public:
525         virtual int getNumberOfSubservices()=0;
526         virtual SWIG_VOID(RESULT) getSubservice(eServiceReference &SWIG_OUTPUT, unsigned int n)=0;
527 };
528 SWIG_TEMPLATE_TYPEDEF(ePtr<iSubserviceList>, iSubserviceListPtr);
529
530 SWIG_IGNORE(iTimeshiftService);
531 class iTimeshiftService: public iObject
532 {
533 #ifdef SWIG
534         iTimeshiftService();
535         ~iTimeshiftService();
536 #endif
537 public:
538         virtual RESULT startTimeshift()=0;
539         virtual RESULT stopTimeshift()=0;
540
541         virtual int isTimeshiftActive()=0;
542                         /* this essentially seeks to the relative end of the timeshift buffer */
543         virtual RESULT activateTimeshift()=0;
544 };
545 SWIG_TEMPLATE_TYPEDEF(ePtr<iTimeshiftService>, iTimeshiftServicePtr);
546
547         /* not related to eCueSheet */
548
549 class iCueSheet_ENUMS
550 {
551 #ifdef SWIG
552         iCueSheet_ENUMS();
553         ~iCueSheet_ENUMS();
554 #endif
555 public:
556         enum { cutIn = 0, cutOut = 1, cutMark = 2 };
557 };
558
559 SWIG_IGNORE(iCueSheet);
560 class iCueSheet: public iCueSheet_ENUMS, public iObject
561 {
562 #ifdef SWIG
563         iCueSheet();
564         ~iCueSheet();
565 #endif
566 public:
567         /* returns a list of (pts, what)-tuples */
568         virtual PyObject *getCutList() = 0;
569         virtual void setCutList(SWIG_PYOBJECT(ePyObject) list) = 0;
570         virtual void setCutListEnable(int enable) = 0;
571 };
572 SWIG_TEMPLATE_TYPEDEF(ePtr<iCueSheet>, iCueSheetPtr);
573
574 class eWidget;
575 class PyList;
576
577 SWIG_IGNORE(iSubtitleOutput);
578 class iSubtitleOutput: public iObject
579 {
580 public:
581         virtual RESULT enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) entry)=0;
582         virtual RESULT disableSubtitles(eWidget *parent)=0;
583         virtual PyObject *getSubtitleList()=0;
584         virtual PyObject *getCachedSubtitle()=0;
585 };
586 SWIG_TEMPLATE_TYPEDEF(ePtr<iSubtitleOutput>, iSubtitleOutputPtr);
587
588 SWIG_IGNORE(iMutableServiceList);
589 class iMutableServiceList: public iObject
590 {
591 #ifdef SWIG
592         iMutableServiceList();
593         ~iMutableServiceList();
594 #endif
595 public:
596                 /* flush changes */
597         virtual RESULT flushChanges()=0;
598                 /* adds a service to a list */
599         virtual RESULT addService(eServiceReference &ref, eServiceReference before=eServiceReference())=0;
600                 /* removes a service from a list */
601         virtual RESULT removeService(eServiceReference &ref)=0;
602                 /* moves a service in a list, only if list suppports a specific sort method. */
603                 /* pos is the new, absolute position from 0..size-1 */
604         virtual RESULT moveService(eServiceReference &ref, int pos)=0;
605                 /* set name of list, for bouquets this is the visible bouquet name */
606         virtual RESULT setListName(const std::string &name)=0;
607 };
608 SWIG_TEMPLATE_TYPEDEF(ePtr<iMutableServiceList>, iMutableServiceListPtr);
609
610 SWIG_IGNORE(iListableService);
611 class iListableService: public iObject
612 {
613 #ifdef SWIG
614         iListableService();
615         ~iListableService();
616 #endif
617 public:
618 #ifndef SWIG
619                 /* legacy interface: get a list */
620         virtual RESULT getContent(std::list<eServiceReference> &list, bool sorted=false)=0;
621 #endif
622         virtual PyObject *getContent(const char* format, bool sorted=false)=0;
623
624                 /* new, shiny interface: streaming. */
625         virtual SWIG_VOID(RESULT) getNext(eServiceReference &SWIG_OUTPUT)=0;
626
627                 /* use this for sorting. output is not sorted because of either
628                  - performance reasons: the whole list must be buffered or
629                  - the interface would be restricted to a list. streaming
630                    (as well as a future "active" extension) won't be possible.
631                 */
632         virtual int compareLessEqual(const eServiceReference &, const eServiceReference &)=0;
633
634         virtual SWIG_VOID(RESULT) startEdit(ePtr<iMutableServiceList> &SWIG_OUTPUT)=0;
635 };
636 SWIG_TEMPLATE_TYPEDEF(ePtr<iListableService>, iListableServicePtr);
637
638 #ifndef SWIG
639         /* a helper class which can be used as argument to stl's sort(). */
640 class iListableServiceCompare
641 {
642         ePtr<iListableService> m_list;
643 public:
644         iListableServiceCompare(iListableService *list): m_list(list) { }
645         bool operator()(const eServiceReference &a, const eServiceReference &b)
646         {
647                 return m_list->compareLessEqual(a, b);
648         }
649 };
650 #endif
651
652 SWIG_IGNORE(iServiceOfflineOperations);
653 class iServiceOfflineOperations: public iObject
654 {
655 #ifdef SWIG
656         iServiceOfflineOperations();
657         ~iServiceOfflineOperations();
658 #endif
659 public:
660                 /* to delete a service, forever. */
661         virtual RESULT deleteFromDisk(int simulate=1)=0;
662
663                 /* for transferring a service... */
664         virtual SWIG_VOID(RESULT) getListOfFilenames(std::list<std::string> &SWIG_OUTPUT)=0;
665
666                 // TODO: additional stuff, like a conversion interface?
667 };
668 SWIG_TEMPLATE_TYPEDEF(ePtr<iServiceOfflineOperations>, iServiceOfflineOperationsPtr);
669
670 SWIG_IGNORE(iStreamableService);
671 class iStreamableService: public iObject
672 {
673 #ifdef SWIG
674         iStreamableService();
675         ~iStreamableService();
676 #endif
677 public:
678                 /* returns a dict:
679                         { "demux": <n>,
680                           "pids": [(x,type),(y,type),(z,type),..],
681                           ...
682                         }
683                         with type being "video", "audio", "pmt", "pat"...
684                 */
685         virtual PyObject *getStreamingData()=0;
686 };
687 SWIG_TEMPLATE_TYPEDEF(ePtr<iStreamableService>, iStreamableServicePtr);
688
689 class iServiceKeys_ENUMS
690 {
691 #ifdef SWIG
692         iServiceKeys_ENUMS();
693         ~iServiceKeys_ENUMS();
694 #endif
695 public:
696         enum {
697                 keyLeft,
698                 keyRight,
699                 keyUp,
700                 keyDown,
701                 keyOk,
702                 keyUser = 0x100
703         };
704 };
705
706 SWIG_IGNORE(iServiceKeys);
707 class iServiceKeys: public iServiceKeys_ENUMS, public iObject
708 {
709 #ifdef SWIG
710         iServiceKeys();
711         ~iServiceKeys();
712 #endif
713 public:
714         virtual SWIG_VOID(RESULT) keyPressed(int key)=0;
715 };
716 SWIG_TEMPLATE_TYPEDEF(ePtr<iServiceKeys>, iServiceKeysPtr);
717
718 class iPlayableService_ENUMS
719 {
720 #ifdef SWIG
721         iPlayableService_ENUMS();
722         ~iPlayableService_ENUMS();
723 #endif
724 public:
725         enum {
726                         /* these first two events are magical, and should only
727                            be generated if you know what you're doing. */
728                 evStart,
729                 evEnd,
730
731                 evTuneFailed,
732
733                         /* when iServiceInformation is implemented:*/
734                 evUpdatedEventInfo,
735                 evUpdatedInfo,
736
737                         /* when seek() is implemented: */
738                 evSeekableStatusChanged, /* for example when timeshifting */
739
740                 evEOF,
741                 evSOF, /* bounced against start of file (when seeking backwards) */
742
743                         /* when cueSheet is implemented */
744                 evCuesheetChanged,
745
746                         /* when rdsDecoder is implemented */
747                 evUpdatedRadioText,
748                 evUpdatedRtpText,
749
750                         /* Radio Screenshow Support */
751                 evUpdatedRassSlidePic,
752                 evUpdatedRassInteractivePicMask,
753
754                 evVideoSizeChanged,
755
756                 evStopped,
757
758                 evUser = 0x100
759         };
760 };
761
762 SWIG_IGNORE(iPlayableService);
763 class iPlayableService: public iPlayableService_ENUMS, public iObject
764 {
765 #ifdef SWIG
766         iPlayableService();
767         ~iPlaybleService();
768 #endif
769         friend class iServiceHandler;
770 public:
771 #ifndef SWIG
772         virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
773 #endif
774         virtual RESULT start()=0;
775         virtual RESULT stop()=0;
776                         /* might have to be changed... */
777         virtual RESULT setTarget(int target)=0;
778         virtual SWIG_VOID(RESULT) seek(ePtr<iSeekableService> &SWIG_OUTPUT)=0;
779         virtual SWIG_VOID(RESULT) pause(ePtr<iPauseableService> &SWIG_OUTPUT)=0;
780         virtual SWIG_VOID(RESULT) info(ePtr<iServiceInformation> &SWIG_OUTPUT)=0;
781         virtual SWIG_VOID(RESULT) audioTracks(ePtr<iAudioTrackSelection> &SWIG_OUTPUT)=0;
782         virtual SWIG_VOID(RESULT) audioChannel(ePtr<iAudioChannelSelection> &SWIG_OUTPUT)=0;
783         virtual SWIG_VOID(RESULT) subServices(ePtr<iSubserviceList> &SWIG_OUTPUT)=0;
784         virtual SWIG_VOID(RESULT) frontendInfo(ePtr<iFrontendInformation> &SWIG_OUTPUT)=0;
785         virtual SWIG_VOID(RESULT) timeshift(ePtr<iTimeshiftService> &SWIG_OUTPUT)=0;
786         virtual SWIG_VOID(RESULT) cueSheet(ePtr<iCueSheet> &SWIG_OUTPUT)=0;
787         virtual SWIG_VOID(RESULT) subtitle(ePtr<iSubtitleOutput> &SWIG_OUTPUT)=0;
788         virtual SWIG_VOID(RESULT) audioDelay(ePtr<iAudioDelay> &SWIG_OUTPUT)=0;
789         virtual SWIG_VOID(RESULT) rdsDecoder(ePtr<iRdsDecoder> &SWIG_OUTPUT)=0;
790         virtual SWIG_VOID(RESULT) stream(ePtr<iStreamableService> &SWIG_OUTPUT)=0;
791         virtual SWIG_VOID(RESULT) keys(ePtr<iServiceKeys> &SWIG_OUTPUT)=0;
792 };
793 SWIG_TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr);
794
795 class iRecordableService_ENUMS
796 {
797 #ifdef SWIG
798         iRecordableService_ENUMS();
799         ~iRecordableService_ENUMS();
800 #endif
801 public:
802         enum {
803                 evStart,
804                 evEnd,
805                 evTunedIn,
806                 evTuneFailed,
807                 evRecordRunning,
808                 evRecordStopped,
809                 evNewProgramInfo,
810                 evRecordFailed,
811                 evRecordWriteError
812         };
813         enum {
814                 NoError=0,
815                 errOpenRecordFile=-1,
816                 errNoDemuxAvailable=-2,
817                 errNoTsRecorderAvailable=-3,
818                 errDiskFull=-4,
819                 errTuneFailed=-255,
820                 errMisconfiguration = -256,
821                 errNoResources = -257,
822         };
823 };
824
825 SWIG_IGNORE(iRecordableService);
826 class iRecordableService: public iRecordableService_ENUMS, public iObject
827 {
828 #ifdef SWIG
829         iRecordableService();
830         ~iRecordableService();
831 #endif
832 public:
833 #ifndef SWIG
834         virtual RESULT connectEvent(const Slot2<void,iRecordableService*,int> &event, ePtr<eConnection> &connection)=0;
835 #endif
836         virtual SWIG_VOID(RESULT) getError(int &SWIG_OUTPUT)=0;
837         virtual RESULT prepare(const char *filename, time_t begTime=-1, time_t endTime=-1, int eit_event_id=-1)=0;
838         virtual RESULT prepareStreaming()=0;
839         virtual RESULT start()=0;
840         virtual RESULT stop()=0;
841         virtual SWIG_VOID(RESULT) frontendInfo(ePtr<iFrontendInformation> &SWIG_OUTPUT)=0;
842         virtual SWIG_VOID(RESULT) stream(ePtr<iStreamableService> &SWIG_OUTPUT)=0;
843 };
844 SWIG_TEMPLATE_TYPEDEF(ePtr<iRecordableService>, iRecordableServicePtr);
845
846 extern PyObject *New_iRecordableServicePtr(const ePtr<iRecordableService> &ref); // defined in enigma_python.i
847
848 inline PyObject *PyFrom(ePtr<iRecordableService> &c)
849 {
850         return New_iRecordableServicePtr(c);
851 }
852
853 #ifndef SWIG
854 #ifdef PYTHON_REFCOUNT_DEBUG
855 inline ePyObject Impl_New_iRecordableServicePtr(const char* file, int line, const ePtr<iRecordableService> &ptr)
856 {
857         return ePyObject(New_iRecordableServicePtr(ptr), file, line);
858 }
859 #define NEW_iRecordableServicePtr(ptr) Impl_New_iRecordableServicePtr(__FILE__, __LINE__, ptr)
860 #else
861 inline ePyObject Impl_New_iRecordableServicePtr(const ePtr<iRecordableService> &ptr)
862 {
863         return New_iRecordableServicePtr(ptr);
864 }
865 #define NEW_iRecordableServicePtr(ptr) Impl_New_iRecordableServicePtr(ptr)
866 #endif
867 #endif // SWIG
868
869 SWIG_IGNORE(iServiceHandler);
870 class iServiceHandler: public iObject
871 {
872 #ifdef SWIG
873         iServiceHandler();
874         ~iServiceHandler();
875 #endif
876 public:
877         virtual SWIG_VOID(RESULT) play(const eServiceReference &, ePtr<iPlayableService> &SWIG_OUTPUT)=0;
878         virtual SWIG_VOID(RESULT) record(const eServiceReference &, ePtr<iRecordableService> &SWIG_OUTPUT)=0;
879         virtual SWIG_VOID(RESULT) list(const eServiceReference &, ePtr<iListableService> &SWIG_OUTPUT)=0;
880         virtual SWIG_VOID(RESULT) info(const eServiceReference &, ePtr<iStaticServiceInformation> &SWIG_OUTPUT)=0;
881         virtual SWIG_VOID(RESULT) offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &SWIG_OUTPUT)=0;
882 };
883 SWIG_TEMPLATE_TYPEDEF(ePtr<iServiceHandler>, iServiceHandlerPtr);
884
885 #endif