trunk 20080912
[gitenigma.git] / include / lib / dvb / serviceplaylist.h
blob3e9d650cd78182d48f44bf05bb8d47b8a931cba2
1 #ifndef __lib_dvb_serviceplaylist_h
2 #define __lib_dvb_serviceplaylist_h
4 #include <lib/dvb/service.h>
5 #include <list>
7 struct ePlaylistEntry
9 enum
11 // PlaylistEntry types
12 PlaylistEntry=1, // normal PlaylistEntry (no Timerlist entry)
13 SwitchTimerEntry=2, // simple service switch timer
14 RecTimerEntry=4, // timer do recording
15 // Recording subtypes
16 recDVR=8, // timer do DVR recording
17 recVCR=16, // timer do VCR recording (LIRC) not used yet
18 recNgrab=131072, // timer do record via Ngrab Server
19 // Timer States
20 stateWaiting=32, // timer is waiting
21 stateRunning=64, // timer is running
22 statePaused=128, // timer is paused
23 stateFinished=256, // timer is finished
24 stateError=512, // timer has error state(s)
25 // Timer Error states
26 errorNoSpaceLeft=1024, // HDD no space Left ( recDVR )
27 errorUserAborted=2048, // User Action aborts this event
28 errorZapFailed=4096, // Zap to service failed
29 errorOutdated=8192, // Outdated event
30 // box was switched off during the event
31 // advanced entry propertys
32 boundFile=16384, // Playlistentry have an bounded file
33 isSmartTimer=32768, // this is a smart timer (EIT related) not uses Yet
34 isRepeating=262144, // this timer is repeating
35 doFinishOnly=65536, // Finish an running event/action
36 // this events are automatically removed
37 // from the timerlist after finish
38 doShutdown=67108864, // timer shutdown the box
39 doGoSleep=134217728, // timer set box to standby
40 // Repeated Timer Days
41 Su=524288, Mo=1048576, Tue=2097152,
42 Wed=4194304, Thu=8388608, Fr=16777216, Sa=33554432
44 eServicePath services;
45 eServiceReference service;
46 union
48 int current_position;
49 int event_id;
50 int last_activation;
52 time_t time_begin;
53 int duration,
54 type; // event type and current state of timer events...
55 ePlaylistEntry(const eServiceReference &ref)
56 :services(ref), service(services.path.back()), current_position(-1), time_begin(-1), duration(-1), type(PlaylistEntry)
57 { }
58 ePlaylistEntry(const eServiceReference &ref, int current_position)
59 :services(ref), service(services.path.back()), current_position(current_position), time_begin(-1), duration(-1), type(PlaylistEntry)
60 { }
61 ePlaylistEntry(const eServiceReference &ref, int time_begin, int duration, int event_id=-1, int type=SwitchTimerEntry )
62 :services(ref), service(services.path.back()), event_id(event_id), time_begin(time_begin), duration(duration), type(type)
63 { }
64 ePlaylistEntry(const eServicePath &p)
65 :services(p), service(services.path.back()), current_position(-1), time_begin(-1), duration(-1), type(PlaylistEntry)
66 { }
67 const eServicePath &getPath() const { return services; }
68 operator eServiceReference &() { return service; }
69 operator const eServiceReference &() const { return service; }
70 operator const eServicePath &() const { return services; }
72 bool operator == (const eServiceReference &r) const
74 return r == service;
76 bool operator == (const ePlaylistEntry &e) const
78 if ( type == PlaylistEntry )
79 return e.service == service;
80 else if ( type & isRepeating )
81 return (e.service == service)
82 && (e.time_begin == time_begin)
83 && ((e.type & (Su|Mo|Tue|Wed|Thu|Fr|Sa)) == (type & (Su|Mo|Tue|Wed|Thu|Fr|Sa)));
84 else
85 return e.service == service && e.time_begin == time_begin;
87 bool operator < (const ePlaylistEntry &e) const
89 return ( service.descr.compare( e.service.descr ) < 0 ) ;
93 class ePlaylist: public eService
95 eString filename;
96 std::list<ePlaylistEntry> list;
97 __u8 changed;
98 public:
99 int load(const char *filename);
100 int save(const char *filename=0);
102 std::list<ePlaylistEntry>::iterator current;
104 void clear();
105 const std::list<ePlaylistEntry>& getConstList() const { return list; }
106 std::list<ePlaylistEntry>& getList() { changed=1;return list; }
108 int deleteService(std::list<ePlaylistEntry>::iterator it);
109 int moveService(std::list<ePlaylistEntry>::iterator it, std::list<ePlaylistEntry>::iterator before);
111 ePlaylist();
112 ~ePlaylist();
115 class eServicePlaylistHandler: public eServiceHandler
117 static eServicePlaylistHandler *instance;
118 void addFile(void *node, const eString &filename);
120 std::multimap<eServiceReference,eServiceReference> playlists;
121 std::set<int> usedUniqueIDs;
122 public:
123 enum { ID = 0x1001 } ;
124 static eServicePlaylistHandler *getInstance() { return instance; }
126 eService *createService(const eServiceReference &node);
128 eServicePlaylistHandler();
129 ~eServicePlaylistHandler();
131 // service list functions
132 void enterDirectory(const eServiceReference &dir, Signal1<void,const eServiceReference&> &callback);
133 void leaveDirectory(const eServiceReference &dir);
135 eService *addRef(const eServiceReference &service);
136 void removeRef(const eServiceReference &service);
138 // playlist functions
139 eServiceReference newPlaylist(const eServiceReference &parent=eServiceReference(), const eServiceReference &serviceref=eServiceReference());
140 int addNum( int );
141 void removePlaylist(const eServiceReference &service);
144 #endif