From: Andreas Monzner Date: Mon, 8 May 2006 20:08:22 +0000 (+0000) Subject: fix "Clearall before scan" handling X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=ca7d92c97764d916bb8dd6731efa1ccff693b944 fix "Clearall before scan" handling 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 --- diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index e8500b2..c006407 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -670,17 +670,26 @@ eDVBDB::~eDVBDB() instance=NULL; } -RESULT eDVBDB::removeService(eServiceReferenceDVB service) +RESULT eDVBDB::removeService(const eServiceReference &ref) { - std::map >::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 >::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 >::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 >::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 >::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 >::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; diff --git a/lib/dvb/db.h b/lib/dvb/db.h index 49624f3..430a5af 100644 --- a/lib/dvb/db.h +++ b/lib/dvb/db.h @@ -17,7 +17,6 @@ DECLARE_REF(eDVBDB); friend class eDVBDBSatellitesQuery; friend class eDVBDBProvidersQuery; - struct channel { ePtr 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); diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index aa4d4bb..e9fb3cf 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -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; diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp index c44471d..605128e 100644 --- a/lib/dvb/scan.cpp +++ b/lib/dvb/scan.cpp @@ -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); } } diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 02963dc..47a9d9e 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -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")