fix calculation in calculateDifference for cable and terrestrial which should complet...
[enigma2.git] / lib / dvb / db.cpp
index 65b42def034e07c8575ac41556249b3d8916c595..193394705c06ee1a34c2fb9d047a3f20c84a017f 100644 (file)
@@ -107,6 +107,12 @@ err:
        return -1;
 }
 
+RESULT eBouquet::setListName(const std::string &name)
+{
+       m_bouquet_name = name;
+       return 0;
+}
+
 eDVBService::eDVBService()
 {
 }
@@ -220,13 +226,16 @@ 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(CONFIGDIR"/enigma2/lamedb", "rt");
@@ -236,7 +245,7 @@ void eDVBDB::load()
                if ( !stat("lamedb", &s) )
                {
                        rename("lamedb", CONFIGDIR"/enigma2/lamedb" );
-                       load();
+                       reloadServicelist();
                }
                return;
        }
@@ -305,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);
@@ -357,7 +374,6 @@ void eDVBDB::load()
                fgets(line, 256, f);
                if (strlen(line))
                        line[strlen(line)-1]=0;
-
                std::string str=line;
 
                if (str[1]!=':')        // old ... (only service_provider)
@@ -404,7 +420,7 @@ void eDVBDB::load()
        fclose(f);
 }
 
-void eDVBDB::save()
+void eDVBDB::saveServicelist()
 {
        eDebug("---- saving lame channel db");
        FILE *f=fopen(CONFIGDIR"/enigma2/lamedb", "w");
@@ -423,6 +439,7 @@ 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",
@@ -438,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++;
        }
@@ -581,8 +603,9 @@ 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
@@ -612,7 +635,7 @@ void eDVBDB::loadBouquets()
                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);
@@ -620,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)
@@ -679,7 +704,7 @@ RESULT eDVBDB::getService(const eServiceReferenceDVB &reference, ePtr<eDVBServic
 
 RESULT eDVBDB::flush()
 {
-       save();
+       saveServicelist();
        return 0;
 }