X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a9939e31b86e340d93aad3d6eb450352ca8323d7..9a387d949dc2188928fbc19e6cf73da0041dd102:/lib/dvb/db.cpp diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index f9c8938c..38be6359 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -151,7 +151,7 @@ RESULT eDVBService::getEvent(const eServiceReference &ref, ePtr & return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr); } -int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore) +int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate) { ePtr res_mgr; if ( eDVBResourceManager::getInstance( res_mgr ) ) @@ -161,7 +161,7 @@ int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReferenc eDVBChannelID chid, chid_ignore; ((const eServiceReferenceDVB&)ref).getChannelID(chid); ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore); - return res_mgr->canAllocateChannel(chid, chid_ignore); + return res_mgr->canAllocateChannel(chid, chid_ignore, simulate); } return 0; } @@ -172,14 +172,32 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ switch (query.m_type) { case eDVBChannelQuery::tName: - res = m_service_name_sort.find(query.m_string) != std::string::npos; + res = m_service_name_sort == query.m_string; break; case eDVBChannelQuery::tProvider: - res = m_provider_name.find(query.m_string) != std::string::npos; + if (query.m_string == "Unknown" && m_provider_name.empty()) + res = 1; + else + res = m_provider_name == query.m_string; break; case eDVBChannelQuery::tType: - res = ref.getServiceType() == query.m_int; + { + int service_type = ref.getServiceType(); + if (query.m_int == 1) // TV Service + { + // Hack for dish network + int onid = ref.getOriginalNetworkID().get(); + if (onid >= 0x1001 && onid <= 0x100b) + { + static int dish_tv_types[] = { 128, 133, 137, 140, 144, 145, 150, 154, 160, 163, 164, 165, 166, 167, 168, 173, 174 }; + static size_t dish_tv_num_types = sizeof(dish_tv_types) / sizeof(int); + if (std::binary_search(dish_tv_types, dish_tv_types + dish_tv_num_types, service_type)) + return true; + } + } + res = service_type == query.m_int; break; + } case eDVBChannelQuery::tBouquet: res = 0; break; @@ -260,12 +278,53 @@ void eDVBService::setCacheEntry(cacheID id, int pid) DEFINE_REF(eDVBDB); - /* THIS CODE IS BAD. it should be replaced by somethine better. */ void eDVBDB::reloadServicelist() +{ + loadServicelist(CONFIGDIR"/enigma2/lamedb"); +} + +void eDVBDB::parseServiceData(ePtr s, std::string str) +{ + while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d... + { + size_t c=str.find(','); + char p=str[0]; + std::string v; + if (c == std::string::npos) + { + v=str.substr(2); + str=""; + } else + { + v=str.substr(2, c-2); + str=str.substr(c+1); + } +// eDebug("%c ... %s", p, v.c_str()); + if (p == 'p') + s->m_provider_name=v; + else if (p == 'f') + { + sscanf(v.c_str(), "%x", &s->m_flags); + } else if (p == 'c') + { + int 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.push_front((uint16_t)val); + } + } +} + + /* THIS CODE IS BAD. it should be replaced by somethine better. */ +void eDVBDB::loadServicelist(const char *file) { eDebug("---- opening lame channel db"); - FILE *f=fopen(CONFIGDIR"/enigma2/lamedb", "rt"); - if (!f) + FILE *f=fopen(file, "rt"); + if (!f && strcmp(file, CONFIGDIR"/enigma2/lamedb") == 0) { struct stat s; if ( !stat("lamedb", &s) ) @@ -279,13 +338,14 @@ void eDVBDB::reloadServicelist() return; } char line[256]; - if ((!fgets(line, 256, f)) || strncmp(line, "eDVB services", 13)) + int version=3; + if ((!fgets(line, 256, f)) || sscanf(line, "eDVB services /%d/", &version) != 1) { - eDebug("not a servicefile"); + eDebug("not a valid servicefile"); fclose(f); return; } - eDebug("reading services"); + eDebug("reading services (version %d)", version); if ((!fgets(line, 256, f)) || strcmp(line, "transponders\n")) { eDebug("services invalid, no transponders"); @@ -320,10 +380,15 @@ void eDVBDB::reloadServicelist() { eDVBFrontendParametersSatellite sat; 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+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &system, &modulation, &rolloff); + flags=0, + system=eDVBFrontendParametersSatellite::System_DVB_S, + modulation=eDVBFrontendParametersSatellite::Modulation_QPSK, + rolloff=eDVBFrontendParametersSatellite::RollOff_alpha_0_35, + pilot=eDVBFrontendParametersSatellite::Pilot_Unknown; + if (version == 3) + sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &system, &modulation, &rolloff, &pilot); + else + sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &flags, &system, &modulation, &rolloff, &pilot); sat.frequency = frequency; sat.symbol_rate = symbol_rate; sat.polarisation = polarisation; @@ -333,13 +398,15 @@ void eDVBDB::reloadServicelist() sat.inversion = inversion; sat.system = system; sat.modulation = modulation; - sat.roll_off = rolloff; + sat.rolloff = rolloff; + sat.pilot = pilot; feparm->setDVBS(sat); + feparm->setFlags(flags); } else if (line[1]=='t') { eDVBFrontendParametersTerrestrial ter; - int frequency, bandwidth, code_rate_HP, code_rate_LP, modulation, transmission_mode, guard_interval, hierarchy, inversion; - sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &bandwidth, &code_rate_HP, &code_rate_LP, &modulation, &transmission_mode, &guard_interval, &hierarchy, &inversion); + int frequency, bandwidth, code_rate_HP, code_rate_LP, modulation, transmission_mode, guard_interval, hierarchy, inversion, flags=0; + sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &bandwidth, &code_rate_HP, &code_rate_LP, &modulation, &transmission_mode, &guard_interval, &hierarchy, &inversion, &flags); ter.frequency = frequency; ter.bandwidth = bandwidth; ter.code_rate_HP = code_rate_HP; @@ -350,20 +417,23 @@ void eDVBDB::reloadServicelist() ter.hierarchy = hierarchy; ter.inversion = inversion; feparm->setDVBT(ter); + feparm->setFlags(flags); } else if (line[1]=='c') { eDVBFrontendParametersCable cab; int frequency, symbol_rate, - inversion=eDVBFrontendParametersCable::Inversion::Unknown, - modulation=eDVBFrontendParametersCable::Modulation::Auto, - fec_inner=eDVBFrontendParametersCable::FEC::fAuto; - sscanf(line+3, "%d:%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation, &fec_inner); + inversion=eDVBFrontendParametersCable::Inversion_Unknown, + modulation=eDVBFrontendParametersCable::Modulation_Auto, + fec_inner=eDVBFrontendParametersCable::FEC_Auto, + flags=0; + sscanf(line+3, "%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation, &fec_inner, &flags); cab.frequency = frequency; cab.fec_inner = fec_inner; cab.inversion = inversion; cab.symbol_rate = symbol_rate; cab.modulation = modulation; feparm->setDVBC(cab); + feparm->setFlags(flags); } } addChannelToList(channelid, feparm); @@ -409,44 +479,10 @@ void eDVBDB::reloadServicelist() fgets(line, 256, f); if (strlen(line)) line[strlen(line)-1]=0; - std::string str=line; - - if (str[1]!=':') // old ... (only service_provider) - { + if (line[1]!=':') // old ... (only service_provider) s->m_provider_name=line; - } else - while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d... - { - size_t c=str.find(','); - char p=str[0]; - std::string v; - if (c == std::string::npos) - { - v=str.substr(2); - str=""; - } else - { - v=str.substr(2, c-2); - str=str.substr(c+1); - } -// eDebug("%c ... %s", p, v.c_str()); - if (p == 'p') - s->m_provider_name=v; - else if (p == 'f') - { - sscanf(v.c_str(), "%x", &s->m_flags); - } else if (p == 'c') - { - int 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.push_front((uint16_t)val); - } - } + else + parseServiceData(s, line); addService(ref, s); } @@ -455,14 +491,14 @@ void eDVBDB::reloadServicelist() fclose(f); } -void eDVBDB::saveServicelist() +void eDVBDB::saveServicelist(const char *file) { eDebug("---- saving lame channel db"); - FILE *f=fopen(CONFIGDIR"/enigma2/lamedb", "w"); + FILE *f=fopen(file, "w"); int channels=0, services=0; if (!f) eFatal("couldn't save lame channel db!"); - fprintf(f, "eDVB services /3/\n"); + fprintf(f, "eDVB services /4/\n"); fprintf(f, "transponders\n"); for (std::map::const_iterator i(m_channels.begin()); i != m_channels.end(); ++i) @@ -475,39 +511,43 @@ void eDVBDB::saveServicelist() eDVBFrontendParametersSatellite sat; eDVBFrontendParametersTerrestrial ter; eDVBFrontendParametersCable cab; + unsigned int flags; // flagOnlyFree yet.. + ch.m_frontendParameters->getFlags(flags); if (!ch.m_frontendParameters->getDVBS(sat)) { - if (sat.system == eDVBFrontendParametersSatellite::System::DVB_S2) + if (sat.system == eDVBFrontendParametersSatellite::System_DVB_S2) { - fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d:%d:%d\n", + fprintf(f, "\ts %d:%d:%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, + flags, sat.system, sat.modulation, - sat.roll_off); + sat.rolloff, + sat.pilot); } else { - fprintf(f, "\ts %d:%d:%d:%d:%d:%d\n", + fprintf(f, "\ts %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.inversion, flags); } } else if (!ch.m_frontendParameters->getDVBT(ter)) { - fprintf(f, "\tt %d:%d:%d:%d:%d:%d:%d:%d:%d\n", + fprintf(f, "\tt %d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n", ter.frequency, ter.bandwidth, ter.code_rate_HP, ter.code_rate_LP, ter.modulation, ter.transmission_mode, - ter.guard_interval, ter.hierarchy, ter.inversion); + ter.guard_interval, ter.hierarchy, ter.inversion, flags); } else if (!ch.m_frontendParameters->getDVBC(cab)) { - fprintf(f, "\tc %d:%d:%d:%d:%d\n", - cab.frequency, cab.symbol_rate, cab.inversion, cab.modulation, cab.fec_inner); + fprintf(f, "\tc %d:%d:%d:%d:%d:%d\n", + cab.frequency, cab.symbol_rate, cab.inversion, cab.modulation, cab.fec_inner, flags); } fprintf(f, "/\n"); channels++; @@ -552,6 +592,11 @@ void eDVBDB::saveServicelist() fclose(f); } +void eDVBDB::saveServicelist() +{ + saveServicelist(CONFIGDIR"/enigma2/lamedb"); +} + void eDVBDB::loadBouquet(const char *path) { std::string bouquet_name = path; @@ -761,7 +806,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje return Py_False; } int tmp, *dest = NULL, - modulation, system, freq, sr, pol, fec; + modulation, system, freq, sr, pol, fec, inv, pilot, rolloff, tsid, onid; char *end_ptr; const Attribute *at; std::string name; @@ -814,19 +859,25 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje PyDict_SetItem(tp_dict, sat_pos, tplist); for (ElementConstIterator it(sat_elements.begin()); it != sat_elements.end(); ++it) { -// eDebug("\telement: %s", (*it)->name().c_str()); + //eDebug("\telement: %s", (*it)->name().c_str()); const AttributeList &tp_attributes = (*it)->getAttributeList(); AttributeConstIterator end = tp_attributes.end(); - modulation = 1; // QPSK default - system = 0; // DVB-S default + modulation = eDVBFrontendParametersSatellite::Modulation_QPSK; + system = eDVBFrontendParametersSatellite::System_DVB_S; freq = 0; sr = 0; pol = -1; - fec = 0; // AUTO default + fec = eDVBFrontendParametersSatellite::FEC_Auto; + inv = eDVBFrontendParametersSatellite::Inversion_Unknown; + pilot = eDVBFrontendParametersSatellite::Pilot_Unknown; + rolloff = eDVBFrontendParametersSatellite::RollOff_alpha_0_35; + tsid = -1; + onid = -1; + for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it) { -// eDebug("\t\tattr: %s", at->name().c_str()); at = *it; + //eDebug("\t\tattr: %s", at->name().c_str()); name = at->name(); if (name == "modulation") dest = &modulation; else if (name == "system") dest = &system; @@ -834,8 +885,15 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje else if (name == "symbol_rate") dest = &sr; else if (name == "polarization") dest = &pol; else if (name == "fec_inner") dest = &fec; + else if (name == "inversion") dest = &inv; + else if (name == "rolloff") dest = &rolloff; + else if (name == "pilot") dest = &pilot; + else if (name == "tsid") dest = &tsid; + else if (name == "onid") dest = &onid; + else continue; if (dest) { + //eDebug("\t\t\tvalue: %s", at->value().c_str()); tmp = strtol(at->value().c_str(), &end_ptr, 10); if (!*end_ptr) *dest = tmp; @@ -843,7 +901,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje } if (freq && sr && pol != -1) { - tuple = PyTuple_New(7); + tuple = PyTuple_New(12); PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(0)); PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(freq)); PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(sr)); @@ -851,6 +909,11 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje PyTuple_SET_ITEM(tuple, 4, PyInt_FromLong(fec)); PyTuple_SET_ITEM(tuple, 5, PyInt_FromLong(system)); PyTuple_SET_ITEM(tuple, 6, PyInt_FromLong(modulation)); + PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong(inv)); + PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong(rolloff)); + PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong(pilot)); + PyTuple_SET_ITEM(tuple, 10, PyInt_FromLong(tsid)); + PyTuple_SET_ITEM(tuple, 11, PyInt_FromLong(onid)); PyList_Append(tplist, tuple); Py_DECREF(tuple); } @@ -940,8 +1003,8 @@ PyObject *eDVBDB::readCables(ePyObject cab_list, ePyObject tp_dict) // eDebug("\telement: %s", (*it)->name().c_str()); const AttributeList &tp_attributes = (*it)->getAttributeList(); AttributeConstIterator end = tp_attributes.end(); - modulation = 3; // QAM64 default - fec = 0; // AUTO default + modulation = eDVBFrontendParametersCable::Modulation_QAM64; + fec = eDVBFrontendParametersCable::FEC_Auto; freq = 0; sr = 0; for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it) @@ -954,6 +1017,7 @@ PyObject *eDVBDB::readCables(ePyObject cab_list, ePyObject tp_dict) else if (name == "frequency") dest = &freq; else if (name == "symbol_rate") dest = &sr; else if (name == "fec_inner") dest = &fec; + else continue; if (dest) { tmp = strtol(at->value().c_str(), &end_ptr, 10); @@ -1054,14 +1118,14 @@ PyObject *eDVBDB::readTerrestrials(ePyObject ter_list, ePyObject tp_dict) const AttributeList &tp_attributes = (*it)->getAttributeList(); AttributeConstIterator end = tp_attributes.end(); freq = 0; - bw = 3; // AUTO - constellation = 1; // AUTO - crh = 5; // AUTO - crl = 5; // AUTO - guard = 4; // AUTO - transm = 2; // AUTO - hierarchy = 4; // AUTO - inv = 2; // AUTO + bw = eDVBFrontendParametersTerrestrial::Bandwidth_Auto; + constellation = eDVBFrontendParametersTerrestrial::Modulation_Auto; + crh = eDVBFrontendParametersTerrestrial::FEC_Auto; + crl = eDVBFrontendParametersTerrestrial::FEC_Auto; + guard = eDVBFrontendParametersTerrestrial::GuardInterval_Auto; + transm = eDVBFrontendParametersTerrestrial::TransmissionMode_Auto; + hierarchy = eDVBFrontendParametersTerrestrial::Hierarchy_Auto; + inv = eDVBFrontendParametersTerrestrial::Inversion_Unknown; for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it) { // eDebug("\t\tattr: %s", at->name().c_str()); @@ -1077,6 +1141,7 @@ PyObject *eDVBDB::readTerrestrials(ePyObject ter_list, ePyObject tp_dict) else if (name == "transmission_mode") dest = &transm; else if (name == "hierarchy_information") dest = &hierarchy; else if (name == "inversion") dest = &inv; + else continue; if (dest) { tmp = strtol(at->value().c_str(), &end_ptr, 10); @@ -1160,15 +1225,17 @@ RESULT eDVBDB::removeServices(eDVBChannelID chid, unsigned int orbpos) if ((unsigned int)sat.orbital_position != orbpos) remove=false; } - if ( remove && chid.dvbnamespace != eNs ) + if ( remove && chid.dvbnamespace != eNs ) // namespace given? { - if (system == iDVBFrontend::feCable && chid.dvbnamespace.get() == 0xFFFF0000) + if ( system == iDVBFrontend::feCable && chid.dvbnamespace.get() == (int)0xFFFF0000 ) ; - else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == 0xEEEE0000) + else if ( system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == (int)0xEEEE0000 ) ; else if ( chid.dvbnamespace != ch.dvbnamespace ) remove=false; } + else if ( system == iDVBFrontend::feCable || system == iDVBFrontend::feTerrestrial ) + 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 ) @@ -1203,6 +1270,45 @@ RESULT eDVBDB::removeServices(eDVBChannelID chid, unsigned int orbpos) return ret; } +RESULT eDVBDB::removeServices(iDVBFrontendParameters *feparm) +{ + int ret = -1; + std::set removed_chids; + std::map::iterator it(m_channels.begin()); + while (it != m_channels.end()) + { + int diff; + if (!feparm->calculateDifference(&(*it->second.m_frontendParameters), diff, false)) + { + if (diff < 4000) + { + removed_chids.insert(it->first); + m_channels.erase(it++); + } + else + ++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(const eServiceReference &ref, unsigned int flagmask) { if (ref.type == eServiceReference::idDVB) @@ -1256,9 +1362,9 @@ RESULT eDVBDB::removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned i } if ( remove && chid.dvbnamespace != eNs ) { - if (system == iDVBFrontend::feCable && chid.dvbnamespace.get() == 0xFFFF0000) + if (system == iDVBFrontend::feCable && chid.dvbnamespace.get() == (int)0xFFFF0000) ; - else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == 0xEEEE0000) + else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == (int)0xEEEE0000) ; else if ( chid.dvbnamespace != ch.dvbnamespace ) remove=false; @@ -1290,9 +1396,13 @@ RESULT eDVBDB::removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned i RESULT eDVBDB::addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm) { channel ch; - assert(feparm); + std::map::iterator it = m_channels.find(id); + ASSERT(feparm); ch.m_frontendParameters = feparm; - m_channels.insert(std::pair(id, ch)); + if (it != m_channels.end()) + it->second = ch; + else + m_channels.insert(std::pair(id, ch)); return 0; } @@ -1420,7 +1530,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ { ePtr a_service, b_service; int sortmode = m_query ? m_query->m_sort : eDVBChannelQuery::tName; - + if ((sortmode == eDVBChannelQuery::tName) || (sortmode == eDVBChannelQuery::tProvider)) { if (a.name.empty() && m_db->getService(a, a_service)) @@ -1428,7 +1538,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ if (b.name.empty() && m_db->getService(b, b_service)) return 1; } - + switch (sortmode) { case eDVBChannelQuery::tName: @@ -1517,7 +1627,7 @@ RESULT eDVBDBBouquetQuery::getNextResult(eServiceReferenceDVB &ref) std::map >::iterator it = m_db->m_services.find(ref); - int res = (!m_query) || it == m_db->m_services.end() || !it->second->isHidden() && it->second->checkFilter(ref, *m_query); + int res = (!m_query) || it == m_db->m_services.end() || !(it->second->isHidden() && it->second->checkFilter(ref, *m_query)); ++m_cursor; @@ -1670,10 +1780,10 @@ static int decodeType(const std::string &type) RESULT parseExpression(ePtr &res, std::list::const_iterator begin, std::list::const_iterator end) { std::list::const_iterator end_of_exp; - + if (begin == end) return 0; - + if (*begin == "(") { end_of_exp = begin; @@ -1682,36 +1792,36 @@ RESULT parseExpression(ePtr &res, std::list::cons break; else ++end_of_exp; - + if (end_of_exp == end) { eDebug("expression parse: end of expression while searching for closing brace"); return -1; } - + ++begin; // begin..end_of_exp int r = parseExpression(res, begin, end_of_exp); if (r) return r; ++end_of_exp; - + /* we had only one sub expression */ if (end_of_exp == end) { // eDebug("only one sub expression"); return 0; } - + /* otherwise we have an operator here.. */ - + ePtr r2 = res; res = new eDVBChannelQuery(); res->m_sort = 0; res->m_p1 = r2; res->m_inverse = 0; r2 = 0; - + if (*end_of_exp == "||") res->m_type = eDVBChannelQuery::tOR; else if (*end_of_exp == "&&") @@ -1722,18 +1832,18 @@ RESULT parseExpression(ePtr &res, std::list::cons res = 0; return 1; } - + ++end_of_exp; - + return parseExpression(res->m_p2, end_of_exp, end); } - + // "begin" "end" std::string type, op, val; - + res = new eDVBChannelQuery(); res->m_sort = 0; - + int cnt = 0; while (begin != end) { @@ -1755,23 +1865,23 @@ RESULT parseExpression(ePtr &res, std::list::cons ++begin; ++cnt; } - + if (cnt != 3) { eDebug("malformed query: missing stuff"); res = 0; return 1; } - + res->m_type = decodeType(type); - + if (res->m_type == -1) { eDebug("malformed query: invalid type %s", type.c_str()); res = 0; return 1; } - + if (op == "==") res->m_inverse = 0; else if (op == "!=") @@ -1782,7 +1892,7 @@ RESULT parseExpression(ePtr &res, std::list::cons res = 0; return 1; } - + res->m_string = val; if (res->m_type == eDVBChannelQuery::tChannelID) @@ -1802,7 +1912,7 @@ RESULT parseExpression(ePtr &res, std::list::cons RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) { std::list tokens; - + std::string current_token; std::string bouquet_name; @@ -1814,34 +1924,34 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) { int c = (i < query.size()) ? query[i] : ' '; ++i; - + int issplit = !!strchr(splitchars, c); int isaln = isalnum(c); int iswhite = c == ' '; int isquot = c == '\"'; - + if (quotemode) { iswhite = issplit = 0; isaln = lastalnum; } - + if (issplit || iswhite || isquot || lastsplit || (lastalnum != isaln)) { if (current_token.size()) tokens.push_back(current_token); current_token.clear(); } - + if (!(iswhite || isquot)) current_token += c; - + if (isquot) quotemode = !quotemode; lastsplit = issplit; lastalnum = isaln; } - + // for (std::list::const_iterator a(tokens.begin()); a != tokens.end(); ++a) // { // printf("%s\n", a->c_str()); @@ -1893,12 +2003,12 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) res = 0; return -1; } - + // eDebug("sort by %d", sort); - + /* now we recursivly parse that. */ int r = parseExpression(res, tokens.begin(), tokens.end()); - + /* we have an empty (but valid!) expression */ if (!r && !res) { @@ -1906,7 +2016,7 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) res->m_inverse = 0; res->m_type = eDVBChannelQuery::tAny; } - + if (res) { res->m_sort = sort;