X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a8a7dc1baea8931584c1798e65c88fe157a73064..1f14a8b7aa70bdc6f155b2ff69e2de7c2bcdccbb:/lib/dvb/db.cpp diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 04c03b94..de2de1e4 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -10,6 +10,47 @@ DEFINE_REF(eDVBService); +RESULT eBouquet::addService(const eServiceReference &ref) +{ + list::iterator it = + std::find(m_services.begin(), m_services.end(), ref); + if ( it != m_services.end() ) + return -1; + m_services.push_back(ref); + return 0; +} + +RESULT eBouquet::removeService(const eServiceReference &ref) +{ + list::iterator it = + std::find(m_services.begin(), m_services.end(), ref); + if ( it == m_services.end() ) + return -1; + m_services.erase(it); + return 0; +} + +RESULT eBouquet::moveService(const eServiceReference &ref, unsigned int pos) +{ + if ( pos < 0 || pos >= m_services.size() ) + return -1; + list::iterator source=m_services.end(); + list::iterator dest=m_services.end(); + for (list::iterator it(m_services.begin()); it != m_services.end(); ++it) + { + if (dest == m_services.end() && !pos--) + dest = it; + if (*it == ref) + source = it; + if (dest != m_services.end() && source != m_services.end()) + break; + } + if (dest == m_services.end() || source == m_services.end() || source == dest) + return -1; + std::iter_swap(source,dest); + return 0; +} + eDVBService::eDVBService() { } @@ -31,10 +72,12 @@ eDVBService &eDVBService::operator=(const eDVBService &s) RESULT eDVBService::getName(const eServiceReference &ref, std::string &name) { - if ( ref.name.length() ) + if (!ref.name.empty()) name = ref.name; - else + else if (!m_service_name.empty()) name = m_service_name; + else + name = "(...)"; return 0; } @@ -155,8 +198,6 @@ void eDVBDB::load() sat.fec = fec; sat.orbital_position = orbital_position; sat.inversion = inversion; - // ... -// t.setSatellite(frequency, symbol_rate, polarisation, fec, sat, inversion); feparm->setDVBS(sat); } else if (line[1]=='t') { @@ -221,7 +262,13 @@ void eDVBDB::load() s->m_service_name = line; s->m_service_name_sort = removeDVBChars(line); makeUpper(s->m_service_name_sort); - + while ((!s->m_service_name_sort.empty()) && s->m_service_name_sort[0] == ' ') + s->m_service_name_sort.erase(0, 1); + + /* put unnamed services at the end, not at the beginning. */ + if (s->m_service_name_sort.empty()) + s->m_service_name_sort = "\xFF"; + fgets(line, 256, f); if (strlen(line)) line[strlen(line)-1]=0; @@ -341,6 +388,49 @@ void eDVBDB::save() fclose(f); } +RESULT eBouquet::flushChanges() +{ + FILE *f=fopen(m_path.c_str(), "wt"); + if (!f) + return -1; + if ( fprintf(f, "#NAME %s\r\n", m_bouquet_name.c_str()) < 0 ) + goto err; + for (list::iterator i(m_services.begin()); i != m_services.end(); ++i) + { + 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() ) + if ( fprintf(f, "#DESCRIPTION %s\r\n", i->name.c_str()) < 0 ) + goto err; + } + fclose(f); + return 0; +err: + fclose(f); + eDebug("couldn't write file %s", m_path.c_str()); + return -1; +} + void eDVBDB::loadBouquet(const char *path) { std::string bouquet_name = path; @@ -501,7 +591,7 @@ RESULT eDVBDB::getService(const eServiceReferenceDVB &reference, ePtr &res, std::list::cons /* we had only one sub expression */ if (end_of_exp == end) { - eDebug("only one sub expression"); +// eDebug("only one sub expression"); return 0; } @@ -783,7 +874,7 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) std::string current_token; std::string bouquet_name; - eDebug("splitting %s....", query.c_str()); +// eDebug("splitting %s....", query.c_str()); unsigned int i = 0; const char *splitchars="()"; int quotemode = 0, lastsplit = 0, lastalnum = 0; @@ -867,7 +958,7 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) return -1; } - eDebug("sort by %d", sort); +// eDebug("sort by %d", sort); /* now we recursivly parse that. */ int r = parseExpression(res, tokens.begin(), tokens.end()); @@ -878,7 +969,7 @@ RESULT eDVBChannelQuery::compile(ePtr &res, std::string query) res->m_bouquet_name = bouquet_name; } - eDebug("return: %d", r); +// eDebug("return: %d", r); return r; }