mirror of
				https://github.com/rofafor/vdr-plugin-iptv.git
				synced 2023-10-10 11:37:03 +00:00 
			
		
		
		
	Updated for vdr-1.7.13.
This commit is contained in:
		
							
								
								
									
										13
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -1,5 +1,6 @@ | ||||
| ================================== | ||||
| VDR Plugin 'iptv' Revision History | ||||
| ---------------------------------- | ||||
| ================================== | ||||
|  | ||||
| 2007-10-14: Version 0.0.1 | ||||
|  | ||||
| @@ -117,7 +118,13 @@ VDR Plugin 'iptv' Revision History | ||||
| - Modified sectionfilters to use socket pair instead of | ||||
|   filesystem fifos. | ||||
|  | ||||
| 2010-xx-xx: Version 0.3.2 | ||||
|  | ||||
| - Updated patches. | ||||
| ==================================  | ||||
| VDR Plugin 'iptv' Revision History | ||||
| ==================================  | ||||
|  | ||||
| 2010-03-05: Version 0.4.0 | ||||
|  | ||||
| - Updated for vdr-1.7.13. | ||||
|   Notice: channels.conf format has changed! | ||||
| - Fixed argument corruption. | ||||
|   | ||||
							
								
								
									
										6
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
									
									
									
									
								
							| @@ -31,6 +31,10 @@ VDRDIR = ../../.. | ||||
| LIBDIR = ../../lib | ||||
| TMPDIR = /tmp | ||||
|  | ||||
| ### Make sure that necessary options are included: | ||||
|  | ||||
| include $(VDRDIR)/Make.global | ||||
|  | ||||
| ### Allow user defined options to overwrite defaults: | ||||
|  | ||||
| -include $(VDRDIR)/Make.config | ||||
| @@ -61,7 +65,7 @@ all-redirect: all | ||||
|  | ||||
| OBJS = $(PLUGIN).o config.o setup.o device.o streamer.o protocoludp.o \ | ||||
| 	protocolhttp.o protocolfile.o protocolext.o sectionfilter.o \ | ||||
| 	sidscanner.o pidscanner.o statistics.o common.o socket.o | ||||
| 	sidscanner.o pidscanner.o statistics.o common.o socket.o source.o | ||||
|  | ||||
| ### The main target: | ||||
|  | ||||
|   | ||||
							
								
								
									
										50
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								README
									
									
									
									
									
								
							| @@ -44,7 +44,6 @@ cd /put/your/path/here/VDR/PLUGINS/src | ||||
| tar -xzf /put/your/path/here/vdr-iptv-X.Y.Z.tgz | ||||
| ln -s iptv-X.Y.Z iptv | ||||
| cd /put/your/path/here/VDR | ||||
| patch -p1 < PLUGINS/src/iptv/patches/vdr-X.Y.Z-pluginparam.patch | ||||
| cp sources.conf /path/to/vdrconf/ | ||||
| cp -R PLUGINS/src/iptv/iptv /path/to/vdrconf/plugins/ | ||||
| make | ||||
| @@ -77,29 +76,8 @@ Setup menu: | ||||
|                                    options which allow you to disable the | ||||
|                                    individual section filters. | ||||
|                                    Valid range: 0...7 | ||||
| - [Red:Channels]                   Opens IPTV channel editor. | ||||
| - [Blue:Info]                      Opens IPTV information/statistics menu. | ||||
|  | ||||
| Channel editor menu: | ||||
|  | ||||
| - Because of the different nature and content the VDR channel editor is not | ||||
|   best suited for editing of IPTV channels. Therefore an alternative editor | ||||
|   is provided which allows more IPTV centric editing of channel information. | ||||
|   An IPTV channel editor is accessible via "Setup -> Plugins -> IPTV" and | ||||
|   pressing the Red button. The channel editor is functionally similar to | ||||
|   VDR's built-in channel editor. | ||||
|  | ||||
| - Scan Sid:  [yes|no]              Defines whether service id shall be | ||||
|                                    scanned automatically. Service id is | ||||
|                                    used in channel identification and | ||||
|                                    EPG information is set according to it. | ||||
|                                    This option requires section filtering. | ||||
|  | ||||
| - Scan pids: [yes|no]              Defines whether video and audio pids | ||||
|                                    shall be scanned automatically. This | ||||
|                                    option is useful with streams missing | ||||
|                                    correct PAT/PMT information. | ||||
|  | ||||
| Information menu: | ||||
|  | ||||
| - [Red:General]                    Opens the general information page. | ||||
| @@ -111,17 +89,20 @@ Configuration: | ||||
|  | ||||
| - channels.conf | ||||
|  | ||||
|   TV4;IPTV:40:IPTV|S1P0|EXT|iptvstream.sh|0:P:0:0:680:0:0:4:0:0:0 | ||||
|   TV3;IPTV:30:IPTV|S0P1|FILE|/video/stream.ts|5:P:0:514:670:2321:0:3:0:0:0 | ||||
|   TV2;IPTV:20:IPTV|S0P1|HTTP|127.0.0.1/TS/2|3000:P:0:513:660:2321:0:2:0:0:0 | ||||
|   TV1;IPTV:10:IPTV|S1P0|UDP|127.0.0.1|1234:P:0:512:650:2321:0:1:0:0:0 | ||||
|            ^  ^    ^    ^   ^         ^    ^ | ||||
|            |  |    |    |   |         |    Source type ("P") | ||||
|            |  |    |    |   |         IP Port Number, File delay (ms), Script parameter | ||||
|            |  |    |    |   IP Address, File location, Script location | ||||
|            |  |    |    Protocol ("UDP", "HTTP", "FILE", "EXT") | ||||
|            |  |    Parameters ("S" Sid scan, "P" Pid scan, "0" disable, "1" enable) | ||||
|            |  Plugin ID ("IPTV") | ||||
|   TV4;IPTV:40:S=1|P=0|F=EXT|U=iptvstream.sh|A=0:I:0:0:680:0:0:4:0:0:0 | ||||
|   TV3;IPTV:30:S=0|P=1|F=FILE|U=/video/stream.ts|A=5:I:0:514:670:2321:0:3:0:0:0 | ||||
|   TV2;IPTV:20:S=0|P=1|F=HTTP|U=127.0.0.1/TS/2|A=3000:I:0:513:660:2321:0:2:0:0:0 | ||||
|   TV1;IPTV:10:S=1|P=0|F=UDP|U=127.0.0.1|A=1234:I:0:512:650:2321:0:1:0:0:0 | ||||
|            ^  ^   ^   ^     ^           ^    ^ | ||||
|            |  |   |   |     |           |    Source type ("I") | ||||
|            |  |   |   |     |           Stream parameter (multicast port | ||||
|            |  |   |   |     |           number, HTTP port number, file delay | ||||
|            |  |   |   |     |           (ms), script parameter) | ||||
|            |  |   |   |     Stream address (multicast address, URL, file | ||||
|            |  |   |   |     location, script location) | ||||
|            |  |   |   Stream protocol ("UDP", "HTTP", "FILE", "EXT") | ||||
|            |  |   PID Scan ("0" disable, "1" enable) | ||||
|            |  SID Scan ("0" disable, "1" enable) | ||||
|            Unique enumeration | ||||
|  | ||||
| - UDP multicast rules for iptables firewall | ||||
| @@ -151,8 +132,7 @@ External streaming: | ||||
|   devices can be used simultaneously. | ||||
|  | ||||
| - IPTV plugin includes an example script which uses VLC media player for | ||||
|   receiving streams, transcoding and handing the result to IPTV plugin. The | ||||
|   plugin was tested with VLC version 0.8.6c. | ||||
|   receiving streams, transcoding and handing the result to IPTV plugin. | ||||
|  | ||||
| Notes: | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								common.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								common.h
									
									
									
									
									
								
							| @@ -20,16 +20,12 @@ | ||||
| #define error(x...) esyslog("ERROR: " x); | ||||
| #endif | ||||
|  | ||||
| #ifndef trNOOP | ||||
| #define trNOOP(s) (s) | ||||
| #endif | ||||
|  | ||||
| #ifndef trVDR | ||||
| #define trVDR(s) tr(s) | ||||
| #endif | ||||
| #define ELEMENTS(x)                     (sizeof(x) / sizeof(x[0])) | ||||
|  | ||||
| #define IPTV_DVR_FILENAME               "/tmp/vdr-iptv%d.dvr" | ||||
|  | ||||
| #define IPTV_SOURCE_CHARACTER           'I' | ||||
|  | ||||
| #define IPTV_DEVICE_INFO_ALL            0 | ||||
| #define IPTV_DEVICE_INFO_GENERAL        1 | ||||
| #define IPTV_DEVICE_INFO_PIDS           2 | ||||
|   | ||||
							
								
								
									
										100
									
								
								device.c
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								device.c
									
									
									
									
									
								
							| @@ -6,6 +6,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
