aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-05-05 18:37:06 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2006-05-05 18:37:06 +0000
commit185319be599e9f42cd695da14c01499fc79f68d5 (patch)
treef62cd0309439b45a230f5adad05355f5c6e9ec6a /lib
parent39708e44b6f6fd25fd3e02ae119351bdebadbfb5 (diff)
downloadenigma2-185319be599e9f42cd695da14c01499fc79f68d5.tar.gz
enigma2-185319be599e9f42cd695da14c01499fc79f68d5.zip
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
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/db.cpp157
-rw-r--r--lib/dvb/db.h5
-rw-r--r--lib/dvb/idvb.h10
-rw-r--r--lib/python/Screens/ChannelSelection.py2
-rw-r--r--lib/python/Screens/ServiceInfo.py2
5 files changed, 169 insertions, 7 deletions
diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp
index 2fbe53e6..e8500b23 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<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;
}
diff --git a/lib/dvb/db.h b/lib/dvb/db.h
index 8ddf2232..49624f35 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 f4e28d2b..aa4d4bb2 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 958b2fd4..02963dce 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 747ee6f5..a4bb4e02 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