support DVB-T2
[vuplus_dvbapp] / lib / dvb / db.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 522035e..fb0b66c
@@ -325,19 +325,11 @@ void eDVBDB::loadServicelist(const char *file)
 {
        eDebug("---- opening lame channel db");
        FILE *f=fopen(file, "rt");
-       if (!f && strcmp(file, eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str()) == 0)
-       {
-               struct stat s;
-               if ( !stat("lamedb", &s) )
-               {
-                       if ( !stat(eEnv::resolve("${sysconfdir}/enigma2").c_str(), &s) )
-                       {
-                               rename("lamedb", eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str());
-                               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)
@@ -406,8 +398,9 @@ void eDVBDB::loadServicelist(const char *file)
                        } else if (line[1]=='t')
                        {
                                eDVBFrontendParametersTerrestrial ter;
-                               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);
+                               int frequency, bandwidth, code_rate_HP, code_rate_LP, modulation, transmission_mode, guard_interval, hierarchy, inversion, flags = 0, plpid = 0;
+                               int system=eDVBFrontendParametersTerrestrial::System_DVB_T;
+                               sscanf(line+3, "%d:%d:%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, &system, &plpid);
                                ter.frequency = frequency;
                                ter.bandwidth = bandwidth;
                                ter.code_rate_HP = code_rate_HP;
@@ -417,6 +410,8 @@ void eDVBDB::loadServicelist(const char *file)
                                ter.guard_interval = guard_interval;
                                ter.hierarchy = hierarchy;
                                ter.inversion = inversion;
+                               ter.system = system;
+                               ter.plpid = plpid;
                                feparm->setDVBT(ter);
                                feparm->setFlags(flags);
                        } else if (line[1]=='c')
@@ -540,10 +535,10 @@ void eDVBDB::saveServicelist(const char *file)
                }
                else if (!ch.m_frontendParameters->getDVBT(ter))
                {
-                       fprintf(f, "\tt %d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
+                       fprintf(f, "\tt %d:%d:%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, flags);
+                               ter.guard_interval, ter.hierarchy, ter.inversion, flags, ter.system, ter.plpid);
                }
                else if (!ch.m_frontendParameters->getDVBC(cab))
                {
@@ -623,24 +618,16 @@ void eDVBDB::loadBouquet(const char *path)
        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)";
@@ -648,29 +635,25 @@ void eDVBDB::loadBouquet(const char *path)
                }
                return;
        }
-       char line[256];
+       int entries=0;
+       size_t linesize = 256;
+       char *line = (char*)malloc(linesize);
        bool read_descr=false;
        eServiceReference *e = NULL;
        while (1)
        {
-               if (!fgets(line, 256, fp))
-                       break;
-               line[strlen(line)-1]=0;
-               if (strlen(line) && line[strlen(line)-1]=='\r')
-                       line[strlen(line)-1]=0;
-               if (!line[0])
-                       break;
+               int len;
+               if ((len = getline(&line, &linesize, fp)) < 2) break;
+               /* strip newline */
+               line[--len] = 0;
+               /* strip carriage return (when found) */
+               if (line[len - 1] == '\r') line[--len] = 0;
                if (line[0]=='#')
                {
                        if (!strncmp(line, "#SERVICE", 8))
                        {
                                int offs = line[8] == ':' ? 10 : 9;
                                eServiceReference tmp(line+offs);
-                               if (tmp.type != eServiceReference::idDVB)
-                               {
-                                       eDebug("only DVB Bouquets supported");
-                                       continue;
-                               }
                                if ( tmp.flags&eServiceReference::canDescent )
                                {
                                        size_t pos = tmp.path.rfind('/');
@@ -720,6 +703,7 @@ void eDVBDB::loadBouquet(const char *path)
                        continue;
                }
        }
+       free(line);
        fclose(fp);
        eDebug("%d entries in Bouquet %s", entries, bouquet_name.c_str());
 }
@@ -1077,7 +1061,8 @@ PyObject *eDVBDB::readTerrestrials(ePyObject ter_list, ePyObject tp_dict)
        const Attribute *at;
        std::string name;
        int tmp, *dest,
-               freq, bw, constellation, crh = 5, crl = 5, guard = 4, transm, hierarchy, inv = 2;
+//             freq, bw, constellation, crh = 5, crl = 5, guard = 4, transm, hierarchy, inv = 2;
+               freq, bw, constellation, crh, crl, guard, transm, hierarchy, inv, system, plpid;
        char *end_ptr;
        const ElementList &root_elements = root->getElementList();
        for (ElementConstIterator it(root_elements.begin()); it != root_elements.end(); ++it)
@@ -1127,6 +1112,8 @@ PyObject *eDVBDB::readTerrestrials(ePyObject ter_list, ePyObject tp_dict)
                                transm = eDVBFrontendParametersTerrestrial::TransmissionMode_Auto;
                                hierarchy = eDVBFrontendParametersTerrestrial::Hierarchy_Auto;
                                inv = eDVBFrontendParametersTerrestrial::Inversion_Unknown;
+                               system = eDVBFrontendParametersTerrestrial::System_DVB_T;
+                               plpid = 0;
                                for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it)
                                {
 //                                     eDebug("\t\tattr: %s", at->name().c_str());
@@ -1142,6 +1129,8 @@ 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 if (name == "system") dest = &system;
+                                       else if (name == "plp_id") dest = &plpid;
                                        else continue;
                                        if (dest)
                                        {
@@ -1152,11 +1141,11 @@ PyObject *eDVBDB::readTerrestrials(ePyObject ter_list, ePyObject tp_dict)
                                }
                                if (freq)
                                {
-                                       if (crh > 5) // our terrestrial.xml is buggy... 6 for AUTO
-                                               crh = 5;
-                                       if (crl > 5) // our terrestrial.xml is buggy... 6 for AUTO
-                                               crl = 5;
-                                       tuple = PyTuple_New(10);
+                                       if (crh > eDVBFrontendParametersTerrestrial::FEC_8_9)
+                                               crh = eDVBFrontendParametersTerrestrial::FEC_Auto;
+                                       if (crl > eDVBFrontendParametersTerrestrial::FEC_8_9)
+                                               crl = eDVBFrontendParametersTerrestrial::FEC_Auto;
+                                       tuple = PyTuple_New(12);
                                        PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(2));
                                        PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(freq));
                                        PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(bw));
@@ -1167,6 +1156,8 @@ PyObject *eDVBDB::readTerrestrials(ePyObject ter_list, ePyObject tp_dict)
                                        PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong(transm));
                                        PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong(hierarchy));
                                        PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong(inv));
+                                       PyTuple_SET_ITEM(tuple, 10, PyInt_FromLong(system));
+                                       PyTuple_SET_ITEM(tuple, 11, PyInt_FromLong(plpid));
                                        PyList_Append(tplist, tuple);
                                        Py_DECREF(tuple);
                                }