code cleanup in ChannelSelection,
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Wed, 29 Nov 2006 21:31:27 +0000 (21:31 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Wed, 29 Nov 2006 21:31:27 +0000 (21:31 +0000)
prepare for new service groups

lib/dvb/db.cpp
lib/dvb/dvb.cpp
lib/dvb/dvb.h
lib/dvb/frontend.cpp
lib/dvb/idvb.h
lib/python/Screens/ChannelSelection.py
lib/service/iservice.h
lib/service/service.cpp
lib/service/servicedvb.cpp

index eb0221a..39a0d3e 100644 (file)
@@ -168,7 +168,7 @@ RESULT eDVBService::getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &
        return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr);
 }
 
        return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr);
 }
 
-bool eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
 {
        ePtr<eDVBResourceManager> res_mgr;
        if ( eDVBResourceManager::getInstance( res_mgr ) )
 {
        ePtr<eDVBResourceManager> res_mgr;
        if ( eDVBResourceManager::getInstance( res_mgr ) )
@@ -180,7 +180,7 @@ bool eDVBService::isPlayable(const eServiceReference &ref, const eServiceReferen
                ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
                return res_mgr->canAllocateChannel(chid, chid_ignore);
        }
                ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
                return res_mgr->canAllocateChannel(chid, chid_ignore);
        }
-       return false;
+       return 0;
 }
 
 int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query)
 }
 
 int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query)
index ff3e471..c3c0a02 100644 (file)
@@ -511,7 +511,7 @@ RESULT eDVBResourceManager::connectChannelAdded(const Slot1<void,eDVBChannel*> &
        return 0;
 }
 
        return 0;
 }
 
-bool eDVBResourceManager::canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm)
+int eDVBResourceManager::canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm)
 {
        ePtr<eDVBRegisteredFrontend> best;
        int bestval = 0;
 {
        ePtr<eDVBRegisteredFrontend> best;
        int bestval = 0;
@@ -524,10 +524,10 @@ bool eDVBResourceManager::canAllocateFrontend(ePtr<iDVBFrontendParameters> &fepa
                                bestval = c;
                }
 
                                bestval = c;
                }
 
-       return bestval>0;
+       return bestval;
 }
 
 }
 
-bool eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore)
+int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore)
 {
        bool ret=true;
        if (m_cached_channel)
 {
        bool ret=true;
        if (m_cached_channel)
index 4ca986b..037c197 100644 (file)
@@ -175,7 +175,7 @@ class eDVBResourceManager: public iObject, public Object
 
        Signal1<void,eDVBChannel*> m_channelAdded;
 
 
        Signal1<void,eDVBChannel*> m_channelAdded;
 
-       bool canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm);
+       int canAllocateFrontend(ePtr<iDVBFrontendParameters> &feparm);
 
        eUsePtr<iDVBChannel> m_cached_channel;
        Connection m_cached_channel_state_changed_conn;
 
        eUsePtr<iDVBChannel> m_cached_channel;
        Connection m_cached_channel_state_changed_conn;
@@ -199,7 +199,7 @@ public:
        };
 
        RESULT connectChannelAdded(const Slot1<void,eDVBChannel*> &channelAdded, ePtr<eConnection> &connection);
        };
 
        RESULT connectChannelAdded(const Slot1<void,eDVBChannel*> &channelAdded, ePtr<eConnection> &connection);
-       bool canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID &ignore);
+       int canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID &ignore);
 
                /* allocate channel... */
        RESULT allocateChannel(const eDVBChannelID &channelid, eUsePtr<iDVBChannel> &channel);
 
                /* allocate channel... */
        RESULT allocateChannel(const eDVBChannelID &channelid, eUsePtr<iDVBChannel> &channel);
index 133aa0f..c4d6412 100644 (file)
@@ -2002,5 +2002,7 @@ int eDVBFrontend::isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)
                ASSERT(!feparm->getDVBS(sat_parm));
                return m_sec->canTune(sat_parm, this, 1 << m_fe);
        }
                ASSERT(!feparm->getDVBS(sat_parm));
                return m_sec->canTune(sat_parm, this, 1 << m_fe);
        }
+       else if (m_type == eDVBFrontend::feCable)
+               return 2;  // more prio for cable frontends
        return 1;
 }
        return 1;
 }
index 1f8aebd..997b2a8 100644 (file)
@@ -272,7 +272,7 @@ public:
        // iStaticServiceInformation
        RESULT getName(const eServiceReference &ref, std::string &name);
        RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
        // iStaticServiceInformation
        RESULT getName(const eServiceReference &ref, std::string &name);
        RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
