X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/f973710dc6bcfc13f8db4e5720dd2aeb1518b012..f995ffff71d819416a89c1bec3ceb69d121daa4e:/lib/dvb/db.cpp diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 33a422f8..19339470 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -66,7 +66,7 @@ RESULT eBouquet::moveService(const eServiceReference &ref, unsigned int pos) RESULT eBouquet::flushChanges() { - FILE *f=fopen(m_path.c_str(), "wt"); + FILE *f=fopen((CONFIGDIR"/enigma2/"+m_filename).c_str(), "w"); if (!f) return -1; if ( fprintf(f, "#NAME %s\r\n", m_bouquet_name.c_str()) < 0 ) @@ -103,10 +103,16 @@ RESULT eBouquet::flushChanges() return 0; err: fclose(f); - eDebug("couldn't write file %s", m_path.c_str()); + eDebug("couldn't write file %s", m_filename.c_str()); return -1; } +RESULT eBouquet::setListName(const std::string &name) +{ + m_bouquet_name = name; + return 0; +} + eDVBService::eDVBService() { } @@ -132,7 +138,7 @@ void eDVBService::genSortName() makeUpper(m_service_name_sort); while ((!m_service_name_sort.empty()) && m_service_name_sort[0] == ' ') m_service_name_sort.erase(0, 1); - + /* put unnamed services at the end, not at the beginning. */ if (m_service_name_sort.empty()) m_service_name_sort = "\xFF"; @@ -140,7 +146,7 @@ void eDVBService::genSortName() RESULT eDVBService::getName(const eServiceReference &ref, std::string &name) { - if (!ref.name.empty()) + if (!ref.name.empty()) name = ref.name; // use renamed service name.. else if (!m_service_name.empty()) name = m_service_name; @@ -220,18 +226,29 @@ int eDVBService::getCachePID(cacheID id) void eDVBService::setCachePID(cacheID id, int pid) { - m_cache[id] = pid; + if (pid == -1) + m_cache.erase(id); + else + m_cache[id] = pid; } DEFINE_REF(eDVBDB); /* THIS CODE IS BAD. it should be replaced by somethine better. */ -void eDVBDB::load() +void eDVBDB::reloadServicelist() { eDebug("---- opening lame channel db"); - FILE *f=fopen("lamedb", "rt"); + FILE *f=fopen(CONFIGDIR"/enigma2/lamedb", "rt"); if (!f) + { + struct stat s; + if ( !stat("lamedb", &s) ) + { + rename("lamedb", CONFIGDIR"/enigma2/lamedb" ); + reloadServicelist(); + } return; + } char line[256]; if ((!fgets(line, 256, f)) || strncmp(line, "eDVB services", 13)) { @@ -279,7 +296,8 @@ void eDVBDB::load() sat.symbol_rate = symbol_rate; sat.polarisation = polarisation; sat.fec = fec; - sat.orbital_position = orbital_position; + sat.orbital_position = + orbital_position < 0 ? orbital_position + 3600 : orbital_position; sat.inversion = inversion; feparm->setDVBS(sat); } else if (line[1]=='t') @@ -296,13 +314,21 @@ void eDVBDB::load() ter.guard_interval = guard_interval; ter.hierarchy = hierarchy; ter.inversion = inversion; - feparm->setDVBT(ter); } else if (line[1]=='c') { - int frequency, symbol_rate, inversion=0, modulation=3; - sscanf(line+2, "%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation); -// t.setCable(frequency, symbol_rate, inversion, modulation); + eDVBFrontendParametersCable cab; + int frequency, symbol_rate, + inversion=eDVBFrontendParametersCable::Inversion::Unknown, + modulation=eDVBFrontendParametersCable::Modulation::Auto, + fec_inner=eDVBFrontendParametersCable::FEC::fAuto; + sscanf(line+2, "%d:%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation, &fec_inner); + cab.frequency = frequency; + cab.fec_inner = fec_inner; + cab.inversion = inversion; + cab.symbol_rate = symbol_rate; + cab.modulation = modulation; + feparm->setDVBC(cab); } } addChannelToList(channelid, feparm); @@ -344,11 +370,10 @@ void eDVBDB::load() s->m_service_name = line; s->genSortName(); - + fgets(line, 256, f); if (strlen(line)) line[strlen(line)-1]=0; - std::string str=line; if (str[1]!=':') // old ... (only service_provider) @@ -395,10 +420,10 @@ void eDVBDB::load() fclose(f); } -void eDVBDB::save() +void eDVBDB::saveServicelist() { eDebug("---- saving lame channel db"); - FILE *f=fopen("lamedb", "wt"); + FILE *f=fopen(CONFIGDIR"/enigma2/lamedb", "w"); int channels=0, services=0; if (!f) eFatal("couldn't save lame channel db!"); @@ -414,11 +439,13 @@ void eDVBDB::save() chid.transport_stream_id.get(), chid.original_network_id.get()); eDVBFrontendParametersSatellite sat; eDVBFrontendParametersTerrestrial ter; + 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, + sat.polarisation, sat.fec, + sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position, sat.inversion); } if (!ch.m_frontendParameters->getDVBT(ter)) @@ -428,6 +455,11 @@ void eDVBDB::save() ter.code_rate_LP, ter.modulation, ter.transmission_mode, ter.guard_interval, ter.hierarchy, ter.inversion); } + 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, "/\n"); channels++; } @@ -481,15 +513,24 @@ void eDVBDB::loadBouquet(const char *path) return; } eBouquet &bouquet = m_bouquets[bouquet_name]; - bouquet.m_path = path; + bouquet.m_filename = bouquet_name; std::list &list = bouquet.m_services; list.clear(); - eDebug("loading bouquet... %s", path); - FILE *fp=fopen(path, "rt"); + std::string p = CONFIGDIR"/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") ) { @@ -530,18 +571,17 @@ void eDVBDB::loadBouquet(const char *path) } if ( (tmp.flags&eServiceReference::flagDirectory) == eServiceReference::flagDirectory ) { - std::string str = tmp.path; - unsigned int pos = str.rfind('/'); + unsigned int pos = tmp.path.rfind('/'); if ( pos != std::string::npos ) - str.erase(0, pos+1); - if (str.empty()) + tmp.path.erase(0, pos+1); + if (tmp.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], str.c_str()); + snprintf(buf, 256, "(type == %d) FROM BOUQUET \"%s\" ORDER BY bouquet", tmp.data[0], tmp.path.c_str()); tmp.path = buf; } list.push_back(tmp); @@ -563,15 +603,16 @@ void eDVBDB::loadBouquet(const char *path) eDebug("%d entries in Bouquet %s", entries, bouquet_name.c_str()); } -void eDVBDB::loadBouquets() +void eDVBDB::reloadBouquets() { + m_bouquets.clear(); loadBouquet("bouquets.tv"); loadBouquet("bouquets.radio"); // create default bouquets when missing if ( m_bouquets.find("userbouquet.favourites.tv") == m_bouquets.end() ) { eBouquet &b = m_bouquets["userbouquet.favourites.tv"]; - b.m_path = "userbouquet.favourites.tv"; + b.m_filename = "userbouquet.favourites.tv"; b.m_bouquet_name = "Favourites (TV)"; b.flushChanges(); eServiceReference ref; @@ -587,14 +628,14 @@ void eDVBDB::loadBouquets() if ( m_bouquets.find("userbouquet.favourites.radio") == m_bouquets.end() ) { eBouquet &b = m_bouquets["userbouquet.favourites.radio"]; - b.m_path = "userbouquet.favourites.radio"; + b.m_filename = "userbouquet.favourites.radio"; b.m_bouquet_name = "Favourites (Radio)"; b.flushChanges(); eServiceReference ref; memset(ref.data, 0, sizeof(ref.data)); ref.type=1; ref.flags=7; - ref.data[0]=1; + ref.data[0]=2; ref.path="(type == 2) FROM BOUQUET \"userbouquet.favourites.radio\" ORDER BY bouquet"; eBouquet &parent = m_bouquets["bouquets.radio"]; parent.m_services.push_back(ref); @@ -602,15 +643,17 @@ void eDVBDB::loadBouquets() } } +eDVBDB *eDVBDB::instance; + eDVBDB::eDVBDB() { - load(); - loadBouquets(); + instance = this; + reloadServicelist(); } eDVBDB::~eDVBDB() { -// save(); + instance=NULL; } RESULT eDVBDB::addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm) @@ -661,7 +704,7 @@ RESULT eDVBDB::getService(const eServiceReferenceDVB &reference, ePtrm_sort == eDVBChannelQuery::tSatellitePosition ) - return (a.getDVBNamespace().get() >> 16) < (b.getDVBNamespace().get() >> 16); + { + int x = (a.getDVBNamespace().get() >> 16); + int y = (b.getDVBNamespace().get() >> 16); + if ( x > 1800 ) + x -= 3600; + if ( y > 1800 ) + y -= 3600; + return x < y; + } return a.name < b.name; }