diff --git a/source/ChanSort.Api/Controller/SerializerBase.cs b/source/ChanSort.Api/Controller/SerializerBase.cs index 3a0bbb2..3148baa 100644 --- a/source/ChanSort.Api/Controller/SerializerBase.cs +++ b/source/ChanSort.Api/Controller/SerializerBase.cs @@ -166,10 +166,10 @@ namespace ChanSort.Api ZipFile.ExtractToDirectory(this.FileName, this.TempPath); } - protected void ZipToOutputFile(string tvOutputFile) + protected void ZipToOutputFile(string tvOutputFile, bool compress = true) { File.Delete(tvOutputFile); - ZipFile.CreateFromDirectory(this.TempPath, tvOutputFile); + ZipFile.CreateFromDirectory(this.TempPath, tvOutputFile, compress ? CompressionLevel.Optimal : CompressionLevel.NoCompression, false); this.FileName = tvOutputFile; } #endregion diff --git a/source/ChanSort.Loader.Grundig/Serializer.cs b/source/ChanSort.Loader.Grundig/Serializer.cs index 003456f..01ec4c0 100644 --- a/source/ChanSort.Loader.Grundig/Serializer.cs +++ b/source/ChanSort.Loader.Grundig/Serializer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Text; @@ -11,9 +12,12 @@ namespace ChanSort.Loader.Grundig { class Serializer : SerializerBase { - private readonly ChannelList terrChannels = new ChannelList(SignalSource.Antenna, "Antenna"); - private readonly ChannelList cableChannels = new ChannelList(SignalSource.Cable, "Cable"); - private readonly ChannelList satChannels = new ChannelList(SignalSource.Sat, "Satellite"); + private readonly ChannelList terrChannels = new ChannelList(SignalSource.Antenna | SignalSource.TvAndData, "Antenna TV"); + private readonly ChannelList cableChannels = new ChannelList(SignalSource.Cable | SignalSource.TvAndData, "Cable TV"); + private readonly ChannelList satChannels = new ChannelList(SignalSource.Sat | SignalSource.TvAndData, "Satellite TV"); + private readonly ChannelList terrChannelsRadio = new ChannelList(SignalSource.Antenna | SignalSource.Radio, "Antenna Radio"); + private readonly ChannelList cableChannelsRadio = new ChannelList(SignalSource.Cable | SignalSource.Radio, "Cable Radio"); + private readonly ChannelList satChannelsRadio = new ChannelList(SignalSource.Sat | SignalSource.Radio, "Satellite Radio"); private readonly List fileDataList = new List(); private readonly StringBuilder logMessages = new StringBuilder(); @@ -37,6 +41,9 @@ namespace ChanSort.Loader.Grundig this.DataRoot.AddChannelList(this.terrChannels); this.DataRoot.AddChannelList(this.cableChannels); this.DataRoot.AddChannelList(this.satChannels); + this.DataRoot.AddChannelList(this.terrChannelsRadio); + this.DataRoot.AddChannelList(this.cableChannelsRadio); + this.DataRoot.AddChannelList(this.satChannelsRadio); foreach (var list in this.DataRoot.ChannelLists) { @@ -49,6 +56,8 @@ namespace ChanSort.Loader.Grundig this.terrChannels.VisibleColumnFieldNames.Add(nameof(ChannelInfo.Source)); this.cableChannels.VisibleColumnFieldNames.Add(nameof(ChannelInfo.Source)); + this.terrChannelsRadio.VisibleColumnFieldNames.Add(nameof(ChannelInfo.Source)); + this.cableChannelsRadio.VisibleColumnFieldNames.Add(nameof(ChannelInfo.Source)); } #endregion @@ -87,6 +96,18 @@ namespace ChanSort.Loader.Grundig fileData.path = fileName; fileData.hasBom = content.Length >= 3 && content[0] == 0xef && content[1] == 0xbb && content[2] == 0xbf; var textContent = Encoding.UTF8.GetString(content, fileData.hasBom ? 3 : 0, content.Length - (fileData.hasBom ? 3 : 0)); + + // some files contain unescaped characters like \x10, which causes XML parsing to fail + var sb = new StringBuilder(textContent.Length); + foreach (var ch in textContent) + { + if (ch < 32 && ch != '\n' && ch != '\r' && ch != '\t') + sb.Append($"&#x{(int)ch:x2};"); + else + sb.Append(ch); + } + textContent = sb.ToString(); + fileData.newline = textContent.Contains("\r\n") ? "\r\n" : "\n"; fileData.indent = textContent.Contains(" <"); fileData.doc = new XmlDocument(); @@ -217,7 +238,7 @@ namespace ChanSort.Loader.Grundig c.Source = type; c.Provider = provider; - var list = this.DataRoot.GetChannelList(src); + var list = this.DataRoot.GetChannelList(c.SignalSource); this.DataRoot.AddChannel(list, c); ++chanId; } @@ -241,6 +262,8 @@ namespace ChanSort.Loader.Grundig c.ServiceId = Int32.Parse(service.Attributes["sid"].InnerText); c.Encrypted = service.Attributes["ca"].InnerText == "1"; c.IsDeleted = service.Attributes["del"].InnerText == "1"; + var typ = service.Attributes["typ"].InnerText; + c.SignalSource |= typ == "1" ? SignalSource.Tv : typ == "2" ? SignalSource.Radio : SignalSource.Data; return c; } @@ -314,7 +337,27 @@ namespace ChanSort.Loader.Grundig var xml = sw.ToString(); if (!file.indent) - xml = xml.Replace("\" />", "\"/>"); + { + xml = xml.Replace(" />", "/>"); + + // replace escaped characters with unescaped ones (invalid XML, but that's how Grundig does it) + var sb = new StringBuilder(xml.Length); + for (int i = 0, c = xml.Length - 5; i < c; i++) + { + if (xml[i] == '&' && xml[i + 1] == '#' && xml[i + 2] == 'x' && xml[i + 5] == ';') + { + sb.Append((char)int.Parse(xml.Substring(i + 3, 2), NumberStyles.HexNumber)); + i += 5; + } + else + sb.Append(xml[i]); + } + + var trail = Math.Min(5, xml.Length); + sb.Append(xml, xml.Length - trail, trail); + xml = sb.ToString(); + } + var enc = new UTF8Encoding(file.hasBom, false); File.WriteAllText(file.path, xml, enc); } diff --git a/source/ChanSort.Loader.Panasonic/XmlSerializer.cs b/source/ChanSort.Loader.Panasonic/XmlSerializer.cs index b511ecf..a1e3ceb 100644 --- a/source/ChanSort.Loader.Panasonic/XmlSerializer.cs +++ b/source/ChanSort.Loader.Panasonic/XmlSerializer.cs @@ -1,10 +1,8 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; -using System.Text.RegularExpressions; using System.Xml; using System.Xml.Schema; using ChanSort.Api; @@ -13,11 +11,20 @@ namespace ChanSort.Loader.Panasonic { /* - Panasonic Android TVs (2020 and later) use the same unstandardized compressed .bin binary format as many Philips lists and some Sharp TVs. - Additionally it exports a .xml file with very limited information that only includes channel numbers and channel names truncated at 8 characters. + MediaTek based Android TVs (e.g. Panasonic 2020 and later, Nokia, ...) use the same unstandardized compressed .bin binary format as many + Philips lists and some Sharp TVs. + Additionally it exports a .xml file with very limited information that only includes channel numbers and channel names truncated at 8 bytes. This truncation makes it impossible for a user to distinguish between channels that have longer names like "Sky Bundesliga ...", therefore this loader adds the "SvlId" as the ShortName. This SvlId is probably a "service list id" and refers to a a data record inside the .bin file. + The truncation can also happen in the middle of a multi-type UTF-8 character sequence. Non-latin characters, including German umlauts or all + cyrillic characters require 2 bytes/character, effectively reducing the channel name length to 4-8 characters. + + Another severe issue with these files is that XML special characters in channel names are not escaped properly. Some preprocessing is required + in order to guess if a "&" is meant as an & data value or an XML attribute. It's likely that < and > inside channel names have the same problem. + + When the TV has channels from various sources, it is not possible to determine to which internal source a channel belongs, making sorting of + sub-lists more or less impossible. */ class XmlSerializer : SerializerBase diff --git a/source/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.csproj b/source/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.csproj index e96fa48..dddb47d 100644 --- a/source/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.csproj +++ b/source/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.csproj @@ -88,6 +88,7 @@ ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll diff --git a/source/ChanSort.Loader.Samsung/SamsungPlugin.cs b/source/ChanSort.Loader.Samsung/SamsungPlugin.cs index 2ee34dd..a3125c2 100644 --- a/source/ChanSort.Loader.Samsung/SamsungPlugin.cs +++ b/source/ChanSort.Loader.Samsung/SamsungPlugin.cs @@ -1,4 +1,5 @@ using System.IO; +using System.IO.Compression; using ChanSort.Api; using ChanSort.Loader.Samsung.Scm; using ChanSort.Loader.Samsung.Zip; @@ -17,7 +18,20 @@ namespace ChanSort.Loader.Samsung if (ext == ".scm") return new ScmSerializer(inputFile); if (ext == ".zip") + { + // some Orsay TVs export a .zip file containing a Clone folder, which holds the same files as an .scm archive has in its root folder + ZipArchiveEntry zipArchiveEntry = null; + using (var stream = new FileStream(inputFile, FileMode.Open)) + { + var zip = new ZipArchive(stream); + zipArchiveEntry = zip.GetEntry("Clone/map-AirD"); + } + if (zipArchiveEntry != null) + return new ScmSerializer(inputFile, "Clone"); + return new DbSerializer(inputFile); + } + return null; } } diff --git a/source/ChanSort.Loader.Samsung/Scm/ScmSerializer.cs b/source/ChanSort.Loader.Samsung/Scm/ScmSerializer.cs index 38fb39a..cb01c70 100644 --- a/source/ChanSort.Loader.Samsung/Scm/ScmSerializer.cs +++ b/source/ChanSort.Loader.Samsung/Scm/ScmSerializer.cs @@ -38,7 +38,8 @@ namespace ChanSort.Loader.Samsung.Scm private readonly Dictionary avbcFrequency = new Dictionary(); private readonly Dictionary dvbcFrequency = new Dictionary(); private readonly Dictionary dvbtFrequency = new Dictionary(); - + + private readonly string baseFolder; private byte[] avbtFileContent; private byte[] avbcFileContent; private byte[] avbxFileContent; @@ -57,8 +58,9 @@ namespace ChanSort.Loader.Samsung.Scm private Dictionary serviceProviderNames; #region ctor() - public ScmSerializer(string inputFile) : base(inputFile) + public ScmSerializer(string inputFile, string baseFolder = "") : base(inputFile) { + this.baseFolder = baseFolder; this.ReadConfigurationFromIniFile(); this.Features.ChannelNameEdit = ChannelNameEditMode.All; this.Features.DeleteMode = DeleteMode.FlagWithPrNr; @@ -113,27 +115,28 @@ namespace ChanSort.Loader.Samsung.Scm Features.FavoritesMode = c.SortedFavorites == FavoritesIndexMode.IndividuallySorted ? FavoritesMode.OrderedPerSource : FavoritesMode.Flags; Features.MaxFavoriteLists = c.numFavorites; - ReadAnalogFineTuning(this.TempPath); - ReadAnalogChannels(this.TempPath, "map-AirA", this.avbtChannels, out this.avbtFileContent, this.avbtFrequency); - ReadAnalogChannels(this.TempPath, "map-CableA", this.avbcChannels, out this.avbcFileContent, this.avbcFrequency); - ReadAnalogChannels(this.TempPath, "map-AirCableMixedA", this.avbxChannels, out this.avbxFileContent, this.avbcFrequency); - ReadDvbTransponderFrequenciesFromPtc(this.TempPath, "PTCAIR", this.dvbtFrequency); - ReadDvbServiceProviders(this.TempPath); - ReadDvbctChannels(this.TempPath, "map-AirD", this.dvbtChannels, out this.dvbtFileContent, this.dvbtFrequency); - ReadDvbTransponderFrequenciesFromPtc(this.TempPath, "PTCCABLE", this.dvbcFrequency); - ReadDvbctChannels(this.TempPath, "map-CableD", this.dvbcChannels, out this.dvbcFileContent, this.dvbcFrequency); - ReadDvbctChannels(this.TempPath, "map-AirCableMixedD", this.dvbxChannels, out this.dvbxFileContent, this.dvbcFrequency); - ReadDvbctChannels(this.TempPath, "map-CablePrime_D", this.primeChannels, out this.primeFileContent, this.dvbcFrequency); - ReadDvbctChannels(this.TempPath, "map-FreesatD", this.freesatChannels, out this.freesatFileContent, this.dvbcFrequency); - ReadDvbctChannels(this.TempPath, "map-TivusatD", this.tivusatChannels, out this.tivusatFileContent, this.dvbcFrequency); - ReadDvbctChannels(this.TempPath, "map-CanalDigitalSatD", this.canalDigitalChannels, out this.canalDigitalFileContent, this.dvbcFrequency); - ReadDvbctChannels(this.TempPath, "map-DigitalPlusD", this.digitalPlusChannels, out this.digitalPlusFileContent, this.dvbcFrequency); - ReadSatellites(this.TempPath); - ReadTransponder(this.TempPath, "UserTransponderDataBase.dat"); // read user data first so it has priority over overridden default transponsers - ReadTransponder(this.TempPath, "TransponderDataBase.dat"); - ReadDvbsChannels(this.TempPath, "map-SateD", this.dvbsChannels, out this.dvbsFileContent, c.dvbsChannelLength); - ReadDvbsChannels(this.TempPath, "map-CyfraPlusD", this.cyfraPlusChannels, out this.cyfraPlusFileContent, c.cyfraPlusChannelSize); - ReadAstraHdPlusChannels(this.TempPath); + var dataFolder = Path.Combine(this.TempPath, this.baseFolder); + ReadAnalogFineTuning(dataFolder); + ReadAnalogChannels(dataFolder, "map-AirA", this.avbtChannels, out this.avbtFileContent, this.avbtFrequency); + ReadAnalogChannels(dataFolder, "map-CableA", this.avbcChannels, out this.avbcFileContent, this.avbcFrequency); + ReadAnalogChannels(dataFolder, "map-AirCableMixedA", this.avbxChannels, out this.avbxFileContent, this.avbcFrequency); + ReadDvbTransponderFrequenciesFromPtc(dataFolder, "PTCAIR", this.dvbtFrequency); + ReadDvbServiceProviders(dataFolder); + ReadDvbctChannels(dataFolder, "map-AirD", this.dvbtChannels, out this.dvbtFileContent, this.dvbtFrequency); + ReadDvbTransponderFrequenciesFromPtc(dataFolder, "PTCCABLE", this.dvbcFrequency); + ReadDvbctChannels(dataFolder, "map-CableD", this.dvbcChannels, out this.dvbcFileContent, this.dvbcFrequency); + ReadDvbctChannels(dataFolder, "map-AirCableMixedD", this.dvbxChannels, out this.dvbxFileContent, this.dvbcFrequency); + ReadDvbctChannels(dataFolder, "map-CablePrime_D", this.primeChannels, out this.primeFileContent, this.dvbcFrequency); + ReadDvbctChannels(dataFolder, "map-FreesatD", this.freesatChannels, out this.freesatFileContent, this.dvbcFrequency); + ReadDvbctChannels(dataFolder, "map-TivusatD", this.tivusatChannels, out this.tivusatFileContent, this.dvbcFrequency); + ReadDvbctChannels(dataFolder, "map-CanalDigitalSatD", this.canalDigitalChannels, out this.canalDigitalFileContent, this.dvbcFrequency); + ReadDvbctChannels(dataFolder, "map-DigitalPlusD", this.digitalPlusChannels, out this.digitalPlusFileContent, this.dvbcFrequency); + ReadSatellites(dataFolder); + ReadTransponder(dataFolder, "UserTransponderDataBase.dat"); // read user data first so it has priority over overridden default transponsers + ReadTransponder(dataFolder, "TransponderDataBase.dat"); + ReadDvbsChannels(dataFolder, "map-SateD", this.dvbsChannels, out this.dvbsFileContent, c.dvbsChannelLength); + ReadDvbsChannels(dataFolder, "map-CyfraPlusD", this.cyfraPlusChannels, out this.cyfraPlusFileContent, c.cyfraPlusChannelSize); + ReadAstraHdPlusChannels(dataFolder); foreach (var list in this.DataRoot.ChannelLists) @@ -164,28 +167,42 @@ namespace ChanSort.Loader.Samsung.Scm #region DetectModelFromFileName() private bool DetectModelFromFileName() { - string file = Path.GetFileName(this.FileName)??""; - System.Text.RegularExpressions.Regex regex = - new System.Text.RegularExpressions.Regex("channel_list_([A-Z]{2}[0-9]{2}|BD-)([A-Z])[0-9A-Z]+_([0-9]{4}).*\\.scm"); - var match = regex.Match(file); - if (match.Success) + string series = null; + + // the known Orsay .zip files contain the same file format as the .scm E/F series + if (Path.GetExtension(this.FileName).ToLower() == ".zip") + series = "E"; + else { - string series; - switch (match.Groups[3].Value) + // for Samsung .scm files the number in the file name is an indicator for the firmware/file format version + string file = Path.GetFileName(this.FileName)??""; + System.Text.RegularExpressions.Regex regex = + new System.Text.RegularExpressions.Regex("channel_list_([A-Z]{2}[0-9]{2}|BD-)([A-Z])[0-9A-Z]+_([0-9]{4}).*\\.scm"); + var match = regex.Match(file); + if (match.Success) { - case "1001": series = "C"; break; - case "1101": series = "D"; break; - case "1201": - //var letter = match.Groups[2].Value; - // E, F, H and some J models use same file format - series = "E"; - break; - default: - return false; + switch (match.Groups[3].Value) + { + case "1001": + series = "C"; + break; + case "1101": + series = "D"; + break; + case "1201": + //var letter = match.Groups[2].Value; + // E, F, H and some J models use same file format + series = "E"; + break; + default: + return false; + } } - if (this.modelConstants.TryGetValue("Series:" + series, out this.c)) - return true; } + + if (series != null && this.modelConstants.TryGetValue("Series:" + series, out this.c)) + return true; + return false; } #endregion @@ -638,7 +655,7 @@ namespace ChanSort.Loader.Samsung.Scm #region Save() public override void Save(string tvOutputFile) { - string zip = this.TempPath; + var zip = Path.Combine(this.TempPath, this.baseFolder); this.SaveChannels(zip, "map-AirA", this.avbtChannels, this.avbtFileContent); this.SaveChannels(zip, "map-CableA", this.avbcChannels, this.avbcFileContent); this.SaveChannels(zip, "map-AirCableMixedA", this.avbxChannels, this.avbxFileContent); @@ -653,7 +670,7 @@ namespace ChanSort.Loader.Samsung.Scm this.SaveChannels(zip, "map-CanalDigitalSatD", this.canalDigitalChannels, this.canalDigitalFileContent); this.SaveChannels(zip, "map-DigitalPlusD", this.digitalPlusChannels, this.digitalPlusFileContent); this.SaveChannels(zip, "map-CyfraPlusD", this.cyfraPlusChannels, this.cyfraPlusFileContent); - this.ZipToOutputFile(tvOutputFile); + this.ZipToOutputFile(tvOutputFile, false); } #endregion diff --git a/source/ChanSort/Properties/licenses.licx b/source/ChanSort/Properties/licenses.licx index 6e5093b..919f908 100644 --- a/source/ChanSort/Properties/licenses.licx +++ b/source/ChanSort/Properties/licenses.licx @@ -1,5 +1,6 @@ -DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraEditors.PictureEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraEditors.Repository.RepositoryItemTextEdit, DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/source/ChanSort/ReferenceListForm.Designer.cs b/source/ChanSort/ReferenceListForm.Designer.cs index f4e28b5..64eb286 100644 --- a/source/ChanSort/ReferenceListForm.Designer.cs +++ b/source/ChanSort/ReferenceListForm.Designer.cs @@ -36,6 +36,7 @@ this.labelControl6 = new DevExpress.XtraEditors.LabelControl(); this.comboPrNr = new DevExpress.XtraEditors.ComboBoxEdit(); this.grpManual = new DevExpress.XtraEditors.GroupControl(); + this.cbData = new DevExpress.XtraEditors.CheckEdit(); this.cbConsecutive = new DevExpress.XtraEditors.CheckEdit(); this.cbIp = new DevExpress.XtraEditors.CheckEdit(); this.cbSat = new DevExpress.XtraEditors.CheckEdit(); @@ -56,7 +57,7 @@ this.groupControl2 = new DevExpress.XtraEditors.GroupControl(); this.labelControl10 = new DevExpress.XtraEditors.LabelControl(); this.labelControl8 = new DevExpress.XtraEditors.LabelControl(); - this.cbData = new DevExpress.XtraEditors.CheckEdit(); + this.xtraScrollableControl1 = new DevExpress.XtraEditors.XtraScrollableControl(); ((System.ComponentModel.ISupportInitialize)(this.edFile.Properties)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.rbAuto.Properties)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.rbManual.Properties)).BeginInit(); @@ -67,6 +68,7 @@ ((System.ComponentModel.ISupportInitialize)(this.comboPrNr.Properties)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.grpManual)).BeginInit(); this.grpManual.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.cbData.Properties)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.cbConsecutive.Properties)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.cbIp.Properties)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.cbSat.Properties)).BeginInit(); @@ -78,7 +80,7 @@ this.groupControl1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.groupControl2)).BeginInit(); this.groupControl2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.cbData.Properties)).BeginInit(); + this.xtraScrollableControl1.SuspendLayout(); this.SuspendLayout(); // // labelControl1 @@ -222,6 +224,14 @@ this.grpManual.Name = "grpManual"; this.grpManual.ShowCaption = false; // + // cbData + // + resources.ApplyResources(this.cbData, "cbData"); + this.cbData.Name = "cbData"; + this.cbData.Properties.AutoWidth = true; + this.cbData.Properties.Caption = resources.GetString("cbData.Properties.Caption"); + this.cbData.TabStop = false; + // // cbConsecutive // resources.ApplyResources(this.cbConsecutive, "cbConsecutive"); @@ -361,24 +371,21 @@ resources.ApplyResources(this.labelControl8, "labelControl8"); this.labelControl8.Name = "labelControl8"; // - // cbData + // xtraScrollableControl1 // - resources.ApplyResources(this.cbData, "cbData"); - this.cbData.Name = "cbData"; - this.cbData.Properties.AutoWidth = true; - this.cbData.Properties.Caption = resources.GetString("checkEdit1.Properties.Caption"); - this.cbData.TabStop = false; + resources.ApplyResources(this.xtraScrollableControl1, "xtraScrollableControl1"); + this.xtraScrollableControl1.Controls.Add(this.groupControl1); + this.xtraScrollableControl1.Controls.Add(this.groupControl2); + this.xtraScrollableControl1.Name = "xtraScrollableControl1"; // // ReferenceListForm // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnClose; - this.Controls.Add(this.groupControl2); - this.Controls.Add(this.groupControl1); + this.Controls.Add(this.xtraScrollableControl1); this.Controls.Add(this.btnClose); this.Controls.Add(this.btnOk); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "ReferenceListForm"; @@ -393,6 +400,7 @@ ((System.ComponentModel.ISupportInitialize)(this.grpManual)).EndInit(); this.grpManual.ResumeLayout(false); this.grpManual.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.cbData.Properties)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.cbConsecutive.Properties)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.cbIp.Properties)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.cbSat.Properties)).EndInit(); @@ -406,7 +414,7 @@ ((System.ComponentModel.ISupportInitialize)(this.groupControl2)).EndInit(); this.groupControl2.ResumeLayout(false); this.groupControl2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.cbData.Properties)).EndInit(); + this.xtraScrollableControl1.ResumeLayout(false); this.ResumeLayout(false); } @@ -449,5 +457,6 @@ private DevExpress.XtraEditors.HyperlinkLabelControl linkWiki; private DevExpress.XtraEditors.CheckEdit cbConsecutive; private DevExpress.XtraEditors.CheckEdit cbData; + private DevExpress.XtraEditors.XtraScrollableControl xtraScrollableControl1; } } \ No newline at end of file diff --git a/source/ChanSort/ReferenceListForm.resx b/source/ChanSort/ReferenceListForm.resx index b43e51b..7c2c702 100644 --- a/source/ChanSort/ReferenceListForm.resx +++ b/source/ChanSort/ReferenceListForm.resx @@ -159,7 +159,6 @@ - @Invariant -1 @@ -243,7 +242,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Automatically reorder all lists in the TV file - 221, 19 + 222, 20 0 @@ -270,7 +269,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Advanced reordering - 123, 19 + 124, 20 2 @@ -390,7 +389,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) TV - 34, 19 + 33, 18 15 @@ -414,7 +413,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Radio - 49, 19 + 48, 18 16 @@ -484,7 +483,6 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) 1 - @Invariant 123, 134 @@ -494,31 +492,24 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) 1 - @Invariant 100 - @Invariant 500 - @Invariant 1000 - @Invariant 2000 - @Invariant 5000 - @Invariant 7000 - @Invariant 140, 20 @@ -544,11 +535,11 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) 284, 109 - + Data/Other - 77, 19 + 76, 18 17 @@ -572,7 +563,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Use consecutive numbers (remove gaps from reference list Pr#) - 484, 19 + 484, 18 21 @@ -596,7 +587,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) IP (Network) - 83, 19 + 82, 18 10 @@ -620,7 +611,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Satellite - 60, 19 + 59, 18 9 @@ -668,7 +659,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Antenna - 63, 19 + 62, 18 7 @@ -692,7 +683,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Cable - 49, 19 + 48, 18 8 @@ -740,7 +731,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Analog - 55, 19 + 54, 18 12 @@ -764,7 +755,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Digital - 51, 19 + 50, 18 13 @@ -792,7 +783,6 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) - @Invariant lblTargetInfo @@ -817,7 +807,6 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) - @Invariant lblSourceInfo @@ -913,7 +902,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) Bottom, Right - 526, 662 + 525, 662 88, 23 @@ -934,13 +923,13 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) $this - 3 + 2 Bottom, Right - 621, 662 + 620, 662 88, 23 @@ -961,7 +950,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) $this - 2 + 1 Tahoma, 12pt @@ -991,7 +980,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) 0 - 12, 22 + 12, 12 696, 142 @@ -1009,10 +998,10 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...) DevExpress.XtraEditors.GroupControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - $this + xtraScrollableControl1 - 1 + 0 Tahoma, 12pt @@ -1074,7 +1063,7 @@ This step can be repeated as needed. 1 - 12, 184 + 12, 185 696, 456 @@ -1092,9 +1081,33 @@ This step can be repeated as needed. DevExpress.XtraEditors.GroupControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - $this + xtraScrollableControl1 + 1 + + + Top, Bottom, Left, Right + + + 0, 0 + + + 708, 646 + + + 4 + + + xtraScrollableControl1 + + + DevExpress.XtraEditors.XtraScrollableControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + + $this + + 0 @@ -1104,7 +1117,7 @@ This step can be repeated as needed. 6, 13 - 721, 697 + 720, 697 CenterParent diff --git a/source/changelog.md b/source/changelog.md index 80e1144..2458787 100644 --- a/source/changelog.md +++ b/source/changelog.md @@ -1,6 +1,12 @@ ChanSort Change Log =================== +2022-04-19 +- added support for Orsay .zip files which contain a Clone/map-AirD and other files similar to Samsung .scm +- Reference list dialog is now resizable +- Grundig dvb\*_config.xml lists are now separated into TV and Radio lists with individual ordering +- ability to load Grundig dvb\*\_config.xml files containing invalid XML characters (e.g. 0x10) + 2022-04-11 - added ChangHong/Chiq L32H7N dtv_cmdb_2.bin format (4419 KB size)