Merge branch 'bug_461_play_another_timeshift_file_after_eof' into experimental
[enigma2.git] / lib / dvb / db.cpp
index e4d9ad228e6d8139ca3911e4fa9bf075a4329459..38be6359cabfd4624d6d4e906b63c12d4f210335 100644 (file)
@@ -172,14 +172,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;
@@ -265,6 +283,42 @@ void eDVBDB::reloadServicelist()
        loadServicelist(CONFIGDIR"/enigma2/lamedb");
 }
 
+void eDVBDB::parseServiceData(ePtr<eDVBService> s, std::string str)
+{
+       while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d...
+       {
+               size_t c=str.find(',');
+               char p=str[0];
+               std::string v;
+               if (c == std::string::npos)
+               {
+                       v=str.substr(2);
+                       str="";
+               } else
+               {
+                       v=str.substr(2, c-2);
+                       str=str.substr(c+1);
+               }
+//             eDebug("%c ... %s", p, v.c_str());
+               if (p == 'p')
+                       s->m_provider_name=v;
+               else if (p == 'f')
+               {
+                       sscanf(v.c_str(), "%x", &s->m_flags);
+               } else if (p == 'c')
+               {
+                       int cid, val;
+                       sscanf(v.c_str(), "%02d%x", &cid, &val);
+                       s->setCacheEntry((eDVBService::cacheID)cid,val);
+               } else if (p == 'C')
+               {
+                       int val;
+                       sscanf(v.c_str(), "%04x", &val);
+                       s->m_ca.push_front((uint16_t)val);
+               }
+       }
+}
+
        /* THIS CODE IS BAD. it should be replaced by somethine better. */
 void eDVBDB::loadServicelist(const char *file)
 {
@@ -425,44 +479,10 @@ void eDVBDB::loadServicelist(const char *file)
                fgets(line, 256, f);
                if (strlen(line))
                        line[strlen(line)-1]=0;
-               std::string str=line;
-
-               if (str[1]!=':')        // old ... (only service_provider)
-               {
+               if (line[1]!=':')       // old ... (only service_provider)
                        s->m_provider_name=line;
-               } else
-                       while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d...
-                       {
-                               size_t c=str.find(',');
-                               char p=str[0];
-                               std::string v;
-                               if (c == std::string::npos)
-                               {
-                                       v=str.substr(2);
-                                       str="";
-                               } else
-                               {
-                                       v=str.substr(2, c-2);
-                                       str=str.substr(c+1);
-                               }
-//                             eDebug("%c ... %s", p, v.c_str());
-                               if (p == 'p')
-                                       s->m_provider_name=v;
-                               else if (p == 'f')
-                               {
-                                       sscanf(v.c_str(), "%x", &s->m_flags);
-                               } else if (p == 'c')
-                               {
-                                       int cid, val;
-                                       sscanf(v.c_str(), "%02d%x", &cid, &val);
-                                       s->setCacheEntry((eDVBService::cacheID)cid,val);
-                               } else if (p == 'C')
-                               {
-                                       int val;
-                                       sscanf(v.c_str(), "%04x", &val);
-                                       s->m_ca.push_front((uint16_t)val);
-                               }
-                       }
+               else
+                       parseServiceData(s, line);
                addService(ref, s);
        }
 
@@ -870,6 +890,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());
@@ -996,6 +1017,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);
@@ -1119,6 +1141,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);
@@ -1374,7 +1397,7 @@ RESULT eDVBDB::addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters
 {
        channel ch;
        std::map<eDVBChannelID, channel>::iterator it = m_channels.find(id);
-       assert(feparm);
+       ASSERT(feparm);
        ch.m_frontendParameters = feparm;
        if (it != m_channels.end())
                it->second = ch;