diff options
Diffstat (limited to 'changrp.c')
-rw-r--r-- | changrp.c | 590 |
1 files changed, 281 insertions, 309 deletions
@@ -41,67 +41,64 @@ cChannelGroup::~cChannelGroup(void) bool cChannelGroup::Parse(const char *s) { - char *line; - char *pos; - char *pos_next; - int parameter = 1; - int valuelen; + char *line; + char *pos; + char *pos_next; + int parameter = 1; + int valuelen; #define MAXVALUELEN (10 * MaxFileName) - char value[MAXVALUELEN]; - - pos = line = strdup(s); - pos_next = pos + strlen(pos); - if (*pos_next == '\n') *pos_next = 0; - while (*pos) { - while (*pos == ' ') pos++; - if (*pos) { - if (*pos != '|') { - pos_next = strchr(pos, '|'); - if (!pos_next) - pos_next = pos + strlen(pos); - valuelen = pos_next - pos + 1; - if (valuelen > MAXVALUELEN) - { - LogFile.eSysLog("entry '%s' is too long. Will be truncated!", pos); - valuelen = MAXVALUELEN; - } - strn0cpy(value, pos, valuelen); - pos = pos_next; - switch (parameter) { - case 1: strcpy(name,value); - break; - default: - { + char value[MAXVALUELEN]; + + pos = line = strdup(s); + pos_next = pos + strlen(pos); + if (*pos_next == '\n') *pos_next = 0; + while (*pos) { + while (*pos == ' ') pos++; + if (*pos) { + if (*pos != '|') { + pos_next = strchr(pos, '|'); + if (!pos_next) + pos_next = pos + strlen(pos); + valuelen = pos_next - pos + 1; + if (valuelen > MAXVALUELEN) { + LogFile.eSysLog("entry '%s' is too long. Will be truncated!", pos); + valuelen = MAXVALUELEN; + } + strn0cpy(value, pos, valuelen); + pos = pos_next; + switch (parameter) { + case 1: + strcpy(name, value); + break; + default: { #ifdef __FreeBSD__ - char *channelbuffer = MALLOC(char, 32); - int numChannels = sscanf(value, "%31[^|]", channelbuffer); + char *channelbuffer = MALLOC(char, 32); + int numChannels = sscanf(value, "%31[^|]", channelbuffer); #else - char *channelbuffer = NULL; - int numChannels = sscanf(value, "%m[^|]", &channelbuffer); + char *channelbuffer = NULL; + int numChannels = sscanf(value, "%m[^|]", &channelbuffer); #endif - if (numChannels == 1) - { - LOCK_CHANNELS_READ; - const cChannel* channel = Channels->GetByChannelID(tChannelID::FromString(channelbuffer), true, true); - if (channel) - { - cChannelGroupItem* channelitem = new cChannelGroupItem(channel); - channels.Add(channelitem); - } - } - free(channelbuffer); - } - break; - } //switch - } - parameter++; - } - if (*pos) pos++; - } //while - - free(line); - return (parameter >= 1) ? true : false; + if (numChannels == 1) { + LOCK_CHANNELS_READ; + const cChannel* channel = Channels->GetByChannelID(tChannelID::FromString(channelbuffer), true, true); + if (channel) { + cChannelGroupItem* channelitem = new cChannelGroupItem(channel); + channels.Add(channelitem); + } + } + free(channelbuffer); + } + break; + } //switch + } + parameter++; + } + if (*pos) pos++; + } //while + + free(line); + return (parameter >= 1) ? true : false; } const char *cChannelGroup::ToText(void) @@ -109,18 +106,16 @@ const char *cChannelGroup::ToText(void) char* channelbuffer = NULL; cChannelGroupItem* ChannelGroupItem = channels.First(); int index = 0; - while (ChannelGroupItem) - { - const cChannel* channel = ChannelGroupItem->channel; - if (index++ == 0) - channelbuffer = strdup(CHANNELSTRING(channel)); - else - { - char* temp = channelbuffer; - msprintf(&channelbuffer, "%s|%s", channelbuffer, CHANNELSTRING(channel)); - free(temp); - } - ChannelGroupItem = channels.Next(ChannelGroupItem); + while (ChannelGroupItem) { + const cChannel* channel = ChannelGroupItem->channel; + if (index++ == 0) + channelbuffer = strdup(CHANNELSTRING(channel)); + else { + char* temp = channelbuffer; + msprintf(&channelbuffer, "%s|%s", channelbuffer, CHANNELSTRING(channel)); + free(temp); + } + ChannelGroupItem = channels.Next(ChannelGroupItem); } char* buffer = NULL; msprintf(&buffer, "%s|%s", name, channelbuffer); @@ -134,26 +129,22 @@ int* cChannelGroup::CreateChannelSel() int* channelSel = (int*) malloc(Channels->Count() * sizeof(int)); const cChannel* channel = Channels->First(); int index = 0; - while (channel) - { - if (channel->GroupSep()) - { - channel = Channels->Next(channel); - continue; - } - channelSel[index] = 0; - cChannelGroupItem* channelInGroup = channels.First(); - while (channelInGroup) - { - if (channel == channelInGroup->channel) - { - channelSel[index] = 1; - break; - } - channelInGroup = channels.Next(channelInGroup); - } - index++; - channel = Channels->Next(channel); + while (channel) { + if (channel->GroupSep()) { + channel = Channels->Next(channel); + continue; + } + channelSel[index] = 0; + cChannelGroupItem* channelInGroup = channels.First(); + while (channelInGroup) { + if (channel == channelInGroup->channel) { + channelSel[index] = 1; + break; + } + channelInGroup = channels.Next(channelInGroup); + } + index++; + channel = Channels->Next(channel); } return channelSel; } @@ -164,15 +155,13 @@ void cChannelGroup::CreateChannelList(int* channelSel) LOCK_CHANNELS_READ; const cChannel* channel = Channels->First(); int index = 0; - while (channel) - { - if (!channel->GroupSep()) - { - if (channelSel[index] == 1) - channels.Add(new cChannelGroupItem(channel)); - index++; - } - channel = Channels->Next(channel); + while (channel) { + if (!channel->GroupSep()) { + if (channelSel[index] == 1) + channels.Add(new cChannelGroupItem(channel)); + index++; + } + channel = Channels->Next(channel); } } @@ -184,11 +173,10 @@ bool cChannelGroup::Save(FILE *f) bool cChannelGroup::ChannelInGroup(const cChannel* channel) { cChannelGroupItem* channelInGroup = channels.First(); - while (channelInGroup) - { - if (channel == channelInGroup->channel) - return true; - channelInGroup = channels.Next(channelInGroup); + while (channelInGroup) { + if (channel == channelInGroup->channel) + return true; + channelInGroup = channels.Next(channelInGroup); } return false; } @@ -197,15 +185,14 @@ bool cChannelGroup::ChannelInGroup(const cChannel* channel) int cChannelGroups::GetIndex(char* channelGroup) { if (!channelGroup) - return -1; + return -1; cChannelGroup* ChannelGroup = First(); int index = 0; - while (ChannelGroup) - { - if (strcmp(channelGroup, ChannelGroup->name) == 0) - return index; - index++; - ChannelGroup = Next(ChannelGroup); + while (ChannelGroup) { + if (strcmp(channelGroup, ChannelGroup->name) == 0) + return index; + index++; + ChannelGroup = Next(ChannelGroup); } return -1; } @@ -213,13 +200,12 @@ int cChannelGroups::GetIndex(char* channelGroup) cChannelGroup* cChannelGroups::GetGroupByName(const char* channelGroup) { if (!channelGroup) - return NULL; + return NULL; cChannelGroup* ChannelGroup = First(); - while (ChannelGroup) - { - if (strcmp(channelGroup, ChannelGroup->name) == 0) - return ChannelGroup; - ChannelGroup = Next(ChannelGroup); + while (ChannelGroup) { + if (strcmp(channelGroup, ChannelGroup->name) == 0) + return ChannelGroup; + ChannelGroup = Next(ChannelGroup); } return NULL; } @@ -227,32 +213,30 @@ cChannelGroup* cChannelGroups::GetGroupByName(const char* channelGroup) cSearchExt* cChannelGroups::Used(cChannelGroup* group) { if (!group) - return NULL; + return NULL; if (SearchExts.Count() == 0) - SearchExts.Load(AddDirectory(CONFIGDIR, "epgsearch.conf")); + SearchExts.Load(AddDirectory(CONFIGDIR, "epgsearch.conf")); cMutexLock SearchExtsLock(&SearchExts); cSearchExt *SearchExt = SearchExts.First(); - while (SearchExt) - { - if (SearchExt->useChannel == 2 && strcmp(SearchExt->channelGroup, group->name) == 0) - return SearchExt; - SearchExt = SearchExts.Next(SearchExt); + while (SearchExt) { + if (SearchExt->useChannel == 2 && strcmp(SearchExt->channelGroup, group->name) == 0) + return SearchExt; + SearchExt = SearchExts.Next(SearchExt); } return NULL; } char** cChannelGroups::CreateMenuitemsList() { - char** menuitemsChGr = new char*[ChannelGroups.Count()+1]; + char** menuitemsChGr = new char*[ChannelGroups.Count() + 1]; cChannelGroup* ChannelGroup = First(); menuitemsChGr[0] = strdup(""); int index = 1; - while (ChannelGroup) - { - menuitemsChGr[index++] = ChannelGroup->name; - ChannelGroup = Next(ChannelGroup); + while (ChannelGroup) { + menuitemsChGr[index++] = ChannelGroup->name; + ChannelGroup = Next(ChannelGroup); } return menuitemsChGr; } @@ -270,63 +254,59 @@ void cMenuChannelGroupItem::Set(void) cChannelGroupItem* channelInGroup = group->channels.First(); int channelNr, chIntBegin = -1, chIntEnd = -1, chLast = -1; - while (channelInGroup) - { - channelNr = channelInGroup->channel->Number(); - if (chIntBegin == -1) - chIntBegin = channelNr; - if (chIntEnd == -1) - chIntEnd = channelNr; - - if (chLast == channelNr-1) - chIntEnd = channelNr; - else - { - chIntEnd = chLast; - if(chIntBegin == chIntEnd) - channelbuffer = cString::sprintf("%s %d", *channelbuffer?*channelbuffer:"", chIntBegin); - else if (chIntEnd != -1) - channelbuffer = cString::sprintf("%s %d-%d", *channelbuffer?*channelbuffer:"", chIntBegin, chIntEnd); - chIntBegin = chIntEnd = channelNr; - } - - chLast = channelNr; - channelInGroup = group->channels.Next(channelInGroup); - if (!channelInGroup) - { - if(chLast == chIntBegin) - channelbuffer = cString::sprintf("%s %d", *channelbuffer?*channelbuffer:"", chIntBegin); - else - channelbuffer = cString::sprintf("%s %d-%d", *channelbuffer?*channelbuffer:"", chIntBegin, chLast); - } + while (channelInGroup) { + channelNr = channelInGroup->channel->Number(); + if (chIntBegin == -1) + chIntBegin = channelNr; + if (chIntEnd == -1) + chIntEnd = channelNr; + + if (chLast == channelNr - 1) + chIntEnd = channelNr; + else { + chIntEnd = chLast; + if (chIntBegin == chIntEnd) + channelbuffer = cString::sprintf("%s %d", *channelbuffer ? *channelbuffer : "", chIntBegin); + else if (chIntEnd != -1) + channelbuffer = cString::sprintf("%s %d-%d", *channelbuffer ? *channelbuffer : "", chIntBegin, chIntEnd); + chIntBegin = chIntEnd = channelNr; + } + + chLast = channelNr; + channelInGroup = group->channels.Next(channelInGroup); + if (!channelInGroup) { + if (chLast == chIntBegin) + channelbuffer = cString::sprintf("%s %d", *channelbuffer ? *channelbuffer : "", chIntBegin); + else + channelbuffer = cString::sprintf("%s %d-%d", *channelbuffer ? *channelbuffer : "", chIntBegin, chLast); + } } - SetText(cString::sprintf("%s\t%s", group->name, *channelbuffer?*channelbuffer:"")); + SetText(cString::sprintf("%s\t%s", group->name, *channelbuffer ? *channelbuffer : "")); } // --- cMenuChannelGroups ---------------------------------------------------------- cMenuChannelGroups::cMenuChannelGroups(char** GroupName) -:cOsdMenu(tr("Channel groups"),20) + : cOsdMenu(tr("Channel groups"), 20) { - SetMenuCategory(mcSetupPlugins); + SetMenuCategory(mcSetupPlugins); groupSel = -1; groupName = GroupName; if (groupName && *groupName) - groupSel = ChannelGroups.GetIndex(*groupName); + groupSel = ChannelGroups.GetIndex(*groupName); cChannelGroup* ChannelGroup = ChannelGroups.First(); int index = 0; - while (ChannelGroup) - { - Add(new cMenuChannelGroupItem(ChannelGroup), (index == groupSel?true:false)); - ChannelGroup = ChannelGroups.Next(ChannelGroup); - index++; + while (ChannelGroup) { + Add(new cMenuChannelGroupItem(ChannelGroup), (index == groupSel ? true : false)); + ChannelGroup = ChannelGroups.Next(ChannelGroup); + index++; } if (groupName && *groupName) - SetHelp(trVDR("Button$Edit"), trVDR("Button$New"), trVDR("Button$Delete"), tr("Button$Select")); + SetHelp(trVDR("Button$Edit"), trVDR("Button$New"), trVDR("Button$Delete"), tr("Button$Select")); else - SetHelp(trVDR("Button$Edit"), trVDR("Button$New"), trVDR("Button$Delete"), NULL); + SetHelp(trVDR("Button$Edit"), trVDR("Button$New"), trVDR("Button$Delete"), NULL); Sort(); Display(); } @@ -340,29 +320,28 @@ cChannelGroup *cMenuChannelGroups::CurrentGroup(void) eOSState cMenuChannelGroups::New(void) { if (HasSubMenu()) - return osContinue; + return osContinue; return AddSubMenu(new cMenuEditChannelGroup(new cChannelGroup, true)); } eOSState cMenuChannelGroups::Delete(void) { - cChannelGroup *curGroup = CurrentGroup(); - if (curGroup) { - cSearchExt* search = ChannelGroups.Used(curGroup); - if (search) - { - cString Message = cString::sprintf("%s %s", tr("Channel group used by:"), search->search); - INFO(Message); - return osContinue; - } - if (Interface->Confirm(tr("Edit$Delete group?"))) { - ChannelGroups.Del(curGroup); - ChannelGroups.Save(); - cOsdMenu::Del(Current()); - Display(); - } - } - return osContinue; + cChannelGroup *curGroup = CurrentGroup(); + if (curGroup) { + cSearchExt* search = ChannelGroups.Used(curGroup); + if (search) { + cString Message = cString::sprintf("%s %s", tr("Channel group used by:"), search->search); + INFO(Message); + return osContinue; + } + if (Interface->Confirm(tr("Edit$Delete group?"))) { + ChannelGroups.Del(curGroup); + ChannelGroups.Save(); + cOsdMenu::Del(Current()); + Display(); + } + } + return osContinue; } eOSState cMenuChannelGroups::ProcessKey(eKeys Key) @@ -370,38 +349,39 @@ eOSState cMenuChannelGroups::ProcessKey(eKeys Key) int GroupNumber = HasSubMenu() ? Count() : -1; eOSState state = cOsdMenu::ProcessKey(Key); - if (state == osUnknown) - { - if (HasSubMenu()) - return osContinue; - switch (Key) - { - case kRed: - if (CurrentGroup()) - state = AddSubMenu(new cMenuEditChannelGroup(CurrentGroup())); - else - state = osContinue; - break; - case kGreen: state = New(); break; - case kYellow: state = Delete(); break; - - case kOk: - case kBlue: - if (groupName && *groupName) - { - free(*groupName); - *groupName = strdup(CurrentGroup()->name); - return osBack; - } - default: break; - } + if (state == osUnknown) { + if (HasSubMenu()) + return osContinue; + switch (Key) { + case kRed: + if (CurrentGroup()) + state = AddSubMenu(new cMenuEditChannelGroup(CurrentGroup())); + else + state = osContinue; + break; + case kGreen: + state = New(); + break; + case kYellow: + state = Delete(); + break; + + case kOk: + case kBlue: + if (groupName && *groupName) { + free(*groupName); + *groupName = strdup(CurrentGroup()->name); + return osBack; + } + default: + break; + } } - if (GroupNumber >= 0 && !HasSubMenu() && ChannelGroups.Get(GroupNumber)) - { - // a newly created group was confirmed with Ok - cChannelGroup* group = ChannelGroups.Get(GroupNumber); - Add(new cMenuChannelGroupItem(group), true); - Display(); + if (GroupNumber >= 0 && !HasSubMenu() && ChannelGroups.Get(GroupNumber)) { + // a newly created group was confirmed with Ok + cChannelGroup* group = ChannelGroups.Get(GroupNumber); + Add(new cMenuChannelGroupItem(group), true); + Display(); } return state; @@ -409,15 +389,15 @@ eOSState cMenuChannelGroups::ProcessKey(eKeys Key) // --- cMenuEditChannelGroup -------------------------------------------------------- cMenuEditChannelGroup::cMenuEditChannelGroup(cChannelGroup *Group, bool New) -:cOsdMenu(tr("Edit channel group"),30) + : cOsdMenu(tr("Edit channel group"), 30) { - SetMenuCategory(mcSetupPlugins); + SetMenuCategory(mcSetupPlugins); group = Group; channelSel = group->CreateChannelSel(); strcpy(name, group->name); addIfConfirmed = New; if (group) - Set(); + Set(); } cMenuEditChannelGroup::~cMenuEditChannelGroup() @@ -430,19 +410,17 @@ void cMenuEditChannelGroup::Set() int current = Current(); Clear(); - Add(new cMenuEditStrItem( tr("Group name"), name, sizeof(group->name), trVDR(FileNameChars))); + Add(new cMenuEditStrItem(tr("Group name"), name, sizeof(group->name), trVDR(FileNameChars))); LOCK_CHANNELS_READ; // TODO THIS MAY LOCK Channels A LONG TIME! const cChannel* channel = Channels->First(); int index = 0; - while (channel) - { - if (channel->GroupSep()) - { - channel = Channels->Next(channel); - continue; - } - Add(new cMenuEditBoolItem( CHANNELNAME(channel), &channelSel[index++], trVDR("no"), trVDR("yes"))); - channel = Channels->Next(channel); + while (channel) { + if (channel->GroupSep()) { + channel = Channels->Next(channel); + continue; + } + Add(new cMenuEditBoolItem(CHANNELNAME(channel), &channelSel[index++], trVDR("no"), trVDR("yes"))); + channel = Channels->Next(channel); } SetCurrent(Get(current)); @@ -451,84 +429,78 @@ void cMenuEditChannelGroup::Set() eOSState cMenuEditChannelGroup::ProcessKey(eKeys Key) { - eOSState state = cOsdMenu::ProcessKey(Key); - - const char* ItemText = Get(Current())->Text(); - if (strlen(ItemText) > 0 && strstr(ItemText, tr("Group name")) != ItemText) - SetHelp(tr("Button$Invert selection"), tr("Button$All yes"), tr("Button$All no"), NULL); - else if (!InEditMode(ItemText, tr("Group name"), name)) - SetHelp(NULL, NULL, NULL, NULL); - - if (state == osUnknown) { - switch (Key) { - case kOk: - if (strlen(name) == 0) - { - ERROR(tr("Group name is empty!")); - return osContinue; - } - if (addIfConfirmed && ChannelGroups.GetGroupByName(name)) - { - ERROR(tr("Group name already exists!")); - return osContinue; - } - - { - bool saveSearchExts = false; - if (strcmp(group->name, name) != 0 && !addIfConfirmed) // if group name changed, update searches - { - cMutexLock SearchExtsLock(&SearchExts); - cSearchExt *SearchExt = SearchExts.First(); - while (SearchExt) { - if (SearchExt->useChannel == 2 && - SearchExt->channelGroup && - strcmp(SearchExt->channelGroup, group->name) == 0) - { - free(SearchExt->channelGroup); - SearchExt->channelGroup = strdup(name); - } - SearchExt = SearchExts.Next(SearchExt); - } - saveSearchExts = true; // save them after groups are saved! - } - - strcpy(group->name, name); - group->CreateChannelList(channelSel); - if (addIfConfirmed) - ChannelGroups.Add(group); - ChannelGroups.Save(); - if (saveSearchExts) - SearchExts.Save(); - } - addIfConfirmed = false; - return osBack; - break; - case kRed: - case kGreen: - case kYellow: - { - LOCK_CHANNELS_READ; - const cChannel* channel = Channels->First(); - int index = 0; - while (channel) - { - if (channel->GroupSep()) - { - channel = Channels->Next(channel); - continue; - } - - channelSel[index] = (Key == kGreen?1:(Key == kRed?1-channelSel[index]:0)); - index++; - channel = Channels->Next(channel); - } - Set(); - Display(); - return osContinue; - } - - default: break; - } - } - return state; + eOSState state = cOsdMenu::ProcessKey(Key); + + const char* ItemText = Get(Current())->Text(); + if (strlen(ItemText) > 0 && strstr(ItemText, tr("Group name")) != ItemText) + SetHelp(tr("Button$Invert selection"), tr("Button$All yes"), tr("Button$All no"), NULL); + else if (!InEditMode(ItemText, tr("Group name"), name)) + SetHelp(NULL, NULL, NULL, NULL); + + if (state == osUnknown) { + switch (Key) { + case kOk: + if (strlen(name) == 0) { + ERROR(tr("Group name is empty!")); + return osContinue; + } + if (addIfConfirmed && ChannelGroups.GetGroupByName(name)) { + ERROR(tr("Group name already exists!")); + return osContinue; + } + + { + bool saveSearchExts = false; + if (strcmp(group->name, name) != 0 && !addIfConfirmed) { // if group name changed, update searches + cMutexLock SearchExtsLock(&SearchExts); + cSearchExt *SearchExt = SearchExts.First(); + while (SearchExt) { + if (SearchExt->useChannel == 2 && + SearchExt->channelGroup && + strcmp(SearchExt->channelGroup, group->name) == 0) { + free(SearchExt->channelGroup); + SearchExt->channelGroup = strdup(name); + } + SearchExt = SearchExts.Next(SearchExt); + } + saveSearchExts = true; // save them after groups are saved! + } + + strcpy(group->name, name); + group->CreateChannelList(channelSel); + if (addIfConfirmed) + ChannelGroups.Add(group); + ChannelGroups.Save(); + if (saveSearchExts) + SearchExts.Save(); + } + addIfConfirmed = false; + return osBack; + break; + case kRed: + case kGreen: + case kYellow: { + LOCK_CHANNELS_READ; + const cChannel* channel = Channels->First(); + int index = 0; + while (channel) { + if (channel->GroupSep()) { + channel = Channels->Next(channel); + continue; + } + + channelSel[index] = (Key == kGreen ? 1 : (Key == kRed ? 1 - channelSel[index] : 0)); + index++; + channel = Channels->Next(channel); + } + Set(); + Display(); + return osContinue; + } + + default: + break; + } + } + return state; } |