| #include "source.h" | ||||
| #include "device.h" | ||||
|  | ||||
| #define IPTV_MAX_DEVICES MAXDEVICES | ||||
| @@ -22,7 +23,7 @@ cIptvDevice::cIptvDevice(unsigned int Index) | ||||
|   sidScanEnabled(false), | ||||
|   pidScanEnabled(false) | ||||
| { | ||||
|   unsigned int bufsize = MEGABYTE(IptvConfig.GetTsBufferSize()); | ||||
|   unsigned int bufsize = (unsigned int)MEGABYTE(IptvConfig.GetTsBufferSize()); | ||||
|   bufsize -= (bufsize % TS_SIZE); | ||||
|   isyslog("creating IPTV device %d (CardIndex=%d)", deviceIndex, CardIndex()); | ||||
|   tsBuffer = new cRingBufferLinear(bufsize + 1, TS_SIZE, false, | ||||
| @@ -85,6 +86,7 @@ cIptvDevice::~cIptvDevice() | ||||
| bool cIptvDevice::Initialize(unsigned int DeviceCount) | ||||
| { | ||||
|   debug("cIptvDevice::Initialize(): DeviceCount=%d\n", DeviceCount); | ||||
|   new cIptvSourceParam(IPTV_SOURCE_CHARACTER, "IPTV"); | ||||
|   if (DeviceCount > IPTV_MAX_DEVICES) | ||||
|      DeviceCount = IPTV_MAX_DEVICES; | ||||
|   for (unsigned int i = 0; i < DeviceCount; ++i) | ||||
| @@ -176,73 +178,16 @@ cString cIptvDevice::GetInformation(unsigned int Page) | ||||
|   return info; | ||||
| } | ||||
|  | ||||
| cString cIptvDevice::GetChannelSettings(const char *IptvParam, int *Parameter, int *SidScan, int *PidScan, cIptvProtocolIf* *Protocol) | ||||
| { | ||||
|   debug("cIptvDevice::GetChannelSettings(%d)\n", deviceIndex); | ||||
|   char *tag = NULL; | ||||
|   char *proto = NULL; | ||||
|   char *loc = NULL; | ||||
|   if (sscanf(IptvParam, "%a[^|]|S%dP%d|%a[^|]|%a[^|]|%u", &tag, SidScan, PidScan, &proto, &loc, Parameter) == 6) { | ||||
|      cString tagstr(tag, true); | ||||
|      cString protostr(proto, true); | ||||
|      cString locstr(loc, true); | ||||
|      // check if IPTV tag | ||||
|      if (strncasecmp(*tagstr, "IPTV", 4) == 0) { | ||||
|         // check if protocol is supported and update the pointer | ||||
|         if (strncasecmp(*protostr, "UDP", 3) == 0) | ||||
|            *Protocol = pUdpProtocol; | ||||
|         else if (strncasecmp(*protostr, "HTTP", 4) == 0) | ||||
|            *Protocol = pHttpProtocol; | ||||
|         else if (strncasecmp(*protostr, "FILE", 4) == 0) | ||||
|            *Protocol = pFileProtocol; | ||||
|         else if (strncasecmp(*protostr, "EXT", 3) == 0) | ||||
|            *Protocol = pExtProtocol; | ||||
|         else | ||||
|            return NULL; | ||||
|         // return location | ||||
|         return locstr; | ||||
|         } | ||||
|      } | ||||
|   else if (sscanf(IptvParam, "%a[^|]|P%dS%d|%a[^|]|%a[^|]|%u", &tag, PidScan, SidScan, &proto, &loc, Parameter) == 6) { | ||||
|      cString tagstr(tag, true); | ||||
|      cString protostr(proto, true); | ||||
|      cString locstr(loc, true); | ||||
|      // check if IPTV tag | ||||
|      if (strncasecmp(*tagstr, "IPTV", 4) == 0) { | ||||
|         // check if protocol is supported and update the pointer | ||||
|         if (strncasecmp(*protostr, "UDP", 3) == 0) | ||||
|            *Protocol = pUdpProtocol; | ||||
|         else if (strncasecmp(*protostr, "HTTP", 4) == 0) | ||||
|            *Protocol = pHttpProtocol; | ||||
|         else if (strncasecmp(*protostr, "FILE", 4) == 0) | ||||
|            *Protocol = pFileProtocol; | ||||
|         else if (strncasecmp(*protostr, "EXT", 3) == 0) | ||||
|            *Protocol = pExtProtocol; | ||||
|         else | ||||
|            return NULL; | ||||
|         // return location | ||||
|         return locstr; | ||||
|         } | ||||
|      } | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| bool cIptvDevice::ProvidesIptv(const char *Param) const | ||||
| { | ||||
|   debug("cIptvDevice::ProvidesIptv(%d)\n", deviceIndex); | ||||
|   return (strncasecmp(Param, "IPTV", 4) == 0); | ||||
| } | ||||
|  | ||||
| bool cIptvDevice::ProvidesSource(int Source) const | ||||
| { | ||||
|   debug("cIptvDevice::ProvidesSource(%d)\n", deviceIndex); | ||||
|   return (cSource::IsPlug(Source)); | ||||
|   return ((Source & cSource::st_Mask) == (IPTV_SOURCE_CHARACTER << 24)); | ||||
| } | ||||
|  | ||||
| bool cIptvDevice::ProvidesTransponder(const cChannel *Channel) const | ||||
| { | ||||
|   debug("cIptvDevice::ProvidesTransponder(%d)\n", deviceIndex); | ||||
|   return (ProvidesSource(Channel->Source()) && ProvidesIptv(Channel->PluginParam())); | ||||
|   return (ProvidesSource(Channel->Source())); | ||||
| } | ||||
|  | ||||
| bool cIptvDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const | ||||
| @@ -265,19 +210,36 @@ int cIptvDevice::NumProvidedSystems(void) const | ||||
|  | ||||
| bool cIptvDevice::SetChannelDevice(const cChannel *Channel, bool LiveView) | ||||
| { | ||||
|   int parameter, sidscan, pidscan; | ||||
|   cString location; | ||||
|   cIptvProtocolIf *protocol; | ||||
|   cIptvTransponderParameters itp(Channel->Parameters()); | ||||
|  | ||||
|   debug("cIptvDevice::SetChannelDevice(%d)\n", deviceIndex); | ||||
|   location = GetChannelSettings(Channel->PluginParam(), ¶meter, &sidscan, &pidscan, &protocol); | ||||
|   if (isempty(location)) { | ||||
|      error("Unrecognized IPTV channel settings: %s", Channel->PluginParam()); | ||||
|    | ||||
|   if (isempty(itp.Address())) { | ||||
|      error("Unrecognized IPTV address: %s", Channel->Parameters()); | ||||
|      return false; | ||||
|      } | ||||
|   sidScanEnabled = sidscan ? true : false; | ||||
|   pidScanEnabled = pidscan ? true : false; | ||||
|   if (pIptvStreamer->Set(location, parameter, deviceIndex, protocol)) { | ||||
|   switch (itp.Protocol()) { | ||||
|     case cIptvTransponderParameters::eProtocolUDP: | ||||
|          protocol = pUdpProtocol; | ||||
|          break; | ||||
|     case cIptvTransponderParameters::eProtocolHTTP: | ||||
|          protocol = pHttpProtocol; | ||||
|          break; | ||||
|     case cIptvTransponderParameters::eProtocolFILE: | ||||
|          protocol = pFileProtocol; | ||||
|          break; | ||||
|     case cIptvTransponderParameters::eProtocolEXT: | ||||
|          protocol = pExtProtocol; | ||||
|          break; | ||||
|     default: | ||||
|          error("Unrecognized IPTV protocol: %s", Channel->Parameters()); | ||||
|          return false; | ||||
|          break; | ||||
|   } | ||||
|   sidScanEnabled = itp.SidScan() ? true : false; | ||||
|   pidScanEnabled = itp.PidScan() ? true : false; | ||||
|   if (pIptvStreamer->Set(itp.Address(), itp.Parameter(), deviceIndex, protocol)) { | ||||
|      if (sidScanEnabled && pSidScanner && IptvConfig.GetSectionFiltering()) | ||||
|         pSidScanner->SetChannel(Channel); | ||||
|      if (pidScanEnabled && pPidScanner) | ||||
| @@ -391,7 +353,7 @@ void cIptvDevice::ResetBuffering(void) | ||||
| { | ||||
|   debug("cIptvDevice::ResetBuffering(%d)\n", deviceIndex); | ||||
|   // pad prefill to multiple of TS_SIZE | ||||
|   tsBufferPrefill = MEGABYTE(IptvConfig.GetTsBufferSize()) * | ||||
|   tsBufferPrefill = (unsigned int)MEGABYTE(IptvConfig.GetTsBufferSize()) * | ||||
|                     IptvConfig.GetTsBufferPrefillRatio() / 100; | ||||
|   tsBufferPrefill -= (tsBufferPrefill % TS_SIZE); | ||||
| } | ||||
|   | ||||
							
								
								
									
										2
									
								
								device.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								device.h
									
									
									
									
									
								
							| @@ -69,8 +69,6 @@ private: | ||||
|  | ||||
|   // for channel parsing & buffering | ||||
| private: | ||||
|   cString GetChannelSettings(const char *IptvParam, int *Parameter, int *SidScan, int *PidScan, cIptvProtocolIf* *Protocol); | ||||
|   bool ProvidesIptv(const char *Param) const; | ||||
|   void ResetBuffering(void); | ||||
|   bool IsBuffering(void); | ||||
|   bool DeleteFilter(unsigned int Index); | ||||
|   | ||||
							
								
								
									
										10
									
								
								iptv.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								iptv.c
									
									
									
									
									
								
							| @@ -12,15 +12,11 @@ | ||||
| #include "setup.h" | ||||
| #include "device.h" | ||||
|  | ||||
| #ifndef PLUGINPARAMPATCHVERSNUM | ||||
| #error "You must apply the pluginparam patch for VDR!" | ||||
| #if defined(APIVERSNUM) && APIVERSNUM < 10713 | ||||
| #error "VDR-1.7.13 API version or greater is required!" | ||||
| #endif | ||||
|  | ||||
| #if defined(APIVERSNUM) && APIVERSNUM < 10600 | ||||
| #error "VDR-1.6.0 API version or greater is required!" | ||||
| #endif | ||||
|  | ||||
| static const char VERSION[]     = "0.3.2"; | ||||
| static const char VERSION[]     = "0.4.0"; | ||||
| static const char DESCRIPTION[] = trNOOP("Experience the IPTV"); | ||||
|  | ||||
| class cPluginIptv : public cPlugin { | ||||
|   | ||||
| @@ -8,12 +8,12 @@ set -e | ||||
| # The script originates from Peter Holik | ||||
| # | ||||
| # Example channels.conf entries: | ||||
| # Energy;IPTV:50:IPTV|S0P0|EXT|png.sh|1:P:0:256:257:0:0:3:0:0:0 | ||||
| # Temperature;IPTV:60:IPTV|S0P0|EXT|png.sh|2:P:0:256:257:0:0:3:0:0:0 | ||||
| # Temperature Week;IPTV:70:IPTV|S0P0|EXT|png.sh|3:P:0:256:257:0:0:3:0:0:0 | ||||
| # Server Temperature;IPTV:80:IPTV|S0P0|EXT|png.sh|4:P:0:256:257:0:0:3:0:0:0 | ||||
| # Server Temperature Week;IPTV:90:IPTV|S0P0|EXT|png.sh|5:P:0:256:257:0:0:3:0:0:0 | ||||
| # Traffic;IPTV:100:IPTV|S0P0|EXT|png.sh|6:P:0:256:257:0:0:3:0:0:0 | ||||
| # Energy;IPTV:50:S=0|P=0|F=EXT|U=png.sh|A=1:I:0:256:257:0:0:3:0:0:0 | ||||
| # Temperature;IPTV:60:S=0|P=0|EXT|U=png.sh|A=2:I:0:256:257:0:0:3:0:0:0 | ||||
| # Temperature Week;IPTV:70:S=0|P=0|EXT|U=png.sh|A=3:I:0:256:257:0:0:3:0:0:0 | ||||
| # Server Temperature;IPTV:80:S=0|P=0|EXT|U=png.sh|A=4:I:0:256:257:0:0:3:0:0:0 | ||||
| # Server Temperature Week;IPTV:90:S=0|P=0|EXT|U=png.sh|A=5:I:0:256:257:0:0:3:0:0:0 | ||||
| # Traffic;IPTV:100:S=0|P=0|EXT|U=png.sh|A=6:I:0:256:257:0:0:3:0:0:0 | ||||
| # | ||||
| # webcam.sh is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| # http://www.vdr-wiki.de/wiki/index.php/Iptv-plugin | ||||
| # | ||||
| # An example channels.conf entry: | ||||
| # internetradio;IPTV:2:IPTV|S0P0|EXT|internetradio.sh|0:P:0:0:256:0:0:2:0:0:0 | ||||
| # internetradio;IPTV:2:S=0|P=0|F=EXT|U=internetradio.sh|A=0:P:0:0:256:0:0:2:0:0:0 | ||||
| # | ||||
| # internetradio.sh is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| # http://www.vdr-wiki.de/wiki/index.php/Iptv-plugin | ||||
| # | ||||
| # An example channels.conf entry: | ||||
| # linein;IPTV:5:IPTV|S0P0|EXT|linein.sh|0:P:27500:0:256:0:0:5:5:5:0 | ||||
| # linein;IPTV:5:S=0|P=0|F=EXT|U=linein.sh|A=0:I:27500:0:256:0:0:5:5:5:0 | ||||
| # | ||||
| # linein.sh is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
|   | ||||
| @@ -52,7 +52,7 @@ lookup_channel_and_pids() | ||||
|     [ ! -e "$CHANNELS_CONF" ] && \ | ||||
|       exit_with_error "channels.conf not found ($CHANNELS_CONF)" | ||||
|  | ||||
|     local CHANNEL_RECORD=`grep "[:]IPTV[|][SP][10][SP][10][|]EXT[|]vlc2iptv[|]$PARAMETER[:]" $CHANNELS_CONF` | ||||
|     local CHANNEL_RECORD=`grep "[:]S=[10][|]P=[10][|]F=EXT[|]U=vlc2iptv[|]A=$PARAMETER[:]I" $CHANNELS_CONF` | ||||
|     [ -z "$CHANNEL_RECORD" ] && \ | ||||
|       exit_with_error "no iptv channel with parameter $PARAMETER found" | ||||
|  | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| # http://www.vdr-wiki.de/wiki/index.php/Iptv-plugin | ||||
| # | ||||
| # An example channels.conf entry: | ||||
| # webcam;IPTV:3:IPTV|S0P0|EXT|webcam.sh|0:P:0:256:257:0:0:3:0:0:0 | ||||
| # webcam;IPTV:3:S=0|P=0|F=EXT|U=webcam.sh|A=0:I:0:256:257:0:0:3:0:0:0 | ||||
| # | ||||
| # webcam.sh is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
|   | ||||
| @@ -1,11 +0,0 @@ | ||||
| diff -Nru vdr-1.6.0-vanilla/pat.c vdr-1.6.0-disable-ca-updates/pat.c | ||||
| --- vdr-1.6.0-vanilla/pat.c	2008-02-08 15:48:31.000000000 +0200 | ||||
| +++ vdr-1.6.0-disable-ca-updates/pat.c	2009-03-07 14:56:42.000000000 +0200 | ||||
| @@ -440,6 +440,7 @@ | ||||
|              } | ||||
|          if (Setup.UpdateChannels >= 2) { | ||||
|             Channel->SetPids(Vpid, Vpid ? Ppid : 0, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid); | ||||
| +           if (!Channel->IsPlug()) | ||||
|             Channel->SetCaIds(CaDescriptors->CaIds()); | ||||
|             } | ||||
|          Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors)); | ||||
| @@ -1,12 +0,0 @@ | ||||
| diff -Nru vdr-1.6.0-vanilla/eitscan.c vdr-1.6.0-disable_eitscan/eitscan.c | ||||
| --- vdr-1.6.0-vanilla/eitscan.c	2006-01-07 16:10:17.000000000 +0200 | ||||
| +++ vdr-1.6.0-disable_eitscan/eitscan.c	2009-06-17 16:04:23.000000000 +0300 | ||||
| @@ -146,7 +146,7 @@ | ||||
|                 if (Device) { | ||||
|                    for (cScanData *ScanData = scanList->First(); ScanData; ScanData = scanList->Next(ScanData)) { | ||||
|                        const cChannel *Channel = ScanData->GetChannel(); | ||||
| -                      if (Channel) { | ||||
| +                      if (Channel && !Channel->IsPlug()) { | ||||
|                           if (!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= CA_ENCRYPTED_MIN) { | ||||
|                              if (Device->ProvidesTransponder(Channel)) { | ||||
|                                 if (!Device->Receiving()) { | ||||
| @@ -1,287 +0,0 @@ | ||||
| diff -Nru vdr-1.6.0-vanilla/channels.c vdr-1.6.0-pluginparam/channels.c | ||||
| --- vdr-1.6.0-vanilla/channels.c	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/channels.c	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -166,6 +166,7 @@ | ||||
|    shortName = strdup(""); | ||||
|    provider = strdup(""); | ||||
|    portalName = strdup(""); | ||||
| +  pluginParam = strdup(""); | ||||
|    memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__); | ||||
|    inversion    = INVERSION_AUTO; | ||||
|    bandwidth    = BANDWIDTH_AUTO; | ||||
| @@ -187,6 +188,7 @@ | ||||
|    shortName = NULL; | ||||
|    provider = NULL; | ||||
|    portalName = NULL; | ||||
| +  pluginParam = NULL; | ||||
|    schedule     = NULL; | ||||
|    linkChannels = NULL; | ||||
|    refChannel   = NULL; | ||||
| @@ -215,6 +217,7 @@ | ||||
|    free(shortName); | ||||
|    free(provider); | ||||
|    free(portalName); | ||||
| +  free(pluginParam); | ||||
|  } | ||||
|   | ||||
|  cChannel& cChannel::operator= (const cChannel &Channel) | ||||
| @@ -223,6 +226,7 @@ | ||||
|    shortName = strcpyrealloc(shortName, Channel.shortName); | ||||
|    provider = strcpyrealloc(provider, Channel.provider); | ||||
|    portalName = strcpyrealloc(portalName, Channel.portalName); | ||||
| +  pluginParam = strcpyrealloc(pluginParam, Channel.pluginParam); | ||||
|    memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__); | ||||
|    return *this; | ||||
|  } | ||||
| @@ -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 | ||||
|   | ||||
| @@ -593,7 +626,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); | ||||
| @@ -605,6 +638,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; | ||||
|  } | ||||
|   | ||||
| @@ -626,7 +660,7 @@ | ||||
|   | ||||
|  bool cChannel::StringToParameters(const char *s) | ||||
|  { | ||||
| -  while (s && *s) { | ||||
| +  while (s && *s && !IsPlug()) { | ||||
|          switch (toupper(*s)) { | ||||
|            case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break; | ||||
|            case 'C': s = ParseParameter(s, coderateH, CoderateValues); break; | ||||
| @@ -736,7 +770,7 @@ | ||||
|          dpids[0] = 0; | ||||
|          ok = false; | ||||
|          if (parambuf && sourcebuf && vpidbuf && apidbuf) { | ||||
| -           ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0; | ||||
| +           ok = ((source = cSource::FromString(sourcebuf)) >= 0) && StringToParameters(parambuf); | ||||
|   | ||||
|             char *p = strchr(vpidbuf, '+'); | ||||
|             if (p) | ||||
| @@ -827,6 +861,7 @@ | ||||
|             shortName = strcpyrealloc(shortName, p); | ||||
|             } | ||||
|          name = strcpyrealloc(name, namebuf); | ||||
| +        if (IsPlug()) pluginParam = strcpyrealloc(pluginParam, parambuf); | ||||
|   | ||||
|          free(parambuf); | ||||
|          free(sourcebuf); | ||||
| diff -Nru vdr-1.6.0-vanilla/channels.h vdr-1.6.0-pluginparam/channels.h | ||||
| --- vdr-1.6.0-vanilla/channels.h	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/channels.h	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -114,6 +114,7 @@ | ||||
|    char *shortName; | ||||
|    char *provider; | ||||
|    char *portalName; | ||||
| +  char *pluginParam; | ||||
|    int __BeginData__; | ||||
|    int frequency; // MHz | ||||
|    int source; | ||||
| @@ -165,6 +166,7 @@ | ||||
|    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 *PluginParam(void) const { return pluginParam; } | ||||
|    int Source(void) const { return source; } | ||||
|    int Srate(void) const { return srate; } | ||||
|    int Vpid(void) const { return vpid; } | ||||
| @@ -199,6 +201,7 @@ | ||||
|    int Hierarchy(void) const { return hierarchy; } | ||||
|    const cLinkChannels* LinkChannels(void) const { return linkChannels; } | ||||
|    const cChannel *RefChannel(void) const { return refChannel; } | ||||
| +  bool IsPlug(void) const { return cSource::IsPlug(source); } | ||||
|    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 *Spids, char SLangs[][MAXLANGCODE2], int Tpid); | ||||
|    void SetCaIds(const int *CaIds); // list must be zero-terminated | ||||
|    void SetCaDescriptors(int Level); | ||||
| diff -Nru vdr-1.6.0-vanilla/config.h vdr-1.6.0-pluginparam/config.h | ||||
| --- vdr-1.6.0-vanilla/config.h	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/config.h	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -30,6 +30,8 @@ | ||||
|  #define APIVERSION  "1.6.0" | ||||
|  #define APIVERSNUM   10600  // Version * 10000 + Major * 100 + Minor | ||||
|   | ||||
| +#define PLUGINPARAMPATCHVERSNUM 1 | ||||
| + | ||||
|  // When loading plugins, VDR searches them by their APIVERSION, which | ||||
|  // may be smaller than VDRVERSION in case there have been no changes to | ||||
|  // VDR header files since the last APIVERSION. This allows compiled | ||||
| diff -Nru vdr-1.6.0-vanilla/menu.c vdr-1.6.0-pluginparam/menu.c | ||||
| --- vdr-1.6.0-vanilla/menu.c	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/menu.c	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -253,6 +253,7 @@ | ||||
|    cChannel *channel; | ||||
|    cChannel data; | ||||
|    char name[256]; | ||||
| +  char pluginParam[256]; | ||||
|    void Setup(void); | ||||
|  public: | ||||
|    cMenuEditChannel(cChannel *Channel, bool New = false); | ||||
| @@ -285,6 +286,7 @@ | ||||
|   | ||||
|    // Parameters for all types of sources: | ||||
|    strn0cpy(name, data.name, sizeof(name)); | ||||
| +  strn0cpy(pluginParam, data.pluginParam, sizeof(pluginParam)); | ||||
|    Add(new cMenuEditStrItem( tr("Name"),          name, sizeof(name))); | ||||
|    Add(new cMenuEditSrcItem( tr("Source"),       &data.source)); | ||||
|    Add(new cMenuEditIntItem( tr("Frequency"),    &data.frequency)); | ||||
| @@ -315,6 +317,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(); | ||||
| @@ -329,6 +332,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.6.0-vanilla/po/fi_FI.po vdr-1.6.0-pluginparam/po/fi_FI.po | ||||
| --- vdr-1.6.0-vanilla/po/fi_FI.po	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/po/fi_FI.po	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -1001,3 +1001,6 @@ | ||||
|  #, c-format | ||||
|  msgid "VDR will shut down in %s minutes" | ||||
|  msgstr "VDR sammuu %s minuutin kuluttua" | ||||
| + | ||||
| +msgid "Parameters" | ||||
| +msgstr "Parametrit" | ||||
| diff -Nru vdr-1.6.0-vanilla/po/fr_FR.po vdr-1.6.0-pluginparam/po/fr_FR.po | ||||
| --- vdr-1.6.0-vanilla/po/fr_FR.po	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/po/fr_FR.po	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -1004,3 +1004,6 @@ | ||||
|  #, c-format | ||||
|  msgid "VDR will shut down in %s minutes" | ||||
|  msgstr "VDR s'arr<72>tera dans %s minutes" | ||||
| + | ||||
| +msgid "Parameters" | ||||
| +msgstr "Param<61>tres" | ||||
| diff -Nru vdr-1.6.0-vanilla/sources.c vdr-1.6.0-pluginparam/sources.c | ||||
| --- vdr-1.6.0-vanilla/sources.c	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/sources.c	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -37,6 +37,7 @@ | ||||
|    char buffer[16]; | ||||
|    char *q = buffer; | ||||
|    switch (Code & st_Mask) { | ||||
| +    case stPlug:  *q++ = 'P'; break; | ||||
|      case stCable: *q++ = 'C'; break; | ||||
|      case stSat:   *q++ = 'S'; | ||||
|                    { | ||||
| @@ -56,6 +57,7 @@ | ||||
|  { | ||||
|    int type = stNone; | ||||
|    switch (toupper(*s)) { | ||||
| +    case 'P': type = stPlug;  break; | ||||
|      case 'C': type = stCable; break; | ||||
|      case 'S': type = stSat;   break; | ||||
|      case 'T': type = stTerr;  break; | ||||
| diff -Nru vdr-1.6.0-vanilla/sources.conf vdr-1.6.0-pluginparam/sources.conf | ||||
| --- vdr-1.6.0-vanilla/sources.conf	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/sources.conf	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -188,3 +188,7 @@ | ||||
|  # Terrestrial | ||||
|   | ||||
|  T       Terrestrial | ||||
| + | ||||
| +# Plugin | ||||
| + | ||||
| +P       Plugin | ||||
| diff -Nru vdr-1.6.0-vanilla/sources.h vdr-1.6.0-pluginparam/sources.h | ||||
| --- vdr-1.6.0-vanilla/sources.h	2008-03-27 21:43:25.000000000 +0200 | ||||
| +++ vdr-1.6.0-pluginparam/sources.h	2008-03-27 22:06:47.000000000 +0200 | ||||
| @@ -16,10 +16,11 @@ | ||||
|  public: | ||||
|    enum eSourceType { | ||||
|      stNone  = 0x0000, | ||||
| +    stPlug  = 0x2000, | ||||
|      stCable = 0x4000, | ||||
|      stSat   = 0x8000, | ||||
|      stTerr  = 0xC000, | ||||
| -    st_Mask = 0xC000, | ||||
| +    st_Mask = 0xE000, | ||||
|      st_Neg  = 0x0800, | ||||
|      st_Pos  = 0x07FF, | ||||
|      }; | ||||
| @@ -35,6 +36,7 @@ | ||||
|    static cString ToString(int Code); | ||||
|    static int FromString(const char *s); | ||||
|    static int FromData(eSourceType SourceType, int Position = 0, bool East = false); | ||||
| +  static bool IsPlug(int Code) { return (Code & st_Mask) == stPlug; } | ||||
|    static bool IsCable(int Code) { return (Code & st_Mask) == stCable; } | ||||
|    static bool IsSat(int Code) { return (Code & st_Mask) == stSat; } | ||||
|    static bool IsTerr(int Code) { return (Code & st_Mask) == stTerr; } | ||||
| @@ -1,287 +0,0 @@ | ||||
| diff -Nru vdr-1.7.12-vanilla/channels.c vdr-1.7.12-pluginparam/channels.c | ||||
| --- vdr-1.7.12-vanilla/channels.c	2010-02-01 11:45:39.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/channels.c	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -188,6 +188,7 @@ | ||||
|    shortName = strdup(""); | ||||
|    provider = strdup(""); | ||||
|    portalName = strdup(""); | ||||
| +  pluginParam = strdup(""); | ||||
|    memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__); | ||||
|    inversion    = INVERSION_AUTO; | ||||
|    bandwidth    = 8000000; | ||||
| @@ -211,6 +212,7 @@ | ||||
|    shortName = NULL; | ||||
|    provider = NULL; | ||||
|    portalName = NULL; | ||||
| +  pluginParam = NULL; | ||||
|    schedule     = NULL; | ||||
|    linkChannels = NULL; | ||||
|    refChannel   = NULL; | ||||
| @@ -239,6 +241,7 @@ | ||||
|    free(shortName); | ||||
|    free(provider); | ||||
|    free(portalName); | ||||
| +  free(pluginParam); | ||||
|  } | ||||
|   | ||||
|  cChannel& cChannel::operator= (const cChannel &Channel) | ||||
| @@ -247,6 +250,7 @@ | ||||
|    shortName = strcpyrealloc(shortName, Channel.shortName); | ||||
|    provider = strcpyrealloc(provider, Channel.provider); | ||||
|    portalName = strcpyrealloc(portalName, Channel.portalName); | ||||
| +  pluginParam = strcpyrealloc(pluginParam, Channel.pluginParam); | ||||
|    memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__); | ||||
|    return *this; | ||||
|  } | ||||
| @@ -307,9 +311,26 @@ | ||||
|       guard        = Channel->guard; | ||||
|       hierarchy    = Channel->hierarchy; | ||||
|       rollOff      = Channel->rollOff; | ||||
| +     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, int Modulation, int System, int RollOff) | ||||
|  { | ||||
|    // Workarounds for broadcaster stupidity: | ||||
| @@ -439,6 +460,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 | ||||
|   | ||||
| @@ -652,7 +685,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); | ||||
| @@ -666,6 +699,7 @@ | ||||
|    ST(" S ")  q += PrintParameter(q, 'S', MapToUser(system, SystemValues)); | ||||
|    ST("  T")  q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues)); | ||||
|    ST("  T")  q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues)); | ||||
| +  ST("P  ")  snprintf(buffer, sizeof(buffer), "%s", pluginParam); | ||||
|    return buffer; | ||||
|  } | ||||
|   | ||||
| @@ -694,7 +728,7 @@ | ||||
|   | ||||
|  bool cChannel::StringToParameters(const char *s) | ||||
|  { | ||||
| -  while (s && *s) { | ||||
| +  while (s && *s && !IsPlug()) { | ||||
|          switch (toupper(*s)) { | ||||
|            case 'A': s = SkipDigits(s); break; // for compatibility with the "multiproto" approach - may be removed in future versions | ||||
|            case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break; | ||||
| @@ -814,7 +848,7 @@ | ||||
|          dpids[0] = 0; | ||||
|          ok = false; | ||||
|          if (parambuf && sourcebuf && vpidbuf && apidbuf) { | ||||
| -           ok = StringToParameters(parambuf) && (source = cSource::FromString(sourcebuf)) >= 0; | ||||
| +           ok = ((source = cSource::FromString(sourcebuf)) >= 0) && StringToParameters(parambuf); | ||||
|   | ||||
|             char *p; | ||||
|             if ((p = strchr(vpidbuf, '=')) != NULL) { | ||||
| @@ -911,6 +945,7 @@ | ||||
|             shortName = strcpyrealloc(shortName, p); | ||||
|             } | ||||
|          name = strcpyrealloc(name, namebuf); | ||||
| +        if (IsPlug()) pluginParam = strcpyrealloc(pluginParam, parambuf); | ||||
|   | ||||
|          free(parambuf); | ||||
|          free(sourcebuf); | ||||
| diff -Nru vdr-1.7.12-vanilla/channels.h vdr-1.7.12-pluginparam/channels.h | ||||
| --- vdr-1.7.12-vanilla/channels.h	2010-02-01 11:45:39.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/channels.h	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -116,6 +116,7 @@ | ||||
|    char *shortName; | ||||
|    char *provider; | ||||
|    char *portalName; | ||||
| +  char *pluginParam; | ||||
|    int __BeginData__; | ||||
|    int frequency; // MHz | ||||
|    int source; | ||||
| @@ -174,6 +175,7 @@ | ||||
|    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 *PluginParam(void) const { return pluginParam; } | ||||
|    int Source(void) const { return source; } | ||||
|    int Srate(void) const { return srate; } | ||||
|    int Vpid(void) const { return vpid; } | ||||
| @@ -214,6 +216,7 @@ | ||||
|    int RollOff(void) const { return rollOff; } | ||||
|    const cLinkChannels* LinkChannels(void) const { return linkChannels; } | ||||
|    const cChannel *RefChannel(void) const { return refChannel; } | ||||
| +  bool IsPlug(void) const { return cSource::IsPlug(source); } | ||||
|    bool IsCable(void) const { return cSource::IsCable(source); } | ||||
|    bool IsSat(void) const { return cSource::IsSat(source); } | ||||
|    bool IsTerr(void) const { return cSource::IsTerr(source); } | ||||
| @@ -221,12 +224,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, int Modulation, int System, int RollOff); | ||||
|    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 Vtype, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid); | ||||
|    void SetCaIds(const int *CaIds); // list must be zero-terminated | ||||
|    void SetCaDescriptors(int Level); | ||||
| diff -Nru vdr-1.7.12-vanilla/config.h vdr-1.7.12-pluginparam/config.h | ||||
| --- vdr-1.7.12-vanilla/config.h	2010-02-01 11:45:39.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/config.h	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -30,6 +30,8 @@ | ||||
|  #define APIVERSION  "1.7.12" | ||||
|  #define APIVERSNUM   10712  // Version * 10000 + Major * 100 + Minor | ||||
|   | ||||
| +#define PLUGINPARAMPATCHVERSNUM 1 | ||||
| + | ||||
|  // When loading plugins, VDR searches them by their APIVERSION, which | ||||
|  // may be smaller than VDRVERSION in case there have been no changes to | ||||
|  // VDR header files since the last APIVERSION. This allows compiled | ||||
| diff -Nru vdr-1.7.12-vanilla/menu.c vdr-1.7.12-pluginparam/menu.c | ||||
| --- vdr-1.7.12-vanilla/menu.c	2010-02-01 11:45:39.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/menu.c	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -190,6 +190,7 @@ | ||||
|    cChannel *channel; | ||||
|    cChannel data; | ||||
|    char name[256]; | ||||
| +  char pluginParam[256]; | ||||
|    void Setup(void); | ||||
|  public: | ||||
|    cMenuEditChannel(cChannel *Channel, bool New = false); | ||||
| @@ -222,6 +223,7 @@ | ||||
|   | ||||
|    // Parameters for all types of sources: | ||||
|    strn0cpy(name, data.name, sizeof(name)); | ||||
| +  strn0cpy(pluginParam, data.pluginParam, sizeof(pluginParam)); | ||||
|    Add(new cMenuEditStrItem( tr("Name"),          name, sizeof(name))); | ||||
|    Add(new cMenuEditSrcItem( tr("Source"),       &data.source)); | ||||
|    Add(new cMenuEditIntItem( tr("Frequency"),    &data.frequency)); | ||||
| @@ -254,6 +256,7 @@ | ||||
|    ST("  T")  Add(new cMenuEditMapItem( tr("Guard"),        &data.guard,        GuardValues)); | ||||
|    ST("  T")  Add(new cMenuEditMapItem( tr("Hierarchy"),    &data.hierarchy,    HierarchyValues)); | ||||
|    ST(" S ")  Add(new cMenuEditMapItem( tr("Rolloff"),      &data.rollOff,      RollOffValues)); | ||||
| +  ST("P  ")  Add(new cMenuEditStrItem( tr("Parameters"),    pluginParam, sizeof(pluginParam), tr(FileNameChars))); | ||||
|   | ||||
|    SetCurrent(Get(current)); | ||||
|    Display(); | ||||
| @@ -268,6 +271,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.7.12-vanilla/po/fi_FI.po vdr-1.7.12-pluginparam/po/fi_FI.po | ||||
| --- vdr-1.7.12-vanilla/po/fi_FI.po	2010-02-01 11:45:40.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/po/fi_FI.po	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -1306,3 +1306,6 @@ | ||||
|  #, c-format | ||||
|  msgid "VDR will shut down in %s minutes" | ||||
|  msgstr "VDR sammuu %s minuutin kuluttua" | ||||
| + | ||||
| +msgid "Parameters" | ||||
| +msgstr "Parametrit" | ||||
| diff -Nru vdr-1.7.12-vanilla/po/fr_FR.po vdr-1.7.12-pluginparam/po/fr_FR.po | ||||
| --- vdr-1.7.12-vanilla/po/fr_FR.po	2010-02-01 11:45:40.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/po/fr_FR.po	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -1309,3 +1309,6 @@ | ||||
|  #, c-format | ||||
|  msgid "VDR will shut down in %s minutes" | ||||
|  msgstr "VDR s'arr<72>tera dans %s minutes" | ||||
| + | ||||
| +msgid "Parameters" | ||||
| +msgstr "Param<61>tres" | ||||
| diff -Nru vdr-1.7.12-vanilla/sources.c vdr-1.7.12-pluginparam/sources.c | ||||
| --- vdr-1.7.12-vanilla/sources.c	2010-02-01 11:45:40.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/sources.c	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -37,6 +37,7 @@ | ||||
|    char buffer[16]; | ||||
|    char *q = buffer; | ||||
|    switch (Code & st_Mask) { | ||||
| +    case stPlug:  *q++ = 'P'; break; | ||||
|      case stCable: *q++ = 'C'; break; | ||||
|      case stSat:   *q++ = 'S'; | ||||
|                    { | ||||
| @@ -56,6 +57,7 @@ | ||||
|  { | ||||
|    int type = stNone; | ||||
|    switch (toupper(*s)) { | ||||
| +    case 'P': type = stPlug;  break; | ||||
|      case 'C': type = stCable; break; | ||||
|      case 'S': type = stSat;   break; | ||||
|      case 'T': type = stTerr;  break; | ||||
| diff -Nru vdr-1.7.12-vanilla/sources.conf vdr-1.7.12-pluginparam/sources.conf | ||||
| --- vdr-1.7.12-vanilla/sources.conf	2010-02-01 11:45:39.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/sources.conf	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -195,3 +195,7 @@ | ||||
|  # Terrestrial | ||||
|   | ||||
|  T       Terrestrial | ||||
| + | ||||
| +# Plugin | ||||
| + | ||||
| +P       Plugin | ||||
| diff -Nru vdr-1.7.12-vanilla/sources.h vdr-1.7.12-pluginparam/sources.h | ||||
| --- vdr-1.7.12-vanilla/sources.h	2010-02-01 11:45:39.000000000 +0200 | ||||
| +++ vdr-1.7.12-pluginparam/sources.h	2010-02-01 13:52:56.000000000 +0200 | ||||
| @@ -16,10 +16,11 @@ | ||||
|  public: | ||||
|    enum eSourceType { | ||||
|      stNone  = 0x0000, | ||||
| +    stPlug  = 0x2000, | ||||
|      stCable = 0x4000, | ||||
|      stSat   = 0x8000, | ||||
|      stTerr  = 0xC000, | ||||
| -    st_Mask = 0xC000, | ||||
| +    st_Mask = 0xE000, | ||||
|      st_Neg  = 0x0800, | ||||
|      st_Pos  = 0x07FF, | ||||
|      }; | ||||
| @@ -35,6 +36,7 @@ | ||||
|    static cString ToString(int Code); | ||||
|    static int FromString(const char *s); | ||||
|    static int FromData(eSourceType SourceType, int Position = 0, bool East = false); | ||||
| +  static bool IsPlug(int Code) { return (Code & st_Mask) == stPlug; } | ||||
|    static bool IsCable(int Code) { return (Code & st_Mask) == stCable; } | ||||
|    static bool IsSat(int Code) { return (Code & st_Mask) == stSat; } | ||||
|    static bool IsTerr(int Code) { return (Code & st_Mask) == stTerr; } | ||||
| @@ -1,6 +1,6 @@ | ||||
| diff -Nru vdr-1.7.12-vanilla/pat.c vdr-1.7.12-disable_ca_updates/pat.c
 | ||||
| --- vdr-1.7.12-vanilla/pat.c	2010-02-01 11:45:40.000000000 +0200
 | ||||
| +++ vdr-1.7.12-disable_ca_updates/pat.c	2010-02-01 13:54:32.000000000 +0200
 | ||||
| diff -Nru vdr-1.7.13-vanilla/pat.c vdr-1.7.13-disable_ca_updates/pat.c
 | ||||
| --- vdr-1.7.13-vanilla/pat.c	2010-01-01 17:40:05.000000000 +0200
 | ||||
| +++ vdr-1.7.13-disable_ca_updates/pat.c	2010-03-04 13:44:28.000000000 +0200
 | ||||
| @@ -458,6 +458,7 @@
 | ||||
|              } | ||||
|          if (Setup.UpdateChannels >= 2) { | ||||
| @@ -1,6 +1,6 @@ | ||||
| diff -Nru vdr-1.7.12-vanilla/eitscan.c vdr-1.7.12-disable_eitscan/eitscan.c
 | ||||
| --- vdr-1.7.12-vanilla/eitscan.c	2010-02-01 11:45:39.000000000 +0200
 | ||||
| +++ vdr-1.7.12-disable_eitscan/eitscan.c	2010-02-01 13:54:20.000000000 +0200
 | ||||
| diff -Nru vdr-1.7.13-vanilla/eitscan.c vdr-1.7.13-disable_eitscan/eitscan.c
 | ||||
| --- vdr-1.7.13-vanilla/eitscan.c	2010-02-07 14:12:05.000000000 +0200
 | ||||
| +++ vdr-1.7.13-disable_eitscan/eitscan.c	2010-03-04 13:44:17.000000000 +0200
 | ||||
| @@ -146,7 +146,7 @@
 | ||||
|                 if (Device) { | ||||
|                    for (cScanData *ScanData = scanList->First(); ScanData; ScanData = scanList->Next(ScanData)) { | ||||
| @@ -33,7 +33,7 @@ cPidScanner::~cPidScanner() | ||||
| void cPidScanner::SetChannel(const cChannel *Channel) | ||||
| { | ||||
|   if (Channel) { | ||||
|      debug("cPidScanner::SetChannel(): %s\n", Channel->PluginParam()); | ||||
|      debug("cPidScanner::SetChannel(): %s\n", Channel->Parameters()); | ||||
|      channel = *Channel; | ||||
|      } | ||||
|   else { | ||||
| @@ -146,12 +146,8 @@ void cPidScanner::Process(const uint8_t* buf) | ||||
|               for (unsigned int i = 0; i < MAXSPIDS; ++i) | ||||
|                   Spids[i] = IptvChannel->Spid(i); | ||||
|               debug("cPidScanner::Process(): Vpid=0x%04X, Apid=0x%04X\n", Vpid, Apid); | ||||
| #if defined(APIVERSNUM) && APIVERSNUM >= 10704 | ||||
|               int Vtype = IptvChannel->Vtype(); | ||||
|               IptvChannel->SetPids(Vpid, Ppid, Vtype, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid); | ||||
| #else | ||||
|               IptvChannel->SetPids(Vpid, Ppid, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid); | ||||
| #endif | ||||
|               } | ||||
|            Channels.Unlock(); | ||||
|            process = false; | ||||
|   | ||||
							
								
								
									
										85
									
								
								po/de_DE.po
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								po/de_DE.po
									
									
									
									
									
								
							| @@ -5,9 +5,9 @@ | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: iptv 0.2.5\n" | ||||
| "Project-Id-Version: iptv 0.4.0\n" | ||||
| "Report-Msgid-Bugs-To: Rolf Ahrenberg\n" | ||||
| "POT-Creation-Date: 2009-03-06 22:15+0200\n" | ||||
| "POT-Creation-Date: 2010-03-04 16:42+0200\n" | ||||
| "PO-Revision-Date: 2007-10-29 21:19+0100\n" | ||||
| "Last-Translator: Tobias Grimm <tg@e-tobi.net>\n" | ||||
| "Language-Team: German\n" | ||||
| @@ -40,60 +40,6 @@ msgstr "TDT (0x70)" | ||||
| msgid "Experience the IPTV" | ||||
| msgstr "Erlebe IPTV" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "DATEI" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protokoll" | ||||
|  | ||||
| msgid "Delay (ms)" | ||||
| msgstr "Verzögerung (ms)" | ||||
|  | ||||
| msgid "Script" | ||||
| msgstr "Skript" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Parameter" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Adresse" | ||||
|  | ||||
| msgid "Port" | ||||
| msgstr "Port" | ||||
|  | ||||
| msgid "Scan Sid" | ||||
| msgstr "Scanne SID" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Scanne PIDS" | ||||
|  | ||||
| msgid "Vtype" | ||||
| msgstr "Vtype" | ||||
|  | ||||
| msgid "Nid" | ||||
| msgstr "Nid" | ||||
|  | ||||
| msgid "Tid" | ||||
| msgstr "Tid" | ||||
|  | ||||
| msgid "Rid" | ||||
| msgstr "Rid" | ||||
|  | ||||
| msgid "Cannot find unique channel settings!" | ||||
| msgstr "Kann eindeutige Kanaleinstellungen nicht finden!" | ||||
|  | ||||
| msgid "IPTV Channels" | ||||
| msgstr "IPTV Kanäle" | ||||
|  | ||||
| msgid "IPTV Information" | ||||
| msgstr "IPTV Informationen" | ||||
|  | ||||
| @@ -167,3 +113,30 @@ msgstr "" | ||||
|  | ||||
| msgid "Help" | ||||
| msgstr "Hilfe" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "DATEI" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Scan sid" | ||||
| msgstr "Scanne SID" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Scanne PIDS" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protokoll" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Adresse" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Parameter" | ||||
|   | ||||
							
								
								
									
										85
									
								
								po/fi_FI.po
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								po/fi_FI.po
									
									
									
									
									
								
							| @@ -5,9 +5,9 @@ | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: iptv 0.2.5\n" | ||||
| "Project-Id-Version: iptv 0.4.0\n" | ||||
| "Report-Msgid-Bugs-To: Rolf Ahrenberg\n" | ||||
| "POT-Creation-Date: 2009-03-06 22:15+0200\n" | ||||
| "POT-Creation-Date: 2010-03-04 16:42+0200\n" | ||||
| "PO-Revision-Date: 2007-08-12 23:22+0300\n" | ||||
| "Last-Translator: Rolf Ahrenberg\n" | ||||
| "Language-Team: <vdr@linuxtv.org>\n" | ||||
| @@ -39,60 +39,6 @@ msgstr "TDT (0x70)" | ||||
| msgid "Experience the IPTV" | ||||
| msgstr "Koe IPTV:n ihmeellinen maailma" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "FILE" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protokolla" | ||||
|  | ||||
| msgid "Delay (ms)" | ||||
| msgstr "Viive (ms)" | ||||
|  | ||||
| msgid "Script" | ||||
| msgstr "Skripti" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Parametri" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Osoite" | ||||
|  | ||||
| msgid "Port" | ||||
| msgstr "Portti" | ||||
|  | ||||
| msgid "Scan Sid" | ||||
| msgstr "Etsi palvelu-ID" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Etsi pidit" | ||||
|  | ||||
| msgid "Vtype" | ||||
| msgstr "Kuvatyyppi" | ||||
|  | ||||
| msgid "Nid" | ||||
| msgstr "Verkko-ID" | ||||
|  | ||||
| msgid "Tid" | ||||
| msgstr "Lähete-ID" | ||||
|  | ||||
| msgid "Rid" | ||||
| msgstr "Radio-ID" | ||||
|  | ||||
| msgid "Cannot find unique channel settings!" | ||||
| msgstr "Yksilöllisiä kanava-asetuksia ei löydetä!" | ||||
|  | ||||
| msgid "IPTV Channels" | ||||
| msgstr "IPTV-kanavat" | ||||
|  | ||||
| msgid "IPTV Information" | ||||
| msgstr "IPTV-tiedot" | ||||
|  | ||||
| @@ -182,3 +128,30 @@ msgstr "Määrittele käytöstä poistettava suodatin, joka lisätään mustalle | ||||
|  | ||||
| msgid "Help" | ||||
| msgstr "Opaste" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "FILE" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Scan sid" | ||||
| msgstr "Etsi palvelu-ID" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Etsi pidit" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protokolla" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Osoite" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Parametri" | ||||
|   | ||||
							
								
								
									
										117
									
								
								po/fr_FR.po
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								po/fr_FR.po
									
									
									
									
									
								
							| @@ -6,9 +6,9 @@ | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: iptv 0.2.5\n" | ||||
| "Project-Id-Version: iptv 0.4.0\n" | ||||
| "Report-Msgid-Bugs-To: Rolf Ahrenberg\n" | ||||
| "POT-Creation-Date: 2009-03-06 22:15+0200\n" | ||||
| "POT-Creation-Date: 2010-03-04 16:42+0200\n" | ||||
| "PO-Revision-Date: 2008-01-26 13:14+0100\n" | ||||
| "Last-Translator: NIVAL Michaël <mnival@club-internet.fr>\n" | ||||
| "Language-Team: French\n" | ||||
| @@ -41,60 +41,6 @@ msgstr "TDT (0x70)" | ||||
| msgid "Experience the IPTV" | ||||
| msgstr "L'expérience IPTV" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "FICHIER" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protocole" | ||||
|  | ||||
| msgid "Delay (ms)" | ||||
| msgstr "Délai (ms)" | ||||
|  | ||||
| msgid "Script" | ||||
| msgstr "Script" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Paramètre" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Adresse" | ||||
|  | ||||
| msgid "Port" | ||||
| msgstr "Port" | ||||
|  | ||||
| msgid "Scan Sid" | ||||
| msgstr "Scanne les SID" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Scanne les PID" | ||||
|  | ||||
| msgid "Vtype" | ||||
| msgstr "Vtype" | ||||
|  | ||||
| msgid "Nid" | ||||
| msgstr "Nid" | ||||
|  | ||||
| msgid "Tid" | ||||
| msgstr "Tid" | ||||
|  | ||||
| msgid "Rid" | ||||
| msgstr "Rid" | ||||
|  | ||||
| msgid "Cannot find unique channel settings!" | ||||
| msgstr "Impossible de trouver un paramètre de chaîne unique !" | ||||
|  | ||||
| msgid "IPTV Channels" | ||||
| msgstr "Canal IPTV" | ||||
|  | ||||
| msgid "IPTV Information" | ||||
| msgstr "Information sur IPTV" | ||||
|  | ||||
| @@ -184,3 +130,62 @@ msgstr "Définit les mauvais comportement qui doivent être désactivé." | ||||
|  | ||||
| msgid "Help" | ||||
| msgstr "Aide" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "FICHIER" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| #, fuzzy | ||||
| msgid "Scan sid" | ||||
| msgstr "Scanne les SID" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Scanne les PID" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protocole" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Adresse" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Paramètre" | ||||
|  | ||||
| #, fuzzy | ||||
| #~ msgid "File" | ||||
| #~ msgstr "Filtres" | ||||
|  | ||||
| #~ msgid "Delay (ms)" | ||||
| #~ msgstr "Délai (ms)" | ||||
|  | ||||
| #~ msgid "Script" | ||||
| #~ msgstr "Script" | ||||
|  | ||||
| #~ msgid "Port" | ||||
| #~ msgstr "Port" | ||||
|  | ||||
| #~ msgid "Vtype" | ||||
| #~ msgstr "Vtype" | ||||
|  | ||||
| #~ msgid "Nid" | ||||
| #~ msgstr "Nid" | ||||
|  | ||||
| #~ msgid "Tid" | ||||
| #~ msgstr "Tid" | ||||
|  | ||||
| #~ msgid "Rid" | ||||
| #~ msgstr "Rid" | ||||
|  | ||||
| #~ msgid "Cannot find unique channel settings!" | ||||
| #~ msgstr "Impossible de trouver un paramètre de chaîne unique !" | ||||
|  | ||||
| #~ msgid "IPTV Channels" | ||||
| #~ msgstr "Canal IPTV" | ||||
|   | ||||
							
								
								
									
										85
									
								
								po/it_IT.po
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								po/it_IT.po
									
									
									
									
									
								
							| @@ -5,9 +5,9 @@ | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: iptv 0.2.5\n" | ||||
| "Project-Id-Version: iptv 0.4.0\n" | ||||
| "Report-Msgid-Bugs-To: Rolf Ahrenberg\n" | ||||
| "POT-Creation-Date: 2009-03-06 22:15+0200\n" | ||||
| "POT-Creation-Date: 2010-03-04 16:42+0200\n" | ||||
| "PO-Revision-Date: 2008-07-13 03:28+0100\n" | ||||
| "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" | ||||
| "Language-Team: Italian\n" | ||||
| @@ -40,60 +40,6 @@ msgstr "TDT (0x70)" | ||||
| msgid "Experience the IPTV" | ||||
| msgstr "Scopri la IPTV" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "FILE" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protocollo" | ||||
|  | ||||
| msgid "Delay (ms)" | ||||
| msgstr "Ritardo (ms)" | ||||
|  | ||||
| msgid "Script" | ||||
| msgstr "Script" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Parametro" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Indirizzo" | ||||
|  | ||||
| msgid "Port" | ||||
| msgstr "Porta" | ||||
|  | ||||
| msgid "Scan Sid" | ||||
| msgstr "Scansione Sid" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Scansione Pids" | ||||
|  | ||||
| msgid "Vtype" | ||||
| msgstr "Vtype" | ||||
|  | ||||
| msgid "Nid" | ||||
| msgstr "Nid" | ||||
|  | ||||
| msgid "Tid" | ||||
| msgstr "Tid" | ||||
|  | ||||
| msgid "Rid" | ||||
| msgstr "Rid" | ||||
|  | ||||
| msgid "Cannot find unique channel settings!" | ||||
| msgstr "Impossibile trovare impostazioni canale unico!" | ||||
|  | ||||
| msgid "IPTV Channels" | ||||
| msgstr "Canali IPTV" | ||||
|  | ||||
| msgid "IPTV Information" | ||||
| msgstr "Informazione IPTV" | ||||
|  | ||||
| @@ -183,3 +129,30 @@ msgstr "Definisci un filtro corrotto che sarà messo nella lista nera." | ||||
|  | ||||
| msgid "Help" | ||||
| msgstr "Aiuto" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "FILE" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Scan sid" | ||||
| msgstr "Scansione Sid" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Scansione Pids" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Protocollo" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Indirizzo" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Parametro" | ||||
|   | ||||
							
								
								
									
										85
									
								
								po/ru_RU.po
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								po/ru_RU.po
									
									
									
									
									
								
							| @@ -5,9 +5,9 @@ | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: iptv 0.2.5\n" | ||||
| "Project-Id-Version: iptv 0.4.0\n" | ||||
| "Report-Msgid-Bugs-To: Rolf Ahrenberg\n" | ||||
| "POT-Creation-Date: 2009-03-06 22:15+0200\n" | ||||
| "POT-Creation-Date: 2010-03-04 16:42+0200\n" | ||||
| "PO-Revision-Date: 2008-03-16 12:14+0100\n" | ||||
| "Last-Translator: Alexander Gross <Bikalexander@gmail.com>\n" | ||||
| "Language-Team: Russian <de@li.org>\n" | ||||
| @@ -41,60 +41,6 @@ msgstr "TDT (0x70)" | ||||
| msgid "Experience the IPTV" | ||||
| msgstr "Попробуй IPTV" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "ФАЙЛ" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Протокол" | ||||
|  | ||||
| msgid "Delay (ms)" | ||||
| msgstr "Задержка (мс)" | ||||
|  | ||||
| msgid "Script" | ||||
| msgstr "Скрипт" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Параметр" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Адрес" | ||||
|  | ||||
| msgid "Port" | ||||
| msgstr "Порт" | ||||
|  | ||||
| msgid "Scan Sid" | ||||
| msgstr "Сканировать SID" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Сканировать пиды" | ||||
|  | ||||
| msgid "Vtype" | ||||
| msgstr "Vtype" | ||||
|  | ||||
| msgid "Nid" | ||||
| msgstr "Nid" | ||||
|  | ||||
| msgid "Tid" | ||||
| msgstr "Tid" | ||||
|  | ||||
| msgid "Rid" | ||||
| msgstr "Rid" | ||||
|  | ||||
| msgid "Cannot find unique channel settings!" | ||||
| msgstr "Невозможно найти уникальные настройки канала!" | ||||
|  | ||||
| msgid "IPTV Channels" | ||||
| msgstr "IPTV каналы" | ||||
|  | ||||
| msgid "IPTV Information" | ||||
| msgstr "IPTV информация" | ||||
|  | ||||
| @@ -168,3 +114,30 @@ msgstr "Неправильно работающий фильтр, занести | ||||
|  | ||||
| msgid "Help" | ||||
| msgstr "Справка" | ||||
|  | ||||
| msgid "UDP" | ||||
| msgstr "UDP" | ||||
|  | ||||
| msgid "HTTP" | ||||
| msgstr "HTTP" | ||||
|  | ||||
| msgid "FILE" | ||||
| msgstr "ФАЙЛ" | ||||
|  | ||||
| msgid "EXT" | ||||
| msgstr "EXT" | ||||
|  | ||||
| msgid "Scan sid" | ||||
| msgstr "Сканировать SID" | ||||
|  | ||||
| msgid "Scan pids" | ||||
| msgstr "Сканировать пиды" | ||||
|  | ||||
| msgid "Protocol" | ||||
| msgstr "Протокол" | ||||
|  | ||||
| msgid "Address" | ||||
| msgstr "Адрес" | ||||
|  | ||||
| msgid "Parameter" | ||||
| msgstr "Параметр" | ||||
|   | ||||
| @@ -53,7 +53,7 @@ void cIptvProtocolExt::ExecuteScript(void) | ||||
|      // Execute the external script | ||||
|      cString cmd = cString::sprintf("%s %d %d", *scriptFile, scriptParameter, socketPort); | ||||
|      debug("cIptvProtocolExt::ExecuteScript(child): %s\n", *cmd); | ||||
|      if (execl("/bin/sh", "sh", "-c", *cmd, NULL) == -1) { | ||||
|      if (execl("/bin/sh", "sh", "-c", *cmd, (char *)NULL) == -1) { | ||||
|         error("Script execution failed: %s", *cmd); | ||||
|         _exit(-1); | ||||
|         } | ||||
|   | ||||
							
								
								
									
										530
									
								
								setup.c
									
									
									
									
									
								
							
							
						
						
									
										530
									
								
								setup.c
									
									
									
									
									
								
							| @@ -5,10 +5,6 @@ | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #include <vdr/device.h> | ||||
| #include <vdr/interface.h> | ||||
| #include <vdr/status.h> | ||||
| #include <vdr/menu.h> | ||||
|  | ||||
| @@ -17,521 +13,6 @@ | ||||
| #include "device.h" | ||||
| #include "setup.h" | ||||
|  | ||||
| // --- cIptvMenuEditChannel -------------------------------------------------- | ||||
|  | ||||
| class cIptvMenuEditChannel : public cOsdMenu | ||||
| { | ||||
| private: | ||||
|   enum { | ||||
|     eProtocolUDP, | ||||
|     eProtocolHTTP, | ||||
|     eProtocolFILE, | ||||
|     eProtocolEXT, | ||||
|     eProtocolCount | ||||
|   }; | ||||
|   struct tIptvChannel { | ||||
|     int frequency, source, protocol, parameter, vpid, ppid, vtype, tpid, sid, nid, tid, rid; | ||||
|     int apid[MAXAPIDS + 1], dpid[MAXDPIDS + 1], spid[MAXSPIDS + 1], caids[MAXCAIDS + 1]; | ||||
|     int sidscan, pidscan; | ||||
|     char name[256], location[256]; | ||||
|   } data; | ||||
|   cChannel *channel; | ||||
|   const char *protocols[eProtocolCount]; | ||||
|   void Setup(void); | ||||
|   cString GetIptvSettings(const char *Param, int *Parameter, int *SidScan, int *PidScan, 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"); | ||||
|   protocols[eProtocolEXT]  = tr("EXT"); | ||||
|   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 *Parameter, int *SidScan, int *PidScan, int *Protocol) | ||||
| { | ||||
|   char *tag = NULL; | ||||
|   char *proto = NULL; | ||||
|   char *loc = NULL; | ||||
|   if (sscanf(Param, "%a[^|]|S%dP%d|%a[^|]|%a[^|]|%d", &tag, SidScan, PidScan, &proto, &loc, Parameter) == 6) { | ||||
|      cString tagstr(tag, true); | ||||
|      cString protostr(proto, true); | ||||
|      cString locstr(loc, true); | ||||
|      // check if IPTV tag | ||||
|      if (strncasecmp(*tagstr, "IPTV", 4) == 0) { | ||||
|         // check if protocol is supported and update the pointer | ||||
|         if (strncasecmp(*protostr, "UDP", 3) == 0) | ||||
|            *Protocol = eProtocolUDP; | ||||
|         else if (strncasecmp(*protostr, "HTTP", 4) == 0) | ||||
|            *Protocol = eProtocolHTTP; | ||||
|         else if (strncasecmp(*protostr, "FILE", 4) == 0) | ||||
|            *Protocol = eProtocolFILE; | ||||
|         else if (strncasecmp(*protostr, "EXT", 3) == 0) | ||||
|            *Protocol = eProtocolEXT; | ||||
|         else | ||||
|            return NULL; | ||||
|         // return location | ||||
|         return locstr; | ||||
|         } | ||||
|      } | ||||
|   else if (sscanf(Param, "%a[^|]|P%dS%d|%a[^|]|%a[^|]|%d", &tag, PidScan, SidScan, &proto, &loc, Parameter) == 6) { | ||||
|      cString tagstr(tag, true); | ||||
|      cString protostr(proto, true); | ||||
|      cString locstr(loc, true); | ||||
|      // check if IPTV tag | ||||
|      if (strncasecmp(*tagstr, "IPTV", 4) == 0) { | ||||
|         // check if protocol is supported and update the pointer | ||||
|         if (strncasecmp(*protostr, "UDP", 3) == 0) | ||||
|            *Protocol = eProtocolUDP; | ||||
|         else if (strncasecmp(*protostr, "HTTP", 4) == 0) | ||||
|            *Protocol = eProtocolHTTP; | ||||
|         else if (strncasecmp(*protostr, "FILE", 4) == 0) | ||||
|            *Protocol = eProtocolFILE; | ||||
|         else if (strncasecmp(*protostr, "EXT", 3) == 0) | ||||
|            *Protocol = eProtocolEXT; | ||||
|         else | ||||
|            return NULL; | ||||
|         // return location | ||||
|         return locstr; | ||||
|         } | ||||
|      } | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| void cIptvMenuEditChannel::GetChannelData(cChannel *Channel) | ||||
| { | ||||
|   if (Channel) { | ||||
|      int parameter, protocol, sidscan, pidscan; | ||||
|      data.frequency = Channel->Frequency(); | ||||
|      data.source = Channel->Source(); | ||||
|      data.vpid = Channel->Vpid(); | ||||
|      data.ppid = Channel->Ppid(); | ||||
| #if defined(APIVERSNUM) && APIVERSNUM >= 10704 | ||||
|      data.vtype = Channel->Vtype(); | ||||
| #endif | ||||
|      data.tpid = Channel->Tpid(); | ||||
|      for (unsigned int i = 0; i < ARRAY_SIZE(data.apid); ++i) | ||||
|          data.apid[i] = Channel->Apid(i); | ||||
|      for (unsigned int i = 0; i < ARRAY_SIZE(data.dpid); ++i) | ||||
|          data.dpid[i] = Channel->Dpid(i); | ||||
|      for (unsigned int i = 0; i < ARRAY_SIZE(data.spid); ++i) | ||||
|          data.spid[i] = Channel->Spid(i); | ||||
|      for (unsigned int i = 0; i < ARRAY_SIZE(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(), ¶meter, &sidscan, &pidscan, &protocol), sizeof(data.location)); | ||||
|      data.sidscan = sidscan; | ||||
|      data.pidscan = pidscan; | ||||
|      data.protocol = protocol; | ||||
|      data.parameter = parameter; | ||||
|      } | ||||
|   else { | ||||
|      data.frequency = 1; | ||||
|      data.source = cSource::FromData(cSource::stPlug); | ||||
|      data.vpid = 0; | ||||
|      data.ppid = 0; | ||||
|      data.vtype = 0; | ||||
|      data.tpid = 0; | ||||
|      for (unsigned int i = 0; i < ARRAY_SIZE(data.apid); ++i) | ||||
|          data.apid[i] = 0; | ||||
|      for (unsigned int i = 0; i < ARRAY_SIZE(data.dpid); ++i) | ||||
|          data.dpid[i] = 0; | ||||
|      for (unsigned int i = 0; i < ARRAY_SIZE(data.spid); ++i) | ||||
|          data.spid[i] = 0; | ||||
|      for (unsigned int i = 0; i < ARRAY_SIZE(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.sidscan = 0; | ||||
|      data.pidscan = 0; | ||||
|      data.protocol = eProtocolUDP; | ||||
|      data.parameter = 1234; | ||||
|      } | ||||
| } | ||||
|  | ||||
| void cIptvMenuEditChannel::SetChannelData(cChannel *Channel) | ||||
| { | ||||
|   if (Channel) { | ||||
|      cString param; | ||||
|      char alangs[MAXAPIDS][MAXLANGCODE2] = { "" }; | ||||
|      char dlangs[MAXDPIDS][MAXLANGCODE2] = { "" }; | ||||
|      switch (data.protocol) { | ||||
|        case eProtocolEXT: | ||||
|             param = cString::sprintf("IPTV|S%dP%d|EXT|%s|%d", data.sidscan, data.pidscan, data.location, data.parameter); | ||||
|             break; | ||||
|        case eProtocolFILE: | ||||
|             param = cString::sprintf("IPTV|S%dP%d|FILE|%s|%d", data.sidscan, data.pidscan, data.location, data.parameter); | ||||
|             break; | ||||
|        case eProtocolHTTP: | ||||
|             param = cString::sprintf("IPTV|S%dP%d|HTTP|%s|%d", data.sidscan, data.pidscan, data.location, data.parameter); | ||||
|             break; | ||||
|        default: | ||||
|        case eProtocolUDP: | ||||
|             param = cString::sprintf("IPTV|S%dP%d|UDP|%s|%d", data.sidscan, data.pidscan, data.location, data.parameter); | ||||
|             break; | ||||
|        } | ||||
|      char slangs[MAXSPIDS][MAXLANGCODE2] = { "" }; | ||||
| #if defined(APIVERSNUM) && APIVERSNUM >= 10704 | ||||
|      Channel->SetPids(data.vpid, data.ppid, data.vtype, data.apid, alangs, data.dpid, dlangs, data.spid, slangs, data.tpid); | ||||
| #else | ||||
|      Channel->SetPids(data.vpid, data.ppid, data.apid, alangs, data.dpid, dlangs, data.spid, slangs, data.tpid); | ||||
| #endif | ||||
|      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, | ||||
|                             eProtocolCount, protocols)); | ||||
|   switch (data.protocol) { | ||||
|     case eProtocolFILE: | ||||
|          Add(new cMenuEditStrItem(trVDR("File"),     data.location, sizeof(data.location))); | ||||
|          Add(new cMenuEditIntItem(tr("Delay (ms)"), &data.parameter,  0, 0xFFFF)); | ||||
|          break; | ||||
|     case eProtocolEXT: | ||||
|          Add(new cMenuEditStrItem(tr("Script"),     data.location, sizeof(data.location))); | ||||
|          Add(new cMenuEditIntItem(tr("Parameter"), &data.parameter,  0, 0xFFFF)); | ||||
|          break; | ||||
|     case eProtocolHTTP: | ||||
|     case eProtocolUDP: | ||||
|     default: | ||||
|          Add(new cMenuEditStrItem(tr("Address"), data.location, sizeof(data.location))); | ||||
|          Add(new cMenuEditIntItem(tr("Port"),   &data.parameter,  0, 0xFFFF)); | ||||
|          break; | ||||
|     } | ||||
|   cOsdItem *sidScanItem = new cMenuEditBoolItem(tr("Scan Sid"), &data.sidscan); | ||||
|   if (!IptvConfig.GetSectionFiltering()) | ||||
|      sidScanItem->SetSelectable(false); | ||||
|   Add(sidScanItem); | ||||
|   Add(new cMenuEditBoolItem(tr("Scan pids"),   &data.pidscan)); | ||||
|   // Normal settings | ||||
|   Add(new cMenuEditStrItem(trVDR("Name"),       data.name,     sizeof(data.name))); | ||||
|   Add(new cMenuEditIntItem(trVDR("Frequency"), &data.frequency)); | ||||
|   Add(new cMenuEditIntItem(trVDR("Vpid"),      &data.vpid,     0, 0x1FFF)); | ||||
| #if defined(APIVERSNUM) && APIVERSNUM >= 10704 | ||||
|   Add(new cMenuEditIntItem(tr   ("Vtype"),     &data.vtype,    0, 0xFF)); | ||||
| #endif | ||||
|   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("Spid1"),     &data.spid[0],  0, 0x1FFF)); | ||||
|   Add(new cMenuEditIntItem(trVDR("Spid2"),     &data.spid[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)); | ||||
|   Add(new cMenuEditIntItem(tr   ("Nid"),       &data.nid,      0, 0xFFFF)); | ||||
|   Add(new cMenuEditIntItem(tr   ("Tid"),       &data.tid,      0, 0xFFFF)); | ||||
|   Add(new cMenuEditIntItem(tr   ("Rid"),       &data.rid,      0, 0x1FFF)); | ||||
|   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); | ||||
|         bool uniquityFailed = false; | ||||
|         bool firstIncrement = true; | ||||
|         // Search for identical channels as these will be ignored by vdr | ||||
|         for (cChannel *iteratorChannel = Channels.First(); iteratorChannel; | ||||
|             iteratorChannel = Channels.Next(iteratorChannel)) { | ||||
|             // This is one of the channels cause the uniquity check to fail | ||||
|             if (!iteratorChannel->GroupSep() && iteratorChannel != channel && | ||||
|                 iteratorChannel->GetChannelID() == newchannel.GetChannelID()) { | ||||
|                // See if it has unique Plugin param. If yes then increment | ||||
|                // the corresponding Rid until it is unique | ||||
|                if (strcmp(iteratorChannel->PluginParam(), | ||||
|                           newchannel.PluginParam())) { | ||||
|                   // If the channel RID is already at maximum, then fail the | ||||
|                   // channel modification | ||||
|                   if (iteratorChannel->Rid() >= 0x1FFF) { | ||||
|                      debug("Cannot increment RID over maximum value\n"); | ||||
|                      uniquityFailed = true; | ||||
|                      break; | ||||
|                      } | ||||
|                   debug("Incrementing conflicting channel RID\n"); | ||||
|                   iteratorChannel->SetId(iteratorChannel->Nid(), | ||||
|                                          iteratorChannel->Tid(), | ||||
|                                          iteratorChannel->Sid(), | ||||
|                                          firstIncrement ? | ||||
|                                          0 : iteratorChannel->Rid() + 1); | ||||
|  | ||||
|                   // Try zero Rid:s at first increment. Prevents them from | ||||
|                   // creeping slowly towards their maximum value | ||||
|                   firstIncrement = false; | ||||
|  | ||||
|                   // Re-set the search and start again | ||||
|                   iteratorChannel = Channels.First(); | ||||
|                   continue; | ||||
|                   // Cannot work around by incrementing rid because channels | ||||
|                   // are actually copies of each other | ||||
|                   } | ||||
|                else { | ||||
|                   uniquityFailed = true; | ||||
|                   break; | ||||
|                   } | ||||
|                } | ||||
|             } | ||||
|         if (!uniquityFailed) { | ||||
|            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, tr("Cannot find unique channel settings!")); | ||||
|            state = osContinue; | ||||
|            } | ||||
|         } | ||||
|      } | ||||
|   if ((Key != kNone) && (data.protocol != oldProtocol)) { | ||||
|      switch (data.protocol) { | ||||
|        case eProtocolEXT: | ||||
|             strn0cpy(data.location, "iptvstream.sh", sizeof(data.location)); | ||||
|             data.parameter = 0; | ||||
|             break; | ||||
|        case eProtocolFILE: | ||||
|             strn0cpy(data.location, "/video/stream.ts", sizeof(data.location)); | ||||
|             data.parameter = 0; | ||||
|             break; | ||||
|        case eProtocolHTTP: | ||||
|             strn0cpy(data.location, "127.0.0.1/TS/1", sizeof(data.location)); | ||||
|             data.parameter = 3000; | ||||
|             break; | ||||
|        default: | ||||
|        case eProtocolUDP: | ||||
|             strn0cpy(data.location, "127.0.0.1", sizeof(data.location)); | ||||
|             data.parameter = 1234; | ||||
|             break; | ||||
|        } | ||||
|      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) | ||||
| { | ||||
|   SetText(cString::sprintf("%d\t%s", channel->Number(), channel->Name())); | ||||
| } | ||||
|  | ||||
| // --- cIptvMenuChannels ----------------------------------------------------- | ||||
|  | ||||
| class cIptvMenuChannels : public cOsdMenu | ||||
| { | ||||
| private: | ||||
|   void Setup(void); | ||||
|   cChannel *GetChannel(int Index) const; | ||||
|   void Propagate(void); | ||||
|  | ||||
| protected: | ||||
|   eOSState Edit(void); | ||||
|   eOSState New(void); | ||||
|   eOSState Delete(void); | ||||
|   eOSState Switch(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() && !strncasecmp(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) const | ||||
| { | ||||
|   cIptvMenuChannelItem *p = dynamic_cast<cIptvMenuChannelItem *>(Get(Index)); | ||||
|   return p ? (cChannel *)p->Channel() : NULL; | ||||
| } | ||||
|  | ||||
| void cIptvMenuChannels::Propagate(void) | ||||
| { | ||||
|   Channels.ReNumber(); | ||||
|   for (cIptvMenuChannelItem *ci = dynamic_cast<cIptvMenuChannelItem *>(First()); ci; ci = dynamic_cast<cIptvMenuChannelItem *>(ci->Next())) | ||||
|       ci->Set(); | ||||
|   Display(); | ||||
|   Channels.SetModified(true); | ||||
| } | ||||
|  | ||||
| eOSState cIptvMenuChannels::Switch(void) | ||||
| { | ||||
|   if (HasSubMenu() || Count() == 0) | ||||
|      return osContinue; | ||||
|   cChannel *ch = GetChannel(Current()); | ||||
|   if (ch) | ||||
|      return cDevice::PrimaryDevice()->SwitchChannel(ch, true) ? osEnd : osContinue; | ||||
|   return osEnd; | ||||
| } | ||||
|  | ||||
| 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:     return Switch(); | ||||
|               case kRed:    return Edit(); | ||||
|               case kGreen:  return New(); | ||||
|               case kYellow: return Delete(); | ||||
|               default: break; | ||||
|               } | ||||
|             } | ||||
|     } | ||||
|   return state; | ||||
| } | ||||
|  | ||||
| // --- cIptvMenuInfo --------------------------------------------------------- | ||||
|  | ||||
| class cIptvMenuInfo : public cOsdMenu | ||||
| @@ -643,7 +124,7 @@ cIptvPluginSetup::cIptvPluginSetup() | ||||
|       disabledFilterNames[i] = tr(section_filter_table[i].description); | ||||
|       } | ||||
|   Setup(); | ||||
|   SetHelp(trVDR("Channels"), NULL, NULL, trVDR("Button$Info")); | ||||
|   SetHelp(NULL, NULL, NULL, trVDR("Button$Info")); | ||||
| } | ||||
|  | ||||
| void cIptvPluginSetup::Setup(void) | ||||
| @@ -680,14 +161,6 @@ void cIptvPluginSetup::Setup(void) | ||||
|   Display(); | ||||
| } | ||||
|  | ||||
| eOSState cIptvPluginSetup::EditChannel(void) | ||||
| { | ||||
|   debug("cIptvPluginSetup::EditChannel()\n"); | ||||
|   if (HasSubMenu()) | ||||
|      return osContinue; | ||||
|   return AddSubMenu(new cIptvMenuChannels()); | ||||
| } | ||||
|  | ||||
| eOSState cIptvPluginSetup::ShowInfo(void) | ||||
| { | ||||
|   debug("cIptvPluginSetup::ShowInfo()\n"); | ||||
| @@ -704,7 +177,6 @@ eOSState cIptvPluginSetup::ProcessKey(eKeys Key) | ||||
|  | ||||
|   if (state == osUnknown) { | ||||
|      switch (Key) { | ||||
|        case kRed:  return EditChannel(); | ||||
|        case kBlue: return ShowInfo(); | ||||
|        case kInfo: if (Current() < help.Size()) | ||||
|                       return AddSubMenu(new cMenuText(cString::sprintf("%s - %s '%s'", tr("Help"), trVDR("Plugin"), PLUGIN_NAME_I18N), help[Current()])); | ||||
|   | ||||
							
								
								
									
										48
									
								
								setup.h
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								setup.h
									
									
									
									
									
								
							| @@ -9,8 +9,55 @@ | ||||
| #define __IPTV_SETUP_H | ||||
|  | ||||
| #include <vdr/menuitems.h> | ||||
| #include <vdr/sourceparams.h> | ||||
| #include "common.h" | ||||
|  | ||||
| class cIptvTransponderParameters | ||||
| { | ||||
|   friend class cIptvSourceParam; | ||||
| private: | ||||
|   int sidscan; | ||||
|   int pidscan; | ||||
|   int protocol; | ||||
|   char address[MaxFileName]; | ||||
|   int parameter; | ||||
| public: | ||||
|   cIptvTransponderParameters(const char *Parameters = NULL); | ||||
|   int SidScan(void) const { return sidscan; } | ||||
|   int PidScan(void) const { return pidscan; } | ||||
|   int Protocol(void) const { return protocol; } | ||||
|   const char *Address(void) const { return address; } | ||||
|   int Parameter(void) const { return parameter; } | ||||
|   void SetSidScan(int SidScan) { sidscan = SidScan; } | ||||
|   void SetPidScan(int PidScan) { pidscan = PidScan; } | ||||
|   void SetProtocol(int Protocol) { protocol = Protocol; } | ||||
|   void SetAddress(const char *Address) { strncpy(address, Address, sizeof(address)); } | ||||
|   void SetParameter(int Parameter) { parameter = Parameter; } | ||||
|   cString ToString(char Type) const; | ||||
|   bool Parse(const char *s); | ||||
| }; | ||||
|  | ||||
| class cIptvSourceParam : public cSourceParam | ||||
| { | ||||
| private: | ||||
|   enum { | ||||
|     eProtocolUDP, | ||||
|     eProtocolHTTP, | ||||
|     eProtocolFILE, | ||||
|     eProtocolEXT, | ||||
|     eProtocolCount | ||||
|   }; | ||||
|   int param; | ||||
|   cChannel data; | ||||
|   cIptvTransponderParameters itp; | ||||
|   const char *protocols[eProtocolCount]; | ||||
| public: | ||||
|   cIptvSourceParam(char Source, const char *Description); | ||||
|   virtual void SetData(cChannel *Channel); | ||||
|   virtual void GetData(cChannel *Channel); | ||||
|   virtual cOsdItem *GetOsdItem(void); | ||||
| }; | ||||
|  | ||||
| class cIptvPluginSetup : public cMenuSetupPage | ||||
| { | ||||
| private: | ||||
| @@ -23,7 +70,6 @@ private: | ||||
|   const char *disabledFilterNames[SECTION_FILTER_TABLE_SIZE]; | ||||
|   cVector<const char*> help; | ||||
|  | ||||
|   eOSState EditChannel(void); | ||||
|   eOSState ShowInfo(void); | ||||
|   void Setup(void); | ||||
|   void StoreFilters(const char *Name, int *Values); | ||||
|   | ||||
| @@ -26,7 +26,7 @@ void cSidScanner::SetStatus(bool On) | ||||
| void cSidScanner::SetChannel(const cChannel *Channel) | ||||
| { | ||||
|   if (Channel) { | ||||
|      debug("cSidScanner::SetChannel(): %s\n", Channel->PluginParam()); | ||||
|      debug("cSidScanner::SetChannel(): %s\n", Channel->Parameters()); | ||||
|      channel = *Channel; | ||||
|      } | ||||
|   else { | ||||
|   | ||||
							
								
								
									
										152
									
								
								source.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								source.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,152 @@ | ||||
| /* | ||||
|  * source.c: IPTV plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "common.h" | ||||
| #include "source.h" | ||||
|  | ||||
| // --- cIptvTransponderParameters -------------------------------------------- | ||||
|  | ||||
| cIptvTransponderParameters::cIptvTransponderParameters(const char *Parameters) | ||||
| : sidscan(0), | ||||
|   pidscan(0), | ||||
|   protocol(eProtocolUDP), | ||||
|   parameter(0) | ||||
| { | ||||
|   debug("cIptvTransponderParameters::cIptvTransponderParameters(): Parameters=%s\n", Parameters); | ||||
|  | ||||
|   memset(&address, 0, sizeof(address)); | ||||
|   Parse(Parameters); | ||||
| } | ||||
|  | ||||
| cString cIptvTransponderParameters::ToString(char Type) const | ||||
| { | ||||
|   debug("cIptvTransponderParameters::ToString() Type=%c\n", Type); | ||||
|  | ||||
|   const char *protocolstr; | ||||
|  | ||||
|   switch (protocol) { | ||||
|     case eProtocolEXT: | ||||
|          protocolstr = "EXT"; | ||||
|          break; | ||||
|     case eProtocolHTTP: | ||||
|          protocolstr = "HTTP"; | ||||
|          break; | ||||
|     case eProtocolFILE: | ||||
|          protocolstr = "FILE"; | ||||
|          break; | ||||
|     default: | ||||
|     case eProtocolUDP: | ||||
|          protocolstr = "UDP"; | ||||
|          break; | ||||
|   } | ||||
|   return cString::sprintf("S=%d|P=%d|F=%s|U=%s|A=%d", sidscan, pidscan, protocolstr, address, parameter); | ||||
| } | ||||
|  | ||||
| bool cIptvTransponderParameters::Parse(const char *s) | ||||
| { | ||||
|   debug("cIptvTransponderParameters::Parse(): s=%s\n", s); | ||||
|  | ||||
|   const char *delim = "|"; | ||||
|   char *str = (char *)s; | ||||
|   char *saveptr = NULL; | ||||
|   char *token = NULL; | ||||
|   bool found_s = false; | ||||
|   bool found_p = false; | ||||
|   bool found_f = true; | ||||
|   bool found_u = false; | ||||
|   bool found_a = false; | ||||
|  | ||||
|   while ((token = (char *)strtok_r(str, delim, &saveptr)) != NULL) { | ||||
|     char *data = token + 1; | ||||
|  | ||||
|     if (data && (*data == '=')) { | ||||
|        ++data; | ||||
|        switch (*token) { | ||||
|          case 'S': | ||||
|               sidscan = strtol(data, (char **)NULL, 10); | ||||
|               found_s = true; | ||||
|               break; | ||||
|          case 'P': | ||||
|               pidscan = strtol(data, (char **)NULL, 10); | ||||
|               found_p = true; | ||||
|               break; | ||||
|          case 'F': | ||||
|               if (strstr(data, "UDP")) | ||||
|                   protocol = eProtocolUDP; | ||||
|               else if (strstr(data, "HTTP")) | ||||
|                   protocol = eProtocolHTTP; | ||||
|               else if (strstr(data, "FILE")) | ||||
|                   protocol = eProtocolFILE; | ||||
|               else if (strstr(data, "EXT")) | ||||
|                   protocol = eProtocolEXT; | ||||
|               else | ||||
|                  found_u = false; | ||||
|               break; | ||||
|          case 'U': | ||||
|               strn0cpy(address, data, sizeof(address)); | ||||
|               found_u = true; | ||||
|               break; | ||||
|          case 'A': | ||||
|               parameter = strtol(data, (char **)NULL, 10); | ||||
|               found_a = true; | ||||
|               break; | ||||
|          default: | ||||
|               break; | ||||
|          } | ||||
|     } | ||||
|     str = NULL; | ||||
|   } | ||||
|  | ||||
|   if (found_s && found_p && found_f && found_u && found_a) | ||||
|      return (true); | ||||
|  | ||||
|   error("Invalid channel parameters: %s\n", s); | ||||
|   return (false); | ||||
| } | ||||
|  | ||||
| // --- cIptvSourceParam ------------------------------------------------------ | ||||
|  | ||||
| cIptvSourceParam::cIptvSourceParam(char Source, const char *Description) | ||||
|   : cSourceParam(Source, Description), | ||||
|     param(0) | ||||
| { | ||||
|   debug("cIptvSourceParam::cIptvSourceParam(): Source=%c Description=%s\n", Source, Description); | ||||
|  | ||||
|   protocols[cIptvTransponderParameters::eProtocolUDP]  = tr("UDP"); | ||||
|   protocols[cIptvTransponderParameters::eProtocolHTTP] = tr("HTTP"); | ||||
|   protocols[cIptvTransponderParameters::eProtocolFILE] = tr("FILE"); | ||||
|   protocols[cIptvTransponderParameters::eProtocolEXT]  = tr("EXT"); | ||||
| } | ||||
|  | ||||
| void cIptvSourceParam::SetData(cChannel *Channel) | ||||
| { | ||||
|   debug("cIptvSourceParam::SetData(): Channel=%s)\n", Channel->Parameters()); | ||||
|   data = *Channel; | ||||
|   itp.Parse(data.Parameters()); | ||||
|   param = 0; | ||||
| } | ||||
|  | ||||
| void cIptvSourceParam::GetData(cChannel *Channel) | ||||
| { | ||||
|   debug("cIptvSourceParam::GetData(): Channel=%s\n", Channel->Parameters()); | ||||
|   data.SetTransponderData(Channel->Source(), Channel->Frequency(), data.Srate(), itp.ToString(Source()), true); | ||||
|   *Channel = data; | ||||
| } | ||||
|  | ||||
| cOsdItem *cIptvSourceParam::GetOsdItem(void) | ||||
| { | ||||
|   debug("cIptvSourceParam::GetOsdItem()\n"); | ||||
|   switch (param++) { | ||||
|     case  0: return new cMenuEditBoolItem(tr("Scan sid"),  &itp.sidscan); | ||||
|     case  1: return new cMenuEditBoolItem(tr("Scan pids"), &itp.pidscan); | ||||
|     case  2: return new cMenuEditStraItem(tr("Protocol"),  &itp.protocol,  ELEMENTS(protocols), protocols); | ||||
|     case  3: return new cMenuEditStrItem( tr("Address"),    itp.address,   sizeof(itp.address)); | ||||
|     case  4: return new cMenuEditIntItem( tr("Parameter"), &itp.parameter, 0,                   0xFFFF); | ||||
|     default: return NULL; | ||||
|     } | ||||
|   return NULL; | ||||
| } | ||||
							
								
								
									
										64
									
								
								source.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								source.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| /* | ||||
|  * source.h: IPTV plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef __IPTV_SOURCE_H | ||||
| #define __IPTV_SOURCE_H | ||||
|  | ||||
| #include <vdr/menuitems.h> | ||||
| #include <vdr/sourceparams.h> | ||||
| #include "common.h" | ||||
|  | ||||
| class cIptvTransponderParameters | ||||
| { | ||||
|   friend class cIptvSourceParam; | ||||
|  | ||||
| private: | ||||
|   int sidscan; | ||||
|   int pidscan; | ||||
|   int protocol; | ||||
|   char address[MaxFileName]; | ||||
|   int parameter; | ||||
|  | ||||
| public: | ||||
|   enum { | ||||
|     eProtocolUDP, | ||||
|     eProtocolHTTP, | ||||
|     eProtocolFILE, | ||||
|     eProtocolEXT, | ||||
|     eProtocolCount | ||||
|   }; | ||||
|   cIptvTransponderParameters(const char *Parameters = NULL); | ||||
|   int SidScan(void) const { return sidscan; } | ||||
|   int PidScan(void) const { return pidscan; } | ||||
|   int Protocol(void) const { return protocol; } | ||||
|   const char *Address(void) const { return address; } | ||||
|   int Parameter(void) const { return parameter; } | ||||
|   void SetSidScan(int SidScan) { sidscan = SidScan; } | ||||
|   void SetPidScan(int PidScan) { pidscan = PidScan; } | ||||
|   void SetProtocol(int Protocol) { protocol = Protocol; } | ||||
|   void SetAddress(const char *Address) { strncpy(address, Address, sizeof(address)); } | ||||
|   void SetParameter(int Parameter) { parameter = Parameter; } | ||||
|   cString ToString(char Type) const; | ||||
|   bool Parse(const char *s); | ||||
| }; | ||||
|  | ||||
| class cIptvSourceParam : public cSourceParam | ||||
| { | ||||
| private: | ||||
|   int param; | ||||
|   cChannel data; | ||||
|   cIptvTransponderParameters itp; | ||||
|   const char *protocols[cIptvTransponderParameters::eProtocolCount]; | ||||
|  | ||||
| public: | ||||
|   cIptvSourceParam(char Source, const char *Description); | ||||
|   virtual void SetData(cChannel *Channel); | ||||
|   virtual void GetData(cChannel *Channel); | ||||
|   virtual cOsdItem *GetOsdItem(void); | ||||
| }; | ||||
|  | ||||
| #endif // __IPTV_SOURCE_H | ||||
		Reference in New Issue
	
	Block a user