diff --git a/device.c b/device.c index e0046fd..7910fb1 100644 --- a/device.c +++ b/device.c @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: device.c,v 1.22 2007/09/16 16:03:24 rahrenbe Exp $ + * $Id: device.c,v 1.23 2007/09/18 18:48:10 rahrenbe Exp $ */ #include "common.h" @@ -106,13 +106,13 @@ bool cIptvDevice::ProvidesIptv(const char *Param) const bool cIptvDevice::ProvidesSource(int Source) const { debug("cIptvDevice::ProvidesSource(%d)\n", deviceIndex); - return ((Source & cSource::st_Mask) == cSource::stPlug); + return (cSource::IsPlug(Source)); } bool cIptvDevice::ProvidesTransponder(const cChannel *Channel) const { debug("cIptvDevice::ProvidesTransponder(%d)\n", deviceIndex); - return (ProvidesSource(Channel->Source()) && ProvidesIptv(Channel->Param())); + return (ProvidesSource(Channel->Source()) && ProvidesIptv(Channel->PluginParam())); } bool cIptvDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const @@ -135,9 +135,9 @@ bool cIptvDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) cIptvProtocolIf *protocol; debug("cIptvDevice::SetChannelDevice(%d)\n", deviceIndex); - addr = GetChannelSettings(Channel->Param(), &port, &protocol); + addr = GetChannelSettings(Channel->PluginParam(), &port, &protocol); if (isempty(addr)) { - error("ERROR: Unrecognized IPTV channel settings: %s", Channel->Param()); + error("ERROR: Unrecognized IPTV channel settings: %s", Channel->PluginParam()); return false; } // pad prefill to multiple of TS_SIZE diff --git a/patches/vdr-1.5.9-iptv.patch b/patches/vdr-1.5.9-iptv.patch index dbb8195..5113a5d 100644 --- a/patches/vdr-1.5.9-iptv.patch +++ b/patches/vdr-1.5.9-iptv.patch @@ -1,11 +1,11 @@ diff -Nru vdr-1.5.9-vanilla/channels.c vdr-1.5.9-iptv/channels.c --- vdr-1.5.9-vanilla/channels.c 2007-08-26 18:45:20.000000000 +0300 -+++ vdr-1.5.9-iptv/channels.c 2007-09-11 20:22:48.000000000 +0300 ++++ vdr-1.5.9-iptv/channels.c 2007-09-18 19:36:45.000000000 +0300 @@ -166,6 +166,7 @@ shortName = strdup(""); provider = strdup(""); portalName = strdup(""); -+ param = strdup(""); ++ pluginParam = strdup(""); memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__); inversion = INVERSION_AUTO; bandwidth = BANDWIDTH_AUTO; @@ -13,7 +13,7 @@ diff -Nru vdr-1.5.9-vanilla/channels.c vdr-1.5.9-iptv/channels.c shortName = NULL; provider = NULL; portalName = NULL; -+ param = NULL; ++ pluginParam = NULL; schedule = NULL; linkChannels = NULL; refChannel = NULL; @@ -21,7 +21,7 @@ diff -Nru vdr-1.5.9-vanilla/channels.c vdr-1.5.9-iptv/channels.c free(shortName); free(provider); free(portalName); -+ free(param); ++ free(pluginParam); } cChannel& cChannel::operator= (const cChannel &Channel) @@ -29,61 +29,98 @@ diff -Nru vdr-1.5.9-vanilla/channels.c vdr-1.5.9-iptv/channels.c shortName = strcpyrealloc(shortName, Channel.shortName); provider = strcpyrealloc(provider, Channel.provider); portalName = strcpyrealloc(portalName, Channel.portalName); -+ param = strcpyrealloc(param, Channel.param); ++ pluginParam = strcpyrealloc(pluginParam, Channel.pluginParam); memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__); return *this; } -@@ -582,15 +586,16 @@ - char buffer[64]; +@@ -280,9 +284,26 @@ + transmission = Channel->transmission; + guard = Channel->guard; + hierarchy = Channel->hierarchy; ++ if (IsPlug()) pluginParam = strcpyrealloc(pluginParam, Channel->pluginParam); + } + } + ++bool cChannel::SetPlugTransponderData(int Source, int Frequency, const char *PluginParam) ++{ ++ if (source != Source || frequency != Frequency || (strcmp(pluginParam, PluginParam) != 0)) { ++ if (Number()) { ++ dsyslog("changing transponder data of channel %d from %s:%d:%s to %s:%d:%s", Number(), *cSource::ToString(source), frequency, pluginParam, *cSource::ToString(Source), Frequency, PluginParam); ++ modification |= CHANNELMOD_TRANSP; ++ Channels.SetModified(); ++ } ++ source = Source; ++ frequency = Frequency; ++ pluginParam = strcpyrealloc(pluginParam, PluginParam); ++ schedule = NULL; ++ } ++ return true; ++} ++ + bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH) + { + // Workarounds for broadcaster stupidity: +@@ -407,6 +428,18 @@ + } + } + ++void cChannel::SetPluginParam(const char *PluginParam) ++{ ++ if (!isempty(PluginParam) && strcmp(pluginParam, PluginParam) != 0) { ++ if (Number()) { ++ dsyslog("changing plugin parameters of channel %d from '%s' to '%s'", Number(), pluginParam, PluginParam); ++ modification |= CHANNELMOD_TRANSP; ++ Channels.SetModified(); ++ } ++ pluginParam = strcpyrealloc(pluginParam, PluginParam); ++ } ++} ++ + #define STRDIFF 0x01 + #define VALDIFF 0x02 + +@@ -579,7 +612,7 @@ + if (isdigit(type)) + type = 'S'; + #define ST(s) if (strchr(s, type)) +- char buffer[64]; ++ char buffer[256]; char *q = buffer; *q = 0; -- ST(" S ") q += sprintf(q, "%c", polarization); -- ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues)); -- ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues)); -- ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues)); -- ST("C T") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues)); -- ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues)); -- ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues)); -- ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues)); -- ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues)); -+ ST(" S ") q += sprintf(q, "%c", polarization); -+ ST(" CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues)); -+ ST(" CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues)); -+ ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues)); -+ ST(" C T") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues)); -+ ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues)); -+ ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues)); -+ ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues)); -+ ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues)); -+ ST("P ") q += sprintf(q, "%s", param); + ST(" S ") q += sprintf(q, "%c", polarization); +@@ -591,6 +624,7 @@ + ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues)); + ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues)); + ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues)); ++ ST("P ") snprintf(buffer, sizeof(buffer), "%s", pluginParam); return buffer; } -@@ -612,7 +617,7 @@ +@@ -612,7 +646,7 @@ bool cChannel::StringToParameters(const char *s) { - while (s && *s) { -+ while (s && *s && IsPlug()) { ++ while (s && *s && !IsPlug()) { switch (toupper(*s)) { case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break; case 'C': s = ParseParameter(s, coderateH, CoderateValues); break; -@@ -813,6 +818,7 @@ +@@ -813,6 +847,7 @@ shortName = strcpyrealloc(shortName, p); } name = strcpyrealloc(name, namebuf); -+ param = strcpyrealloc(param, parambuf); ++ if (IsPlug()) pluginParam = strcpyrealloc(pluginParam, parambuf); free(parambuf); free(sourcebuf); diff -Nru vdr-1.5.9-vanilla/channels.h vdr-1.5.9-iptv/channels.h --- vdr-1.5.9-vanilla/channels.h 2007-08-26 18:45:20.000000000 +0300 -+++ vdr-1.5.9-iptv/channels.h 2007-09-11 20:22:48.000000000 +0300 ++++ vdr-1.5.9-iptv/channels.h 2007-09-18 19:36:24.000000000 +0300 @@ -114,6 +114,7 @@ char *shortName; char *provider; char *portalName; -+ char *param; ++ char *pluginParam; int __BeginData__; int frequency; // MHz int source; @@ -91,7 +128,7 @@ diff -Nru vdr-1.5.9-vanilla/channels.h vdr-1.5.9-iptv/channels.h int Frequency(void) const { return frequency; } ///< Returns the actual frequency, as given in 'channels.conf' int Transponder(void) const; ///< Returns the transponder frequency in MHz, plus the polarization in case of sat static int Transponder(int Frequency, char Polarization); ///< builds the transponder from the given Frequency and Polarization -+ const char *Param(void) const { return param; } ++ const char *PluginParam(void) const { return pluginParam; } int Source(void) const { return source; } int Srate(void) const { return srate; } int Vpid(void) const { return vpid; } @@ -103,14 +140,29 @@ diff -Nru vdr-1.5.9-vanilla/channels.h vdr-1.5.9-iptv/channels.h bool IsCable(void) const { return cSource::IsCable(source); } bool IsSat(void) const { return cSource::IsSat(source); } bool IsTerr(void) const { return cSource::IsTerr(source); } +@@ -206,12 +209,14 @@ + bool HasTimer(void) const; + int Modification(int Mask = CHANNELMOD_ALL); + void CopyTransponderData(const cChannel *Channel); ++ bool SetPlugTransponderData(int Source, int Frequency, const char *PluginParam); + bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH); + bool SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH); + bool SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CodeRateH, int CodeRateL, int Guard, int Transmission); + void SetId(int Nid, int Tid, int Sid, int Rid = 0); + void SetName(const char *Name, const char *ShortName, const char *Provider); + void SetPortalName(const char *PortalName); ++ void SetPluginParam(const char *PluginParam); + void SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int Tpid); + void SetCaIds(const int *CaIds); // list must be zero-terminated + void SetCaDescriptors(int Level); diff -Nru vdr-1.5.9-vanilla/menu.c vdr-1.5.9-iptv/menu.c --- vdr-1.5.9-vanilla/menu.c 2007-08-26 18:45:20.000000000 +0300 -+++ vdr-1.5.9-iptv/menu.c 2007-09-11 20:23:26.000000000 +0300 ++++ vdr-1.5.9-iptv/menu.c 2007-09-18 19:36:24.000000000 +0300 @@ -219,6 +219,7 @@ cChannel *channel; cChannel data; char name[256]; -+ char param[256]; ++ char pluginParam[256]; void Setup(void); public: cMenuEditChannel(cChannel *Channel, bool New = false); @@ -118,41 +170,29 @@ diff -Nru vdr-1.5.9-vanilla/menu.c vdr-1.5.9-iptv/menu.c // Parameters for all types of sources: strn0cpy(name, data.name, sizeof(name)); -+ strn0cpy(param, data.param, sizeof(param)); ++ strn0cpy(pluginParam, data.pluginParam, sizeof(pluginParam)); Add(new cMenuEditStrItem( tr("Name"), name, sizeof(name), tr(FileNameChars))); Add(new cMenuEditSrcItem( tr("Source"), &data.source)); Add(new cMenuEditIntItem( tr("Frequency"), &data.frequency)); -@@ -269,16 +271,17 @@ - Add(new cMenuEditIntItem( tr("Rid"), &data.rid, 0)); - XXX*/ - // Parameters for specific types of sources: -- ST(" S ") Add(new cMenuEditChrItem( tr("Polarization"), &data.polarization, "hvlr")); -- ST("CS ") Add(new cMenuEditIntItem( tr("Srate"), &data.srate)); -- ST("CST") Add(new cMenuEditMapItem( tr("Inversion"), &data.inversion, InversionValues, tr("off"))); -- ST("CST") Add(new cMenuEditMapItem( tr("CoderateH"), &data.coderateH, CoderateValues, tr("none"))); -- ST(" T") Add(new cMenuEditMapItem( tr("CoderateL"), &data.coderateL, CoderateValues, tr("none"))); -- ST("C T") Add(new cMenuEditMapItem( tr("Modulation"), &data.modulation, ModulationValues, "QPSK")); -- ST(" T") Add(new cMenuEditMapItem( tr("Bandwidth"), &data.bandwidth, BandwidthValues)); -- ST(" T") Add(new cMenuEditMapItem( tr("Transmission"), &data.transmission, TransmissionValues)); -- ST(" T") Add(new cMenuEditMapItem( tr("Guard"), &data.guard, GuardValues)); -- ST(" T") Add(new cMenuEditMapItem( tr("Hierarchy"), &data.hierarchy, HierarchyValues, tr("none"))); -+ ST(" S ") Add(new cMenuEditChrItem( tr("Polarization"), &data.polarization, "hvlr")); -+ ST(" CS ") Add(new cMenuEditIntItem( tr("Srate"), &data.srate)); -+ ST(" CST") Add(new cMenuEditMapItem( tr("Inversion"), &data.inversion, InversionValues, tr("off"))); -+ ST(" CST") Add(new cMenuEditMapItem( tr("CoderateH"), &data.coderateH, CoderateValues, tr("none"))); -+ ST(" T") Add(new cMenuEditMapItem( tr("CoderateL"), &data.coderateL, CoderateValues, tr("none"))); -+ ST(" C T") Add(new cMenuEditMapItem( tr("Modulation"), &data.modulation, ModulationValues, "QPSK")); -+ ST(" T") Add(new cMenuEditMapItem( tr("Bandwidth"), &data.bandwidth, BandwidthValues)); -+ ST(" T") Add(new cMenuEditMapItem( tr("Transmission"), &data.transmission, TransmissionValues)); -+ ST(" T") Add(new cMenuEditMapItem( tr("Guard"), &data.guard, GuardValues)); -+ ST(" T") Add(new cMenuEditMapItem( tr("Hierarchy"), &data.hierarchy, HierarchyValues, tr("none"))); -+ ST("P ") Add(new cMenuEditStrItem( tr("Parameters"), param, sizeof(param), tr(FileNameChars))); +@@ -279,6 +281,7 @@ + ST(" T") Add(new cMenuEditMapItem( tr("Transmission"), &data.transmission, TransmissionValues)); + ST(" T") Add(new cMenuEditMapItem( tr("Guard"), &data.guard, GuardValues)); + ST(" T") Add(new cMenuEditMapItem( tr("Hierarchy"), &data.hierarchy, HierarchyValues, tr("none"))); ++ ST("P ") Add(new cMenuEditStrItem( tr("Parameters"), pluginParam, sizeof(pluginParam), tr(FileNameChars))); SetCurrent(Get(current)); Display(); +@@ -293,6 +296,7 @@ + if (Key == kOk) { + if (Channels.HasUniqueChannelID(&data, channel)) { + data.name = strcpyrealloc(data.name, name); ++ data.pluginParam = strcpyrealloc(data.pluginParam, pluginParam); + if (channel) { + *channel = data; + isyslog("edited channel %d %s", channel->Number(), *data.ToText()); diff -Nru vdr-1.5.9-vanilla/po/fi_FI.po vdr-1.5.9-iptv/po/fi_FI.po --- vdr-1.5.9-vanilla/po/fi_FI.po 2007-08-26 18:45:20.000000000 +0300 -+++ vdr-1.5.9-iptv/po/fi_FI.po 2007-09-11 20:24:22.000000000 +0300 ++++ vdr-1.5.9-iptv/po/fi_FI.po 2007-09-18 19:36:24.000000000 +0300 @@ -1271,3 +1271,7 @@ #, c-format msgid "VDR will shut down in %s minutes" @@ -163,7 +203,7 @@ diff -Nru vdr-1.5.9-vanilla/po/fi_FI.po vdr-1.5.9-iptv/po/fi_FI.po +msgstr "Parametrit" diff -Nru vdr-1.5.9-vanilla/sources.c vdr-1.5.9-iptv/sources.c --- vdr-1.5.9-vanilla/sources.c 2007-08-26 18:45:20.000000000 +0300 -+++ vdr-1.5.9-iptv/sources.c 2007-09-11 20:22:48.000000000 +0300 ++++ vdr-1.5.9-iptv/sources.c 2007-09-18 19:36:24.000000000 +0300 @@ -37,6 +37,7 @@ char buffer[16]; char *q = buffer; @@ -182,7 +222,7 @@ diff -Nru vdr-1.5.9-vanilla/sources.c vdr-1.5.9-iptv/sources.c case 'T': type = stTerr; break; diff -Nru vdr-1.5.9-vanilla/sources.conf vdr-1.5.9-iptv/sources.conf --- vdr-1.5.9-vanilla/sources.conf 2007-08-26 18:45:20.000000000 +0300 -+++ vdr-1.5.9-iptv/sources.conf 2007-09-11 20:22:48.000000000 +0300 ++++ vdr-1.5.9-iptv/sources.conf 2007-09-18 19:36:24.000000000 +0300 @@ -188,3 +188,7 @@ # Terrestrial @@ -193,7 +233,7 @@ diff -Nru vdr-1.5.9-vanilla/sources.conf vdr-1.5.9-iptv/sources.conf +P Plugin diff -Nru vdr-1.5.9-vanilla/sources.h vdr-1.5.9-iptv/sources.h --- vdr-1.5.9-vanilla/sources.h 2007-08-26 18:45:20.000000000 +0300 -+++ vdr-1.5.9-iptv/sources.h 2007-09-11 20:22:48.000000000 +0300 ++++ vdr-1.5.9-iptv/sources.h 2007-09-18 19:36:24.000000000 +0300 @@ -16,10 +16,11 @@ public: enum eSourceType { diff --git a/po/fi_FI.po b/po/fi_FI.po index 9faeab5..47c4ecf 100644 --- a/po/fi_FI.po +++ b/po/fi_FI.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: Rolf Ahrenberg\n" -"POT-Creation-Date: 2007-09-16 16:48+0300\n" +"POT-Creation-Date: 2007-09-18 21:37+0300\n" "PO-Revision-Date: 2007-08-12 23:22+0300\n" "Last-Translator: Rolf Ahrenberg\n" "Language-Team: \n" @@ -19,22 +19,50 @@ msgstr "" msgid "Experiment the IPTV" msgstr "Koe IPTV:n ihmeellinen maailma" -#: setup.c:32 +#: setup.c:53 +msgid "UDP" +msgstr "UDP" + +#: setup.c:54 +msgid "HTTP" +msgstr "HTTP" + +#: setup.c:55 +msgid "FILE" +msgstr "FILE" + +#: setup.c:170 +msgid "Protocol" +msgstr "Protokolla" + +#: setup.c:178 +msgid "Address" +msgstr "Osoite" + +#: setup.c:179 +msgid "Port" +msgstr "Portti" + +#: setup.c:280 +msgid "IPTV Channels" +msgstr "IPTV-kanavat" + +#: setup.c:416 msgid "TS buffer size [MB]" msgstr "TS-puskurin koko [MB]" -#: setup.c:33 +#: setup.c:417 msgid "TS buffer prefill ratio [%]" msgstr "TS-puskurin esitäyttöaste [%]" -#: setup.c:34 +#: setup.c:418 msgid "UDP buffer size [packets]" msgstr "UDP-puskurin koko [pakettia]" -#: setup.c:35 +#: setup.c:419 msgid "HTTP buffer size [packets]" msgstr "HTTP-puskurin koko [pakettia]" -#: setup.c:36 +#: setup.c:420 msgid "FILE buffer size [packets]" msgstr "FILE-puskurin koko [pakettia]" diff --git a/setup.c b/setup.c index d0b2d05..887fc5d 100644 --- a/setup.c +++ b/setup.c @@ -3,9 +3,14 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: setup.c,v 1.5 2007/09/16 13:49:35 rahrenbe Exp $ + * $Id: setup.c,v 1.6 2007/09/18 18:48:11 rahrenbe Exp $ */ +#include + +#include +#include + #include "common.h" #include "config.h" #include "setup.h" @@ -13,8 +18,387 @@ #ifndef trVDR #define trVDR(s) tr(s) #endif - -cIptvPluginSetup::cIptvPluginSetup(void) + +// --- cIptvMenuEditChannel -------------------------------------------------- + +class cIptvMenuEditChannel : public cOsdMenu +{ +private: + enum { + eProtocolUDP, + eProtocolHTTP, + eProtocolFILE, + eProtocolCount + }; + struct tIptvChannel { + int frequency, source, protocol, port, vpid, ppid, tpid, sid, nid, tid, rid; + int apid[MAXAPIDS + 1], dpid[MAXDPIDS + 1], spid[MAXSPIDS + 1], caids[MAXCAIDS + 1]; + char name[256], location[256]; + } data; + cChannel *channel; + const char *protocols[eProtocolCount]; + void Setup(void); + cString GetIptvSettings(const char *Param, int *Port, int *Protocol); + void GetChannelData(cChannel *Channel); + void SetChannelData(cChannel *Channel); + +public: + cIptvMenuEditChannel(cChannel *Channel, bool New = false); + virtual eOSState ProcessKey(eKeys Key); +}; + +cIptvMenuEditChannel::cIptvMenuEditChannel(cChannel *Channel, bool New) +:cOsdMenu(trVDR("Edit channel"), 16) +{ + protocols[eProtocolUDP] = tr("UDP"); + protocols[eProtocolHTTP] = tr("HTTP"); + protocols[eProtocolFILE] = tr("FILE"); + channel = Channel; + GetChannelData(channel); + if (New) { + channel = NULL; + data.nid = 0; + data.tid = 0; + data.rid = 0; + } + Setup(); +} + +cString cIptvMenuEditChannel::GetIptvSettings(const char *Param, int *Port, int *Protocol) +{ + char *loc = NULL; + if (sscanf(Param, "IPTV|UDP|%a[^|]|%u", &loc, Port) == 2) { + cString addr(loc, true); + *Protocol = eProtocolUDP; + return addr; + } + else if (sscanf(Param, "IPTV|HTTP|%a[^|]|%u", &loc, Port) == 2) { + cString addr(loc, true); + *Protocol = eProtocolHTTP; + return addr; + } + else if (sscanf(Param, "IPTV|FILE|%a[^|]|%u", &loc, Port) == 2) { + cString addr(loc, true); + *Protocol = eProtocolFILE; + return addr; + } + return NULL; +} + +void cIptvMenuEditChannel::GetChannelData(cChannel *Channel) +{ + if (Channel) { + int port, protocol; + data.frequency = Channel->Frequency(); + data.source = Channel->Source(); + data.vpid = Channel->Vpid(); + data.ppid = Channel->Ppid(); + data.tpid = Channel->Tpid(); + for (unsigned int i = 0; i < sizeof(data.apid); ++i) + data.apid[i] = Channel->Apid(i); + for (unsigned int i = 0; i < sizeof(data.dpid); ++i) + data.dpid[i] = Channel->Dpid(i); + for (unsigned int i = 0; i < sizeof(data.spid); ++i) + data.spid[i] = Channel->Spid(i); + for (unsigned int i = 0; i < sizeof(data.caids); ++i) + data.caids[i] = Channel->Ca(i); + data.sid = Channel->Sid(); + data.nid = Channel->Nid(); + data.tid = Channel->Tid(); + data.rid = Channel->Rid(); + strn0cpy(data.name, Channel->Name(), sizeof(data.name)); + strn0cpy(data.location, *GetIptvSettings(Channel->PluginParam(), &port, &protocol), sizeof(data.location)); + data.protocol = protocol; + data.port = port; + } + else { + data.frequency = 1; + data.source = cSource::FromData(cSource::stPlug); + data.vpid = 0; + data.ppid = 0; + data.tpid = 0; + for (unsigned int i = 0; i < sizeof(data.apid); ++i) + data.apid[i] = 0; + for (unsigned int i = 0; i < sizeof(data.dpid); ++i) + data.dpid[i] = 0; + for (unsigned int i = 0; i < sizeof(data.spid); ++i) + data.spid[i] = 0; + for (unsigned int i = 0; i < sizeof(data.caids); ++i) + data.caids[i] = 0; + data.sid = 1; + data.nid = 0; + data.tid = 0; + data.rid = 0; + strn0cpy(data.name, "IPTV", sizeof(data.name)); + strn0cpy(data.location, "127.0.0.1", sizeof(data.location)); + data.protocol = eProtocolUDP; + data.port = 0; + } +} + +void cIptvMenuEditChannel::SetChannelData(cChannel *Channel) +{ + if (Channel) { + cString param; + char alangs[MAXAPIDS][MAXLANGCODE2] = { "" }; + char dlangs[MAXDPIDS][MAXLANGCODE2] = { "" }; + switch (data.protocol) { + case eProtocolFILE: + param = cString::sprintf("IPTV|FILE|%s|0", data.location); + break; + case eProtocolHTTP: + param = cString::sprintf("IPTV|HTTP|%s|%d", data.location, data.port); + break; + default: + case eProtocolUDP: + param = cString::sprintf("IPTV|UDP|%s|%d", data.location, data.port); + break; + } + Channel->SetPids(data.vpid, data.ppid, data.apid, alangs, data.dpid, dlangs, data.tpid); + Channel->SetCaIds(data.caids); + Channel->SetId(data.nid, data.tid, data.sid, data.rid); + Channel->SetName(data.name, "", "IPTV"); + Channel->SetPlugTransponderData(cSource::stPlug, data.frequency, param); + } +} + +void cIptvMenuEditChannel::Setup(void) +{ + int current = Current(); + Clear(); + // IPTV specific settings + Add(new cMenuEditStraItem(tr("Protocol"), &data.protocol, 3, protocols)); + switch (data.protocol) { + case eProtocolFILE: + Add(new cMenuEditStrItem(trVDR("File"), data.location, sizeof(data.location), trVDR(FileNameChars))); + break; + case eProtocolHTTP: + case eProtocolUDP: + default: + Add(new cMenuEditStrItem(tr("Address"),data.location, sizeof(data.location), trVDR(FileNameChars))); + Add(new cMenuEditIntItem(tr("Port"), &data.port, 0, 0xFFFF)); + break; + } + // Normal settings + Add(new cMenuEditStrItem(trVDR("Name"), data.name, sizeof(data.name), trVDR(FileNameChars))); + Add(new cMenuEditIntItem(trVDR("Frequency"), &data.frequency)); + Add(new cMenuEditIntItem(trVDR("Vpid"), &data.vpid, 0, 0x1FFF)); + Add(new cMenuEditIntItem(trVDR("Ppid"), &data.ppid, 0, 0x1FFF)); + Add(new cMenuEditIntItem(trVDR("Apid1"), &data.apid[0], 0, 0x1FFF)); + Add(new cMenuEditIntItem(trVDR("Apid2"), &data.apid[1], 0, 0x1FFF)); + Add(new cMenuEditIntItem(trVDR("Dpid1"), &data.dpid[0], 0, 0x1FFF)); + Add(new cMenuEditIntItem(trVDR("Dpid2"), &data.dpid[1], 0, 0x1FFF)); + Add(new cMenuEditIntItem(trVDR("Tpid"), &data.tpid, 0, 0x1FFF)); + Add(new cMenuEditIntItem(trVDR("CA"), &data.caids[0], 0, 0xFFFF)); + Add(new cMenuEditIntItem(trVDR("Sid"), &data.sid, 1, 0xFFFF)); + SetCurrent(Get(current)); + Display(); +} + +eOSState cIptvMenuEditChannel::ProcessKey(eKeys Key) +{ + int oldProtocol = data.protocol; + eOSState state = cOsdMenu::ProcessKey(Key); + if (state == osUnknown) { + if (Key == kOk) { + cChannel newchannel; + SetChannelData(&newchannel); + if (Channels.HasUniqueChannelID(&newchannel, channel)) { + if (channel) { + SetChannelData(channel); + isyslog("edited channel %d %s", channel->Number(), *channel->ToText()); + state = osBack; + } + else { + channel = new cChannel; + SetChannelData(channel); + Channels.Add(channel); + Channels.ReNumber(); + isyslog("added channel %d %s", channel->Number(), *channel->ToText()); + state = osUser1; + } + Channels.SetModified(true); + } + else { + Skins.Message(mtError, trVDR("Channel settings are not unique!")); + state = osContinue; + } + } + } + if ((Key != kNone) && (data.protocol != oldProtocol)) + Setup(); + return state; +} + +// --- cIptvMenuChannelItem -------------------------------------------------- + +class cIptvMenuChannelItem : public cOsdItem +{ +private: + cChannel *channel; + +public: + cIptvMenuChannelItem(cChannel *Channel); + virtual void Set(void); + cChannel *Channel(void) { return channel; } +}; + +cIptvMenuChannelItem::cIptvMenuChannelItem(cChannel *Channel) +{ + channel = Channel; + Set(); +} + +void cIptvMenuChannelItem::Set(void) +{ + char *buffer = NULL; + asprintf(&buffer, "%d\t%s", channel->Number(), channel->Name()); + SetText(buffer, false); +} + +// --- cIptvMenuChannels ----------------------------------------------------- + +class cIptvMenuChannels : public cOsdMenu +{ +private: + void Setup(void); + cChannel *GetChannel(int Index); + void Propagate(void); + +protected: + eOSState Edit(void); + eOSState New(void); + eOSState Delete(void); + +public: + cIptvMenuChannels(); + ~cIptvMenuChannels(); + virtual eOSState ProcessKey(eKeys Key); +}; + +cIptvMenuChannels::cIptvMenuChannels(void) +:cOsdMenu(tr("IPTV Channels"), numdigits(Channels.MaxNumber()) + 1) +{ + Setup(); + Channels.IncBeingEdited(); +} + +cIptvMenuChannels::~cIptvMenuChannels() +{ + Channels.DecBeingEdited(); +} + +void cIptvMenuChannels::Setup(void) +{ + Clear(); + for (cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel)) { + if (!channel->GroupSep() && channel->IsPlug() && !strncmp(channel->PluginParam(), "IPTV", 4)) { + cIptvMenuChannelItem *item = new cIptvMenuChannelItem(channel); + Add(item); + } + } + SetHelp(trVDR("Button$Edit"), trVDR("Button$New"), trVDR("Button$Delete"), NULL); + Display(); +} + +cChannel *cIptvMenuChannels::GetChannel(int Index) +{ + cIptvMenuChannelItem *p = (cIptvMenuChannelItem *)Get(Index); + return p ? (cChannel *)p->Channel() : NULL; +} + +void cIptvMenuChannels::Propagate(void) +{ + Channels.ReNumber(); + for (cIptvMenuChannelItem *ci = (cIptvMenuChannelItem *)First(); ci; ci = (cIptvMenuChannelItem *)ci->Next()) + ci->Set(); + Display(); + Channels.SetModified(true); +} + +eOSState cIptvMenuChannels::Edit(void) +{ + if (HasSubMenu() || Count() == 0) + return osContinue; + cChannel *ch = GetChannel(Current()); + if (ch) + return AddSubMenu(new cIptvMenuEditChannel(ch)); + return osContinue; +} + +eOSState cIptvMenuChannels::New(void) +{ + if (HasSubMenu()) + return osContinue; + return AddSubMenu(new cIptvMenuEditChannel(GetChannel(Current()), true)); +} + +eOSState cIptvMenuChannels::Delete(void) +{ + if (!HasSubMenu() && Count() > 0) { + int CurrentChannelNr = cDevice::CurrentChannel(); + cChannel *CurrentChannel = Channels.GetByNumber(CurrentChannelNr); + int Index = Current(); + cChannel *channel = GetChannel(Current()); + int DeletedChannel = channel->Number(); + // Check if there is a timer using this channel: + if (channel->HasTimer()) { + Skins.Message(mtError, trVDR("Channel is being used by a timer!")); + return osContinue; + } + if (Interface->Confirm(trVDR("Delete channel?"))) { + if (CurrentChannel && channel == CurrentChannel) { + int n = Channels.GetNextNormal(CurrentChannel->Index()); + if (n < 0) + n = Channels.GetPrevNormal(CurrentChannel->Index()); + CurrentChannel = Channels.Get(n); + CurrentChannelNr = 0; // triggers channel switch below + } + Channels.Del(channel); + cOsdMenu::Del(Index); + Propagate(); + isyslog("channel %d deleted", DeletedChannel); + if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) { + if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring()) + Channels.SwitchTo(CurrentChannel->Number()); + else + cDevice::SetCurrentChannel(CurrentChannel); + } + } + } + return osContinue; +} + +eOSState cIptvMenuChannels::ProcessKey(eKeys Key) +{ + eOSState state = cOsdMenu::ProcessKey(Key); + + switch (state) { + case osUser1: { + cChannel *channel = Channels.Last(); + if (channel) { + Add(new cIptvMenuChannelItem(channel), true); + return CloseSubMenu(); + } + } + break; + default: + if (state == osUnknown) { + switch (Key) { + case kOk: + case kRed: return Edit(); + case kGreen: return New(); + case kYellow: return Delete(); + default: break; + } + } + } + return state; +} + +// --- cIptvPluginSetup ------------------------------------------------------ + +cIptvPluginSetup::cIptvPluginSetup() { tsBufferSize = IptvConfig.GetTsBufferSize(); tsBufferPrefill = IptvConfig.GetTsBufferPrefillRatio(); @@ -38,9 +422,22 @@ void cIptvPluginSetup::Setup(void) Display(); } +eOSState cIptvPluginSetup::EditChannel(void) +{ + if (HasSubMenu()) + return osContinue; + return AddSubMenu(new cIptvMenuChannels()); +} + eOSState cIptvPluginSetup::ProcessKey(eKeys Key) { eOSState state = cMenuSetupPage::ProcessKey(Key); + if (state == osUnknown) { + switch (Key) { + case kRed: return EditChannel(); + default: break; + } + } return state; } @@ -59,3 +456,4 @@ void cIptvPluginSetup::Store(void) IptvConfig.SetHttpBufferSize(httpBufferSize); IptvConfig.SetFileBufferSize(fileBufferSize); } + diff --git a/setup.h b/setup.h index b5487fa..6b0b65a 100644 --- a/setup.h +++ b/setup.h @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: setup.h,v 1.3 2007/09/16 13:38:20 rahrenbe Exp $ + * $Id: setup.h,v 1.4 2007/09/18 18:48:11 rahrenbe Exp $ */ #ifndef __IPTV_SETUP_H @@ -19,6 +19,7 @@ private: int udpBufferSize; int httpBufferSize; int fileBufferSize; + eOSState EditChannel(void); virtual void Setup(void); protected: