diff options
Diffstat (limited to 'equivhandler.c')
-rw-r--r-- | equivhandler.c | 127 |
1 files changed, 70 insertions, 57 deletions
diff --git a/equivhandler.c b/equivhandler.c index 281d2f3..75007ec 100644 --- a/equivhandler.c +++ b/equivhandler.c @@ -24,7 +24,6 @@ cEquivHandler::cEquivHandler() cEquivHandler::~cEquivHandler() { - // TODO Auto-generated destructor stub } void cEquivHandler::loadEquivalentChannelMap (void) @@ -55,62 +54,72 @@ void cEquivHandler::loadEquivalentChannelMap (void) char origChanID[256]; char equiChanID[256]; char source[256]; - int nid = 0; - int tid = 0; - int sid = 0; - int rid = 0; + int nid, tid, sid, rid; while ((Line = fgets (Buffer, sizeof (Buffer), File)) != NULL) { Line = compactspace (skipspace (stripspace (Line))); - if (!isempty (Line)) { - if (sscanf (Line, "%[^ ] %[^ ] %[^\n]\n", origChanID, equiChanID, source) == 3) { - if (origChanID[0] != '#' && origChanID[0] != ';') { - nid = 0; - tid = 0; - sid = 0; - rid = 0; - if (sscanf (origChanID, "%[^-]-%i -%i -%i ", source, &nid, &tid, &sid) == 4) - if (sscanf (equiChanID, "%[^-]-%i -%i -%i ", source, &nid, &tid, &sid) == 4) { - if (sscanf (origChanID, "%[^-]-%i -%i -%i -%i ", source, &nid, &tid, &sid, &rid) != 5) { - rid = 0; - } - tChannelID OriginalChID = tChannelID (cSource::FromString (source), nid, tid, sid, rid); - bool found = false; - //int i = 0; - cChannel *OriginalChannel = Channels.GetByChannelID (OriginalChID, false); - if (!OriginalChannel) { - LogI(2, prep("Warning, not found epg channel \'%s\' in channels.conf. Equivalency is assumed to be valid, but perhaps you should check the entry in the equivalents file"), origChanID); //TODO: skip this ing? - continue; - } - if (sscanf (equiChanID, "%[^-]-%i -%i -%i ", source, &nid, &tid, &sid) == 4) { - if (sscanf (equiChanID, "%[^-]-%i -%i -%i -%i ", source, &nid, &tid, &sid, &rid) - != 5) { - rid = 0; - } - tChannelID EquivChID = tChannelID (cSource::FromString (source), nid, tid, sid, rid); - cChannel *EquivChannel = Channels.GetByChannelID (EquivChID, false); //TODO use valid function? - if (EquivChannel) { - ret = equiChanMap.equal_range(*OriginalChID.ToString()); - for (it=ret.first; it!=ret.second; ++it) - if ((*it).second == *OriginalChID.ToString()) { - found = true; - break; - } - - if (!found) { - string origCh(*OriginalChID.ToString()); - string equiCh(*EquivChID.ToString()); - equiChanMap.insert(pair<string,string>(origCh.c_str(),equiCh.c_str())); - LogD(4, prep("Found %s equivalent to %s. origCh %s"), *EquivChID.ToString(), *OriginalChID.ToString(), origCh.c_str()); - for ( it2=equiChanMap.begin() ; it2 != equiChanMap.end(); it2++ ) - LogD(3, prep("Original ID %s <-> Equivalent ID %s"), (*it2).first.c_str(), it2->second.c_str()); - } - } else - LogI(0, prep("Warning, not found equivalent channel \'%s\' in channels.conf"), equiChanID); - } - } //if scanf string1 - } //if string1 - } //if scanf - } //if isempty + //skip empty and commented lines + if (isempty (Line) || Line[0] == '#' || Line[0] == ';') continue; + //skip invalid line + if (sscanf (Line, "%[^ ] %[^ ] %[^\n]\n", origChanID, equiChanID, source) != 3) continue; + + nid = 0; + tid = 0; + sid = 0; + rid = 0; + //skip invalid id formats + if ((sscanf (origChanID, "%[^-]-%i -%i -%i ", source, &nid, &tid, &sid) != 4) + && (sscanf (equiChanID, "%[^-]-%i -%i -%i ", source, &nid, &tid, &sid) != 4)) + continue; + + if (sscanf (origChanID, "%[^-]-%i -%i -%i -%i ", source, &nid, &tid, &sid, &rid) != 5) { + rid = 0; + } + tChannelID OriginalChID = tChannelID (cSource::FromString (source), nid, tid, sid, rid); + bool found = false; + //int i = 0; +#if APIVERSNUM >= 20300 + LOCK_CHANNELS_READ; + const cChannel *OriginalChannel = Channels->GetByChannelID(OriginalChID, false); +#else + cChannel *OriginalChannel = Channels.GetByChannelID (OriginalChID, false); +#endif + if (!OriginalChannel) { + LogI(2, prep("Warning, not found EPG channel \'%s\' in channels.conf. Equivalence is assumed to be valid, but perhaps you should check the entry in the equivalents file"), origChanID); + continue; + } + if (sscanf (equiChanID, "%[^-]-%i -%i -%i ", source, &nid, &tid, &sid) == 4) { + + if (sscanf (equiChanID, "%[^-]-%i -%i -%i -%i ", source, &nid, &tid, &sid, &rid) + != 5) { + rid = 0; + } + tChannelID EquivChID = tChannelID (cSource::FromString (source), nid, tid, sid, rid); +#if APIVERSNUM >= 20300 + const cChannel *EquivChannel = Channels->GetByChannelID(EquivChID, false); +#else + cChannel *EquivChannel = Channels.GetByChannelID (EquivChID, false); +#endif + if (!EquivChannel) { + LogI(0, prep("Warning, not found equivalent channel \'%s\' in channels.conf"), equiChanID); + continue; + } + + //check if channel is already added + ret = equiChanMap.equal_range(*OriginalChID.ToString()); + for (it=ret.first; it!=ret.second; ++it) + if ((*it).second == *OriginalChID.ToString()) { + found = true; + break; + } + if (found) continue; + + string origCh(*OriginalChID.ToString()); + string equiCh(*EquivChID.ToString()); + equiChanMap.insert(pair<string,string>(origCh.c_str(),equiCh.c_str())); + LogD(4, prep("Found %s equivalent to %s. origCh %s"), *EquivChID.ToString(), *OriginalChID.ToString(), origCh.c_str()); + for ( it2=equiChanMap.begin() ; it2 != equiChanMap.end(); it2++ ) + LogD(3, prep("Original ID %s <-> Equivalent ID %s"), (*it2).first.c_str(), it2->second.c_str()); + } } //while fclose (File); equiChanFileTime = st.st_mtim.tv_nsec; @@ -130,7 +139,7 @@ void cEquivHandler::updateEquivalent(cSchedules * Schedules, tChannelID channelI for (it=ret.first; it!=ret.second; ++it) { LogD(2, prep("equivalent channel exists")); tChannelID equChannelID (tChannelID::FromString((*it).second.c_str())); - cChannel *equChannel = GetChannelByID (equChannelID, false); + const cChannel *equChannel = GetChannelByID (equChannelID, false); if (equChannel) { LogD(2, prep("found Equivalent channel %s"), *equChannelID.ToString()); cSchedule *pSchedule = (cSchedule *) Schedules->GetSchedule (equChannel, true); @@ -192,14 +201,18 @@ void cEquivHandler::sortEquivalents(tChannelID channelID, cSchedules* Schedules) { LogD(3, prep("equivalent channel exists")); tChannelID equChannelID(tChannelID::FromString((*it).second.c_str())); - cChannel* pChannel = GetChannelByID(equChannelID, false); + const cChannel* pChannel = GetChannelByID(equChannelID, false); if (pChannel) { LogD(2, prep("found Equivalent channel %s"), *equChannelID.ToString()); cSchedule* pSchedule = (cSchedule *) Schedules->GetSchedule(pChannel, true); pSchedule->Sort(); +#if APIVERSNUM >= 20300 + pSchedule->SetModified(); +#else Schedules->SetModified(pSchedule); +#endif } } } |