config.usage.blinking_display_clock_during_recording now changes behavior
[enigma2.git] / Navigation.py
index c42a62e..7b1deb0 100644 (file)
@@ -1,5 +1,8 @@
-from enigma import *
+from enigma import eServiceCenter, eServiceReference, pNavigation, getBestPlayableServiceReference
+from Components.ParentalControl import parentalControl
+from Tools.BoundFunction import boundFunction
 import RecordTimer
 import RecordTimer
+import SleepTimer
 
 import NavigationInstance
 import ServiceReference
 
 import NavigationInstance
 import ServiceReference
@@ -12,62 +15,95 @@ class Navigation:
                
                NavigationInstance.instance = self
                self.ServiceHandler = eServiceCenter.getInstance()
                
                NavigationInstance.instance = self
                self.ServiceHandler = eServiceCenter.getInstance()
-
+               
                import Navigation as Nav
                Nav.navcore = self
                
                self.pnav = pNavigation()
                import Navigation as Nav
                Nav.navcore = self
                
                self.pnav = pNavigation()
-               self.pnav.m_event.get().append(self.callEvent)
+               self.pnav.m_event.get().append(self.dispatchEvent)
+               self.pnav.m_record_event.get().append(self.dispatchRecordEvent)
                self.event = [ ]
                self.event = [ ]
-               self.currentlyPlayingService = None
+               self.record_event = [ ]
                self.currentlyPlayingServiceReference = None
                self.currentlyPlayingServiceReference = None
-               
+               self.currentlyPlayingService = None
                self.RecordTimer = RecordTimer.RecordTimer()
                self.RecordTimer = RecordTimer.RecordTimer()
+               self.SleepTimer = SleepTimer.SleepTimer()
 
 
-       def callEvent(self, i):
+       def dispatchEvent(self, i):
                for x in self.event:
                        x(i)
                for x in self.event:
                        x(i)
-       
-       def playService(self, ref):
+
+       def dispatchRecordEvent(self, rec_service, event):
+#              print "record_event", rec_service, event
+               for x in self.record_event:
+                       x(rec_service, event)
+
+       def playService(self, ref, checkParentalControl = True):
+               oldref = self.currentlyPlayingServiceReference
+               if ref and oldref and ref == oldref:
+                       print "ignore request to play already running service"
+                       return 0
+               print "playing", ref and ref.toString()
                self.currentlyPlayingServiceReference = None
                self.currentlyPlayingServiceReference = None
+               self.currentlyPlayingService = None
                if ref is None:
                        self.stopService()
                        return 0
                if ref is None:
                        self.stopService()
                        return 0
-               
-               if not self.pnav.playService(ref):
-                       self.currentlyPlayingServiceReference = ref
-                       return 0
+               if not checkParentalControl or parentalControl.isServicePlayable(ref, boundFunction(self.playService, checkParentalControl = False)):
+                       if ref.flags & eServiceReference.isGroup:
+                               if not oldref:
+                                       oldref = eServiceReference()
+                               playref = getBestPlayableServiceReference(ref, oldref)
+                               if not playref or (checkParentalControl and not parentalControl.isServicePlayable(playref, boundFunction(self.playService, checkParentalControl = False))):
+                                       self.stopService()
+                                       return 0
+                       else:
+                               playref = ref
+                       if self.pnav and not self.pnav.playService(playref):
+                               self.currentlyPlayingServiceReference = playref
+                               return 0
+               else:
+                       self.stopService()
                return 1
        
        def getCurrentlyPlayingServiceReference(self):
                return self.currentlyPlayingServiceReference
        
        def recordService(self, ref):
                return 1
        
        def getCurrentlyPlayingServiceReference(self):
                return self.currentlyPlayingServiceReference
        
        def recordService(self, ref):
+               service = None
                print "recording service: %s" % (str(ref))
                if isinstance(ref, ServiceReference.ServiceReference):
                        ref = ref.ref
                print "recording service: %s" % (str(ref))
                if isinstance(ref, ServiceReference.ServiceReference):
                        ref = ref.ref
-               service = self.pnav.recordService(ref)
-               
-               if service is None:
-                       print "record returned non-zero"
-                       return None
-               else:
-                       return service
-       
-       def getCurrentService(self):
-               service = self.pnav.getCurrentService()
-               
-               if service is None:
-                       return None
-               
+               if ref:
+                       if ref.flags & eServiceReference.isGroup:
+                               ref = getBestPlayableServiceReference(ref, eServiceReference())
+                       service = ref and self.pnav and self.pnav.recordService(ref)
+                       if service is None:
+                               print "record returned non-zero"
                return service
                return service
-       
+
+       def stopRecordService(self, service):
+               ret = self.pnav and self.pnav.stopRecordService(service)
+               return ret
+
+       def getRecordings(self):
+               return self.pnav and self.pnav.getRecordings()
+
+       def getCurrentService(self):
+               if not self.currentlyPlayingService:
+                       self.currentlyPlayingService = self.pnav and self.pnav.getCurrentService()
+               return self.currentlyPlayingService
+
        def stopService(self):
        def stopService(self):
-               self.pnav.stopService()
-       
+               print "stopService"
+               if self.pnav:
+                       self.pnav.stopService()
+               self.currentlyPlayingService = None
+               self.currentlyPlayingServiceReference = None
+
        def pause(self, p):
        def pause(self, p):
-               return self.pnav.pause(p)
-       
+               return self.pnav and self.pnav.pause(p)
+
        def recordWithTimer(self, ref, begin, end, name, description, eit):
                if isinstance(ref, eServiceReference):
                        ref = ServiceReference.ServiceReference(ref)
        def recordWithTimer(self, ref, begin, end, name, description, eit):
                if isinstance(ref, eServiceReference):
                        ref = ServiceReference.ServiceReference(ref)
@@ -77,7 +113,8 @@ class Navigation:
        
        def shutdown(self):
                self.RecordTimer.shutdown()
        
        def shutdown(self):
                self.RecordTimer.shutdown()
-               del self.pnav
+               self.ServiceHandler = None
+               self.pnav = None
 
        def stopUserServices(self):
                self.stopService()
 
        def stopUserServices(self):
                self.stopService()