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 eb0221a3ee4616b6898c974c6f4d8107caa901d4..39a0d3eefa120ad69514ed9cfaacf85ab266705a 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 ff3e4712b8ecbf6564889254031a70fa131455c9..c3c0a026980f30705620a0b5175e866c6bcc2b66 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 4ca986b18934fdb85d202ff00037d01f77712e99..037c1974d2e91970bd85b06db630c6c8964d4e09 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 133aa0f73a921c8235d5de4ed959e1715bb2dd42..c4d641226e79b7b58adf796e1ea6a1e0d3597a61 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 1f8aebdaf1aa8b2bbdf2020991d53503d62dc451..997b2a882f7d129e49662f3c276c9a7b9d082557 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 c75c421a63a0a2f118fc622556100b0efa150c6d..acd53bc5faa7a4c9e3b62d2496685e9e9dea4c9e 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 0d11dd7eba1b90f7c4455c5093d08d1985d1005f..6cb904e6d6bb10404bfd990a8faefd15f925b400 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 181ec22f26ebf898075b649f01d9bb6fa7944272..82957c81ea46b3ef26aeacd0a99875a83fa77cdf 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 871a0b2667869ffdcece7c268c3454d06bc4df6f..4b7d63a07e9da154420073c2f5381557a335291e 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;
        }