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! */
145 class iStaticServiceInformation: public iObject
148 virtual RESULT getName(const eServiceReference &ref, std::string &name)=0;
150 // doesn't need to be implemented, should return -1 then.
151 virtual int getLength(const eServiceReference &ref)=0;
154 std::string getName(const eServiceReference &ref) { std::string temp; getName(ref, temp); return temp; }
157 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
161 class iServiceInformation: public iObject
164 virtual RESULT getName(std::string &name)=0;
166 std::string getName() { std::string temp; getName(temp); return temp; }
167 virtual RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
170 TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
172 class iPauseableService: public iObject
175 virtual RESULT pause()=0;
176 virtual RESULT unpause()=0;
179 TEMPLATE_TYPEDEF(ePtr<iPauseableService>, iPauseableServicePtr);
181 class iSeekableService: public iObject
184 virtual RESULT getLength(pts_t &SWIG_OUTPUT)=0;
185 virtual RESULT seekTo(pts_t to)=0;
186 virtual RESULT getPlayPosition(pts_t &SWIG_OUTPUT)=0;
189 TEMPLATE_TYPEDEF(ePtr<iSeekableService>, iSeekableServicePtr);
191 class iPlayableService: public iObject
193 friend class iServiceHandler;
200 // when iServiceInformation is implemented:
203 virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
204 virtual RESULT start()=0;
205 virtual RESULT stop()=0;
206 virtual RESULT seek(ePtr<iSeekableService> &ptr)=0;
207 virtual RESULT pause(ePtr<iPauseableService> &ptr)=0;
208 virtual RESULT info(ePtr<iServiceInformation> &ptr)=0;
211 TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr);
213 class iRecordableService: public iObject
216 virtual RESULT prepare()=0;
217 virtual RESULT start()=0;
218 virtual RESULT stop()=0;
221 TEMPLATE_TYPEDEF(ePtr<iRecordableService>, iRecordableServicePtr);
223 // TEMPLATE_TYPEDEF(std::list<eServiceReference>, eServiceReferenceList);
225 class iListableService: public iObject
228 /* legacy interface: get a list */
229 virtual RESULT getContent(std::list<eServiceReference> &list)=0;
231 /* new, shiny interface: streaming. */
232 virtual RESULT getNext(eServiceReference &ptr)=0;
235 TEMPLATE_TYPEDEF(ePtr<iListableService>, iListableServicePtr);
237 class iServiceHandler: public iObject
240 virtual RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr)=0;
241 virtual RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr)=0;
242 virtual RESULT list(const eServiceReference &, ePtr<iListableService> &ptr)=0;
243 virtual RESULT info(const eServiceReference &, ePtr<iStaticServiceInformation> &ptr);
246 TEMPLATE_TYPEDEF(ePtr<iServiceHandler>, iServiceHandlerPtr);