handle broken timers.xml gracefully
[enigma2.git] / RecordTimer.py
index 215f9c3ab33930b3cc56e2d5471baac609896406..cf900170c8ac65929a7e41836de789bc39f16d44 100644 (file)
@@ -393,8 +393,22 @@ class RecordTimer(timer.Timer):
        
        def loadTimer(self):
                # TODO: PATH!
-               doc = xml.dom.minidom.parse(self.Filename)
-               
+               try:
+                       doc = xml.dom.minidom.parse(self.Filename)
+               except xml.parsers.expat.ExpatError:
+                       from Tools.Notifications import AddPopup
+                       from Screens.MessageBox import MessageBox
+
+                       AddPopup(_("The timer file (timers.xml) is corrupt and could not be loaded."), type = MessageBox.TYPE_ERROR, timeout = 0, id = "TimerLoadFailed")
+
+                       print "timers.xml failed to load!"
+                       try:
+                               import os
+                               os.rename(self.Filename, self.Filename + "_old")
+                       except IOError:
+                               print "renaming broken timer failed"
+                       return
+
                root = doc.childNodes[0]
                for timer in elementsWithTag(root.childNodes, "timer"):
                        self.record(createTimer(timer))
@@ -482,27 +496,19 @@ class RecordTimer(timer.Timer):
                file.close()
 
        def getNextZapTime(self):
-               llen = len(self.timer_list)
-               idx = 0
                now = time.time()
-               while idx < llen:
-                       timer = self.timer_list[idx]
+               for timer in self.timer_list:
                        if not timer.justplay or timer.begin < now:
-                               idx += 1
-                       else:
-                               return timer.begin
+                               continue
+                       return timer.begin
                return -1
 
        def getNextRecordingTime(self):
-               llen = len(self.timer_list)
-               idx = 0
                now = time.time()
-               while idx < llen:
-                       timer = self.timer_list[idx]
+               for timer in self.timer_list:
                        if timer.justplay or timer.begin < now:
-                               idx += 1
-                       else:
-                               return timer.begin
+                               continue
+                       return timer.begin
                return -1
 
        def record(self, entry):
@@ -510,6 +516,7 @@ class RecordTimer(timer.Timer):
                print "[Timer] Record " + str(entry)
                entry.Timer = self
                self.addTimerEntry(entry)
+               self.saveTimer()
                
        def isInTimer(self, eventid, begin, duration, service):
                time_match = 0
@@ -531,10 +538,20 @@ class RecordTimer(timer.Timer):
                                        sref.setUnsignedData(5, 0)
                                        sref.setUnsignedData(6, 0)
                                        check = x.service_ref.ref.toCompareString() == str(service)
+                                       num = 0
+                                       if check:
+                                               check = False
+                                               event = eEPGCache.getInstance().lookupEventId(sref, eventid)
+                                               num = event and event.getNumOfLinkageServices() or 0
                                        sref.setUnsignedData(1, sid)
                                        sref.setUnsignedData(2, tsid)
                                        sref.setUnsignedData(5, parent_sid)
                                        sref.setUnsignedData(6, parent_tsid)
+                                       for cnt in range(num):
+                                               subservice = event.getLinkageService(sref, cnt)
+                                               if sref.toCompareString() == subservice.toCompareString():
+                                                       check = True
+                                                       break
                        if check:
                                #if x.eit is not None and x.repeated == 0:
                                #       if x.eit == eventid:
@@ -581,6 +598,7 @@ class RecordTimer(timer.Timer):
                print "in running: ", entry in self.timer_list
                # now the timer should be in the processed_timers list. remove it from there.
                self.processed_timers.remove(entry)
+               self.saveTimer()
 
        def shutdown(self):
                self.saveTimer()