fix bluescreen(segfault) in automatic service scan .. part2
[enigma2.git] / timer.py
index 5c664bbe097f6bd48ab67fa65e0d904d0d17ca65..0ad53af9d79addeb55d05f7454256fc7070d0af2 100644 (file)
--- a/timer.py
+++ b/timer.py
@@ -2,6 +2,8 @@ from bisect import insort
 from time import strftime, time, localtime, gmtime, mktime
 from calendar import timegm
 from enigma import eTimer
 from time import strftime, time, localtime, gmtime, mktime
 from calendar import timegm
 from enigma import eTimer
+import calendar
+import datetime
 
 class TimerEntry:
        StateWaiting  = 0
 
 class TimerEntry:
        StateWaiting  = 0
@@ -15,6 +17,9 @@ class TimerEntry:
                self.end = end
                self.state = 0
                self.resetRepeated()
                self.end = end
                self.state = 0
                self.resetRepeated()
+               #begindate = localtime(self.begin)
+               #newdate = datetime.datetime(begindate.tm_year, begindate.tm_mon, begindate.tm_mday 0, 0, 0);
+               self.repeatedbegindate = begin
                self.backoff = 0
                
                self.disabled = False
                self.backoff = 0
                
                self.disabled = False
@@ -29,6 +34,13 @@ class TimerEntry:
        def isRunning(self):
                return self.state == self.StateRunning
                
        def isRunning(self):
                return self.state == self.StateRunning
                
+       def addOneDay(self, timedatestruct):
+               oldHour = timedatestruct.tm_hour
+               newdate =  (datetime.datetime(timedatestruct.tm_year, timedatestruct.tm_mon, timedatestruct.tm_mday, timedatestruct.tm_hour, timedatestruct.tm_min, timedatestruct.tm_sec) + datetime.timedelta(days=1)).timetuple()
+               if localtime(mktime(newdate)).tm_hour != oldHour:
+                       return (datetime.datetime(timedatestruct.tm_year, timedatestruct.tm_mon, timedatestruct.tm_mday, timedatestruct.tm_hour, timedatestruct.tm_min, timedatestruct.tm_sec) + datetime.timedelta(days=2)).timetuple()                        
+               return newdate
+               
        # update self.begin and self.end according to the self.repeated-flags
        def processRepeated(self, findRunningEvent = True):
                print "ProcessRepeated"
        # update self.begin and self.end according to the self.repeated-flags
        def processRepeated(self, findRunningEvent = True):
                print "ProcessRepeated"
@@ -36,12 +48,13 @@ class TimerEntry:
                        now = int(time()) + 1
 
                        #to avoid problems with daylight saving, we need to calculate with localtime, in struct_time representation
                        now = int(time()) + 1
 
                        #to avoid problems with daylight saving, we need to calculate with localtime, in struct_time representation
+                       localrepeatedbegindate = localtime(self.repeatedbegindate)
                        localbegin = localtime(self.begin)
                        localend = localtime(self.end)
                        localnow = localtime(now)
 
                        localbegin = localtime(self.begin)
                        localend = localtime(self.end)
                        localnow = localtime(now)
 
-                       print strftime("%c", localbegin)
-                       print strftime("%c", localend)
+                       print "localbegin:", strftime("%c", localbegin)
+                       print "localend:", strftime("%c", localend)
 
                        day = []
                        flags = self.repeated
 
                        day = []
                        flags = self.repeated
@@ -55,16 +68,19 @@ class TimerEntry:
 
                        print strftime("%c", localnow)
 
 
                        print strftime("%c", localnow)
 
-                       while ((day[localbegin.tm_wday] != 0) or ((day[localbegin.tm_wday] == 0) and ((findRunningEvent and localend < localnow) or ((not findRunningEvent) and localbegin < localnow)))):
-                               print "localbegin:", strftime("%c", localbegin)
-                               print "localend:", strftime("%c", localend)
-                               #add one day to the struct_time, we have to convert using gmt functions, because the daylight saving flag might change after we add our 86400 seconds
-                               localbegin = gmtime(timegm(localbegin) + 86400)
-                               localend = gmtime(timegm(localend) + 86400)
-
+                       # if day is NOT in the list of repeated days
+                       # OR if the day IS in the list of the repeated days, check, if event is currently running... then if findRunningEvent is false, go to the next event
+                       while ((day[localbegin.tm_wday] != 0) or (mktime(localrepeatedbegindate) > mktime(localbegin))  or ((day[localbegin.tm_wday] == 0) and ((findRunningEvent and localend < localnow) or ((not findRunningEvent) and localbegin < localnow)))):
+                               localbegin = self.addOneDay(localbegin)
+                               localend = self.addOneDay(localend)
+                               print "localbegin after addOneDay:", strftime("%c", localbegin)
+                               print "localend after addOneDay:", strftime("%c", localend)
+                               
                        #we now have a struct_time representation of begin and end in localtime, but we have to calculate back to (gmt) seconds since epoch
                        self.begin = int(mktime(localbegin))
                        #we now have a struct_time representation of begin and end in localtime, but we have to calculate back to (gmt) seconds since epoch
                        self.begin = int(mktime(localbegin))
-                       self.end = int(mktime(localend)) + 1
+                       self.end = int(mktime(localend))
+                       if self.begin == self.end:
+                               self.end += 1
 
                        print "ProcessRepeated result"
                        print strftime("%c", localtime(self.begin))
 
                        print "ProcessRepeated result"
                        print strftime("%c", localtime(self.begin))
@@ -134,17 +150,6 @@ class Timer:
                for f in self.on_state_change:
                        f(entry)
 
                for f in self.on_state_change:
                        f(entry)
 
-       def getNextRecordingTime(self):
-               llen = len(self.timer_list)
-               idx = 0
-               while idx < llen:
-                       timer = self.timer_list[idx]
-                       if timer.justplay:
-                               idx += 1
-                       else:
-                               return timer.begin
-               return -1
-
        def cleanup(self):
                self.processed_timers = [entry for entry in self.processed_timers if entry.disabled]
        
        def cleanup(self):
                self.processed_timers = [entry for entry in self.processed_timers if entry.disabled]