use e2 functions to merge config and services
[enigma2.git] / lib / dvb / db.cpp
index b40b7373a4d7e3254404c0ce37f8fd8b975d5758..e1b19175d62fb00227e3d720423c04797f9bda47 100644 (file)
@@ -260,12 +260,17 @@ void eDVBService::setCacheEntry(cacheID id, int pid)
 
 DEFINE_REF(eDVBDB);
 
-       /* THIS CODE IS BAD. it should be replaced by somethine better. */
 void eDVBDB::reloadServicelist()
+{
+       loadServicelist(CONFIGDIR"/enigma2/lamedb");
+}
+
+       /* THIS CODE IS BAD. it should be replaced by somethine better. */
+void eDVBDB::loadServicelist(const char *file)
 {
        eDebug("---- opening lame channel db");
-       FILE *f=fopen(CONFIGDIR"/enigma2/lamedb", "rt");
-       if (!f)
+       FILE *f=fopen(file, "rt");
+       if (!f && strcmp(file, CONFIGDIR"/enigma2/lamedb") == 0)
        {
                struct stat s;
                if ( !stat("lamedb", &s) )
@@ -863,6 +868,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
                                Py_DECREF(sat_pos);
                        if (sat_name)
                                Py_DECREF(sat_name);
+                       if (sat_flags)
+                               Py_DECREF(sat_flags);
                }
        }
        Py_INCREF(Py_True);
@@ -1158,10 +1165,15 @@ RESULT eDVBDB::removeServices(eDVBChannelID chid, unsigned int orbpos)
                        if ((unsigned int)sat.orbital_position != orbpos)
                                remove=false;
                }
-               else if (orbpos != 0xFFFFFFFF) // do not remove -C or -T transponders when a orbital position is given..
-                       remove=false;
-               if ( remove && chid.dvbnamespace != eNs && chid.dvbnamespace != ch.dvbnamespace )
-                       remove=false;
+               if ( remove && chid.dvbnamespace != eNs )
+               {
+                       if (system == iDVBFrontend::feCable && chid.dvbnamespace.get() == 0xFFFF0000)
+                               ;
+                       else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == 0xEEEE0000)
+                               ;
+                       else if ( chid.dvbnamespace != ch.dvbnamespace )
+                               remove=false;
+               }
                if ( remove && chid.original_network_id != eOnid && chid.original_network_id != ch.original_network_id )
                        remove=false;
                if ( remove && chid.transport_stream_id != eTsid && chid.transport_stream_id != ch.transport_stream_id )
@@ -1247,8 +1259,15 @@ RESULT eDVBDB::removeFlags(unsigned int flagmask, eDVBChannelID chid, unsigned i
                        if ((unsigned int)sat.orbital_position != orbpos)
                                remove=false;
                }
-               if ( remove && chid.dvbnamespace != eNs && chid.dvbnamespace != ch.dvbnamespace )
-                       remove=false;
+               if ( remove && chid.dvbnamespace != eNs )
+               {
+                       if (system == iDVBFrontend::feCable && chid.dvbnamespace.get() == 0xFFFF0000)
+                               ;
+                       else if (system == iDVBFrontend::feTerrestrial && chid.dvbnamespace.get() == 0xEEEE0000)
+                               ;
+                       else if ( chid.dvbnamespace != ch.dvbnamespace )
+                               remove=false;
+               }
                if ( remove && chid.original_network_id != eOnid && chid.original_network_id != ch.original_network_id )
                        remove=false;
                if ( remove && chid.transport_stream_id != eTsid && chid.transport_stream_id != ch.transport_stream_id )
@@ -1466,14 +1485,20 @@ RESULT eDVBDBQuery::getNextResult(eServiceReferenceDVB &ref)
 {
        while (m_cursor != m_db->m_services.end())
        {
-               ref = m_cursor->first;
+               ePtr<eDVBService> service = m_cursor->second;
+               if (service->isHidden())
+                       ++m_cursor;
+               else
+               {
+                       ref = m_cursor->first;
 
-               int res = (!m_query) || m_cursor->second->checkFilter(ref, *m_query);
+                       int res = (!m_query) || service->checkFilter(ref, *m_query);
 
-               ++m_cursor;
+                       ++m_cursor;
 
-               if (res)
-                       return 0;
+                       if (res)
+                               return 0;
+               }
        }
 
        ref.type = eServiceReference::idInvalid;
@@ -1497,7 +1522,7 @@ RESULT eDVBDBBouquetQuery::getNextResult(eServiceReferenceDVB &ref)
                std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it =
                        m_db->m_services.find(ref);
 
-               int res = (!m_query) || it == m_db->m_services.end() || it->second->checkFilter(ref, *m_query);
+               int res = (!m_query) || it == m_db->m_services.end() || !(it->second->isHidden() && it->second->checkFilter(ref, *m_query));
 
                ++m_cursor;
 
@@ -1551,7 +1576,7 @@ eDVBDBSatellitesQuery::eDVBDBSatellitesQuery(eDVBDB *db, const eServiceReference
        for (std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_db->m_services.begin());
                it != m_db->m_services.end(); ++it)
        {
-               int res = it->second->checkFilter(it->first, *query);
+               int res = !it->second->isHidden() && it->second->checkFilter(it->first, *query);
                if (res)
                {
                        unsigned int dvbnamespace = it->first.getDVBNamespace().get()&0xFFFF0000;
@@ -1598,7 +1623,7 @@ eDVBDBProvidersQuery::eDVBDBProvidersQuery(eDVBDB *db, const eServiceReference &
        for (std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator it(m_db->m_services.begin());
                it != m_db->m_services.end(); ++it)
        {
-               int res = it->second->checkFilter(it->first, *query);
+               int res = !it->second->isHidden() && it->second->checkFilter(it->first, *query);
                if (res)
                {
                        const char *provider_name = it->second->m_provider_name.length() ?