-       bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
+       int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
 
                /* for filtering: */
        int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
 
                /* for filtering: */
        int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
index c75c421..acd53bc 100644 (file)
@@ -3,8 +3,9 @@ from Components.Button import Button
 from Components.ServiceList import ServiceList
 from Components.ActionMap import NumberActionMap, ActionMap
 from Components.MenuList import MenuList
 from Components.ServiceList import ServiceList
 from Components.ActionMap import NumberActionMap, ActionMap
 from Components.MenuList import MenuList
+from Components.ServiceEventTracker import ServiceEventTracker
 from EpgSelection import EPGSelection
 from EpgSelection import EPGSelection
-from enigma import eServiceReference, eEPGCache, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB
+from enigma import eServiceReference, eEPGCache, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB, iPlayableService, iServiceInformation
 from Components.config import config, ConfigSubsection, ConfigText
 from Screens.FixedMenu import FixedMenu
 from Tools.NumericalTextInput import NumericalTextInput
 from Components.config import config, ConfigSubsection, ConfigText
 from Screens.FixedMenu import FixedMenu
 from Tools.NumericalTextInput import NumericalTextInput
@@ -866,23 +867,40 @@ class ChannelSelectionBase(Screen):
                serviceHandler = eServiceCenter.getInstance()
                if config.usage.multibouquet.value:
                        list = serviceHandler.list(self.bouquet_root)
                serviceHandler = eServiceCenter.getInstance()
                if config.usage.multibouquet.value:
                        list = serviceHandler.list(self.bouquet_root)
-                       if not list is None:
+                       if list:
                                while True:
                                        s = list.getNext()
                                        if not s.valid():
                                                break
                                while True:
                                        s = list.getNext()
                                        if not s.valid():
                                                break
-                                       if ((s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory):
+                                       if (s.flags & eServiceReference.isGroup):
+                                               continue
+                                       if (s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory:
                                                info = serviceHandler.info(s)
                                                info = serviceHandler.info(s)
-                                               if not info is None:
+                                               if info:
                                                        bouquets.append((info.getName(s), s))
                                return bouquets
                else:
                        info = serviceHandler.info(self.bouquet_root)
                                                        bouquets.append((info.getName(s), s))
                                return bouquets
                else:
                        info = serviceHandler.info(self.bouquet_root)
-                       if not info is None:
+                       if info:
                                bouquets.append((info.getName(self.bouquet_root), self.bouquet_root))
                        return bouquets
                return None
 
                                bouquets.append((info.getName(self.bouquet_root), self.bouquet_root))
                        return bouquets
                return None
 
+       def getGroupList(self):
+               groups = [ ]
+               serviceHandler = eServiceCenter.getInstance()
+               list = serviceHandler.list(self.bouquet_root)
+               if list:
+                       while True:
+                               s = list.getNext()
+                               if not s.valid():
+                                       break
+                               if (s.flags & eServiceReference.isGroup) and (s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory:
+                                       info = serviceHandler.info(s)
+                                       if info:
+                                               groups.append((info.getName(s), s))
+               return groups
+
        def keyNumber0(self, num):
                if len(self.servicePath) > 1:
                        self.keyGoUp()
        def keyNumber0(self, num):
                if len(self.servicePath) > 1:
                        self.keyGoUp()
@@ -936,7 +954,11 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                                "keyTV": self.setModeTv,
                        })
 
                                "keyTV": self.setModeTv,
                        })
 
-               self.onShown.append(self.__onShown)
+               self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+                       {
+                               iPlayableService.evStart: self.__evServiceStart,
+                               iPlayableService.evEnd: self.__evServiceEnd
+                       })
 
                self.lastChannelRootTimer = eTimer()
                self.lastChannelRootTimer.timeout.get().append(self.__onCreate)
 
                self.lastChannelRootTimer = eTimer()
                self.lastChannelRootTimer.timeout.get().append(self.__onCreate)
@@ -951,6 +973,17 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                self.lastroot = config.tv.lastroot
                self.revertMode = None
 
                self.lastroot = config.tv.lastroot
                self.revertMode = None
 
+       def __evServiceStart(self):
+               service = self.session.nav.getCurrentService()
+               if service:
+                       info = service.info()
+                       if info:
+                               refstr = info.getInfoString(iServiceInformation.sServiceref)
+                               self.servicelist.setPlayableIgnoreService(eServiceReference(refstr))
+
+       def __evServiceEnd(self):
+               self.servicelist.setPlayableIgnoreService(eServiceReference())
+
        def setMode(self):
                self.restoreRoot()
                lastservice=eServiceReference(self.lastservice.value)
        def setMode(self):
                self.restoreRoot()
                lastservice=eServiceReference(self.lastservice.value)
