diff options
Diffstat (limited to 'recdone.c')
-rw-r--r-- | recdone.c | 582 |
1 files changed, 283 insertions, 299 deletions
@@ -44,7 +44,7 @@ cRecDone::cRecDone() startTime = 0; duration = 0; if (buffer) - free(buffer); + free(buffer); buffer = NULL; searchID = -1; rawdescription = NULL; @@ -55,24 +55,22 @@ cRecDone::cRecDone(const cTimer* Timer, const cEvent* Event, cSearchExt* Search) title = shortText = description = aux = rawdescription = NULL; startTime = 0; duration = 0; - searchID = Search?Search->ID:-1; + searchID = Search ? Search->ID : -1; buffer = NULL; - if (Event) - { - if (Event->Title()) - title = strdup(Event->Title()); - if (Event->ShortText()) - shortText = strdup(Event->ShortText()); - if (Event->Description()) - description = strdup(Event->Description()); - startTime = Event->StartTime(); - duration = Event->Duration(); - if (Timer) - { - channelID = Timer->Channel()->GetChannelID(); - if (!isempty(Timer->Aux())) - aux = strdup(Timer->Aux()); + if (Event) { + if (Event->Title()) + title = strdup(Event->Title()); + if (Event->ShortText()) + shortText = strdup(Event->ShortText()); + if (Event->Description()) + description = strdup(Event->Description()); + startTime = Event->StartTime(); + duration = Event->Duration(); + if (Timer) { + channelID = Timer->Channel()->GetChannelID(); + if (!isempty(Timer->Aux())) + aux = strdup(Timer->Aux()); } else { channelID = tChannelID::InvalidID; aux = NULL; @@ -82,30 +80,30 @@ cRecDone::cRecDone(const cTimer* Timer, const cEvent* Event, cSearchExt* Search) cRecDone::~cRecDone() { - if (buffer) { - free(buffer); - buffer = NULL; - } - if (title) { - free(title); - title = NULL; - } - if (shortText) { - free(shortText); - shortText = NULL; - } - if (description) { - free(description); - description = NULL; - } - if (rawdescription) { - free(rawdescription); - rawdescription = NULL; - } - if (aux) { - free(aux); - aux = NULL; - } + if (buffer) { + free(buffer); + buffer = NULL; + } + if (title) { + free(title); + title = NULL; + } + if (shortText) { + free(shortText); + shortText = NULL; + } + if (description) { + free(description); + description = NULL; + } + if (rawdescription) { + free(rawdescription); + rawdescription = NULL; + } + if (aux) { + free(aux); + aux = NULL; + } } @@ -113,20 +111,25 @@ bool cRecDone::Parse(char *s) { char *t = skipspace(s + 1); switch (*s) { - case 'T': title = strdup(t); - break; - case 'S': shortText = strdup(t); - break; - case 'D': strreplace(t, '|', '\n'); - description = strdup(t); - break; - case '@': strreplace(t, '|', '\n'); - aux = strdup(t); - break; - default: LogFile.eSysLog("ERROR: unexpected tag while reading epgsearch done data: %s", s); - return false; + case 'T': + title = strdup(t); + break; + case 'S': + shortText = strdup(t); + break; + case 'D': + strreplace(t, '|', '\n'); + description = strdup(t); + break; + case '@': + strreplace(t, '|', '\n'); + aux = strdup(t); + break; + default: + LogFile.eSysLog("ERROR: unexpected tag while reading epgsearch done data: %s", s); + return false; } - return true; + return true; } bool cRecDone::Read(FILE *f) @@ -135,52 +138,50 @@ bool cRecDone::Read(FILE *f) char *s; cReadLine ReadLine; while ((s = ReadLine.Read(f)) != NULL) { - char *t = skipspace(s + 1); - switch (*s) { - case 'R': if (!recDone) { - time_t StartTime; - int Duration, SearchID; - int n = sscanf(t, "%ld %d %d", &StartTime, &Duration, &SearchID); - if (n == 3) { - recDone = new cRecDone; - if (recDone) - { - recDone->searchID = SearchID; - recDone->startTime = StartTime; - recDone->duration = Duration; - RecsDone.Add(recDone); - } - } - } - break; - case 'C': - { - s = skipspace(s + 1); - char *p = strchr(s, ' '); - if (p) - *p = 0; // strips optional channel name - if (*s) { - tChannelID channelID = tChannelID::FromString(s); - if (channelID.Valid()) { - if (recDone) - recDone->channelID = channelID; + char *t = skipspace(s + 1); + switch (*s) { + case 'R': + if (!recDone) { + time_t StartTime; + int Duration, SearchID; + int n = sscanf(t, "%ld %d %d", &StartTime, &Duration, &SearchID); + if (n == 3) { + recDone = new cRecDone; + if (recDone) { + recDone->searchID = SearchID; + recDone->startTime = StartTime; + recDone->duration = Duration; + RecsDone.Add(recDone); } - else { - LogFile.Log(3, "ERROR: illegal channel ID: %s", s); - return false; - } - } - } - break; - case 'r': - recDone = NULL; - break; - default: if (recDone && !recDone->Parse(s)) - { - LogFile.Log(1,"ERROR: parsing %s", s); - return false; - } - } + } + } + break; + case 'C': { + s = skipspace(s + 1); + char *p = strchr(s, ' '); + if (p) + *p = 0; // strips optional channel name + if (*s) { + tChannelID channelID = tChannelID::FromString(s); + if (channelID.Valid()) { + if (recDone) + recDone->channelID = channelID; + } else { + LogFile.Log(3, "ERROR: illegal channel ID: %s", s); + return false; + } + } + } + break; + case 'r': + recDone = NULL; + break; + default: + if (recDone && !recDone->Parse(s)) { + LogFile.Log(1, "ERROR: parsing %s", s); + return false; + } + } } return true; } @@ -188,35 +189,35 @@ bool cRecDone::Read(FILE *f) const char *cRecDone::ToText(void) { - char* tmpDescr = description?strdup(description):NULL; + char* tmpDescr = description ? strdup(description) : NULL; if (tmpDescr) - strreplace(tmpDescr, '\n', '|'); + strreplace(tmpDescr, '\n', '|'); - char* tmpInfo = aux?strdup(aux):NULL; + char* tmpInfo = aux ? strdup(aux) : NULL; if (tmpInfo) - strreplace(tmpInfo, '\n', '|'); + strreplace(tmpInfo, '\n', '|'); if (buffer) - free(buffer); + free(buffer); buffer = NULL; LOCK_CHANNELS_READ; const cChannel *channel = Channels->GetByChannelID(channelID, true, true); if (!channel) - LogFile.Log(3,"invalid channel in recs done!"); + LogFile.Log(3, "invalid channel in recs done!"); msprintf(&buffer, "R %ld %d %d\nC %s\n%s%s%s%s%s%s%s%s%s%s%s%sr", - startTime, duration, searchID, - channel?CHANNELSTRING(channel):"", - title?"T ":"",title?title:"", title?"\n":"", - shortText?"S ":"",shortText?shortText:"", shortText?"\n":"", - tmpDescr?"D ":"",tmpDescr?tmpDescr:"", tmpDescr?"\n":"", - tmpInfo?"@ ":"",tmpInfo?tmpInfo:"", tmpInfo?"\n":""); + startTime, duration, searchID, + channel ? CHANNELSTRING(channel) : "", + title ? "T " : "", title ? title : "", title ? "\n" : "", + shortText ? "S " : "", shortText ? shortText : "", shortText ? "\n" : "", + tmpDescr ? "D " : "", tmpDescr ? tmpDescr : "", tmpDescr ? "\n" : "", + tmpInfo ? "@ " : "", tmpInfo ? tmpInfo : "", tmpInfo ? "\n" : ""); if (tmpDescr) - free(tmpDescr); + free(tmpDescr); if (tmpInfo) - free(tmpInfo); + free(tmpInfo); return buffer; } @@ -230,164 +231,151 @@ int cRecDone::ChannelNr() LOCK_CHANNELS_READ; const cChannel* channel = Channels->GetByChannelID(channelID, true, true); if (!channel) - return -1; + return -1; else - return channel->Number(); + return channel->Number(); } // -- cRecsDone ----------------------------------------------------------------- int cRecsDone::GetCountRecordings(const cEvent* event, cSearchExt* search, cRecDone** first, int matchLimit) { - return GetCountRecordings(event, search->compareTitle, search->compareSubtitle, search->compareSummary, search->compareDate, search->catvaluesAvoidRepeat, first, matchLimit); + return GetCountRecordings(event, search->compareTitle, search->compareSubtitle, search->compareSummary, search->compareDate, search->catvaluesAvoidRepeat, first, matchLimit); } bool CatValuesMatch(unsigned long catvaluesAvoidRepeat, const string& rDescr, const string& eDescr) { - bool bCatMatch = ((rDescr != "" && eDescr != "") || (rDescr == "" && eDescr == "")); - cSearchExtCat *SearchExtCat = SearchExtCats.First(); - int index = 0; - while (catvaluesAvoidRepeat > 0 && SearchExtCat && bCatMatch) - { - if (catvaluesAvoidRepeat & (1<<index)) - { - char* eCatValue = GetExtEPGValue(eDescr.c_str(), SearchExtCat->name, SearchExtCat->format); - char* rCatValue = GetExtEPGValue(rDescr.c_str(), SearchExtCat->name, SearchExtCat->format); - if ((!eCatValue && rCatValue) || - (!rCatValue && eCatValue) || - (eCatValue && rCatValue && strcmp(eCatValue, rCatValue) != 0)) - bCatMatch = false; - free(eCatValue); - free(rCatValue); - } - SearchExtCat = SearchExtCats.Next(SearchExtCat); - index++; + bool bCatMatch = ((rDescr != "" && eDescr != "") || (rDescr == "" && eDescr == "")); + cSearchExtCat *SearchExtCat = SearchExtCats.First(); + int index = 0; + while (catvaluesAvoidRepeat > 0 && SearchExtCat && bCatMatch) { + if (catvaluesAvoidRepeat & (1 << index)) { + char* eCatValue = GetExtEPGValue(eDescr.c_str(), SearchExtCat->name, SearchExtCat->format); + char* rCatValue = GetExtEPGValue(rDescr.c_str(), SearchExtCat->name, SearchExtCat->format); + if ((!eCatValue && rCatValue) || + (!rCatValue && eCatValue) || + (eCatValue && rCatValue && strcmp(eCatValue, rCatValue) != 0)) + bCatMatch = false; + free(eCatValue); + free(rCatValue); + } + SearchExtCat = SearchExtCats.Next(SearchExtCat); + index++; } - return bCatMatch; + return bCatMatch; } bool MatchesInExpression(const string& expression, const cRecDone* recDone, const cEvent* event) { - cVarExpr varExpr(expression); - - cEvent recDoneEvent(0); - recDoneEvent.SetTitle(recDone->title); - recDoneEvent.SetShortText(recDone->shortText); - recDoneEvent.SetDescription(recDone->description); - recDoneEvent.SetStartTime(recDone->startTime); - recDoneEvent.SetDuration(recDone->duration); - - string resRecDone = varExpr.Evaluate(&recDoneEvent); - string resEvent = varExpr.Evaluate(event); - return resRecDone == resEvent; + cVarExpr varExpr(expression); + + cEvent recDoneEvent(0); + recDoneEvent.SetTitle(recDone->title); + recDoneEvent.SetShortText(recDone->shortText); + recDoneEvent.SetDescription(recDone->description); + recDoneEvent.SetStartTime(recDone->startTime); + recDoneEvent.SetDuration(recDone->duration); + + string resRecDone = varExpr.Evaluate(&recDoneEvent); + string resEvent = varExpr.Evaluate(event); + return resRecDone == resEvent; } int cRecsDone::GetCountRecordings(const cEvent* event, bool compareTitle, int compareSubtitle, bool compareSummary, int compareDate, unsigned long catvaluesAvoidRepeat, cRecDone** first, int matchLimit) { - if (first) - *first = NULL; - if (!event) - return 0; - - cMutexLock RecsDoneLock(this); - int count = 0; - - string eTitle = ""; - if (compareTitle) - { - string s = event->Title()?event->Title():""; - eTitle = GetAlNum(s); - std::transform(eTitle.begin(), eTitle.end(), eTitle.begin(), tolower); - } - string eSubtitle = ""; - if (compareSubtitle) - { - string s = event->ShortText()?event->ShortText():""; - eSubtitle = GetAlNum(s); - std::transform(eSubtitle.begin(), eSubtitle.end(), eSubtitle.begin(), tolower); - } - string eDescr = ""; - string eRawDescr = ""; - if ((compareSummary || catvaluesAvoidRepeat != 0) && event->Description()) - { - eDescr = event->Description(); - char* rawDescr = GetRawDescription(event->Description()); - eRawDescr = rawDescr?rawDescr:""; - if (rawDescr) free(rawDescr); - } - - string compareExpression = ""; - if (compareDate == 1) compareExpression = "%date%"; - if (compareDate == 2) compareExpression = "%year%-%week%"; - if (compareDate == 3) compareExpression = "%year%-%month%"; - - cRecDone* firstrecDone = NULL; - cRecDone* recDone = First(); - while (recDone) - { - string rTitle = ""; - if (compareTitle) - { - string s = recDone->title?recDone->title:""; - rTitle = GetAlNum(s); - std::transform(rTitle.begin(), rTitle.end(), rTitle.begin(), tolower); - } - string rSubtitle = ""; - if (compareSubtitle) - { - string s = recDone->shortText?recDone->shortText:""; - rSubtitle = GetAlNum(s); - std::transform(rSubtitle.begin(), rSubtitle.end(), rSubtitle.begin(), tolower); - } - string rDescr = ""; - string rRawDescr = ""; - if ((compareSummary || catvaluesAvoidRepeat != 0) && recDone->description) - { - rDescr = recDone->description; - char* rawDescr = recDone->rawdescription?recDone->rawdescription:GetRawDescription(recDone->description); - recDone->rawdescription = rawDescr; - rRawDescr = rawDescr?rawDescr:""; - } - - if ((!compareTitle || rTitle == eTitle) && - (!compareSubtitle || (rSubtitle == eSubtitle && rSubtitle !="")) && - (!compareSummary || DescriptionMatches(eRawDescr.c_str(), rRawDescr.c_str(), matchLimit)) && - (catvaluesAvoidRepeat == 0 || CatValuesMatch(catvaluesAvoidRepeat, rDescr, eDescr)) && - (compareExpression.size() == 0 || MatchesInExpression(compareExpression, recDone, event))) - { - if (!firstrecDone) firstrecDone = recDone; - else - if (firstrecDone->startTime > recDone->startTime) - firstrecDone = recDone; - LogFile.Log(3,"same event already recorded at %s", DAYDATETIME(recDone->startTime)); - count++; - } - - recDone = Next(recDone); - } - - - if (first) - *first = firstrecDone; - - return count; + if (first) + *first = NULL; + if (!event) + return 0; + + cMutexLock RecsDoneLock(this); + int count = 0; + + string eTitle = ""; + if (compareTitle) { + string s = event->Title() ? event->Title() : ""; + eTitle = GetAlNum(s); + std::transform(eTitle.begin(), eTitle.end(), eTitle.begin(), tolower); + } + string eSubtitle = ""; + if (compareSubtitle) { + string s = event->ShortText() ? event->ShortText() : ""; + eSubtitle = GetAlNum(s); + std::transform(eSubtitle.begin(), eSubtitle.end(), eSubtitle.begin(), tolower); + } + string eDescr = ""; + string eRawDescr = ""; + if ((compareSummary || catvaluesAvoidRepeat != 0) && event->Description()) { + eDescr = event->Description(); + char* rawDescr = GetRawDescription(event->Description()); + eRawDescr = rawDescr ? rawDescr : ""; + if (rawDescr) free(rawDescr); + } + + string compareExpression = ""; + if (compareDate == 1) compareExpression = "%date%"; + if (compareDate == 2) compareExpression = "%year%-%week%"; + if (compareDate == 3) compareExpression = "%year%-%month%"; + + cRecDone* firstrecDone = NULL; + cRecDone* recDone = First(); + while (recDone) { + string rTitle = ""; + if (compareTitle) { + string s = recDone->title ? recDone->title : ""; + rTitle = GetAlNum(s); + std::transform(rTitle.begin(), rTitle.end(), rTitle.begin(), tolower); + } + string rSubtitle = ""; + if (compareSubtitle) { + string s = recDone->shortText ? recDone->shortText : ""; + rSubtitle = GetAlNum(s); + std::transform(rSubtitle.begin(), rSubtitle.end(), rSubtitle.begin(), tolower); + } + string rDescr = ""; + string rRawDescr = ""; + if ((compareSummary || catvaluesAvoidRepeat != 0) && recDone->description) { + rDescr = recDone->description; + char* rawDescr = recDone->rawdescription ? recDone->rawdescription : GetRawDescription(recDone->description); + recDone->rawdescription = rawDescr; + rRawDescr = rawDescr ? rawDescr : ""; + } + + if ((!compareTitle || rTitle == eTitle) && + (!compareSubtitle || (rSubtitle == eSubtitle && rSubtitle != "")) && + (!compareSummary || DescriptionMatches(eRawDescr.c_str(), rRawDescr.c_str(), matchLimit)) && + (catvaluesAvoidRepeat == 0 || CatValuesMatch(catvaluesAvoidRepeat, rDescr, eDescr)) && + (compareExpression.size() == 0 || MatchesInExpression(compareExpression, recDone, event))) { + if (!firstrecDone) firstrecDone = recDone; + else if (firstrecDone->startTime > recDone->startTime) + firstrecDone = recDone; + LogFile.Log(3, "same event already recorded at %s", DAYDATETIME(recDone->startTime)); + count++; + } + + recDone = Next(recDone); + } + + + if (first) + *first = firstrecDone; + + return count; } void cRecsDone::RemoveSearchID(int ID) { if (ID == -1) - return; + return; cMutexLock RecsDoneLock(this); if (Count() == 0) - Load(AddDirectory(CONFIGDIR, "epgsearchdone.data")); + Load(AddDirectory(CONFIGDIR, "epgsearchdone.data")); cRecDone* recDone = First(); - while (recDone) - { - if (recDone->searchID == ID) - { - recDone->searchID = -1; - LogFile.Log(2,"search timer %d removed in recording %s~%s", ID, recDone->title?recDone->title:"unknown title", recDone->shortText?recDone->shortText:"unknown subtitle"); - } - recDone = Next(recDone); + while (recDone) { + if (recDone->searchID == ID) { + recDone->searchID = -1; + LogFile.Log(2, "search timer %d removed in recording %s~%s", ID, recDone->title ? recDone->title : "unknown title", recDone->shortText ? recDone->shortText : "unknown subtitle"); + } + recDone = Next(recDone); } Save(); } @@ -397,23 +385,23 @@ bool cRecsDone::Load(const char *FileName) cMutexLock RecsDoneLock(this); Clear(); if (FileName) { - free(fileName); - fileName = strdup(FileName); + free(fileName); + fileName = strdup(FileName); } if (fileName && access(fileName, F_OK) == 0) { - LogFile.iSysLog("loading %s", fileName); - FILE *f = fopen(fileName, "r"); - bool result = false; - if (f) { - result = cRecDone::Read(f); - fclose(f); - } - if (result) - LogFile.Log(2,"loaded recordings done from %s (count: %d)", fileName, Count()); - else - LogFile.Log(1,"error loading recordings done from %s (count: %d)", fileName, Count()); - return result; + LogFile.iSysLog("loading %s", fileName); + FILE *f = fopen(fileName, "r"); + bool result = false; + if (f) { + result = cRecDone::Read(f); + fclose(f); + } + if (result) + LogFile.Log(2, "loaded recordings done from %s (count: %d)", fileName, Count()); + else + LogFile.Log(1, "error loading recordings done from %s (count: %d)", fileName, Count()); + return result; } return false; } @@ -425,52 +413,48 @@ bool cRecsDone::Save(void) cRecDone* l = (cRecDone*)this->First(); cSafeFile f(fileName); if (f.Open()) { - while (l) { - if (!l->title) { // atleast a title should exist - l = (cRecDone*)l->Next(); - continue; - } - if (!l->Save(f)) { + while (l) { + if (!l->title) { // atleast a title should exist + l = (cRecDone*)l->Next(); + continue; + } + if (!l->Save(f)) { result = false; break; - } - l = (cRecDone*)l->Next(); - } - if (!f.Close()) - result = false; - } - else - result = false; - LogFile.Log(2,"saved recordings done (count: %d)", Count()); + } + l = (cRecDone*)l->Next(); + } + if (!f.Close()) + result = false; + } else + result = false; + LogFile.Log(2, "saved recordings done (count: %d)", Count()); return result; } int cRecsDone::GetTotalCountRecordings(cSearchExt* search, cRecDone** first) { - if (!search) return 0; - if (first) - *first = NULL; - - cMutexLock RecsDoneLock(this); - int count = 0; - - cRecDone* firstrecDone = NULL; - cRecDone* recDone = First(); - while (recDone) - { - if (recDone->searchID == search->ID) - { - count++; - if (!firstrecDone) firstrecDone = recDone; - else - if (firstrecDone->startTime > recDone->startTime) - firstrecDone = recDone; - } - recDone = Next(recDone); - } - - if (first) - *first = firstrecDone; - - return count; + if (!search) return 0; + if (first) + *first = NULL; + + cMutexLock RecsDoneLock(this); + int count = 0; + + cRecDone* firstrecDone = NULL; + cRecDone* recDone = First(); + while (recDone) { + if (recDone->searchID == search->ID) { + count++; + if (!firstrecDone) firstrecDone = recDone; + else if (firstrecDone->startTime > recDone->startTime) + firstrecDone = recDone; + } + recDone = Next(recDone); + } + + if (first) + *first = firstrecDone; + + return count; } |