summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eepg.c2
-rw-r--r--epghandler.c1
-rw-r--r--setupeepg.c1
-rw-r--r--util.c98
4 files changed, 81 insertions, 21 deletions
diff --git a/eepg.c b/eepg.c
index 6091915..2ba6008 100644
--- a/eepg.c
+++ b/eepg.c
@@ -238,6 +238,8 @@ public:
cFilterEEPG::cFilterEEPG (void)
{
+ nSummaries = 0;
+ nTitles = 0;
Trigger ();
//Set (0x00, 0x00);
}
diff --git a/epghandler.c b/epghandler.c
index 3aaec2e..0262d75 100644
--- a/epghandler.c
+++ b/epghandler.c
@@ -172,6 +172,7 @@ bool cEEpgHandler::HandleEvent(cEvent* Event) {
return true;
}
+
bool cEEpgHandler::SortSchedule(cSchedule* Schedule) {
Schedule->Sort();
diff --git a/setupeepg.c b/setupeepg.c
index 54f8243..ee2565e 100644
--- a/setupeepg.c
+++ b/setupeepg.c
@@ -14,6 +14,7 @@ cSetupEEPG* cSetupEEPG::_setupEEPG = NULL;
cSetupEEPG::cSetupEEPG (void)
{
+ ConfDir = NULL;
OptPat = 1;
OrderInfo = 1;
RatingInfo = 1;
diff --git a/util.c b/util.c
index 2683131..bf5455a 100644
--- a/util.c
+++ b/util.c
@@ -11,6 +11,8 @@
#include <vdr/thread.h>
#include <vdr/epg.h>
+#include <map>
+
namespace util
{
@@ -135,23 +137,33 @@ void CleanString (unsigned char *String)
// http://projects.vdr-developer.org/projects/plg-epgfixer
// by Matti Lehtimaki
-class cAddEventListItem : public cListObject
+//class cAddEventListItem : public cListObject
+//{
+//protected:
+// cEvent *event;
+// tChannelID channelID;
+//public:
+// cAddEventListItem(cEvent *Event, tChannelID ChannelID) { event = Event; channelID = ChannelID; }
+// tChannelID GetChannelID() { return channelID; }
+// cEvent *GetEvent() { return event; }
+// ~cAddEventListItem() { }
+//};
+
+struct tChannelIDCompare
{
-protected:
- cEvent *event;
- tChannelID channelID;
-public:
- cAddEventListItem(cEvent *Event, tChannelID ChannelID) { event = Event; channelID = ChannelID; }
- tChannelID GetChannelID() { return channelID; }
- cEvent *GetEvent() { return event; }
- ~cAddEventListItem() { }
+ bool operator() (const tChannelID& lhs, const tChannelID& rhs) const
+ {
+ return *lhs.ToString() < *rhs.ToString();
+ }
};
+
class cAddEventThread : public cThread
{
private:
cTimeMs LastHandleEvent;
- cList<cAddEventListItem> *list;
+// cList<cAddEventListItem> *list;
+ std::map<tChannelID,cList<cEvent>*,tChannelIDCompare> *map_list;
enum { INSERT_TIMEOUT_IN_MS = 10000 };
protected:
virtual void Action(void);
@@ -164,13 +176,17 @@ public:
cAddEventThread::cAddEventThread(void)
:cThread("cAddEventThread"), LastHandleEvent()
{
- list = new cList<cAddEventListItem>;
+// list = new cList<cAddEventListItem>;
+ map_list = new std::map<tChannelID,cList<cEvent>*,tChannelIDCompare>;
}
cAddEventThread::~cAddEventThread(void)
{
LOCK_THREAD;
- list->cList::Clear();
+// list->cList::Clear();
+ std::map<tChannelID,cList<cEvent>*,tChannelIDCompare>::iterator it;
+ for ( it=map_list->begin() ; it != map_list->end(); it++ )
+ (*it).second->cList::Clear();
Cancel(3);
}
@@ -178,17 +194,44 @@ void cAddEventThread::Action(void)
{
SetPriority(19);
while (Running() && !LastHandleEvent.TimedOut()) {
- cAddEventListItem *e = NULL;
+// cAddEventListItem *e = NULL;
cSchedulesLock SchedulesLock(true, 10);
cSchedules *schedules = (cSchedules *)cSchedules::Schedules(SchedulesLock);
Lock();
- while (schedules && (e = list->First()) != NULL) {
- cSchedule *schedule = (cSchedule *)schedules->GetSchedule(Channels.GetByChannelID(e->GetChannelID()), true);
- schedule->AddEvent(e->GetEvent());
- EpgHandlers.SortSchedule(schedule);
- EpgHandlers.DropOutdated(schedule, e->GetEvent()->StartTime(), e->GetEvent()->EndTime(), e->GetEvent()->TableID(), e->GetEvent()->Version());
- list->Del(e);
- }
+// while (schedules && (e = list->First()) != NULL) {
+// cSchedule *schedule = (cSchedule *)schedules->GetSchedule(Channels.GetByChannelID(e->GetChannelID()), true);
+// schedule->AddEvent(e->GetEvent());
+// EpgHandlers.SortSchedule(schedule);
+// EpgHandlers.DropOutdated(schedule, e->GetEvent()->StartTime(), e->GetEvent()->EndTime(), e->GetEvent()->TableID(), e->GetEvent()->Version());
+// list->Del(e);
+// }
+ std::map<tChannelID,cList<cEvent>*,tChannelIDCompare>::iterator it;
+ it=map_list->begin();
+ while (schedules && it != map_list->end()) {
+ cSchedule *schedule = (cSchedule *)schedules->GetSchedule(Channels.GetByChannelID((*it).first), true);
+ while (((*it).second->First()) != NULL) {
+ cEvent* event = (*it).second->First();
+
+ cEvent *pEqvEvent = (cEvent *) schedule->GetEvent (event->EventID(), event->StartTime());
+ if (pEqvEvent){
+ LogD (0, prep("schedule->DelEvent(event)"));
+ schedule->DelEvent(pEqvEvent);
+ }
+
+ LogD (0, prep("schedule->AddEvent(event)"));
+ //cCondWait::SleepMs(10);
+ if (event)
+ schedule->AddEvent(event);
+ (*it).second->Del(event);
+ }
+ EpgHandlers.SortSchedule(schedule);
+ //sortSchedules(schedules, (*it).first);
+ //schedule->Sort();
+ delete (*it).second;
+ map_list->erase(it);
+ it=map_list->begin();
+
+ }
Unlock();
cCondWait::SleepMs(10);
}
@@ -196,9 +239,21 @@ void cAddEventThread::Action(void)
void cAddEventThread::AddEvent(cEvent *Event, tChannelID ChannelID)
{
+ LogD (0, prep("AddEventT start"));
LOCK_THREAD;
- list->Add(new cAddEventListItem(Event, ChannelID));
+ LogD (0, prep("AddEventT lock "));
+ if (map_list->empty() || map_list->count(ChannelID) == 0) {
+ LogD (0, prep("AddEventT if"));
+ cList<cEvent>* list = new cList<cEvent>;
+ list->Add(Event);
+ map_list->insert(std::make_pair(ChannelID, list));
+ } else {
+ LogD (0, prep("AddEventT else"));
+ (*map_list->find(ChannelID)).second->Add(Event);
+ }
+// list->Add(new cAddEventListItem(Event, ChannelID));
LastHandleEvent.Set(INSERT_TIMEOUT_IN_MS);
+ LogD (0, prep("AddEventT end"));
}
static cAddEventThread AddEventThread;
@@ -207,6 +262,7 @@ static cAddEventThread AddEventThread;
void AddEvent(cEvent *Event, tChannelID ChannelID)
{
+ LogD (0, prep("AddEvent"));
AddEventThread.AddEvent(Event, ChannelID);
if (!AddEventThread.Active())
AddEventThread.Start();