add playlists
[enigma2.git] / lib / service / iservice.h
1 #ifndef __lib_dvb_iservice_h
2 #define __lib_dvb_iservice_h
3
4 #include <lib/base/object.h>
5 #include <lib/base/estring.h>
6 #include <connection.h>
7 #include <list>
8
9 class eServiceReference
10 {
11 public:
12         enum
13         {
14                 idInvalid=-1,
15                 idStructure,    // service_id == 0 is root
16                 idDVB,
17                 idFile,
18                 idUser=0x1000
19         };
20         int type;
21
22         int flags; // flags will NOT be compared.
23         enum
24         {
25                 isDirectory=1,          // SHOULD enter  (implies mustDescent)
26                 mustDescent=2,          // cannot be played directly - often used with "isDirectory" (implies canDescent)
27                 /*
28                         for example:
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)
33                 */
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
39         };
40
41         inline int getSortKey() const { return (flags & hasSortKey) ? data[3] : ((flags & sort1) ? 1 : 0); }
42
43         int data[8];
44         eString path;
45
46         eServiceReference()
47                 : type(idInvalid), flags(0)
48         {
49         }
50
51         eServiceReference(int type, int flags)
52                 : type(type), flags(flags)
53         {
54                 memset(data, 0, sizeof(data));
55         }
56         eServiceReference(int type, int flags, int data0)
57                 : type(type), flags(flags)
58         {
59                 memset(data, 0, sizeof(data));
60                 data[0]=data0;
61         }
62         eServiceReference(int type, int flags, int data0, int data1)
63                 : type(type), flags(flags)
64         {
65                 memset(data, 0, sizeof(data));
66                 data[0]=data0;
67                 data[1]=data1;
68         }
69         eServiceReference(int type, int flags, int data0, int data1, int data2)
70                 : type(type), flags(flags)
71         {
72                 memset(data, 0, sizeof(data));
73                 data[0]=data0;
74                 data[1]=data1;
75                 data[2]=data2;
76         }
77         eServiceReference(int type, int flags, int data0, int data1, int data2, int data3)
78                 : type(type), flags(flags)
79         {
80                 memset(data, 0, sizeof(data));
81                 data[0]=data0;
82                 data[1]=data1;
83                 data[2]=data2;
84                 data[3]=data3;
85         }
86         eServiceReference(int type, int flags, int data0, int data1, int data2, int data3, int data4)
87                 : type(type), flags(flags)
88         {
89                 memset(data, 0, sizeof(data));
90                 data[0]=data0;
91                 data[1]=data1;
92                 data[2]=data2;
93                 data[3]=data3;
94                 data[4]=data4;
95         }
96         eServiceReference(int type, int flags, const eString &path)
97                 : type(type), flags(flags), path(path)
98         {
99                 memset(data, 0, sizeof(data));
100         }
101         eServiceReference(const eString &string);
102         eString toString() const;
103         bool operator==(const eServiceReference &c) const
104         {
105                 if (type != c.type)
106                         return 0;
107                 return /* (flags == c.flags) && */ (memcmp(data, c.data, sizeof(int)*8)==0) && (path == c.path);
108         }
109         bool operator!=(const eServiceReference &c) const
110         {
111                 return !(*this == c);
112         }
113         bool operator<(const eServiceReference &c) const
114         {
115                 if (type < c.type)
116                         return 1;
117
118                 if (type > c.type)
119                         return 0;
120                         
121 /*              if (flags < c.flags)
122                         return 1;
123                 if (flags > c.flags)
124                         return 0; */
125
126                 int r=memcmp(data, c.data, sizeof(int)*8);
127                 if (r)
128                         return r < 0;
129                 return path < c.path;
130         }
131         operator bool() const
132         {
133                 return type != idInvalid;
134         }
135 };
136
137 class iServiceInformation: public virtual iObject
138 {
139 public:
140         virtual RESULT getName(eString &name)=0;
141 };
142
143 class iPauseableService: public virtual iObject
144 {
145 public:
146         virtual RESULT pause()=0;
147         virtual RESULT unpause()=0;
148 };
149
150 class iPlayableService: public virtual iObject
151 {
152         friend class iServiceHandler;
153 public:
154         enum
155         {
156                 evStart,
157                 evEnd
158         };
159         virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
160         virtual RESULT start()=0;
161         virtual RESULT stop()=0;
162         virtual RESULT getIPausableService(ePtr<iPauseableService> &ptr)=0;
163         virtual RESULT getIServiceInformation(ePtr<iServiceInformation> &ptr)=0;
164 };
165
166 class iRecordableService: public virtual iObject
167 {
168 public:
169         virtual RESULT start()=0;
170         virtual RESULT stop()=0;
171 };
172
173 class iListableService: public virtual iObject
174 {
175 public:
176         virtual RESULT getContent(std::list<eServiceReference> &list)=0;
177 };
178
179 class iServiceHandler: public virtual iObject
180 {
181 public:
182         virtual RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr)=0;
183         virtual RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr)=0;
184         virtual RESULT list(const eServiceReference &, ePtr<iListableService> &ptr)=0;
185 };
186
187 #endif