- 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)
This commit is contained in:
Horst Beham
2022-04-19 10:36:52 +02:00
parent 0ea5e0ff0c
commit 76d88c63cc
10 changed files with 214 additions and 103 deletions

View File

@@ -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

View File

@@ -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<FileData> fileDataList = new List<FileData>();
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);
}

View File

@@ -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 &amp; 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

View File

@@ -88,6 +88,7 @@
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>

View File

@@ -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;
}
}

View File

@@ -38,7 +38,8 @@ namespace ChanSort.Loader.Samsung.Scm
private readonly Dictionary<int, decimal> avbcFrequency = new Dictionary<int, decimal>();
private readonly Dictionary<int, decimal> dvbcFrequency = new Dictionary<int, decimal>();
private readonly Dictionary<int, decimal> dvbtFrequency = new Dictionary<int, decimal>();
private readonly string baseFolder;
private byte[] avbtFileContent;
private byte[] avbcFileContent;
private byte[] avbxFileContent;
@@ -57,8 +58,9 @@ namespace ChanSort.Loader.Samsung.Scm
private Dictionary<int, string> 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

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -159,7 +159,6 @@
</data>
<data name="edFile.Properties.Buttons1" xml:space="preserve">
<value />
<comment>@Invariant</comment>
</data>
<data name="edFile.Properties.Buttons2" type="System.Int32, mscorlib">
<value>-1</value>
@@ -243,7 +242,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Automatically reorder all lists in the TV file</value>
</data>
<data name="rbAuto.Size" type="System.Drawing.Size, System.Drawing">
<value>221, 19</value>
<value>222, 20</value>
</data>
<data name="rbAuto.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -270,7 +269,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Advanced reordering</value>
</data>
<data name="rbManual.Size" type="System.Drawing.Size, System.Drawing">
<value>123, 19</value>
<value>124, 20</value>
</data>
<data name="rbManual.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
@@ -390,7 +389,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>TV</value>
</data>
<data name="cbTv.Size" type="System.Drawing.Size, System.Drawing">
<value>34, 19</value>
<value>33, 18</value>
</data>
<data name="cbTv.TabIndex" type="System.Int32, mscorlib">
<value>15</value>
@@ -414,7 +413,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Radio</value>
</data>
<data name="cbRadio.Size" type="System.Drawing.Size, System.Drawing">
<value>49, 19</value>
<value>48, 18</value>
</data>
<data name="cbRadio.TabIndex" type="System.Int32, mscorlib">
<value>16</value>
@@ -484,7 +483,6 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
</data>
<data name="comboPrNr.EditValue" xml:space="preserve">
<value>1</value>
<comment>@Invariant</comment>
</data>
<data name="comboPrNr.Location" type="System.Drawing.Point, System.Drawing">
<value>123, 134</value>
@@ -494,31 +492,24 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
</data>
<data name="comboPrNr.Properties.Items" xml:space="preserve">
<value>1</value>
<comment>@Invariant</comment>
</data>
<data name="comboPrNr.Properties.Items1" xml:space="preserve">
<value>100</value>
<comment>@Invariant</comment>
</data>
<data name="comboPrNr.Properties.Items2" xml:space="preserve">
<value>500</value>
<comment>@Invariant</comment>
</data>
<data name="comboPrNr.Properties.Items3" xml:space="preserve">
<value>1000</value>
<comment>@Invariant</comment>
</data>
<data name="comboPrNr.Properties.Items4" xml:space="preserve">
<value>2000</value>
<comment>@Invariant</comment>
</data>
<data name="comboPrNr.Properties.Items5" xml:space="preserve">
<value>5000</value>
<comment>@Invariant</comment>
</data>
<data name="comboPrNr.Properties.Items6" xml:space="preserve">
<value>7000</value>
<comment>@Invariant</comment>
</data>
<data name="comboPrNr.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 20</value>
@@ -544,11 +535,11 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<data name="cbData.Location" type="System.Drawing.Point, System.Drawing">
<value>284, 109</value>
</data>
<data name="checkEdit1.Properties.Caption" xml:space="preserve">
<data name="cbData.Properties.Caption" xml:space="preserve">
<value>Data/Other</value>
</data>
<data name="cbData.Size" type="System.Drawing.Size, System.Drawing">
<value>77, 19</value>
<value>76, 18</value>
</data>
<data name="cbData.TabIndex" type="System.Int32, mscorlib">
<value>17</value>
@@ -572,7 +563,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Use consecutive numbers (remove gaps from reference list Pr#)</value>
</data>
<data name="cbConsecutive.Size" type="System.Drawing.Size, System.Drawing">
<value>484, 19</value>
<value>484, 18</value>
</data>
<data name="cbConsecutive.TabIndex" type="System.Int32, mscorlib">
<value>21</value>
@@ -596,7 +587,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>IP (Network)</value>
</data>
<data name="cbIp.Size" type="System.Drawing.Size, System.Drawing">
<value>83, 19</value>
<value>82, 18</value>
</data>
<data name="cbIp.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
@@ -620,7 +611,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Satellite</value>
</data>
<data name="cbSat.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 19</value>
<value>59, 18</value>
</data>
<data name="cbSat.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
@@ -668,7 +659,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Antenna</value>
</data>
<data name="cbAntenna.Size" type="System.Drawing.Size, System.Drawing">
<value>63, 19</value>
<value>62, 18</value>
</data>
<data name="cbAntenna.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
@@ -692,7 +683,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Cable</value>
</data>
<data name="cbCable.Size" type="System.Drawing.Size, System.Drawing">
<value>49, 19</value>
<value>48, 18</value>
</data>
<data name="cbCable.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
@@ -740,7 +731,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Analog</value>
</data>
<data name="cbAnalog.Size" type="System.Drawing.Size, System.Drawing">
<value>55, 19</value>
<value>54, 18</value>
</data>
<data name="cbAnalog.TabIndex" type="System.Int32, mscorlib">
<value>12</value>
@@ -764,7 +755,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Digital</value>
</data>
<data name="cbDigital.Size" type="System.Drawing.Size, System.Drawing">
<value>51, 19</value>
<value>50, 18</value>
</data>
<data name="cbDigital.TabIndex" type="System.Int32, mscorlib">
<value>13</value>
@@ -792,7 +783,6 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
</data>
<data name="lblTargetInfo.Text" xml:space="preserve">
<value> </value>
<comment>@Invariant</comment>
</data>
<data name="&gt;&gt;lblTargetInfo.Name" xml:space="preserve">
<value>lblTargetInfo</value>
@@ -817,7 +807,6 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
</data>
<data name="lblSourceInfo.Text" xml:space="preserve">
<value> </value>
<comment>@Invariant</comment>
</data>
<data name="&gt;&gt;lblSourceInfo.Name" xml:space="preserve">
<value>lblSourceInfo</value>
@@ -913,7 +902,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>Bottom, Right</value>
</data>
<data name="btnOk.Location" type="System.Drawing.Point, System.Drawing">
<value>526, 662</value>
<value>525, 662</value>
</data>
<data name="btnOk.Size" type="System.Drawing.Size, System.Drawing">
<value>88, 23</value>
@@ -934,13 +923,13 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>$this</value>
</data>
<data name="&gt;&gt;btnOk.ZOrder" xml:space="preserve">
<value>3</value>
<value>2</value>
</data>
<data name="btnClose.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="btnClose.Location" type="System.Drawing.Point, System.Drawing">
<value>621, 662</value>
<value>620, 662</value>
</data>
<data name="btnClose.Size" type="System.Drawing.Size, System.Drawing">
<value>88, 23</value>
@@ -961,7 +950,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>$this</value>
</data>
<data name="&gt;&gt;btnClose.ZOrder" xml:space="preserve">
<value>2</value>
<value>1</value>
</data>
<data name="groupControl1.AppearanceCaption.Font" type="System.Drawing.Font, System.Drawing">
<value>Tahoma, 12pt</value>
@@ -991,7 +980,7 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>0</value>
</data>
<data name="groupControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 22</value>
<value>12, 12</value>
</data>
<data name="groupControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>696, 142</value>
@@ -1009,10 +998,10 @@ or a data file from another TV (SCM, TLL, DB, BIN, ...)</value>
<value>DevExpress.XtraEditors.GroupControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;groupControl1.Parent" xml:space="preserve">
<value>$this</value>
<value>xtraScrollableControl1</value>
</data>
<data name="&gt;&gt;groupControl1.ZOrder" xml:space="preserve">
<value>1</value>
<value>0</value>
</data>
<data name="groupControl2.AppearanceCaption.Font" type="System.Drawing.Font, System.Drawing">
<value>Tahoma, 12pt</value>
@@ -1074,7 +1063,7 @@ This step can be repeated as needed.</value>
<value>1</value>
</data>
<data name="groupControl2.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 184</value>
<value>12, 185</value>
</data>
<data name="groupControl2.Size" type="System.Drawing.Size, System.Drawing">
<value>696, 456</value>
@@ -1092,9 +1081,33 @@ This step can be repeated as needed.</value>
<value>DevExpress.XtraEditors.GroupControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;groupControl2.Parent" xml:space="preserve">
<value>$this</value>
<value>xtraScrollableControl1</value>
</data>
<data name="&gt;&gt;groupControl2.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="xtraScrollableControl1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="xtraScrollableControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="xtraScrollableControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>708, 646</value>
</data>
<data name="xtraScrollableControl1.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;xtraScrollableControl1.Name" xml:space="preserve">
<value>xtraScrollableControl1</value>
</data>
<data name="&gt;&gt;xtraScrollableControl1.Type" xml:space="preserve">
<value>DevExpress.XtraEditors.XtraScrollableControl, DevExpress.Utils.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;xtraScrollableControl1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;xtraScrollableControl1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
@@ -1104,7 +1117,7 @@ This step can be repeated as needed.</value>
<value>6, 13</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>721, 697</value>
<value>720, 697</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterParent</value>

View File

@@ -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)