diff options
author | lordjaxom <lordjaxom> | 2004-12-30 22:43:55 +0000 |
---|---|---|
committer | lordjaxom <lordjaxom> | 2004-12-30 22:43:55 +0000 |
commit | 302fa2e67276bd0674e81e2a9a01b9e91dd45d8c (patch) | |
tree | a454884a16e0ffa48b5ce3e4ce1a66eb874a9de0 /common.c | |
download | vdr-plugin-streamdev-302fa2e67276bd0674e81e2a9a01b9e91dd45d8c.tar.gz vdr-plugin-streamdev-302fa2e67276bd0674e81e2a9a01b9e91dd45d8c.tar.bz2 |
Initial revision
Diffstat (limited to 'common.c')
-rw-r--r-- | common.c | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/common.c b/common.c new file mode 100644 index 0000000..af80c6e --- /dev/null +++ b/common.c @@ -0,0 +1,259 @@ +/* + * $Id: common.c,v 1.1 2004/12/30 22:43:55 lordjaxom Exp $ + */ + +#include <vdr/channels.h> +#include <iostream> + +#include "common.h" +#include "tools/select.h" +#include "i18n.h" + +using namespace std; + +const char *VERSION = "0.3.3-pre3-geni"; + +const char *StreamTypes[st_Count] = { + "TS", + "PES", + "PS", + "ES", +}; + +const char *SuspendModes[sm_Count] = { + "Offer suspend mode", + "Always suspended", + "Never suspended" +}; + +const char IpCharacters[] = "0123456789."; + +char *GetNextLine(char *String, uint Length, uint &Offset) { + char *last, *first; + + first = String + Offset; + for (last = first; last < String + Length; ++last) { + if (*last == '\012') { + if (*(last - 1) == '\015') + *(last - 1) = '\0'; + + *last++ = '\0'; + Dprintf("IN: |%s|\n", first); + Offset = last - String; + return first; + } + } + return NULL; +} + +cChannel *ChannelFromString(char *String) { + cChannel *channel = NULL; + + if (isnumber(String)) { + int temp = strtol(String, NULL, 10); + if (temp >= 1 && temp <= Channels.MaxNumber()) + channel = Channels.GetByNumber(temp); + } else { + channel = Channels.GetByChannelID(tChannelID::FromString(String)); + + if (channel == NULL) { + int i = 1; + while ((channel = Channels.GetByNumber(i, 1)) != NULL) { + if (String == channel->Name()) + break; + + i = channel->Number() + 1; + } + } + } + return channel; +} + +void cStreamdevMenuSetupPage::AddCategory(const char *Title) { + char *buffer = NULL; + + asprintf(&buffer, "--- %s -------------------------------------------------" + "---------------", Title ); + + cOsdItem *item = new cOsdItem(buffer); + free(buffer); + +#if VDRVERSNUM < 10307 +# ifdef HAVE_BEAUTYPATCH + item->SetColor(clrScrolLine, clrBackground); +# else + item->SetColor(clrCyan, clrBackground); +# endif +#else + item->SetSelectable(false); +#endif + Add(item); +} + +void cStreamdevMenuSetupPage::AddBoolEdit(const char *Title, int &Value) { + Add(new cMenuEditBoolItem(Title, &Value)); +} + +void cStreamdevMenuSetupPage::AddIpEdit(const char *Title, char *Value) { + Add(new cMenuEditIpItem(Title, Value)); +} + +void cStreamdevMenuSetupPage::AddShortEdit(const char *Title, int &Value) { + AddRangeEdit(Title, Value, 0, 65535); +} + +void cStreamdevMenuSetupPage::AddRangeEdit(const char *Title, int &Value, + int Min, int Max) { + Add(new cMenuEditIntItem(Title, &Value, Min, Max)); +} + +void cStreamdevMenuSetupPage::AddSuspEdit(const char *Title, int &Value) { + static const char *SuspendModesTR[sm_Count] = { NULL }; + + if (SuspendModesTR[0] == NULL) { + for (int i = 0; i < sm_Count; ++i) + SuspendModesTR[i] = tr(SuspendModes[i]); + } + + Add(new cMenuEditStraItem(Title, &Value, sm_Count, SuspendModesTR)); +} +void cStreamdevMenuSetupPage::AddTypeEdit(const char *Title, int &Value) { + Add(new cMenuEditStraItem(Title, &Value, st_Count, StreamTypes)); +} + +cMenuEditIpItem::cMenuEditIpItem(const char *Name, char *Value): + cMenuEditItem(Name) { + value = Value; + curNum = -1; + pos = -1; + step = false; + Set(); +} + +cMenuEditIpItem::~cMenuEditIpItem() { +} + +void cMenuEditIpItem::Set(void) { + char buf[1000]; + if (pos >= 0) { + in_addr_t addr = inet_addr(value); + if ((int)addr == -1) + addr = 0; + int p = 0; + for (int i = 0; i < 4; ++i) { + p += snprintf(buf + p, sizeof(buf) - p, pos == i ? "[%d]" : "%d", + pos == i ? curNum : (addr >> (i * 8)) & 0xff); + if (i < 3) + buf[p++] = '.'; + } + SetValue(buf); + } else + SetValue(value); +} + +eOSState cMenuEditIpItem::ProcessKey(eKeys Key) { + in_addr addr; + addr.s_addr = inet_addr(value); + if ((int)addr.s_addr == -1) + addr.s_addr = 0; + + switch (Key) { + case kUp: + if (pos >= 0) { + if (curNum < 255) ++curNum; + } else + return cMenuEditItem::ProcessKey(Key); + break; + + case kDown: + if (pos >= 0) { + if (curNum > 0) --curNum; + } else + return cMenuEditItem::ProcessKey(Key); + break; + + case kOk: + if (pos >= 0) { + addr.s_addr = inet_addr(value); + if ((int)addr.s_addr == -1) + addr.s_addr = 0; + addr.s_addr &= ~(0xff << (pos * 8)); + addr.s_addr |= curNum << (pos * 8); + strcpy(value, inet_ntoa(addr)); + } else + return cMenuEditItem::ProcessKey(Key); + curNum = -1; + pos = -1; + break; + + case kRight: + if (pos >= 0) { + addr.s_addr = inet_addr(value); + if ((int)addr.s_addr == -1) + addr.s_addr = 0; + addr.s_addr &= ~(0xff << (pos * 8)); + addr.s_addr |= curNum << (pos * 8); + strcpy(value, inet_ntoa(addr)); + } + + if (pos == -1 || pos == 3) + pos = 0; + else + ++pos; + + curNum = (addr.s_addr >> (pos * 8)) & 0xff; + step = true; + break; + + case kLeft: + if (pos >= 0) { + addr.s_addr = inet_addr(value); + if ((int)addr.s_addr == -1) + addr.s_addr = 0; + addr.s_addr &= ~(0xff << (pos * 8)); + addr.s_addr |= curNum << (pos * 8); + strcpy(value, inet_ntoa(addr)); + } + + if (pos <= 0) + pos = 3; + else + --pos; + + curNum = (addr.s_addr >> (pos * 8)) & 0xff; + step = true; + break; + + case k0 ... k9: + if (pos == -1) + pos = 0; + + if (curNum == -1 || step) { + curNum = Key - k0; + step = false; + } else + curNum = curNum * 10 + (Key - k0); + + if (!step && (curNum * 10 > 255) || (curNum == 0)) { + in_addr addr; + addr.s_addr = inet_addr(value); + if ((int)addr.s_addr == -1) + addr.s_addr = 0; + addr.s_addr &= ~(0xff << (pos * 8)); + addr.s_addr |= curNum << (pos * 8); + strcpy(value, inet_ntoa(addr)); + if (++pos == 4) + pos = 0; + curNum = (addr.s_addr >> (pos * 8)) & 0xff; + step = true; + } + break; + + default: + return cMenuEditItem::ProcessKey(Key); + } + + Set(); + return osContinue; +} + |