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); }
46 std::string getPath() { return path; }
48 // only for override service names in bouquets or to give servicerefs a name which not have a
49 // real existing service ( for dvb eServiceDVB )
51 std::string getName() { return name; }
54 : type(idInvalid), flags(0)
58 eServiceReference(int type, int flags)
59 : type(type), flags(flags)
61 memset(data, 0, sizeof(data));
63 eServiceReference(int type, int flags, int data0)
64 : type(type), flags(flags)
66 memset(data, 0, sizeof(data));
69 eServiceReference(int type, int flags, int data0, int data1)
70 : type(type), flags(flags)
72 memset(data, 0, sizeof(data));
76 eServiceReference(int type, int flags, int data0, int data1, int data2)
77 : type(type), flags(flags)
79 memset(data, 0, sizeof(data));
84 eServiceReference(int type, int flags, int data0, int data1, int data2, int data3)
85 : type(type), flags(flags)
87 memset(data, 0, sizeof(data));
93 eServiceReference(int type, int flags, int data0, int data1, int data2, int data3, int data4)
94 : type(type), flags(flags)
96 memset(data, 0, sizeof(data));
103 eServiceReference(int type, int flags, const std::string &path)
104 : type(type), flags(flags), path(path)
106 memset(data, 0, sizeof(data));
108 eServiceReference(const std::string &string);
109 std::string toString() const;
110 bool operator==(const eServiceReference &c) const
114 return (memcmp(data, c.data, sizeof(int)*8)==0) && (path == c.path);
116 bool operator!=(const eServiceReference &c) const
118 return !(*this == c);
120 bool operator<(const eServiceReference &c) const
128 int r=memcmp(data, c.data, sizeof(int)*8);
131 return path < c.path;
133 operator bool() const
140 return type != idInvalid;
144 SWIG_ALLOW_OUTPUT_SIMPLE(eServiceReference);
146 typedef long long pts_t;
148 /* the reason we have the servicereference as additional argument is
149 that we don't have to create one object for every entry in a possibly
150 large list, provided that no state information is nessesary to deliver
151 the required information. Anyway - ref *must* be the same as the argument
152 to the info() or getIServiceInformation call! */
154 /* About the usage of SWIG_VOID:
155 SWIG_VOID(real_returntype_t) hides a return value from swig. This is used for
156 the "superflouus" RESULT return values.
158 Python code has to check the returned pointer against 0. This works,
159 as all functions returning instances in smartpointers AND having a
160 RESULT have to BOTH return non-zero AND set the pointer to zero.
162 Python code thus can't check for the reason, but the reason isn't
163 user-servicable anyway. If you want to return a real reason which
164 goes beyong "it just doesn't work", use extra variables for this,
167 Hide the result only if there is another way to check for failure! */
169 class iStaticServiceInformation: public iObject
172 virtual SWIG_VOID(RESULT) getName(const eServiceReference &ref, std::string &SWIG_OUTPUT)=0;
174 // doesn't need to be implemented, should return -1 then.
175 virtual int getLength(const eServiceReference &ref)=0;
178 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
182 TEMPLATE_TYPEDEF(ePtr<eServiceEvent>, eServiceEventPtr);
184 class iServiceInformation: public iObject
187 virtual SWIG_VOID(RESULT) getName(std::string &SWIG_OUTPUT)=0;
188 virtual SWIG_VOID(RESULT) getEvent(ePtr<eServiceEvent> &SWIG_OUTPUT, int nownext);
191 sIsCrypted, /* is encrypted (no indication if decrypt was possible) */
192 sAspect, /* aspect ratio: 0=4:3, 1=16:9, 2=whatever we need */
193 sIsMultichannel, /* multichannel *available* (probably not selected) */
195 /* "user serviceable info" - they are not reliable. Don't use them for anything except the service menu!
196 that's also the reason why they are so globally defined.
199 again - if somebody EVER tries to use this information for anything else than simply displaying it,
200 i will change this to return a user-readable text like "zero x zero three three" (and change the
201 exact spelling in every version) to stop that!
215 enum { resNA = -1, resIsString = -2 };
217 virtual int getInfo(int w);
218 virtual std::string getInfoString(int w);
221 TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
223 class iPauseableService: public iObject
226 virtual RESULT pause()=0;
227 virtual RESULT unpause()=0;
230 TEMPLATE_TYPEDEF(ePtr<iPauseableService>, iPauseableServicePtr);
232 class iSeekableService: public iObject
235 virtual RESULT getLength(pts_t &SWIG_OUTPUT)=0;
236 virtual RESULT seekTo(pts_t to)=0;
237 enum { dirForward = +1, dirBackward = -1 };
238 virtual RESULT seekRelative(int direction, pts_t to)=0;
239 virtual RESULT getPlayPosition(pts_t &SWIG_OUTPUT)=0;
242 TEMPLATE_TYPEDEF(ePtr<iSeekableService>, iSeekableServicePtr);
244 struct iAudioTrackInfo
246 std::string m_description;
247 std::string m_language; /* iso639 */
249 std::string getDescription() { return m_description; }
250 std::string getLanguage() { return m_language; }
253 SWIG_ALLOW_OUTPUT_SIMPLE(iAudioTrackInfo);
255 class iAudioTrackSelection: public iObject
258 virtual int getNumberOfTracks()=0;
259 virtual RESULT selectTrack(unsigned int i)=0;
260 virtual SWIG_VOID(RESULT) getTrackInfo(struct iAudioTrackInfo &SWIG_OUTPUT, unsigned int n)=0;
263 TEMPLATE_TYPEDEF(ePtr<iAudioTrackSelection>, iAudioTrackSelectionPtr);
266 class iPlayableService: public iObject
268 friend class iServiceHandler;
276 // when iServiceInformation is implemented:
280 virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
281 virtual RESULT start()=0;
282 virtual RESULT stop()=0;
283 virtual SWIG_VOID(RESULT) seek(ePtr<iSeekableService> &SWIG_OUTPUT)=0;
284 virtual SWIG_VOID(RESULT) pause(ePtr<iPauseableService> &SWIG_OUTPUT)=0;
285 virtual SWIG_VOID(RESULT) info(ePtr<iServiceInformation> &SWIG_OUTPUT)=0;
286 virtual SWIG_VOID(RESULT) audioTracks(ePtr<iAudioTrackSelection> &SWIG_OUTPUT)=0;
289 TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr);
291 class iRecordableService: public iObject
294 virtual RESULT prepare(const char *filename)=0;
295 virtual RESULT start()=0;
296 virtual RESULT stop()=0;
299 TEMPLATE_TYPEDEF(ePtr<iRecordableService>, iRecordableServicePtr);
301 // TEMPLATE_TYPEDEF(std::list<eServiceReference>, eServiceReferenceList);
303 class iMutableServiceList: public iObject
307 virtual RESULT flushChanges()=0;
308 /* adds a service to a list */
309 virtual RESULT addService(eServiceReference &ref)=0;
310 /* removes a service from a list */
311 virtual RESULT removeService(eServiceReference &ref)=0;
312 /* moves a service in a list, only if list suppports a specific sort method. */
313 /* pos is the new, absolute position from 0..size-1 */
314 virtual RESULT moveService(eServiceReference &ref, int pos)=0;
317 TEMPLATE_TYPEDEF(ePtr<iMutableServiceList>, iMutableServiceListPtr);
319 class iListableService: public iObject
322 /* legacy interface: get a list */
323 virtual RESULT getContent(std::list<eServiceReference> &list)=0;
325 /* new, shiny interface: streaming. */
326 virtual SWIG_VOID(RESULT) getNext(eServiceReference &SWIG_OUTPUT)=0;
328 /* use this for sorting. output is not sorted because of either
329 - performance reasons: the whole list must be buffered or
330 - the interface would be restricted to a list. streaming
331 (as well as a future "active" extension) won't be possible.
333 virtual int compareLessEqual(const eServiceReference &, const eServiceReference &)=0;
335 virtual SWIG_VOID(RESULT) startEdit(ePtr<iMutableServiceList> &SWIG_OUTPUT)=0;
338 TEMPLATE_TYPEDEF(ePtr<iListableService>, iListableServicePtr);
340 /* a helper class which can be used as argument to stl's sort(). */
341 class iListableServiceCompare
343 ePtr<iListableService> m_list;
345 iListableServiceCompare(iListableService *list): m_list(list) { }
346 bool operator()(const eServiceReference &a, const eServiceReference &b)
348 return m_list->compareLessEqual(a, b);
352 class iServiceOfflineOperations: public iObject
355 /* to delete a service, forever. */
356 virtual RESULT deleteFromDisk(int simulate=1)=0;
358 /* for transferring a service... */
359 virtual SWIG_VOID(RESULT) getListOfFilenames(std::list<std::string> &SWIG_OUTPUT)=0;
361 // TODO: additional stuff, like a conversion interface?
364 TEMPLATE_TYPEDEF(ePtr<iServiceOfflineOperations>, iServiceOfflineOperationsPtr);
366 class iServiceHandler: public iObject
369 virtual SWIG_VOID(RESULT) play(const eServiceReference &, ePtr<iPlayableService> &SWIG_OUTPUT)=0;
370 virtual SWIG_VOID(RESULT) record(const eServiceReference &, ePtr<iRecordableService> &SWIG_OUTPUT)=0;
371 virtual SWIG_VOID(RESULT) list(const eServiceReference &, ePtr<iListableService> &SWIG_OUTPUT)=0;
372 virtual SWIG_VOID(RESULT) info(const eServiceReference &, ePtr<iStaticServiceInformation> &SWIG_OUTPUT)=0;
373 virtual SWIG_VOID(RESULT) offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &SWIG_OUTPUT)=0;
376 TEMPLATE_TYPEDEF(ePtr<iServiceHandler>, iServiceHandlerPtr);