fix digital+ (mhw2) epg (still disabled in epgcache.h!)
[vuplus_dvbapp] / lib / dvb / epgcache.h
index 5e5e7e8..4d45d87 100644 (file)
@@ -6,10 +6,23 @@
 
 #ifndef SWIG
 
+/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */
+#if defined (__GNUC__) && defined (__GNUC_MINOR__)
+#define __GNUC_PREREQ(maj, min) \
+         ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+#else
+#define __GNUC_PREREQ(maj, min)  0
+#endif
+
 #include <vector>
 #include <list>
+#if 0 && __GNUC_PREREQ(4,3)
+#include <unordered_map>
+#include <unordered_set>
+#else
 #include <ext/hash_map>
 #include <ext/hash_set>
+#endif
 
 #include <errno.h>
 
@@ -92,7 +105,14 @@ struct hash_uniqueEPGKey
 };
 
 #define tidMap std::set<__u32>
-#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 )  // check if gcc version >= 3.1
+#if 0 && __GNUC_PREREQ(4,3)
+       #define eventCache std::unordered_map<uniqueEPGKey, std::pair<eventMap, timeMap>, hash_uniqueEPGKey, uniqueEPGKey::equal>
+       #ifdef ENABLE_PRIVATE_EPG
+               #define contentTimeMap std::unordered_map<time_t, std::pair<time_t, __u16> >
+               #define contentMap std::unordered_map<int, contentTimeMap >
+               #define contentMaps std::unordered_map<uniqueEPGKey, contentMap, hash_uniqueEPGKey, uniqueEPGKey::equal >
+       #endif
+#elif __GNUC_PREREQ(3,1)
        #define eventCache __gnu_cxx::hash_map<uniqueEPGKey, std::pair<eventMap, timeMap>, hash_uniqueEPGKey, uniqueEPGKey::equal>
        #ifdef ENABLE_PRIVATE_EPG
                #define contentTimeMap __gnu_cxx::hash_map<time_t, std::pair<time_t, __u16> >
@@ -155,15 +175,15 @@ class eEPGCache: public eMainloop, private eThread, public Object
                pthread_mutex_t channel_active;
                channel_data(eEPGCache*);
                eEPGCache *cache;
-               eTimer abortTimer, zapTimer;
+               ePtr<eTimer> abortTimer, zapTimer;
                int prevChannelState;
                __u8 state, isRunning, haveData;
                ePtr<eDVBChannel> channel;
-               ePtr<eConnection> m_stateChangedConn, m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn;
-               ePtr<iDVBSectionReader> m_NowNextReader, m_ScheduleReader, m_ScheduleOtherReader;
-               tidMap seenSections[3], calcedSections[3];
+               ePtr<eConnection> m_stateChangedConn, m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn, m_ViasatConn;
+               ePtr<iDVBSectionReader> m_NowNextReader, m_ScheduleReader, m_ScheduleOtherReader, m_ViasatReader;
+               tidMap seenSections[4], calcedSections[4];
 #ifdef ENABLE_PRIVATE_EPG
-               eTimer startPrivateTimer;
+               ePtr<eTimer> startPrivateTimer;
                int m_PrevVersion;
                int m_PrivatePid;
                uniqueEPGKey m_PrivateService;
@@ -181,7 +201,8 @@ class eEPGCache: public eMainloop, private eThread, public Object
                ePtr<eConnection> m_MHWConn, m_MHWConn2;
                ePtr<iDVBSectionReader> m_MHWReader, m_MHWReader2;
                eDVBSectionFilterMask m_MHWFilterMask, m_MHWFilterMask2;
-               eTimer m_MHWTimeoutTimer;
+               ePtr<eTimer> m_MHWTimeoutTimer;
+               __u16 m_mhw2_channel_pid, m_mhw2_title_pid, m_mhw2_summary_pid;
                bool m_MHWTimeoutet;
                void MHWTimeout() { m_MHWTimeoutet=true; }
                void readMHWData(const __u8 *data);
@@ -198,6 +219,7 @@ class eEPGCache: public eMainloop, private eThread, public Object
                void storeTitle(std::map<__u32, mhw_title_t>::iterator itTitle, std::string sumText, const __u8 *data);
 #endif
                void readData(const __u8 *data);
+               void readDataViasat(const __u8 *data);
                void startChannel();
                void startEPG();
                bool finishEPG();
@@ -210,6 +232,7 @@ public:
 #ifdef ENABLE_MHW_EPG
        ,MHW=8
 #endif
+       ,VIASAT=16
        };
        struct Message
        {
@@ -220,6 +243,9 @@ public:
                        leaveChannel,
                        quit,
                        got_private_pid,
+                       got_mhw2_channel_pid,
+                       got_mhw2_title_pid,
+                       got_mhw2_summary_pid,
                        timeChanged
                };
                int type;
@@ -249,7 +275,7 @@ private:
        friend class channel_data;
        static eEPGCache *instance;
 
-       eTimer cleanTimer;
+       ePtr<eTimer> cleanTimer;
        std::map<iDVBChannel*, channel_data*> m_knownChannels;
        ePtr<eConnection> m_chanAddedConn;