fix "Clearall before scan" handling
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 8 May 2006 20:08:22 +0000 (20:08 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Mon, 8 May 2006 20:08:22 +0000 (20:08 +0000)
add ability to reset the newfound flag from single service via channellist context menu
add ability to the newfound flags for all services from a "orbital position" via channellist context menu

lib/dvb/db.cpp
lib/dvb/db.h
lib/dvb/idvb.h
lib/dvb/scan.cpp
lib/python/Screens/ChannelSelection.py

index e8500b23f25c6e8aa2957e612f167ccc7d409138..c0064071a75ba42e4deb22db5b2b88629583117c 100644 (file)
@@ -670,17 +670,26 @@ eDVBDB::~eDVBDB()
        instance=NULL;
 }
 
-RESULT eDVBDB::removeService(eServiceReferenceDVB service)
+RESULT eDVBDB::removeService(const eServiceReference &ref)
 {
-       std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_services.find(service));
-       if (it != m_services.end())
+       if (ref.type == eServiceReference::idDVB)
        {
-               m_services.erase(it);
-               return 0;
+               eServiceReferenceDVB &service = (eServiceReferenceDVB&)ref;
+               std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_services.find(service));
+               if (it != m_services.end())
+               {
+                       m_services.erase(it);
+                       return 0;
+               }
        }
        return -1;
 }
 
+RESULT eDVBDB::removeServices(int dvb_namespace, int tsid, int onid, unsigned int orb_pos)
+{
+       return removeServices(eDVBChannelID(eDVBNamespace(dvb_namespace), eTransportStreamID(tsid), eOriginalNetworkID(onid)), orb_pos);
+}
+
 RESULT eDVBDB::removeServices(eDVBChannelID chid, unsigned int orbpos)
 {
        RESULT ret=-1;
@@ -710,6 +719,10 @@ RESULT eDVBDB::removeServices(eDVBChannelID chid, unsigned int orbpos)
                        remove=false;
                if ( remove )
                {
+                       eDebug("remove %08x %04x %04x",
+                               ch.dvbnamespace.get(),
+                               ch.original_network_id.get(),
+                               ch.transport_stream_id.get());
                        removed_chids.insert(it->first);
                        m_channels.erase(it++);
                }
@@ -734,22 +747,35 @@ RESULT eDVBDB::removeServices(eDVBChannelID chid, unsigned int orbpos)
        return ret;
 }
 
-RESULT eDVBDB::addFlag(eServiceReferenceDVB service, unsigned int flagmask)
+RESULT eDVBDB::addFlag(const eServiceReference &ref, unsigned int flagmask)
 {
-       std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_services.find(service));
-       if (it != m_services.end())
+       if (ref.type == eServiceReference::idDVB)
        {
-               it->second->m_flags |= ~flagmask;
+               eServiceReferenceDVB &service = (eServiceReferenceDVB&)ref;
+               std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_services.find(service));
+               if (it != m_services.end())
+                       it->second->m_flags |= ~flagmask;
+               return 0;
        }
-       return 0;
+       return -1;
 }
 
-RESULT eDVBDB::removeFlag(eServiceReferenceDVB service, unsigned int flagmask)
+RESULT eDVBDB::removeFlag(const eServiceReference &ref, unsigned int flagmask)
 {
-       std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_services.find(service));
-       if (it != m_services.end())
-               it->second->m_flags &= ~flagmask;
-       return 0;
+       if (ref.type == eServiceReference::idDVB)
+       {
+               eServiceReferenceDVB &service = (eServiceReferenceDVB&)ref;
+               std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_services.find(service));
+               if (it != m_services.end())
+                       it->second->m_flags &= ~flagmask;
+               return 0;
+       }
+       return -1;
+}
+
+RESULT eDVBDB::removeFlags(unsigned int flagmask, int dvb_namespace, int tsid, int onid, unsigned int orb_pos)
+{
+       return removeFlags(flagmask, eDVBChannelID(eDVBNamespace(dvb_namespace), eTransportStreamID(tsid), eOriginalNetworkID(onid)), orb_pos);
 }
 
 RESULT eDVBDB::removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned int orbpos)
@@ -798,7 +824,6 @@ RESULT eDVBDB::removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned i
        return 0;
 }
 
-
 RESULT eDVBDB::addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)
 {
        channel ch;
index 49624f35d62682bca10dd304329cc61d80348e1b..430a5af0b48b692dd837458a43c2373886f28ad1 100644 (file)
@@ -17,7 +17,6 @@ DECLARE_REF(eDVBDB);
        friend class eDVBDBSatellitesQuery;
        friend class eDVBDBProvidersQuery;
 
-
        struct channel
        {
                ePtr<iDVBFrontendParameters> m_frontendParameters;
@@ -33,13 +32,16 @@ DECLARE_REF(eDVBDB);
        ~eDVBDB();
 #endif
 public:
-       RESULT removeService(eServiceReferenceDVB service);
-       RESULT removeServices(eDVBChannelID chid, unsigned int orb_pos);
-       RESULT addFlag(eServiceReferenceDVB service, unsigned int flagmask);
-       RESULT removeFlag(eServiceReferenceDVB service, unsigned int flagmask);
-       RESULT removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned int orb_pos);
-#ifndef SWIG
 // iDVBChannelList
+       RESULT removeFlags(unsigned int flagmask, int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF);
+       RESULT removeServices(int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF);
+       RESULT removeService(const eServiceReference &service);
+       RESULT addFlag(const eServiceReference &service, unsigned int flagmask);
+       RESULT removeFlag(const eServiceReference &service, unsigned int flagmask);
+#ifndef SWIG
+       RESULT removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned int orb_pos);
+       RESULT removeServices(eDVBChannelID chid, unsigned int orb_pos);
+
        RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm);
        RESULT removeChannel(const eDVBChannelID &id);
 
