#define channelMapIterator std::map<iDVBChannel*, channel_data*>::iterator
#define updateMap std::map<eDVBChannelID, time_t>
-struct hash_32
-{
- inline size_t operator()( const __u32 &x) const
- {
- return (x >> 8)&0xFFFF;
- }
-};
-
-struct equal_32
-{
- inline size_t operator()(const __u32 &x, const __u32 &y) const
- {
- return x == y;
- }
-};
-
struct hash_uniqueEPGKey
{
inline size_t operator()( const uniqueEPGKey &x) const
}
};
+#define tidMap std::set<__u32>
#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1
#define eventCache __gnu_cxx::hash_map<uniqueEPGKey, std::pair<eventMap, timeMap>, hash_uniqueEPGKey, uniqueEPGKey::equal>
- #define tidMap __gnu_cxx::hash_set<__u32, hash_32, equal_32>
#else // for older gcc use following
#define eventCache std::hash_map<uniqueEPGKey, std::pair<eventMap, timeMap>, hash_uniqueEPGKey, uniqueEPGKey::equal >
- #define tidMap std::hash_map<__u32, hash_32, equal_32>
#endif
+#define descriptorPair std::pair<int,__u8*>
+#define descriptorMap std::map<__u32, descriptorPair >
+
class eventData
{
friend class eEPGCache;
private:
__u8* EITdata;
int ByteSize;
+ static descriptorMap descriptors;
public:
int type;
static int CacheSize;
- eventData(const eit_event_struct* e, int size, int type)
- :ByteSize(size), type(type)
- {
- CacheSize+=size;
- EITdata = new __u8[size];
- if (e)
- memcpy(EITdata, (__u8*) e, size);
- }
- ~eventData()
- {
- CacheSize-=ByteSize;
- delete [] EITdata;
- }
+ static void load(FILE *);
+ static void save(FILE *);
+ eventData(const eit_event_struct* e, int size, int type);
+ ~eventData();
+ const eit_event_struct* get() const;
operator const eit_event_struct*() const
{
- return (const eit_event_struct*) EITdata;
- }
- const eit_event_struct* get() const
- {
- return (const eit_event_struct*) EITdata;
+ return get();
}
int getEventID()
{
- return HILO( ((const eit_event_struct*) EITdata)->event_id );
+ return (EITdata[0] << 8) | EITdata[1];
}
time_t getStartTime()
{
- return parseDVBtime(
- EITdata[2], EITdata[3],
- EITdata[4], EITdata[5], EITdata[6]);
+ return parseDVBtime(EITdata[2], EITdata[3], EITdata[4], EITdata[5], EITdata[6]);
+ }
+ int getDuration()
+ {
+ return fromBCD(EITdata[7])*3600+fromBCD(EITdata[8])*60+fromBCD(EITdata[9]);
}
};
ePtr<eDVBChannel> channel;
ePtr<eConnection> m_stateChangedConn, m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn;
ePtr<iDVBSectionReader> m_NowNextReader, m_ScheduleReader, m_ScheduleOtherReader;
- tidMap seenSections, calcedSections;
+ tidMap seenSections[3], calcedSections[3];
void readData(const __u8 *data);
void startChannel();
void startEPG();
// called from main thread
inline void Lock();
inline void Unlock();
- Event *lookupEvent(const eServiceReferenceDVB &service, int event_id, bool plain=false );
- Event *lookupEvent(const eServiceReferenceDVB &service, time_t=0, bool plain=false );
- const eventMap* getEventMap(const eServiceReferenceDVB &service);
- const timeMap* getTimeMap(const eServiceReferenceDVB &service);
+
+ // result Event * must be deleted by caller of lookupEvent
+ inline RESULT lookupEvent(const eServiceReferenceDVB &service, int event_id, Event *& );
+ inline RESULT lookupEvent(const eServiceReferenceDVB &service, time_t , Event *& );
+
+ // methods for faster use.. but not thread save ..
+ // Lock and Unlock should be used !!
+ RESULT lookupEvent(const eServiceReferenceDVB &service, int event_id, const eventData *& );
+ RESULT lookupEvent(const eServiceReferenceDVB &service, time_t , const eventData *& );
+
+ inline RESULT getEventMap(const eServiceReferenceDVB &service, const eventMap *& );
+ inline RESULT getTimeMap(const eServiceReferenceDVB &service, const timeMap *& );
};
TEMPLATE_TYPEDEF(ePtr<eEPGCache>,eEPGCachePtr);
-inline const eventMap* eEPGCache::getEventMap(const eServiceReferenceDVB &service)
+inline RESULT eEPGCache::lookupEvent(const eServiceReferenceDVB &service, time_t t, Event *& result )
+{
+ const eventData *data=0;
+ RESULT ret = lookupEvent(service, t, data);
+ if ( !ret && data )
+ result = new Event((uint8_t*)data->get());
+ return ret;
+}
+
+inline RESULT eEPGCache::lookupEvent(const eServiceReferenceDVB &service, int event_id, Event *& result)
+{
+ const eventData *data=0;
+ RESULT ret = lookupEvent(service, event_id, data);
+ if ( !ret && data )
+ result = new Event((uint8_t*)data->get());
+ return ret;
+}
+
+inline RESULT eEPGCache::getEventMap(const eServiceReferenceDVB &service, const eventMap *& result)
{
eventCache::iterator It = eventDB.find( service );
if ( It != eventDB.end() && It->second.first.size() )
- return &(It->second.first);
- else
+ {
+ result=&(It->second.first);
return 0;
+ }
+ else
+ result=0;
+ return -1;
}
-inline const timeMap* eEPGCache::getTimeMap(const eServiceReferenceDVB &service)
+inline RESULT eEPGCache::getTimeMap(const eServiceReferenceDVB &service, const timeMap *& result)
{
eventCache::iterator It = eventDB.find( service );
if ( It != eventDB.end() && It->second.second.size() )
- return &(It->second.second);
- else
+ {
+ result=&(It->second.second);
return 0;
+ }
+ else
+ result=0;
+ return -1;
}
inline void eEPGCache::Lock()