/* * maps.cpp: A plugin for the Video Disk Recorder * * See the README file for copyright information and how to reach the author. * */ #include "maps.h" #include cTEXTMapping::cTEXTMapping(const char *Name, const char *Value) { name=strdup(Name); value=strdup(Value); } cTEXTMapping::~cTEXTMapping() { if (name) free((void *) name); if (value) free((void *) value); } void cTEXTMapping::ChangeValue(const char *Value) { if (value) free((void *) value); value=strdup(Value); } // -------------------------------------------------------------------------------------------------------- void cTEXTMappings::Remove() { cTEXTMapping *maps; while ((maps=Last())!=NULL) { Del(maps); } } cTEXTMapping* cTEXTMappings::GetMap(const char* Name) { if (!Name) return NULL; if (!Count()) return NULL; for (int i=0; iName(),Name)) return Get(i); } return NULL; } // -------------------------------------------------------------------------------------------------------- bool cEPGMappings::ProcessChannel(const tChannelID ChannelID) { if (!Count()) return false; for (int i=0; iNumChannelIDs(); x++) { if (Get(i)->ChannelIDs()[x]==ChannelID) return true; } } return false; } bool cEPGMappings::IgnoreChannel(const cChannel *Channel) { if (!Channel) return false; if (!Count()) return false; tChannelID cid=Channel->GetChannelID(); for (int i=0; iFlags() & OPT_APPEND)==OPT_APPEND) { for (int x=0; xNumChannelIDs(); x++) { if (Get(i)->ChannelIDs()[x]==cid) return true; } } } return false; } void cEPGMappings::Remove() { cEPGMapping *maps; while ((maps=Last())!=NULL) { Del(maps); } } cEPGMapping* cEPGMappings::GetMap(const char* ChannelName) { if (!ChannelName) return NULL; if (!Count()) return NULL; for (int i=0; iChannelName(),ChannelName)) return Get(i); } return NULL; } cEPGMapping *cEPGMappings::GetMap(tChannelID ChannelID) { if (!Count()) return NULL; for (int i=0; iNumChannelIDs(); x++) { if (Get(i)->ChannelIDs()[x]==ChannelID) return Get(i); } } return NULL; } // -------------------------------------------------------------------------------------------------------- cEPGMapping::cEPGMapping(const char *ChannelName, const char *Flags_and_Channels) { channelname=strdup(ChannelName); dsyslog("xmltv2vdr: added mapping for '%s'",channelname); flags=USE_SHORTTEXT; channelids=NULL; numchannelids=0; if (Flags_and_Channels) { char *flags_unused_p=(char *) strdup(Flags_and_Channels); if (!flags_unused_p) return; char *flags_p=strchr(flags_unused_p,';'); if (flags_p) { *flags_p=0; flags_p++; char *channels_p=strchr(flags_p,';'); if (channels_p) { *channels_p=0; channels_p++; flags=atoi(flags_p); addchannels(channels_p); } } free(flags_unused_p); } } cEPGMapping::~cEPGMapping() { if (channelname) free((void *) channelname); if (channelids) free(channelids); } cEPGMapping::cEPGMapping(cEPGMapping©) { channelname=strdup(copy.channelname); channelids=NULL; numchannelids=0; if (copy.numchannelids>0) { channelids=(tChannelID *) malloc((copy.numchannelids+1)*sizeof(tChannelID)); if (!channelids) return; for (int i=0; iNumber(); } if (*v2==tChannelID::InvalidID) { num2=INT_MAX; } else { cChannel *c2=Channels.GetByChannelID(*v2); if (c2) num2=c2->Number(); } if (num1>num2) return 1; else return -1; } void cEPGMapping::addchannels(const char *channels) { char *tmp=(char *) strdup(channels); if (!tmp) return; char *token,*str1,*saveptr; str1=tmp; while (token=strtok_r(str1,";",&saveptr)) { tChannelID ChannelID=tChannelID::FromString(token); if (!(ChannelID==tChannelID::InvalidID)) { tChannelID *tmp_channelids=(tChannelID *) realloc(channelids,(numchannelids+1)*sizeof(struct tChannelID)); if (!tmp_channelids) { free(tmp); return; } channelids=tmp_channelids; channelids[numchannelids]=ChannelID; numchannelids++; } str1=NULL; } free(tmp); } void cEPGMapping::AddChannel(int ChannelNumber) { cChannel *chan=Channels.GetByNumber(ChannelNumber); if (chan) { bool found=false; for (int i=0; iGetChannelID()) { found=true; break; } } if (!found) { tChannelID *tmp_channelids=static_cast(realloc(channelids,(numchannelids+1)*sizeof(struct tChannelID))); if (tmp_channelids) { channelids=tmp_channelids; channelids[numchannelids]=chan->GetChannelID(); numchannelids++; qsort(channelids,numchannelids,sizeof(tChannelID),compare); } } } } void cEPGMapping::ReplaceChannels(int NumChannelIDs, tChannelID *ChannelIDs) { if (NumChannelIDs<0) return; free(channelids); channelids=NULL; numchannelids=0; if (!NumChannelIDs) return; if (!ChannelIDs) return; for (int i=0; i(realloc(channelids,(numchannelids+1)*sizeof(tChannelID))); if (tmp_channelids) { channelids=tmp_channelids; channelids[numchannelids]=ChannelIDs[i]; numchannelids++; qsort(channelids,numchannelids,sizeof(tChannelID),compare); } } } void cEPGMapping::RemoveInvalidChannels() { qsort(channelids,numchannelids,sizeof(tChannelID),compare); for (int i=0; iGetChannelID()) { found=true; break; } } if (found) { channelids[i]=tChannelID::InvalidID; if (!MarkOnly) { qsort(channelids,numchannelids,sizeof(tChannelID),compare); numchannelids--; } } }