1 #ifndef __lib_dvb_iservice_h
2 #define __lib_dvb_iservice_h
4 #include <lib/python/swig.h>
5 #include <lib/base/object.h>
7 #include <connection.h>
10 class eServiceReference
16 idStructure, // service_id == 0 is root
23 int flags; // flags will NOT be compared.
26 isDirectory=1, // SHOULD enter (implies mustDescent)
27 mustDescent=2, // cannot be played directly - often used with "isDirectory" (implies canDescent)
30 normal services have none of them - they can be fed directly into the "play"-handler.
31 normal directories have both of them set - you cannot play a directory directly and the UI should descent into it.
32 playlists have "mustDescent", but not "isDirectory" - you don't want the user to browse inside the playlist (unless he really wants)
33 services with sub-services have none of them, instead the have the "canDecsent" flag (as all of the above)
35 canDescent=4, // supports enterDirectory/leaveDirectory
36 flagDirectory=isDirectory|mustDescent|canDescent,
37 shouldSort=8, // should be ASCII-sorted according to service_name. great for directories.
38 hasSortKey=16, // has a sort key in data[3]. not having a sort key implies 0.
39 sort1=32 // sort key is 1 instead of 0
42 inline int getSortKey() const { return (flags & hasSortKey) ? data[3] : ((flags & sort1) ? 1 : 0); }
48 : type(idInvalid), flags(0)
52 eServiceReference(int type, int flags)
53 : type(type), flags(flags)
55 memset(data, 0, sizeof(data));
57 eServiceReference(int type, int flags, int data0)
58 : type(type), flags(flags)
60 memset(data, 0, sizeof(data));
63 eServiceReference(int type, int flags, int data0, int data1)
64 : type(type), flags(flags)
66 memset(data, 0, sizeof(data));
70 eServiceReference(int type, int flags, int data0, int data1, int data2)
71 : type(type), flags(flags)
73 memset(data, 0, sizeof(data));
78 eServiceReference(int type, int flags, int data0, int data1, int data2, int data3)
79 : type(type), flags(flags)
81 memset(data, 0, sizeof(data));
87 eServiceReference(int type, int flags, int data0, int data1, int data2, int data3, int data4)
88 : type(type), flags(flags)
90 memset(data, 0, sizeof(data));
97 eServiceReference(int type, int flags, const std::string &path)
98 : type(type), flags(flags), path(path)
100 memset(data, 0, sizeof(data));
102 eServiceReference(const std::string &string);
103 std::string toString() const;
104 bool operator==(const eServiceReference &c) const
108 return /* (flags == c.flags) && */ (memcmp(data, c.data, sizeof(int)*8)==0) && (path == c.path);
110 bool operator!=(const eServiceReference &c) const
112 return !(*this == c);
114 bool operator<(const eServiceReference &c) const
122 /* if (flags < c.flags)
127 int r=memcmp(data, c.data, sizeof(int)*8);
130 return path < c.path;
132 operator bool() const
134 return type != idInvalid;
138 typedef unsigned long long pts_t;
140 /* the reason we have the servicereference as additional argument is
141 that we don't have to create one object for every entry in a possibly
142 large list, provided that no state information is nessesary to deliver
143 the required information. Anyway - ref *must* be the same as the argument
144 to the info() or getIServiceInformation call! */
146 /* About the usage of SWIG_VOID:
147 SWIG_VOID(real_returntype_t) hides a return value from swig. This is used for
148 the "superflouus" RESULT return values.
150 Python code has to check the returned pointer against 0. This works,
151 as all functions returning instances in smartpointers AND having a
152 RESULT have to BOTH return non-zero AND set the pointer to zero.
154 Python code thus can't check for the reason, but the reason isn't
155 user-servicable anyway. If you want to return a real reason which
156 goes beyong "it just doesn't work", use extra variables for this,
159 Hide the result only if there is another way to check for failure! */
161 class iStaticServiceInformation: public iObject
164 virtual SWIG_VOID(RESULT) getName(const eServiceReference &ref, std::string &SWIG_OUTPUT)=0;
166 // doesn't need to be implemented, should return -1 then.
167 virtual int getLength(const eServiceReference &ref)=0;
170 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
174 class iServiceInformation: public iObject
177 virtual SWIG_VOID(RESULT) getName(std::string &SWIG_OUTPUT)=0;
178 virtual SWIG_VOID(RESULT) getEvent(ePtr<eServiceEvent> &SWIG_OUTPUT, int nownext);
181 TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
183 class iPauseableService: public iObject
186 virtual RESULT pause()=0;
187 virtual RESULT unpause()=0;
190 TEMPLATE_TYPEDEF(ePtr<iPauseableService>, iPauseableServicePtr);
192 class iSeekableService: public iObject
195 virtual RESULT getLength(pts_t &SWIG_OUTPUT)=0;
196 virtual RESULT seekTo(pts_t to)=0;
197 virtual RESULT getPlayPosition(pts_t &SWIG_OUTPUT)=0;
200 TEMPLATE_TYPEDEF(ePtr<iSeekableService>, iSeekableServicePtr);
202 class iPlayableService: public iObject
204 friend class iServiceHandler;
211 // when iServiceInformation is implemented:
214 virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
215 virtual RESULT start()=0;
216 virtual RESULT stop()=0;
217 virtual SWIG_VOID(RESULT) seek(ePtr<iSeekableService> &SWIG_OUTPUT)=0;
218 virtual SWIG_VOID(RESULT) pause(ePtr<iPauseableService> &SWIG_OUTPUT)=0;
219 virtual SWIG_VOID(RESULT) info(ePtr<iServiceInformation> &SWIG_OUTPUT)=0;
222 TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr);
224 class iRecordableService: public iObject
227 virtual RESULT prepare()=0;
228 virtual RESULT start()=0;
229 virtual RESULT stop()=0;
232 TEMPLATE_TYPEDEF(ePtr<iRecordableService>, iRecordableServicePtr);
234 // TEMPLATE_TYPEDEF(std::list<eServiceReference>, eServiceReferenceList);
236 class iListableService: public iObject
239 /* legacy interface: get a list */
240 virtual RESULT getContent(std::list<eServiceReference> &list)=0;
242 /* new, shiny interface: streaming. */
243 virtual SWIG_VOID(RESULT) getNext(eServiceReference &SWIG_OUTPUT)=0;
246 TEMPLATE_TYPEDEF(ePtr<iListableService>, iListableServicePtr);
248 class iServiceHandler: public iObject
251 virtual SWIG_VOID(RESULT) play(const eServiceReference &, ePtr<iPlayableService> &SWIG_OUTPUT)=0;
252 virtual SWIG_VOID(RESULT) record(const eServiceReference &, ePtr<iRecordableService> &SWIG_OUTPUT)=0;
253 virtual SWIG_VOID(RESULT) list(const eServiceReference &, ePtr<iListableService> &SWIG_OUTPUT)=0;
254 virtual SWIG_VOID(RESULT) info(const eServiceReference &, ePtr<iStaticServiceInformation> &SWIG_OUTPUT)=0;
257 TEMPLATE_TYPEDEF(ePtr<iServiceHandler>, iServiceHandlerPtr);