@@ -990,14 +1023,6 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                if lastservice.valid():
                        self.zap()
 
                if lastservice.valid():
                        self.zap()
 
-       def __onShown(self):
-               self.recallBouquetMode()
-               ref = self.session.nav.getCurrentlyPlayingServiceReference()
-               if ref is not None and ref.valid() and ref.getPath() == "":
-                       self.servicelist.setPlayableIgnoreService(ref)
-               else:
-                       self.servicelist.setPlayableIgnoreService(eServiceReference())
-
        def channelSelected(self):
                ref = self.getCurrentSelection()
                if self.movemode:
        def channelSelected(self):
                ref = self.getCurrentSelection()
                if self.movemode:
@@ -1183,6 +1208,23 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
                                "ok": self.channelSelected,
                        })
 
                                "ok": self.channelSelected,
                        })
 
+               self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+                       {
+                               iPlayableService.evStart: self.__evServiceStart,
+                               iPlayableService.evEnd: self.__evServiceEnd
+                       })
+
+       def __evServiceStart(self):
+               service = self.session.nav.getCurrentService()
+               if service:
+                       info = service.info()
+                       if info:
+                               refstr = info.getInfoString(iServiceInformation.sServiceref)
+                               self.servicelist.setPlayableIgnoreService(eServiceReference(refstr))
+
+       def __evServiceEnd(self):
+               self.servicelist.setPlayableIgnoreService(eServiceReference())
+
        def saveRoot(self):
                path = ''
                for i in self.servicePathRadio:
        def saveRoot(self):
                path = ''
                for i in self.servicePathRadio:
@@ -1225,7 +1267,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
                if lastservice.valid():
                        self.servicelist.setCurrent(lastservice)
                        self.session.nav.playService(lastservice)
                if lastservice.valid():
                        self.servicelist.setCurrent(lastservice)
                        self.session.nav.playService(lastservice)
-                       self.servicelist.setPlayableIgnoreService(lastservice)
                self.info.show()
 
        def channelSelected(self): # just return selected service
                self.info.show()
 
        def channelSelected(self): # just return selected service
@@ -1240,7 +1281,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
                        playingref = self.session.nav.getCurrentlyPlayingServiceReference()
                        if playingref is None or playingref != ref:
                                self.session.nav.playService(ref)
                        playingref = self.session.nav.getCurrentlyPlayingServiceReference()
                        if playingref is None or playingref != ref:
                                self.session.nav.playService(ref)
-                               self.servicelist.setPlayableIgnoreService(ref)
                                config.radio.lastservice.value = ref.toString()
                                config.radio.lastservice.save()
                        self.saveRoot()
                                config.radio.lastservice.value = ref.toString()
                                config.radio.lastservice.save()
                        self.saveRoot()
index 0d11dd7..6cb904e 100644 (file)
@@ -39,7 +39,8 @@ public:
                shouldSort=8,                   // should be ASCII-sorted according to service_name. great for directories.
                hasSortKey=16,          // has a sort key in data[3]. not having a sort key implies 0.
                sort1=32,                                       // sort key is 1 instead of 0
                shouldSort=8,                   // should be ASCII-sorted according to service_name. great for directories.
                hasSortKey=16,          // has a sort key in data[3]. not having a sort key implies 0.
                sort1=32,                                       // sort key is 1 instead of 0
-               isMarker=64                     // Marker
+               isMarker=64,                    // Marker
+               isGroup=128                     // is a group of services
        };
        int flags; // flags will NOT be compared.
 
        };
        int flags; // flags will NOT be compared.
 
@@ -238,7 +239,7 @@ public:
        virtual int getLength(const eServiceReference &ref);
        virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time=-1);
                // returns true when not implemented
        virtual int getLength(const eServiceReference &ref);
        virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time=-1);
                // returns true when not implemented
-       virtual bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
+       virtual int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
 
        virtual int getInfo(const eServiceReference &ref, int w);
        virtual std::string getInfoString(const eServiceReference &ref,int w);
 
        virtual int getInfo(const eServiceReference &ref, int w);
        virtual std::string getInfoString(const eServiceReference &ref,int w);
index 181ec22..82957c8 100644 (file)
@@ -171,9 +171,9 @@ int iStaticServiceInformation::getLength(const eServiceReference &ref)
        return -1;
 }
 
        return -1;
 }
 
