add optional notification of childs when parent moves
[enigma2.git] / lib / dvb / db.cpp
index 13b43ffe6f5f0a00a2cdf993b053ca3c912b5be6..2fbe53e63959c11a62ca8854a2407cf6e88dcb9f 100644 (file)
@@ -114,6 +114,7 @@ RESULT eBouquet::setListName(const std::string &name)
 }
 
 eDVBService::eDVBService()
+       :m_flags(0)
 {
 }
 
@@ -193,7 +194,7 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ
                res = 0;
                break;
        case eDVBChannelQuery::tSatellitePosition:
-               res = (ref.getDVBNamespace().get() >> 16) == query.m_int;
+               res = ((unsigned int)ref.getDVBNamespace().get())>>16 == query.m_int;
                break;
        case eDVBChannelQuery::tChannelID:
        {
@@ -208,6 +209,9 @@ int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQ
        case eDVBChannelQuery::tOR:
                res = checkFilter(ref, *query.m_p1) || checkFilter(ref, *query.m_p2);
                break;
+       case eDVBChannelQuery::tAny:
+               res = 1;
+               break;
        }
 
        if (query.m_inverse)
@@ -244,8 +248,11 @@ void eDVBDB::reloadServicelist()
                struct stat s;
                if ( !stat("lamedb", &s) )
                {
-                       rename("lamedb", CONFIGDIR"/enigma2/lamedb" );
-                       reloadServicelist();
+                       if ( !stat(CONFIGDIR"/enigma2", &s) )
+                       {
+                               rename("lamedb", CONFIGDIR"/enigma2/lamedb" );
+                               reloadServicelist();
+                       }
                }
                return;
        }
@@ -489,8 +496,8 @@ void eDVBDB::saveServicelist()
                        ca != i->second->m_ca.end(); ++ca)
                        fprintf(f, ",C:%04x", *ca);
 
-               if (it->second->m_flags)
-                       fprintf(f, ",f:%x", it->second->m_flags);
+               if (i->second->m_flags)
+                       fprintf(f, ",f:%x", i->second->m_flags);
 
                fprintf(f, "\n");
                services++;
@@ -1012,6 +1019,13 @@ static int decodeType(const std::string &type)
 RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::const_iterator begin, std::list<std::string>::const_iterator end)
 {
        std::list<std::string>::const_iterator end_of_exp;
+       
+       if (begin == end)
+       {
+               eDebug("empty expression!");
+               return 0;
+       }
+       
        if (*begin == "(")
        {
                end_of_exp = begin;
@@ -1228,6 +1242,14 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
                /* now we recursivly parse that. */
        int r = parseExpression(res, tokens.begin(), tokens.end());
        
+               /* we have an empty (but valid!) expression */
+       if (!r && !res)
+       {
+               res = new eDVBChannelQuery();
+               res->m_inverse = 0;
+               res->m_type = eDVBChannelQuery::tAny;
+       }
+       
        if (res)
        {
                res->m_sort = sort;