use eEnv::resolve() / eEnv.resolve()
[vuplus_dvbapp] / lib / dvb / db.cpp
index ae30e36..522035e 100644 (file)
@@ -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 )
@@ -172,14 +173,32 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ
        switch (query.m_type)
        {
        case eDVBChannelQuery::tName:
-               res = m_service_name_sort.find(query.m_string) != std::string::npos;
+               res = m_service_name_sort == query.m_string;
                break;
        case eDVBChannelQuery::tProvider:
-               res = m_provider_name.find(query.m_string) != std::string::npos;
+               if (query.m_string == "Unknown" && m_provider_name.empty())
+                       res = 1;
+               else
+                       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;
@@ -262,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)
@@ -306,14 +325,14 @@ void eDVBDB::loadServicelist(const char *file)
 {
        eDebug("---- opening lame channel db");
        FILE *f=fopen(file, "rt");
-       if (!f && strcmp(file, CONFIGDIR"/enigma2/lamedb") == 0)
+       if (!f && strcmp(file, eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str()) == 0)
        {
                struct stat s;
                if ( !stat("lamedb", &s) )
                {
-                       if ( !stat(CONFIGDIR"/enigma2", &s) )
+                       if ( !stat(eEnv::resolve("${sysconfdir}/enigma2").c_str(), &s) )
                        {
-                               rename("lamedb", CONFIGDIR"/enigma2/lamedb" );
+                               rename("lamedb", eEnv::resolve("${sysconfdir}/enigma2/lamedb").c_str());
                                reloadServicelist();
                        }
                }
@@ -576,7 +595,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)
@@ -600,7 +619,7 @@ 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");
@@ -872,6 +891,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
                                        else if (name == "pilot") dest = &pilot;
                                        else if (name == "tsid") dest = &tsid;
                                        else if (name == "onid") dest = &onid;
+                                       else continue;
                                        if (dest)
                                        {
                                                //eDebug("\t\t\tvalue: %s", at->value().c_str());
@@ -998,6 +1018,7 @@ PyObject *eDVBDB::readCables(ePyObject cab_list, ePyObject tp_dict)
                                        else if (name == "frequency") dest = &freq;
                                        else if (name == "symbol_rate") dest = &sr;
                                        else if (name == "fec_inner") dest = &fec;
+                                       else continue;
                                        if (dest)
                                        {
                                                tmp = strtol(at->value().c_str(), &end_ptr, 10);
@@ -1121,6 +1142,7 @@ 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 continue;
                                        if (dest)
                                        {
                                                tmp = strtol(at->value().c_str(), &end_ptr, 10);