aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2005-02-07 09:14:02 +0000
committerFelix Domke <tmbinc@elitedvb.net>2005-02-07 09:14:02 +0000
commitd9ee52e4f0fbe9a1ae00d0e66f9e6f0a07fa319f (patch)
treef1084b85919b5590615e281331cfe535c3a160c8 /lib/dvb
parent4bc08995411e21f3564f09e136809be68ddf96a8 (diff)
downloadenigma2-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.cpp85
-rw-r--r--lib/dvb/db.h32
-rw-r--r--lib/dvb/idvb.h69
-rw-r--r--lib/dvb/stT1RVV70
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