- work on actions
[vuplus_dvbapp] / lib / dvb / db.cpp
index 1a2cd7d..fe4bcc7 100644 (file)
@@ -17,6 +17,62 @@ eDVBService::~eDVBService()
 {
 }
 
+eDVBService &eDVBService::operator=(const eDVBService &s)
+{
+       m_service_name = s.m_service_name;
+       m_provider_name = s.m_provider_name;
+       m_flags = s.m_flags;
+       m_ca = s.m_ca;
+       m_cache = s.m_cache;
+       return *this;
+}
+
+RESULT eDVBService::getName(const eServiceReference &ref, std::string &name)
+{
+       name = m_service_name;
+}
+
+int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query)
+{
+       int res = 0;
+       switch (query.m_type)
+       {
+       case eDVBChannelQuery::tName:
+               res = m_service_name.find(query.m_string) != std::string::npos;
+               break;
+       case eDVBChannelQuery::tProvider:
+               res = m_provider_name.find(query.m_string) != std::string::npos;
+               break;
+       case eDVBChannelQuery::tType:
+               res = ref.getServiceType() == query.m_int;
+               break;
+       case eDVBChannelQuery::tBouquet:
+               res = 0;
+               break;
+       case eDVBChannelQuery::tSatellitePosition:
+               res = (ref.getDVBNamespace().get() >> 16) == query.m_int;
+               break;
+       case eDVBChannelQuery::tChannelID:
+       {
+               eDVBChannelID chid;
+               ref.getChannelID(chid);
+               res = chid == query.m_channelid;
+               break;
+       }
+       case eDVBChannelQuery::tAND:
+               res = checkFilter(ref, *query.m_p1) && checkFilter(ref, *query.m_p2);
+               break;
+       case eDVBChannelQuery::tOR:
+               res = checkFilter(ref, *query.m_p1) || checkFilter(ref, *query.m_p2);
+               break;
+       }
+
+       if (query.m_inverse)
+               return !res;
+       else
+               return res;
+}
+
 DEFINE_REF(eDVBDB);
 
 eDVBDB::eDVBDB()
@@ -67,7 +123,7 @@ eDVBDB::eDVBDB()
                        {
                                eDVBFrontendParametersSatellite sat;
                                int frequency, symbol_rate, polarisation, fec, orbital_position, inversion;
-                               sscanf(line+2, "%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion);
+                               sscanf(line+2, "%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &inversion, &orbital_position);
                                sat.frequency = frequency;
                                sat.symbol_rate = symbol_rate;
                                sat.polarisation = polarisation;
@@ -209,15 +265,15 @@ eDVBDB::~eDVBDB()
                const eServiceReferenceDVB &s = i->first;
                fprintf(f, "%04x:%08x:%04x:%04x:%d:%d\n", 
                                s.getServiceID().get(), s.getDVBNamespace().get(), 
-                               s.getOriginalNetworkID().get(), s.getTransportStreamID().get(),
+                               s.getTransportStreamID().get(),s.getOriginalNetworkID().get(), 
                                s.getServiceType(),
                                0);
                
                fprintf(f, "%s\n", i->second->m_service_name.c_str());
-               fprintf(f, "p=%s", i->second->m_provider_name.c_str());
+               fprintf(f, "p:%s", i->second->m_provider_name.c_str());
                for (std::set<int>::const_iterator ca(i->second->m_ca.begin());
                        ca != i->second->m_ca.end(); ++ca)
-                       fprintf(f, ",C=%04x", *ca);
+                       fprintf(f, ",C:%04x", *ca);
                fprintf(f, "\n");
                services++;
        }
@@ -272,3 +328,42 @@ RESULT eDVBDB::getService(const eServiceReferenceDVB &reference, ePtr<eDVBServic
        return 0;
 }
 
+RESULT eDVBDB::startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *q)
+{
+       query = new eDVBDBQuery(this, q);
+       return 0;
+}
+
+DEFINE_REF(eDVBDBQuery);
+
+eDVBDBQuery::eDVBDBQuery(eDVBDB *db, eDVBChannelQuery *query): m_db(db), m_query(query)
+{
+       m_cursor = m_db->m_services.begin();
+}
+
+RESULT eDVBDBQuery::getNextResult(eServiceReferenceDVB &ref)
+{
+       while (m_cursor != m_db->m_services.end())
+       {
+               ref = m_cursor->first;
+               
+               int res = (!m_query) || m_cursor->second->checkFilter(ref, *m_query);
+
+               ++m_cursor;
+               
+               if (res)
+                       return 0;
+       }
+       return 1;
+}
+
+RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
+{
+       res = new eDVBChannelQuery();
+       res->m_type = eDVBChannelQuery::tName;
+       res->m_inverse = 0;
+       res->m_string = query;
+       return 0;
+}
+
+DEFINE_REF(eDVBChannelQuery);