db.cpp : 'Load Bouquets' fixed for line have more than 256 chracters.
[vuplus_dvbapp] / lib / dvb / db.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 109d6a6..ea0df97
@@ -3,6 +3,7 @@
 #include <lib/dvb/dvb.h>
 #include <lib/dvb/frontend.h>
 #include <lib/dvb/epgcache.h>
+#include <lib/base/eenv.h>
 #include <lib/base/eerror.h>
 #include <lib/base/estring.h>
 #include <xmlccwrap/xmlccwrap.h>
@@ -73,7 +74,7 @@ RESULT eBouquet::moveService(const eServiceReference &ref, unsigned int pos)
 
 RESULT eBouquet::flushChanges()
 {
-       FILE *f=fopen((CONFIGDIR"/enigma2/"+m_filename).c_str(), "w");
+       FILE *f=fopen(eEnv::resolve("${sysconfdir}/enigma2/" + m_filename).c_str(), "w");
        if (!f)
                return -1;
        if ( fprintf(f, "#NAME %s\r\n", m_bouquet_name.c_str()) < 0 )
@@ -181,8 +182,23 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ
                        res = m_provider_name == query.m_string;
                break;
        case eDVBChannelQuery::tType:
-               res = ref.getServiceType() == query.m_int;
+       {
+               int service_type = ref.getServiceType();
+               if (query.m_int == 1) // TV Service
+               {
+                       // Hack for dish network
+                       int onid = ref.getOriginalNetworkID().get();
+                       if (onid >= 0x1001 && onid <= 0x100b)
+                       {
+                               static int dish_tv_types[] = { 128, 133, 137, 140, 144, 145, 150, 154, 160, 163, 164, 165, 166, 167, 168, 173, 174 };
+                               static size_t dish_tv_num_types = sizeof(dish_tv_types) / sizeof(int);
+                               if (std::binary_search(dish_tv_types, dish_tv_types + dish_tv_num_types, service_type))
+                                       return true;
+                       }
+               }
+               res = service_type == query.m_int;
                break;
+       }
        case eDVBChannelQuery::tBouquet:
                res = 0;
                break;
@@ -265,7 +281,7 @@ DEFINE_REF(eDVBDB);
 
 void eDVBDB::reloadServicelist()
 {
-       loadServicelist(CONFIGDIR"/enigma2/lamedb");
+       loadServicelist(eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str());
 }
 
 void eDVBDB::parseServiceData(ePtr<eDVBService> s, std::string str)
@@ -309,19 +325,11 @@ void eDVBDB::loadServicelist(const char *file)
 {
        eDebug("---- opening lame channel db");
        FILE *f=fopen(file, "rt");
-       if (!f && strcmp(file, CONFIGDIR"/enigma2/lamedb") == 0)
-       {
-               struct stat s;
-               if ( !stat("lamedb", &s) )
-               {
-                       if ( !stat(CONFIGDIR"/enigma2", &s) )
-                       {
-                               rename("lamedb", CONFIGDIR"/enigma2/lamedb" );
-                               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)
@@ -579,7 +587,7 @@ void eDVBDB::saveServicelist(const char *file)
 
 void eDVBDB::saveServicelist()
 {
-       saveServicelist(CONFIGDIR"/enigma2/lamedb");
+       saveServicelist(eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str());
 }
 
 void eDVBDB::loadBouquet(const char *path)
@@ -603,28 +611,20 @@ void eDVBDB::loadBouquet(const char *path)
        std::list<eServiceReference> &list = bouquet.m_services;
        list.clear();
 
-       std::string p = CONFIGDIR"/enigma2/";
+       std::string p = eEnv::resolve("${sysconfdir}/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") )
+               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)";
@@ -632,29 +632,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('/');
@@ -704,6 +700,7 @@ void eDVBDB::loadBouquet(const char *path)
                        continue;
                }
        }
+       free(line);
        fclose(fp);
        eDebug("%d entries in Bouquet %s", entries, bouquet_name.c_str());
 }