X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fdb.cpp;h=0547407132b3b9e765e83d4314b63cb89095398b;hp=719ff35e72df1f31fbd9865fd5bfc1ad821edfb8;hb=849b33656dc710cfa5f644a55680fd396ab1d8d7;hpb=4be13de9082e1c79de77db6fa3eeab18a3955715 diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 719ff35..0547407 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -73,7 +74,7 @@ RESULT eBouquet::moveService(const eServiceReference &ref, unsigned int pos) RESULT eBouquet::flushChanges() { - FILE *f=fopen((CONFIGDIR"/enigma2/"+m_filename).c_str(), "w"); + FILE *f=fopen(eEnv::resolve("${sysconfdir}/enigma2/" + m_filename).c_str(), "w"); if (!f) return -1; if ( fprintf(f, "#NAME %s\r\n", m_bouquet_name.c_str()) < 0 ) @@ -172,14 +173,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; @@ -262,7 +281,43 @@ DEFINE_REF(eDVBDB); void eDVBDB::reloadServicelist() { - loadServicelist(CONFIGDIR"/enigma2/lamedb"); + loadServicelist(eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str()); +} + +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. */ @@ -270,19 +325,11 @@ void eDVBDB::loadServicelist(const char *file) { eDebug("---- opening lame channel db"); FILE *f=fopen(file, "rt"); - if (!f && strcmp(file, CONFIGDIR"/enigma2/lamedb") == 0) - { - struct stat s; - if ( !stat("lamedb", &s) ) - { - if ( !stat(CONFIGDIR"/enigma2", &s) ) - { - rename("lamedb", CONFIGDIR"/enigma2/lamedb" ); - reloadServicelist(); - } - } + if (!f) { + eDebug("can't open %s: %m", file); return; } + char line[256]; int version=3; if ((!fgets(line, 256, f)) || sscanf(line, "eDVB services /%d/", &version) != 1) @@ -425,44 +472,10 @@ void eDVBDB::loadServicelist(const char *file) 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); } @@ -574,7 +587,7 @@ void eDVBDB::saveServicelist(const char *file) void eDVBDB::saveServicelist() { - saveServicelist(CONFIGDIR"/enigma2/lamedb"); + saveServicelist(eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str()); } void eDVBDB::loadBouquet(const char *path) @@ -598,28 +611,20 @@ void eDVBDB::loadBouquet(const char *path) std::list &list = bouquet.m_services; list.clear(); - std::string p = CONFIGDIR"/enigma2/"; + std::string p = eEnv::resolve("${sysconfdir}/enigma2/"); p+=path; eDebug("loading bouquet... %s", p.c_str()); FILE *fp=fopen(p.c_str(), "rt"); - int entries=0; if (!fp) { - struct stat s; - if ( !stat(path, &s) ) - { - rename(path, p.c_str() ); - loadBouquet(path); - return; - } - eDebug("failed to open."); - if ( strstr(path, "bouquets.tv") ) + eDebug("can't open %s: %m", p.c_str()); + if (!strcmp(path, "bouquets.tv")) { eDebug("recreate bouquets.tv"); bouquet.m_bouquet_name="Bouquets (TV)"; bouquet.flushChanges(); } - else if ( strstr(path, "bouquets.radio") ) + else if (!strcmp(path, "bouquets.radio")) { eDebug("recreate bouquets.radio"); bouquet.m_bouquet_name="Bouquets (Radio)"; @@ -627,6 +632,7 @@ void eDVBDB::loadBouquet(const char *path) } return; } + int entries=0; char line[256]; bool read_descr=false; eServiceReference *e = NULL; @@ -839,25 +845,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 - inv = 2; // AUTO default - pilot = 2; // AUTO default - rolloff = 0; // alpha 0.35 + 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; @@ -870,8 +876,10 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje 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; @@ -981,8 +989,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) @@ -995,6 +1003,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); @@ -1095,14 +1104,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()); @@ -1118,6 +1127,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); @@ -1201,15 +1211,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() == (int)0xFFFF0000) + if ( system == iDVBFrontend::feCable && chid.dvbnamespace.get() == (int)0xFFFF0000 ) ; - else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == (int)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 ) @@ -1371,7 +1383,7 @@ RESULT eDVBDB::addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters { channel ch; std::map::iterator it = m_channels.find(id); - assert(feparm); + ASSERT(feparm); ch.m_frontendParameters = feparm; if (it != m_channels.end()) it->second = ch;