X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=lib%2Fdvb%2Fdb.cpp;h=fe4bcc76fa3230950e4ad387cca5490291176b9c;hb=1cdf6cb021fcaa6548b90ba7b6765cf1e8b8b37b;hp=810aba046735b48e4f6d9f05f70316d4da492685;hpb=4bc08995411e21f3564f09e136809be68ddf96a8;p=vuplus_dvbapp diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 810aba0..fe4bcc7 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -27,6 +27,52 @@ eDVBService &eDVBService::operator=(const eDVBService &s) 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() @@ -282,3 +328,42 @@ RESULT eDVBDB::getService(const eServiceReferenceDVB &reference, ePtr &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 &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);