1 #ifndef __lib_dvb_iservice_h
2 #define __lib_dvb_iservice_h
4 #include <lib/base/object.h>
6 #include <connection.h>
9 class eServiceReference
15 idStructure, // service_id == 0 is root
22 int flags; // flags will NOT be compared.
25 isDirectory=1, // SHOULD enter (implies mustDescent)
26 mustDescent=2, // cannot be played directly - often used with "isDirectory" (implies canDescent)
29 normal services have none of them - they can be fed directly into the "play"-handler.
30 normal directories have both of them set - you cannot play a directory directly and the UI should descent into it.
31 playlists have "mustDescent", but not "isDirectory" - you don't want the user to browse inside the playlist (unless he really wants)
32 services with sub-services have none of them, instead the have the "canDecsent" flag (as all of the above)
34 canDescent=4, // supports enterDirectory/leaveDirectory
35 flagDirectory=isDirectory|mustDescent|canDescent,
36 shouldSort=8, // should be ASCII-sorted according to service_name. great for directories.
37 hasSortKey=16, // has a sort key in data[3]. not having a sort key implies 0.
38 sort1=32 // sort key is 1 instead of 0
41 inline int getSortKey() const { return (flags & hasSortKey) ? data[3] : ((flags & sort1) ? 1 : 0); }
47 : type(idInvalid), flags(0)
51 eServiceReference(int type, int flags)
52 : type(type), flags(flags)
54 memset(data, 0, sizeof(data));
56 eServiceReference(int type, int flags, int data0)
57 : type(type), flags(flags)
59 memset(data, 0, sizeof(data));
62 eServiceReference(int type, int flags, int data0, int data1)
63 : type(type), flags(flags)
65 memset(data, 0, sizeof(data));
69 eServiceReference(int type, int flags, int data0, int data1, int data2)
70 : type(type), flags(flags)
72 memset(data, 0, sizeof(data));
77 eServiceReference(int type, int flags, int data0, int data1, int data2, int data3)
78 : type(type), flags(flags)
80 memset(data, 0, sizeof(data));
86 eServiceReference(int type, int flags, int data0, int data1, int data2, int data3, int data4)
87 : type(type), flags(flags)
89 memset(data, 0, sizeof(data));
96 eServiceReference(int type, int flags, const std::string &path)
97 : type(type), flags(flags), path(path)
99 memset(data, 0, sizeof(data));
101 eServiceReference(const std::string &string);
102 std::string toString() const;
103 bool operator==(const eServiceReference &c) const
107 return /* (flags == c.flags) && */ (memcmp(data, c.data, sizeof(int)*8)==0) && (path == c.path);
109 bool operator!=(const eServiceReference &c) const
111 return !(*this == c);
113 bool operator<(const eServiceReference &c) const
121 /* if (flags < c.flags)
126 int r=memcmp(data, c.data, sizeof(int)*8);
129 return path < c.path;
131 operator bool() const
133 return type != idInvalid;
137 /* the reason we have the servicereference as additional argument is
138 that we don't have to create one object for every entry in a possibly
139 large list, provided that no state information is nessesary to deliver
140 the required information. Anyway - ref *must* be the same as the argument
141 to the info() or getIServiceInformation call! */
142 class iStaticServiceInformation: public iObject
145 virtual RESULT getName(const eServiceReference &ref, std::string &name)=0;
148 TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
152 class iServiceInformation: public iStaticServiceInformation
155 virtual RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
158 TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
160 class iPauseableService: public iObject
163 virtual RESULT pause()=0;
164 virtual RESULT unpause()=0;
167 TEMPLATE_TYPEDEF(ePtr<iPauseableService>, iPauseableServicePtr);
169 class iPlayableService: public iObject
171 friend class iServiceHandler;
178 // when iServiceInformation is implemented:
181 virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
182 virtual RESULT start()=0;
183 virtual RESULT stop()=0;
184 virtual RESULT pause(ePtr<iPauseableService> &ptr)=0;
185 virtual RESULT info(ePtr<iServiceInformation> &ptr)=0;
188 TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr);
190 class iRecordableService: public iObject
193 virtual RESULT start()=0;
194 virtual RESULT stop()=0;
197 TEMPLATE_TYPEDEF(ePtr<iRecordableService>, iRecordableServicePtr);
199 // TEMPLATE_TYPEDEF(std::list<eServiceReference>, eServiceReferenceList);
201 class iListableService: public iObject
204 virtual RESULT getContent(std::list<eServiceReference> &list)=0;
207 TEMPLATE_TYPEDEF(ePtr<iListableService>, iListableServicePtr);
209 class iServiceHandler: public iObject
212 virtual RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr)=0;
213 virtual RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr)=0;
214 virtual RESULT list(const eServiceReference &, ePtr<iListableService> &ptr)=0;
215 virtual RESULT info(const eServiceReference &, ePtr<iStaticServiceInformation> &ptr);
218 TEMPLATE_TYPEDEF(ePtr<iServiceHandler>, iServiceHandlerPtr);