From 185319be599e9f42cd695da14c01499fc79f68d5 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Fri, 5 May 2006 18:37:06 +0000 Subject: [PATCH] add function to remove single service, add function to remove transponder(s) and service(s) for specified onid/tsid/dvbnamespace/orbpos mark new found services in scan with dxNewFound flag add functions to change dxflags of a single service add function to change dxflags for specified onid/tsid/dvbnamespace/orbpos --- lib/dvb/db.cpp | 157 ++++++++++++++++++++++++++++++++- lib/dvb/db.h | 5 ++ lib/dvb/idvb.h | 10 ++- lib/python/Screens/ChannelSelection.py | 2 + lib/python/Screens/ServiceInfo.py | 2 +- 5 files changed, 169 insertions(+), 7 deletions(-) diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 2fbe53e..e8500b2 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -194,7 +194,10 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ res = 0; break; case eDVBChannelQuery::tSatellitePosition: - res = ((unsigned int)ref.getDVBNamespace().get())>>16 == query.m_int; + res = ((unsigned int)ref.getDVBNamespace().get())>>16 == (unsigned int)query.m_int; + break; + case eDVBChannelQuery::tFlags: + res = (m_flags & query.m_int) == query.m_int; break; case eDVBChannelQuery::tChannelID: { @@ -667,6 +670,135 @@ eDVBDB::~eDVBDB() instance=NULL; } +RESULT eDVBDB::removeService(eServiceReferenceDVB service) +{ + std::map >::iterator it(m_services.find(service)); + if (it != m_services.end()) + { + m_services.erase(it); + return 0; + } + return -1; +} + +RESULT eDVBDB::removeServices(eDVBChannelID chid, unsigned int orbpos) +{ + RESULT ret=-1; + eDVBNamespace eNs; + eTransportStreamID eTsid; + eOriginalNetworkID eOnid; + std::map::iterator it(m_channels.begin()); + std::set removed_chids; + while (it != m_channels.end()) + { + const eDVBChannelID &ch = it->first; + bool remove=true; + int system; + it->second.m_frontendParameters->getSystem(system); + if ( orbpos != 0xFFFFFFFF && system == iDVBFrontend::feSatellite ) + { + eDVBFrontendParametersSatellite sat; + it->second.m_frontendParameters->getDVBS(sat); + if ((unsigned int)sat.orbital_position != orbpos) + remove=false; + } + if ( remove && chid.dvbnamespace != eNs && chid.dvbnamespace != ch.dvbnamespace ) + remove=false; + if ( remove && chid.original_network_id != eOnid && chid.original_network_id != ch.original_network_id ) + remove=false; + if ( remove && chid.transport_stream_id != eTsid && chid.transport_stream_id != ch.transport_stream_id ) + remove=false; + if ( remove ) + { + removed_chids.insert(it->first); + m_channels.erase(it++); + } + else + ++it; + } + if (!removed_chids.empty()) + { + std::map >::iterator service(m_services.begin()); + while(service != m_services.end()) + { + eDVBChannelID chid; + service->first.getChannelID(chid); + std::set::iterator it(removed_chids.find(chid)); + if (it != removed_chids.end()) + m_services.erase(service++); + else + ++service; + ret=0; + } + } + return ret; +} + +RESULT eDVBDB::addFlag(eServiceReferenceDVB service, unsigned int flagmask) +{ + std::map >::iterator it(m_services.find(service)); + if (it != m_services.end()) + { + it->second->m_flags |= ~flagmask; + } + return 0; +} + +RESULT eDVBDB::removeFlag(eServiceReferenceDVB service, unsigned int flagmask) +{ + std::map >::iterator it(m_services.find(service)); + if (it != m_services.end()) + it->second->m_flags &= ~flagmask; + return 0; +} + +RESULT eDVBDB::removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned int orbpos) +{ + eDVBNamespace eNs; + eTransportStreamID eTsid; + eOriginalNetworkID eOnid; + std::map::iterator it(m_channels.begin()); + std::set removed_chids; + while (it != m_channels.end()) + { + const eDVBChannelID &ch = it->first; + bool remove=true; + int system; + it->second.m_frontendParameters->getSystem(system); + if ( orbpos != 0xFFFFFFFF && system == iDVBFrontend::feSatellite ) + { + eDVBFrontendParametersSatellite sat; + it->second.m_frontendParameters->getDVBS(sat); + if ((unsigned int)sat.orbital_position != orbpos) + remove=false; + } + if ( remove && chid.dvbnamespace != eNs && chid.dvbnamespace != ch.dvbnamespace ) + remove=false; + if ( remove && chid.original_network_id != eOnid && chid.original_network_id != ch.original_network_id ) + remove=false; + if ( remove && chid.transport_stream_id != eTsid && chid.transport_stream_id != ch.transport_stream_id ) + remove=false; + if ( remove ) + removed_chids.insert(it->first); + ++it; + } + if (!removed_chids.empty()) + { + std::map >::iterator service(m_services.begin()); + while(service != m_services.end()) + { + eDVBChannelID chid; + service->first.getChannelID(chid); + std::set::iterator it(removed_chids.find(chid)); + if (it != removed_chids.end()) + service->second->m_flags &= ~flagmask; + ++service; + } + } + return 0; +} + + RESULT eDVBDB::addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm) { channel ch; @@ -696,7 +828,14 @@ RESULT eDVBDB::getChannelFrontendData(const eDVBChannelID &id, ePtr >(serviceref, service)); + std::map >::iterator it(m_services.find(serviceref)); + if (it == m_services.end()) + { + service->m_flags |= eDVBService::dxNewFound; + m_services.insert(std::pair >(serviceref, service)); + } + else + it->second->m_flags &= ~eDVBService::dxNewFound; return 0; } @@ -933,8 +1072,8 @@ eDVBDBSatellitesQuery::eDVBDBSatellitesQuery(eDVBDB *db, const eServiceReference eServiceReferenceDVB ref; ref.setDVBNamespace(dvbnamespace); ref.flags=eServiceReference::flagDirectory; - char buf[64]; - snprintf(buf, 64, "(satellitePosition == %d) && ", dvbnamespace>>16); + char buf[128]; + snprintf(buf, 128, "(satellitePosition == %d) && ", dvbnamespace>>16); ref.path=buf+source.path; unsigned int pos=ref.path.find("FROM"); @@ -949,6 +1088,14 @@ eDVBDBSatellitesQuery::eDVBDBSatellitesQuery(eDVBDB *db, const eServiceReference ref.path+="PROVIDERS ORDER BY name"; // eDebug("ref.path now %s", ref.path.c_str()); m_list.push_back(ref); + + snprintf(buf, 128, "(satellitePosition == %d) && (flags == %d) && ", dvbnamespace>>16, eDVBService::dxNewFound); + ref.path=buf+source.path; + pos=ref.path.find("FROM"); + ref.path.erase(pos); + ref.path+="ORDER BY name"; +// eDebug("ref.path now %s", ref.path.c_str()); + m_list.push_back(ref); } } } @@ -1011,6 +1158,8 @@ static int decodeType(const std::string &type) return eDVBChannelQuery::tSatellitePosition; else if (type == "channelID") return eDVBChannelQuery::tChannelID; + else if (type == "flags") + return eDVBChannelQuery::tFlags; else return -1; } diff --git a/lib/dvb/db.h b/lib/dvb/db.h index 8ddf223..49624f3 100644 --- a/lib/dvb/db.h +++ b/lib/dvb/db.h @@ -33,6 +33,11 @@ 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 addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm); diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index f4e28d2..aa4d4bb 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -244,8 +244,8 @@ public: dxNoSDT=1, // don't get SDT dxDontshow=2, dxHoldName=8, - dxNewFound=64, // found in prev scan #endif + dxNewFound=64, dxNoDVB=4 // dont use PMT for this service ( use cached pids ) }; @@ -293,7 +293,8 @@ public: tChannelID, tAND, tOR, - tAny + tAny, + tFlags }; int m_type; @@ -315,6 +316,11 @@ public: class iDVBChannelList: public iObject { public: + virtual RESULT removeService(eServiceReferenceDVB 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 removeFlags(unsigned int flagmask, eDVBChannelID chid=eDVBChannelID(), 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/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 958b2fd..02963dc 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -670,6 +670,8 @@ class ChannelSelectionBase(Screen): orbpos = service.getUnsignedData(4) >> 16 if service.getPath().find("FROM PROVIDER") != -1: service_name = _("Providers") + elif service.getPath().find("flags ==") != -1: + service_name = _("New") else: service_name = _("Services") try: diff --git a/lib/python/Screens/ServiceInfo.py b/lib/python/Screens/ServiceInfo.py index 747ee6f..a4bb4e0 100644 --- a/lib/python/Screens/ServiceInfo.py +++ b/lib/python/Screens/ServiceInfo.py @@ -69,7 +69,7 @@ class ServiceInfo(Screen): if service is not None: self.info = service.info() self.feinfo = service.frontendStatusInfo() - print self.info.getInfoObject(iServiceInformation.sVideoPID); + print self.info.getInfoObject(iServiceInformation.sCAIDs); else: self.info = None -- 2.7.4