diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2005-02-07 09:14:02 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2005-02-07 09:14:02 +0000 |
| commit | d9ee52e4f0fbe9a1ae00d0e66f9e6f0a07fa319f (patch) | |
| tree | f1084b85919b5590615e281331cfe535c3a160c8 /lib/dvb | |
| parent | 4bc08995411e21f3564f09e136809be68ddf96a8 (diff) | |
| download | enigma2-d9ee52e4f0fbe9a1ae00d0e66f9e6f0a07fa319f.tar.gz enigma2-d9ee52e4f0fbe9a1ae00d0e66f9e6f0a07fa319f.zip | |
- added iStaticServiceInformation
- added service list interface for dvb
- started work on queries (currently only "instr" on servicename)
- started work on infobar
- added listbox with service
- fixed dvbdb
- remove some debug output
Diffstat (limited to 'lib/dvb')
| -rw-r--r-- | lib/dvb/db.cpp | 85 | ||||
| -rw-r--r-- | lib/dvb/db.h | 32 | ||||
| -rw-r--r-- | lib/dvb/idvb.h | 69 | ||||
| -rw-r--r-- | lib/dvb/stT1RVV7 | 0 |
4 files changed, 169 insertions, 17 deletions
diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index 810aba04..fe4bcc76 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<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); diff --git a/lib/dvb/db.h b/lib/dvb/db.h index e673b9e6..55998ebf 100644 --- a/lib/dvb/db.h +++ b/lib/dvb/db.h @@ -4,27 +4,12 @@ #include <lib/dvb/idvb.h> #include <set> -class eDVBService: public iObject -{ - DECLARE_REF; -public: - eDVBService(); - std::string m_service_name; - std::string m_provider_name; - - int m_flags; - std::set<int> m_ca; - std::map<int,int> m_cache; - virtual ~eDVBService(); - - eDVBService &operator=(const eDVBService &); -}; - class ServiceDescriptionTable; class eDVBDB: public iDVBChannelList { DECLARE_REF; + friend class eDVBDBQuery; private: struct channel { @@ -45,6 +30,21 @@ public: RESULT addService(const eServiceReferenceDVB &service, eDVBService *service); RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service); + + RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query); +}; + + // we have to add a possibility to invalidate here. +class eDVBDBQuery: public iDVBChannelListQuery +{ +DECLARE_REF; +private: + std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator m_cursor; + ePtr<eDVBDB> m_db; + ePtr<eDVBChannelQuery> m_query; +public: + eDVBDBQuery(eDVBDB *db, eDVBChannelQuery *query); + virtual RESULT getNextResult(eServiceReferenceDVB &ref); }; #endif diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index c68ad940..15796166 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -139,7 +139,7 @@ struct eServiceReferenceDVB: public eServiceReference setTransportStreamID(chid.transport_stream_id); } - void getChannelID(eDVBChannelID &chid) + void getChannelID(eDVBChannelID &chid) const { chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID()); } @@ -151,14 +151,81 @@ struct eServiceReferenceDVB: public eServiceReference }; +////////////////// TODO: we need an interface here, but what exactly? + +#include <set> +// btw, still implemented in db.cpp. FIX THIS, TOO. + +class eDVBChannelQuery; + +class eDVBService: public iStaticServiceInformation +{ + DECLARE_REF; +public: + eDVBService(); + std::string m_service_name; + std::string m_provider_name; + + int m_flags; + std::set<int> m_ca; + std::map<int,int> m_cache; + virtual ~eDVBService(); + + eDVBService &operator=(const eDVBService &); + + // iStaticServiceInformation + RESULT getName(const eServiceReference &ref, std::string &name); + + // for filtering: + int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query); +}; + +////////////////// + class iDVBChannel; class iDVBDemux; class iDVBFrontendParameters; +class iDVBChannelListQuery: public iObject +{ +public: + virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0; +}; + +class eDVBChannelQuery: public iObject +{ + DECLARE_REF; +public: + enum + { + tName, + tProvider, + tType, + tBouquet, + tSatellitePosition, + tChannelID, + tAND, + tOR + }; + + int m_type; + int m_inverse; + + std::string m_string; + int m_int; + eDVBChannelID m_channelid; + + static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query); + + ePtr<eDVBChannelQuery> m_p1, m_p2; +}; + class iDVBChannelList: public iObject { public: virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0; + virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0; + virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query)=0; }; class iDVBResourceManager: public iObject diff --git a/lib/dvb/stT1RVV7 b/lib/dvb/stT1RVV7 deleted file mode 100644 index e69de29b..00000000 --- a/lib/dvb/stT1RVV7 +++ /dev/null |