index aa4d4bb2c8c6e965ef52e3eb56f15c3611f68fdf..e9fb3cf00a48f035100e42dc8c19a5e5bf923b30 100644 (file)
@@ -316,11 +316,13 @@ public:
 class iDVBChannelList: public iObject
 {
 public:
-       virtual RESULT removeService(eServiceReferenceDVB service)=0;
+       virtual RESULT removeService(const eServiceReference &service)=0;
        virtual RESULT removeServices(eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
-       virtual RESULT addFlag(eServiceReferenceDVB service, unsigned int flagmask=0xFFFFFFFF)=0;
-       virtual RESULT removeFlag(eServiceReferenceDVB service, unsigned int flagmask=0xFFFFFFFF)=0;
+       virtual RESULT removeServices(int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
+       virtual RESULT addFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
+       virtual RESULT removeFlag(const eServiceReference &service, unsigned int flagmask=0xFFFFFFFF)=0;
        virtual RESULT removeFlags(unsigned int flagmask, eDVBChannelID chid=eDVBChannelID(), unsigned int orb_pos=0xFFFFFFFF)=0;
+       virtual RESULT removeFlags(unsigned int flagmask, int dvb_namespace=-1, int tsid=-1, int onid=-1, unsigned int orb_pos=0xFFFFFFFF)=0;
        virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
        virtual RESULT removeChannel(const eDVBChannelID &id)=0;
        
index c44471d9bd51d42170b8c4ee567dc4ec98f76e93..605128e7c8670caa6674aa81425840183d8a3bbb 100644 (file)
@@ -498,8 +498,9 @@ void eDVBScan::insertInto(iDVBChannelList *db)
                {
                        eDVBChannelID chid;
                        if (m_flags & scanDontRemoveFeeds)
-                               chid.dvbnamespace = eDVBNamespace((*it)<<16);
-                       db->removeServices(chid, *it);
+                               chid.dvbnamespace = eDVBNamespace((*x)<<16);
+                       eDebug("remove %d %08x", *x, chid.dvbnamespace.get());
+                       db->removeServices(chid, *x);
                }
        }
 
index 02963dceec1c29dd8a550da5e9776fc56c030002..47a9d9e66aef0dfd1637d352759e91cf8ef4a03c 100644 (file)
@@ -18,6 +18,8 @@ from ServiceReference import ServiceReference
 from re import *
 from os import remove
 
+FLAG_SERVICE_NEW_FOUND = 64 #define in lib/dvb/idvb.h as dxNewFound = 64
+
 import xml.dom.minidom
 
 class BouquetSelector(Screen):
@@ -66,6 +68,8 @@ class ChannelContextMenu(Screen):
                menu = [ ]
 
                current_root = csel.getRoot()
+               current_sel_path = csel.getCurrentSelection().getPath()
+               current_sel_flags = csel.getCurrentSelection().flags
                inBouquetRootList = current_root and current_root.getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
                inBouquet = csel.getMutableList() is not None
                haveBouquets = csel.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1
@@ -77,11 +81,16 @@ class ChannelContextMenu(Screen):
                                                menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected))
                                        else:
                                                menu.append((_("add service to favourites"), self.addServiceToBouquetSelected))
-                               elif haveBouquets:
-                                       if not inBouquet and csel.getCurrentSelection().getPath().find("PROVIDERS") == -1:
-                                               menu.append((_("copy to favourites"), self.copyCurrentToBouquetList))
+                               else:
+                                       if haveBouquets:
+                                               if not inBouquet and current_sel_path.find("PROVIDERS") == -1:
+                                                       menu.append((_("copy to favourites"), self.copyCurrentToBouquetList))
+                                       if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
+                                               menu.append((_("remove all new found flags"), self.removeAllNewFoundFlags))
                                if inBouquet:
                                        menu.append((_("remove service"), self.removeCurrentService))
+                               if current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
+                                       menu.append((_("remove new found flag"), self.removeNewFoundFlag))
                        elif haveBouquets:
                                menu.append((_("remove bouquet"), self.removeBouquet))
 
@@ -174,6 +183,21 @@ class ChannelContextMenu(Screen):
                self.csel.endMarkedEdit(abort=True)
                self.close()
 
+       def removeNewFoundFlag(self):
+               eDVBDB.getInstance().removeFlag(self.csel.getCurrentSelection(), FLAG_SERVICE_NEW_FOUND)
+               self.close()
+
+       def removeAllNewFoundFlags(self):
+               curpath = self.csel.getCurrentSelection().getPath()
+               idx = curpath.find("satellitePosition == ")
+               if idx != -1:
+                       tmp = curpath[idx+21:]
+                       idx = tmp.find(')')
+                       if idx != -1:
+                               satpos = int(tmp[:idx])
+                               eDVBDB.getInstance().removeFlags(FLAG_SERVICE_NEW_FOUND, -1, -1, -1, satpos)
+               self.close()
+
 class ChannelSelectionEPG:
        def __init__(self):
                self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"],
@@ -670,7 +694,7 @@ class ChannelSelectionBase(Screen):
                                                        orbpos = service.getUnsignedData(4) >> 16
                                                        if service.getPath().find("FROM PROVIDER") != -1:
                                                                service_name = _("Providers")
-                                                       elif service.getPath().find("flags ==") != -1:
+                                                       elif service.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
                                                                service_name = _("New")
                                                        else:
                                                                service_name = _("Services")