From 572b037a7a3229c0cad946927adc15648fcc314c Mon Sep 17 00:00:00 2001 From: Huevos Date: Wed, 7 Aug 2024 12:46:23 +0200 Subject: [PATCH] Move LCNData to db.h Author: @DimitarCC Uses some code from https://github.com/openatv/enigma2/commit/be62b2da3a92e16429c695b5277e1ffa3a339990 --- lib/dvb/db.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/dvb/db.h | 73 ++++++++++++++++++++++++++++++++++++++++ lib/dvb/scan.cpp | 56 ++----------------------------- lib/dvb/scan.h | 3 -- 4 files changed, 162 insertions(+), 56 deletions(-) diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index f349e820937..379994c8013 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -800,6 +800,65 @@ void eDVBDB::loadServiceListV5(FILE * f) eDebug("[eDVBDB] loaded %d channels/transponders and %d services", tcount, scount); } +void eDVBDB::resetLcnDB() +{ + m_lcnmap.clear(); + FILE *m_lcn_file = fopen(eEnv::resolve("${sysconfdir}/enigma2/lcndb").c_str(), "w"); + if (m_lcn_file) + fclose(m_lcn_file); +} + +void eDVBDB::saveLcnDB() +{ + std::string lfname = eEnv::resolve("${sysconfdir}/enigma2/lcndb"); + CFile lf(lfname, "w"); + if (lf) + { + for (auto &[key, value] : m_lcnmap) + { + value.write(lf, key); + } + } +} + +void eDVBDB::addLcnToDB(int ns, int onid, int tsid, int sid, uint16_t lcn, uint32_t signal) +{ + eServiceReferenceDVB s = eServiceReferenceDVB(eDVBNamespace(ns), eTransportStreamID(tsid), eOriginalNetworkID(onid), eServiceID(sid), 0); + std::map::iterator it = m_lcnmap.find(s); + if (it != m_lcnmap.end()) + { + it->second.Update(lcn, signal); + } + else + { + LCNData lcndata; + lcndata.Update(lcn, signal); + m_lcnmap.insert(std::pair(s, lcndata)); + } +} + +void eDVBDB::readLcnDBFile() +{ + char line[256]; + m_lcnmap.clear(); + std::string lfname = eEnv::resolve("${sysconfdir}/enigma2/lcndb"); + CFile lf(lfname, "rt"); + if(lf) + { + while (!feof(lf)) + { + if (!fgets(line, sizeof(line), lf)) + break; + + LCNData lcndata; + eServiceReferenceDVB s = lcndata.parse(line); + if (s) + m_lcnmap.insert(std::pair(s, lcndata)); + + } + } +} + void eDVBDB::loadServicelist(const char *file) { eDebug("[eDVBDB] ---- opening lame channel db"); @@ -828,6 +887,8 @@ void eDVBDB::loadServicelist(const char *file) eDebug("[eDVBDB] services invalid, no transponders"); return; } + + readLcnDBFile(); // clear all transponders int tcount = 0; while (!feof(f)) @@ -1109,6 +1170,7 @@ void eDVBDB::saveServicelist(const char *file) void eDVBDB::saveServicelist() { saveServicelist(eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str()); + saveLcnDB(); } void eDVBDB::saveIptvServicelist() @@ -2120,6 +2182,30 @@ PyObject *eDVBDB::readATSC(ePyObject atsc_list, ePyObject tp_dict) return Py_True; } +PyObject *eDVBDB::getLcnDBData() +{ + ePyObject dest = PyList_New(0); + if (dest) + { + std::map::iterator it = m_lcnmap.begin(); + for (;it != m_lcnmap.end();++it) + { + ePyObject tuple = PyTuple_New(6); + PyTuple_SET_ITEM(tuple, 0, PyLong_FromLongLong((unsigned long)it->second.NS)); + PyTuple_SET_ITEM(tuple, 1, PyLong_FromLongLong((unsigned long)it->second.ONID)); + PyTuple_SET_ITEM(tuple, 2, PyLong_FromLongLong((unsigned long)it->second.TSID)); + PyTuple_SET_ITEM(tuple, 3, PyLong_FromLongLong((unsigned long)it->second.SID)); + PyTuple_SET_ITEM(tuple, 4, PyLong_FromLongLong((unsigned long)it->second.LCN)); + PyTuple_SET_ITEM(tuple, 5, PyLong_FromLongLong((unsigned long)it->second.SIGNAL)); + PyList_Append(dest, tuple); + Py_DECREF(tuple); + } + } + else + Py_RETURN_NONE; + return dest; +} + eDVBDB::~eDVBDB() { instance=NULL; diff --git a/lib/dvb/db.h b/lib/dvb/db.h index 8501ea3be78..c92f45c5aba 100644 --- a/lib/dvb/db.h +++ b/lib/dvb/db.h @@ -7,8 +7,75 @@ #include #include #include +#include class ServiceDescriptionSection; +struct LCNData +{ +private: + bool FOUND; + + std::vector split_str(std::string s) + { + std::vector tokens; + std::string token; + std::stringstream str(s); + while (getline(str, token, ':')) { + tokens.push_back(token); + } + return tokens; + } + +public: + int NS; + int ONID; + int TSID; + int SID; + int SIGNAL; + int LCN; + LCNData() + { + LCN = 0; + SIGNAL = -1; + FOUND = true; + } + + eServiceReferenceDVB parse(const char *line) + { + + if (sscanf(line, "%x:%x:%x:%x:%d:%d", &NS, &ONID, &TSID, &SID, &LCN, &SIGNAL) == 6) + return eServiceReferenceDVB(eDVBNamespace(NS), eTransportStreamID(TSID), eOriginalNetworkID(ONID), eServiceID(SID), 0); + else + return eServiceReferenceDVB(); + + } + + void Update(uint16_t lcn, uint32_t signal) + { + LCN = lcn; + SIGNAL = signal; + FOUND = true; + } + + void write(FILE *lf, const eServiceReferenceDVB &key) + { + if (FOUND) + { + int sid = key.getServiceID().get(); + int tsid = key.getTransportStreamID().get(); + int onid = key.getOriginalNetworkID().get(); + int ns = key.getDVBNamespace().get(); + fprintf(lf, "%x:%x:%x:%x:%d:%d\n", ns, onid, tsid, sid, LCN, SIGNAL); + } + } + + void resetFound() + { + FOUND = false; + } + +}; + class eIPTVDBItem { public: @@ -65,6 +132,7 @@ class eDVBDB: public iDVBChannelList #endif private: void loadServiceListV5(FILE * f); + std::map m_lcnmap; public: std::vector iptv_services; // iDVBChannelList @@ -83,6 +151,7 @@ class eDVBDB: public iDVBChannelList PyObject *readTerrestrials(SWIG_PYOBJECT(ePyObject) ter_list, SWIG_PYOBJECT(ePyObject) tp_dict); PyObject *readCables(SWIG_PYOBJECT(ePyObject) cab_list, SWIG_PYOBJECT(ePyObject) tp_dict); PyObject *readATSC(SWIG_PYOBJECT(ePyObject) atsc_list, SWIG_PYOBJECT(ePyObject) tp_dict); + PyObject *getLcnDBData(); #ifndef SWIG RESULT removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned int orb_pos); RESULT removeServices(eDVBChannelID chid, unsigned int orb_pos); @@ -106,6 +175,9 @@ class eDVBDB: public iDVBChannelList eDVBDB(); virtual ~eDVBDB(); int renumberBouquet(eBouquet &bouquet, int startChannelNum = 1); + void addLcnToDB(int ns, int onid, int tsid, int sid, uint16_t lcn, uint32_t signal); + void resetLcnDB(); + void readLcnDBFile(); #endif eServiceReference searchReference(int tsid, int onid, int sid); void setNumberingMode(bool numberingMode); @@ -117,6 +189,7 @@ class eDVBDB: public iDVBChannelList void saveServicelist(); void saveIptvServicelist(); void saveServicelist(const char *file); + void saveLcnDB(); void reloadBouquets(); void parseServiceData(ePtr s, std::string str); }; diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp index fe1cded8c97..205c169ff8f 100644 --- a/lib/dvb/scan.cpp +++ b/lib/dvb/scan.cpp @@ -48,13 +48,10 @@ eDVBScan::eDVBScan(iDVBChannel *channel, bool usePAT, bool debug) if (m_channel->getDemux(m_demux)) SCAN_eDebug("[eDVBScan] failed to allocate demux!"); m_channel->connectStateChange(sigc::mem_fun(*this, &eDVBScan::stateChange), m_stateChanged_connection); - m_lcn_file = NULL; } eDVBScan::~eDVBScan() { - if (m_lcn_file) - fclose(m_lcn_file); } int eDVBScan::isValidONIDTSID(int orbital_position, eOriginalNetworkID onid, eTransportStreamID tsid) @@ -585,39 +582,6 @@ void eDVBScan::addKnownGoodChannel(const eDVBChannelID &chid, iDVBFrontendParame m_new_channels.insert(std::pair >(chid, feparm)); } -void eDVBScan::addLcnToDB(eDVBNamespace ns, eOriginalNetworkID onid, eTransportStreamID tsid, eServiceID sid, uint16_t lcn, uint32_t signal) -{ - if (m_lcn_file) - { - int size = 0; - char row[40]; - bool added = false; - sprintf(row, "%08x:%04x:%04x:%04x:%05d:%08d\n", ns.get(), onid.get(), tsid.get(), sid.get(), lcn, signal); - fseek(m_lcn_file, 0, SEEK_END); - size = ftell(m_lcn_file); - - for (int i = 0; i < size / 39; i++) - { - char tmp[40]; - fseek(m_lcn_file, i*39, SEEK_SET); - fread (tmp, 1, 39, m_lcn_file); - if (memcmp(tmp, row, 23) == 0) - { - fseek(m_lcn_file, i*39, SEEK_SET); - fwrite(row, 1, 39, m_lcn_file); - added = true; - break; - } - } - - if (!added) - { - fseek(m_lcn_file, 0, SEEK_END); - fwrite(row, 1, 39, m_lcn_file); - } - } -} - void eDVBScan::addChannelToScan(iDVBFrontendParameters *feparm) { /* check if we don't already have that channel ... */ @@ -992,7 +956,7 @@ void eDVBScan::channelDone() LogicalChannel *ch = *it; if (ch->getVisibleServiceFlag()) { - addLcnToDB(ns, onid, tsid, eServiceID(ch->getServiceId()), ch->getLogicalChannelNumber(), signal); + eDVBDB::getInstance()->addLcnToDB(ns.get(), onid.get(), tsid.get(), eServiceID(ch->getServiceId()).get(), ch->getLogicalChannelNumber(), signal); SCAN_eDebug("NAMESPACE: %08x ONID: %04x TSID: %04x SID: %04x LCN: %05d SIGNAL: %08d", ns.get(), onid.get(), tsid.get(), ch->getServiceId(), ch->getLogicalChannelNumber(), signal); } } @@ -1266,26 +1230,12 @@ void eDVBScan::start(const eSmartPtrList &known_transpon transponderlist = &m_ch_blindscan; } - if (m_lcn_file) - fclose(m_lcn_file); - if (m_flags & scanRemoveServices) { - m_lcn_file = fopen(eEnv::resolve("${sysconfdir}/enigma2/lcndb").c_str(), "w"); - if (!m_lcn_file) - eDebug("couldn't open file lcndb"); - } - else - { - m_lcn_file = fopen(eEnv::resolve("${sysconfdir}/enigma2/lcndb").c_str(), "r+"); - if (!m_lcn_file) - { - m_lcn_file = fopen(eEnv::resolve("${sysconfdir}/enigma2/lcndb").c_str(), "w"); - if (!m_lcn_file) - eDebug("couldn't open file lcndb"); - } + eDVBDB::getInstance()->resetLcnDB(); } + for (eSmartPtrList::const_iterator i(known_transponders.begin()); i != known_transponders.end(); ++i) { bool exist=false; diff --git a/lib/dvb/scan.h b/lib/dvb/scan.h index 1876782e5ec..8a59c74e138 100644 --- a/lib/dvb/scan.h +++ b/lib/dvb/scan.h @@ -98,9 +98,6 @@ class eDVBScan: public sigc::trackable, public iObject int m_networkid; bool m_usePAT; bool m_scan_debug; - - FILE *m_lcn_file; - void addLcnToDB(eDVBNamespace ns, eOriginalNetworkID onid, eTransportStreamID tsid, eServiceID sid, uint16_t lcn, uint32_t signal); public: eDVBScan(iDVBChannel *channel, bool usePAT=true, bool debug=true ); ~eDVBScan();