add function to remove single service,
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 5 May 2006 18:37:06 +0000 (18:37 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 5 May 2006 18:37:06 +0000 (18:37 +0000)
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
lib/dvb/db.h
lib/dvb/idvb.h
lib/python/Screens/ChannelSelection.py
lib/python/Screens/ServiceInfo.py

index 2fbe53e..e8500b2 100644 (file)
@@ -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<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(eDVBChannelID chid, unsigned int orbpos)
+{
+       RESULT ret=-1;
+       eDVBNamespace eNs;
+       eTransportStreamID eTsid;
+       eOriginalNetworkID eOnid;
+       std::map<eDVBChannelID, channel>::iterator it(m_channels.begin());
+       std::set<eDVBChannelID> 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<eServiceReferenceDVB, ePtr<eDVBService> >::iterator service(m_services.begin());
+               while(service != m_services.end())
+               {
+                       eDVBChannelID chid;
+                       service->first.getChannelID(chid);
+                       std::set<eDVBChannelID>::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<eServiceReferenceDVB, ePtr<eDVBService> >::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<eServiceReferenceDVB, ePtr<eDVBService> >::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<eDVBChannelID, channel>::iterator it(m_channels.begin());
+       std::set<eDVBChannelID> 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<eServiceReferenceDVB, ePtr<eDVBService> >::iterator service(m_services.begin());
+               while(service != m_services.end())
+               {
+                       eDVBChannelID chid;
+                       service->first.getChannelID(chid);
+                       std::set<eDVBChannelID>::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<iDVBFrontend
 
 RESULT eDVBDB::addService(const eServiceReferenceDVB &serviceref, eDVBService *service)
 {
-       m_services.insert(std::pair<eServiceReferenceDVB, ePtr<eDVBService> >(serviceref, service));
+       std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_services.find(serviceref));
+       if (it == m_services.end())
+       {
+               service->m_flags |= eDVBService::dxNewFound;
+               m_services.insert(std::pair<eServiceReferenceDVB, ePtr<eDVBService> >(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;
 }
index 8ddf223..49624f3 100644 (file)
@@ -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);
index f4e28d2..aa4d4bb 100644 (file)
@@ -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;
        
index 958b2fd..02963dc 100644 (file)
@@ -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:
index 747ee6f..a4bb4e0 100644 (file)
@@ -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