-bool iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
 {
 {
-       return true;
+       return 0;
 }
 
 RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
 }
 
 RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
index 871a0b2..4b7d63a 100644 (file)
@@ -39,6 +39,7 @@ class eStaticServiceDVBInformation: public iStaticServiceInformation
 public:
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
 public:
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
+       int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
 };
 
 DEFINE_REF(eStaticServiceDVBInformation);
 };
 
 DEFINE_REF(eStaticServiceDVBInformation);
@@ -90,12 +91,30 @@ int eStaticServiceDVBInformation::getLength(const eServiceReference &ref)
        return -1;
 }
 
        return -1;
 }
 
+int eStaticServiceDVBInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+{
+       ePtr<eDVBResourceManager> res_mgr;
+       if ( eDVBResourceManager::getInstance( res_mgr ) )
+               eDebug("isPlayble... no res manager!!");
+       else
+       {
+               eDVBChannelID chid, chid_ignore;
+               ((const eServiceReferenceDVB&)ref).getChannelID(chid);
+               ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
+               return res_mgr->canAllocateChannel(chid, chid_ignore);
+       }
+       return false;
+}
+
+
 class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation
 {
        DECLARE_REF(eStaticServiceDVBBouquetInformation);
 public:
 class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation
 {
        DECLARE_REF(eStaticServiceDVBBouquetInformation);
 public:
+       eServiceReference m_playable_service;
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
+       int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
 };
 
 DEFINE_REF(eStaticServiceDVBBouquetInformation);
 };
 
 DEFINE_REF(eStaticServiceDVBBouquetInformation);
@@ -133,6 +152,46 @@ RESULT eStaticServiceDVBBouquetInformation::getName(const eServiceReference &ref
                return -1;
 }
 
                return -1;
 }
 
+int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+{
+       if (ref.flags & eServiceReference::isGroup)
+       {
+               ePtr<iDVBChannelList> db;
+               ePtr<eDVBResourceManager> res;
+
+               if (eDVBResourceManager::getInstance(res))
+               {
+                       eDebug("eStaticServiceDVBBouquetInformation::isPlayable failed.. no resource manager!");
+                       return false;
+               }
+
+               if (res->getChannelList(db))
+               {
+                       eDebug("eStaticServiceDVBBouquetInformation::isPlayable failed.. no channel list!");
+                       return false;
+               }
+
+               eBouquet *bouquet=0;
+               if (db->getBouquet(ref, bouquet))
+               {
+                       eDebug("eStaticServiceDVBBouquetInformation::isPlayable failed.. getBouquet failed!");
+                       return false;
+               }
+
+               eDVBChannelID chid, chid_ignore;
+               ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
+               for (std::list<eServiceReference>::iterator it(bouquet->m_services.begin()); it != bouquet->m_services.end(); ++it)
+               {
+                       m_playable_service = *it;
+                       ((const eServiceReferenceDVB&)*it).getChannelID(chid);
+                       if (res->canAllocateChannel(chid, chid_ignore))
+                               return true;
+               }
+       }
+       m_playable_service = eServiceReference();
+       return false;
+}
+
 int eStaticServiceDVBBouquetInformation::getLength(const eServiceReference &ref)
 {
        return -1;
 int eStaticServiceDVBBouquetInformation::getLength(const eServiceReference &ref)
 {
        return -1;
@@ -1211,6 +1270,7 @@ int eDVBServicePlay::getInfo(int w)
        case sTSID: return ((const eServiceReferenceDVB&)m_reference).getTransportStreamID().get();
        case sNamespace: return ((const eServiceReferenceDVB&)m_reference).getDVBNamespace().get();
        case sProvider: if (!m_dvb_service) return -1; return -2;
        case sTSID: return ((const eServiceReferenceDVB&)m_reference).getTransportStreamID().get();
        case sNamespace: return ((const eServiceReferenceDVB&)m_reference).getDVBNamespace().get();
        case sProvider: if (!m_dvb_service) return -1; return -2;
+       case sServiceref: return resIsString;
        default:
                return -1;
        }
        default:
                return -1;
        }
@@ -1223,6 +1283,8 @@ std::string eDVBServicePlay::getInfoString(int w)
        case sProvider:
                if (!m_dvb_service) return "";
                return m_dvb_service->m_provider_name;
        case sProvider:
                if (!m_dvb_service) return "";
                return m_dvb_service->m_provider_name;
+       case sServiceref:
+               return m_reference.toString();
        default:
                break;
        }
        default:
                break;
        }