DEFINE_REF(eDVBService);
-RESULT eBouquet::addService(const eServiceReference &ref)
+RESULT eBouquet::addService(const eServiceReference &ref, eServiceReference before)
{
list::iterator it =
std::find(m_services.begin(), m_services.end(), ref);
if ( it != m_services.end() )
return -1;
- m_services.push_back(ref);
+ if (before.valid())
+ {
+ it = std::find(m_services.begin(), m_services.end(), before);
+ m_services.insert(it, ref);
+ }
+ else
+ m_services.push_back(ref);
return 0;
}
{
eServiceReference tmp = *i;
std::string str = tmp.path;
- if ( (i->flags&eServiceReference::flagDirectory) == eServiceReference::flagDirectory )
- {
- unsigned int p1 = str.find("FROM BOUQUET \"");
- if (p1 == std::string::npos)
- {
- eDebug("doof... kaputt");
- continue;
- }
- str.erase(0, p1+14);
- p1 = str.find("\"");
- if (p1 == std::string::npos)
- {
- eDebug("doof2... kaputt");
- continue;
- }
- str.erase(p1);
- tmp.path=str;
- }
if ( fprintf(f, "#SERVICE %s\r\n", tmp.toString().c_str()) < 0 )
goto err;
if ( i->name.length() )
}
eDVBService::eDVBService()
- :m_flags(0)
+ :m_cache(0), m_flags(0)
{
}
eDVBService::~eDVBService()
{
+ delete [] m_cache;
}
eDVBService &eDVBService::operator=(const eDVBService &s)
m_provider_name = s.m_provider_name;
m_flags = s.m_flags;
m_ca = s.m_ca;
- m_cache = s.m_cache;
+ copyCache(s.m_cache);
return *this;
}
return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr);
}
-bool eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
+int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore)
{
ePtr<eDVBResourceManager> res_mgr;
if ( eDVBResourceManager::getInstance( res_mgr ) )
((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
return res_mgr->canAllocateChannel(chid, chid_ignore);
}
- return false;
+ return 0;
}
int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query)
return res;
}
-int eDVBService::getCachePID(cacheID id)
+bool eDVBService::cacheEmpty()
{
- std::map<int, int>::iterator it = m_cache.find(id);
- if ( it != m_cache.end() )
- return it->second;
- return -1;
+ if (m_cache)
+ for (int i=0; i < cacheMax; ++i)
+ if (m_cache[i] != -1)
+ return false;
+ return true;
}
-void eDVBService::setCachePID(cacheID id, int pid)
+void eDVBService::initCache()
{
- if (pid == -1)
- m_cache.erase(id);
+ m_cache = new int[cacheMax];
+ memset(m_cache, -1, sizeof(int) * cacheMax);
+}
+
+void eDVBService::copyCache(int *source)
+{
+ if (source)
+ {
+ if (!m_cache)
+ m_cache = new int[cacheMax];
+ memcpy(m_cache, source, cacheMax * sizeof(int));
+ }
else
+ {
+ delete [] m_cache;
+ m_cache = 0;
+ }
+}
+
+int eDVBService::getCacheEntry(cacheID id)
+{
+ if (id >= cacheMax || !m_cache)
+ return -1;
+ return m_cache[id];
+}
+
+void eDVBService::setCacheEntry(cacheID id, int pid)
+{
+ if (!m_cache)
+ initCache();
+ if (id < cacheMax)
m_cache[id] = pid;
}
if (line[1]=='s')
{
eDVBFrontendParametersSatellite sat;
- int frequency, symbol_rate, polarisation, fec, orbital_position, inversion;
- sscanf(line+2, "%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion);
+ int frequency, symbol_rate, polarisation, fec, orbital_position, inversion,
+ system=eDVBFrontendParametersSatellite::System::DVB_S,
+ modulation=eDVBFrontendParametersSatellite::Modulation::QPSK,
+ rolloff=eDVBFrontendParametersSatellite::RollOff::alpha_auto;
+ sscanf(line+2, "%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &system, &modulation, &rolloff);
sat.frequency = frequency;
sat.symbol_rate = symbol_rate;
sat.polarisation = polarisation;
sat.orbital_position =
orbital_position < 0 ? orbital_position + 3600 : orbital_position;
sat.inversion = inversion;
+ sat.system = system;
+ sat.modulation = modulation;
+ sat.roll_off = rolloff;
feparm->setDVBS(sat);
} else if (line[1]=='t')
{
} else if (p == 'c')
{
int cid, val;
- sscanf(v.c_str(), "%02d%04x", &cid, &val);
- s->m_cache[cid]=val;
+ sscanf(v.c_str(), "%02d%x", &cid, &val);
+ s->setCacheEntry((eDVBService::cacheID)cid,val);
} else if (p == 'C')
{
int val;
sscanf(v.c_str(), "%04x", &val);
- s->m_ca.insert(val);
+ s->m_ca.push_front((uint16_t)val);
}
}
addService(ref, s);
eDVBFrontendParametersCable cab;
if (!ch.m_frontendParameters->getDVBS(sat))
{
- fprintf(f, "\ts %d:%d:%d:%d:%d:%d\n",
- sat.frequency, sat.symbol_rate,
- sat.polarisation, sat.fec,
- sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
- sat.inversion);
+ if (sat.system == eDVBFrontendParametersSatellite::System::DVB_S2)
+ {
+ fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d:%d:%d\n",
+ sat.frequency, sat.symbol_rate,
+ sat.polarisation, sat.fec,
+ sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
+ sat.inversion,
+ sat.system,
+ sat.modulation,
+ sat.roll_off);
+ }
+ else
+ {
+ fprintf(f, "\ts %d:%d:%d:%d:%d:%d\n",
+ sat.frequency, sat.symbol_rate,
+ sat.polarisation, sat.fec,
+ sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
+ sat.inversion);
+ }
}
if (!ch.m_frontendParameters->getDVBT(ter))
{
fprintf(f, "p:%s", i->second->m_provider_name.c_str());
// write cached pids
- for (std::map<int,int>::const_iterator ca(i->second->m_cache.begin());
- ca != i->second->m_cache.end(); ++ca)
- fprintf(f, ",c:%02d%04x", ca->first, ca->second);
+ for (int x=0; x < eDVBService::cacheMax; ++x)
+ {
+ int entry = i->second->getCacheEntry((eDVBService::cacheID)x);
+ if (entry != -1)
+ fprintf(f, ",c:%02d%04x", x, entry);
+ }
// write cached ca pids
- for (std::set<int>::const_iterator ca(i->second->m_ca.begin());
+ for (CAID_LIST::const_iterator ca(i->second->m_ca.begin());
ca != i->second->m_ca.end(); ++ca)
fprintf(f, ",C:%04x", *ca);
break;
if (line[0]=='#')
{
- if (!strncmp(line, "#SERVICE ", 9) || !strncmp(line, "#SERVICE: ", 10))
+ if (!strncmp(line, "#SERVICE", 8))
{
int offs = line[8] == ':' ? 10 : 9;
eServiceReference tmp(line+offs);
eDebug("only DVB Bouquets supported");
continue;
}
- if ( (tmp.flags&eServiceReference::flagDirectory) == eServiceReference::flagDirectory )
+ if ( tmp.flags&eServiceReference::canDescent )
{
unsigned int pos = tmp.path.rfind('/');
+ char buf[256];
+ std::string path = tmp.path;
if ( pos != std::string::npos )
- tmp.path.erase(0, pos+1);
- if (tmp.path.empty())
+ path.erase(0, pos+1);
+ if (path.empty())
{
eDebug("Bouquet load failed.. no filename given..");
continue;
}
- loadBouquet(tmp.path.c_str());
- char buf[256];
- snprintf(buf, 256, "(type == %d) FROM BOUQUET \"%s\" ORDER BY bouquet", tmp.data[0], tmp.path.c_str());
- tmp.path = buf;
+ pos = path.find("FROM BOUQUET ");
+ if (pos != std::string::npos)
+ {
+ char endchr = path[pos+13];
+ if (endchr != '"')
+ {
+ eDebug("ignore invalid bouquet '%s' (only \" are allowed)",
+ tmp.toString().c_str());
+ continue;
+ }
+ char *beg = &path[pos+14];
+ char *end = strchr(beg, endchr);
+ path.assign(beg, end - beg);
+ }
+ else
+ {
+ snprintf(buf, 256, "FROM BOUQUET \"%s\" ORDER BY bouquet", path.c_str());
+ tmp.path = buf;
+ }
+ loadBouquet(path.c_str());
}
list.push_back(tmp);
e = &list.back();
read_descr=true;
++entries;
}
- else if (read_descr && !strncmp(line, "#DESCRIPTION ", 13))
+ else if (read_descr && !strncmp(line, "#DESCRIPTION", 12))
{
- e->name = line+13;
+ int offs = line[12] == ':' ? 14 : 13;
+ e->name = line+offs;
read_descr=false;
}
else if (!strncmp(line, "#NAME ", 6))
ref.type=1;
ref.flags=7;
ref.data[0]=1;
- ref.path="(type == 1) FROM BOUQUET \"userbouquet.favourites.tv\" ORDER BY bouquet";
+ ref.path="FROM BOUQUET \"userbouquet.favourites.tv\" ORDER BY bouquet";
eBouquet &parent = m_bouquets["bouquets.tv"];
parent.m_services.push_back(ref);
parent.flushChanges();
ref.type=1;
ref.flags=7;
ref.data[0]=2;
- ref.path="(type == 2) FROM BOUQUET \"userbouquet.favourites.radio\" ORDER BY bouquet";
+ ref.path="FROM BOUQUET \"userbouquet.favourites.radio\" ORDER BY bouquet";
eBouquet &parent = m_bouquets["bouquets.radio"];
parent.m_services.push_back(ref);
parent.flushChanges();
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;
bool remove=true;
int system;
it->second.m_frontendParameters->getSystem(system);
- if ( orbpos != 0xFFFFFFFF && system == iDVBFrontend::feSatellite )
+ if ( system == iDVBFrontend::feSatellite )
{
eDVBFrontendParametersSatellite sat;
it->second.m_frontendParameters->getDVBS(sat);
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++);
}
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)
return 0;
}
-
RESULT eDVBDB::addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)
{
channel ch;
{
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;
}
int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)
{
ePtr<eDVBService> a_service, b_service;
-
int sortmode = m_query ? m_query->m_sort : eDVBChannelQuery::tName;
if ((sortmode == eDVBChannelQuery::tName) || (sortmode == eDVBChannelQuery::tProvider))
{
- if (m_db->getService(a, a_service))
+ if (a.name.empty() && m_db->getService(a, a_service))
return 1;
- if (m_db->getService(b, b_service))
+ if (b.name.empty() && m_db->getService(b, b_service))
return 1;
}
switch (sortmode)
{
case eDVBChannelQuery::tName:
- return a_service->m_service_name_sort < b_service->m_service_name_sort;
+ if (a_service)
+ {
+ if (b_service)
+ return a_service->m_service_name_sort < b_service->m_service_name_sort;
+ else
+ {
+ std::string str = b.name;
+ makeUpper(str);
+ return a_service->m_service_name_sort < str;
+ }
+ }
+ else if (b_service)
+ {
+ std::string str = a.name;
+ makeUpper(str);
+ return str < b_service->m_service_name_sort;
+ }
+ else
+ {
+ std::string aa = a.name, bb = b.name;
+ makeUpper(aa);
+ makeUpper(bb);
+ return aa < bb;
+ }
case eDVBChannelQuery::tProvider:
return a_service->m_provider_name < b_service->m_provider_name;
case eDVBChannelQuery::tType:
y -= 3600;
return x < y;
}
- return a.name < b.name;
+ std::string aa = a.name, bb = b.name;
+ makeUpper(aa);
+ makeUpper(bb);
+ return aa < bb;
}
eDVBDBSatellitesQuery::eDVBDBSatellitesQuery(eDVBDB *db, const eServiceReference &source, eDVBChannelQuery *query)
:eDVBDBListQuery(db, source, query)
{
+ std::set<unsigned int> found;
for (std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_db->m_services.begin());
it != m_db->m_services.end(); ++it)
{
if (res)
{
unsigned int dvbnamespace = it->first.getDVBNamespace().get()&0xFFFF0000;
- bool found=0;
- for (std::list<eServiceReferenceDVB>::iterator i(m_list.begin()); i != m_list.end(); ++i)
- if ( (i->getDVBNamespace().get()&0xFFFF0000) == dvbnamespace )
- {
- found=true;
- break;
- }
- if (!found)
+ if (found.find(dvbnamespace) == found.end())
{
+ found.insert(dvbnamespace);
eServiceReferenceDVB ref;
ref.setDVBNamespace(dvbnamespace);
ref.flags=eServiceReference::flagDirectory;
eDVBDBProvidersQuery::eDVBDBProvidersQuery(eDVBDB *db, const eServiceReference &source, eDVBChannelQuery *query)
:eDVBDBListQuery(db, source, query)
{
+ std::set<std::string> found;
for (std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_db->m_services.begin());
it != m_db->m_services.end(); ++it)
{
int res = it->second->checkFilter(it->first, *query);
if (res)
{
- bool found=0;
-
const char *provider_name = it->second->m_provider_name.length() ?
it->second->m_provider_name.c_str() :
"Unknown";
-
- for (std::list<eServiceReferenceDVB>::iterator i(m_list.begin()); i != m_list.end(); ++i)
- if (i->name == provider_name)
- {
- found=true;
- break;
- }
- if (!found)
+ if (found.find(std::string(provider_name)) == found.end())
{
+ found.insert(std::string(provider_name));
eServiceReferenceDVB ref;
char buf[64];
ref.name=provider_name;
std::list<std::string>::const_iterator end_of_exp;
if (begin == end)
- {
- eDebug("empty expression!");
return 0;
- }
if (*begin == "(")
{