diff --git a/source/ChanSort.Loader.Panasonic/DbChannel.cs b/source/ChanSort.Loader.Panasonic/DbChannel.cs index 0d889c1..bb7dc42 100644 --- a/source/ChanSort.Loader.Panasonic/DbChannel.cs +++ b/source/ChanSort.Loader.Panasonic/DbChannel.cs @@ -9,6 +9,8 @@ namespace ChanSort.Loader.Panasonic internal class DbChannel : ChannelInfo { internal byte[] RawName; + internal bool NonAscii; + internal bool ValidUtf8 = true; #region ctor() internal DbChannel(SQLiteDataReader r, IDictionary field, DataRoot dataRoot, Encoding encoding) @@ -157,19 +159,32 @@ namespace ChanSort.Loader.Panasonic // single byte code pages might have UTF-8 code mixed in, so we have to parse it manually StringBuilder sb = new StringBuilder(); + this.NonAscii = false; + this.ValidUtf8 = true; for (int i = startOffset; i < this.RawName.Length; i+=bytesPerChar) { byte c = this.RawName[i]; byte c2 = i + 1 < this.RawName.Length ? this.RawName[i + 1] : (byte)0; - if (c < 0xA0) - sb.Append((char)c); + if (c >= 0x80) + NonAscii = true; + + if (c < 0x80) + sb.Append((char) c); + else if (c < 0xA0) + { + ValidUtf8 = false; + sb.Append((char) c); + } else if (bytesPerChar == 1 && c >= 0xC0 && c <= 0xDF && c2 >= 0x80 && c2 <= 0xBF) // 2 byte UTF-8 { sb.Append((char)(((c & 0x1F) << 6) | (c2 & 0x3F))); ++i; } else + { + ValidUtf8 = false; sb.Append(encoding.GetString(this.RawName, i, bytesPerChar)); + } } string longName, shortName; @@ -240,14 +255,19 @@ namespace ChanSort.Loader.Panasonic #endregion #region UpdateRawData() - public override void UpdateRawData() + public void UpdateRawData(bool explicitUtf8, bool implicitUtf8) { if (IsNameModified) { var utf8 = Encoding.UTF8.GetBytes(this.Name); - this.RawName = new byte[utf8.Length + 1]; - this.RawName[0] = 0x15; // DVB encoding ID for UTF8 - Array.Copy(utf8, 0, this.RawName, 1, utf8.Length); + if (implicitUtf8) + this.RawName = utf8; + else if (explicitUtf8) + { + this.RawName = new byte[utf8.Length + 1]; + this.RawName[0] = 0x15; // DVB encoding ID for UTF8 + Array.Copy(utf8, 0, this.RawName, 1, utf8.Length); + } } } #endregion diff --git a/source/ChanSort.Loader.Panasonic/Serializer.cs b/source/ChanSort.Loader.Panasonic/Serializer.cs index b0c90d8..c5cedec 100644 --- a/source/ChanSort.Loader.Panasonic/Serializer.cs +++ b/source/ChanSort.Loader.Panasonic/Serializer.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Data; using System.Data.SQLite; -using System.Drawing; using System.IO; using System.Text; using ChanSort.Api; @@ -26,6 +25,8 @@ namespace ChanSort.Loader.Panasonic private int dbSizeOffset; private bool littleEndianByteOrder; private string charEncoding; + private bool explicitUtf8; + private bool implicitUtf8; enum CypherMode { @@ -250,6 +251,7 @@ order by s.ntype,major_channel var fields = this.GetFieldMap(fieldNames); cmd.CommandText = sql; + this.implicitUtf8 = true; using (var r = cmd.ExecuteReader()) { while (r.Read()) @@ -258,12 +260,17 @@ order by s.ntype,major_channel if (!channel.IsDeleted) { if (channel.RawName.Length > 0 && channel.RawName[0] == 0x15) // if there is a channel with a 0x15 encoding ID (UTF-8), we can allow editing channels - this.Features.ChannelNameEdit = ChannelNameEditMode.All; + this.explicitUtf8 = true; + if (channel.NonAscii) // if all channels with non-ascii characters are valid UTF-8 strings, we can allow editing too + this.implicitUtf8 &= channel.ValidUtf8; var channelList = this.DataRoot.GetChannelList(channel.SignalSource); this.DataRoot.AddChannel(channelList, channel); } } } + + if (this.explicitUtf8 || this.implicitUtf8) + this.Features.ChannelNameEdit = ChannelNameEditMode.All; } #endregion @@ -346,7 +353,7 @@ order by s.ntype,major_channel continue; if (channel.IsDeleted && channel.OldProgramNr >= 0) continue; - channel.UpdateRawData(); + channel.UpdateRawData(this.explicitUtf8, this.implicitUtf8); cmd.Parameters["@rowid"].Value = channel.RecordIndex; cmd.Parameters["@progNr"].Value = channel.NewProgramNr; cmd.Parameters["@sname"].Value = channel.RawName; diff --git a/source/ChanSort/MainForm.Designer.cs b/source/ChanSort/MainForm.Designer.cs index 49fa20a..f1be54d 100644 --- a/source/ChanSort/MainForm.Designer.cs +++ b/source/ChanSort/MainForm.Designer.cs @@ -1491,12 +1491,12 @@ new DevExpress.XtraBars.LinkPersistInfo(this.miCzech), new DevExpress.XtraBars.LinkPersistInfo(this.miGerman), new DevExpress.XtraBars.LinkPersistInfo(this.miSpanish), + new DevExpress.XtraBars.LinkPersistInfo(this.miHungarian), new DevExpress.XtraBars.LinkPersistInfo(this.miPolski), new DevExpress.XtraBars.LinkPersistInfo(this.miPortuguese), new DevExpress.XtraBars.LinkPersistInfo(this.miRomanian), new DevExpress.XtraBars.LinkPersistInfo(this.miRussian), - new DevExpress.XtraBars.LinkPersistInfo(this.miTurkish), - new DevExpress.XtraBars.LinkPersistInfo(this.miHungarian)}); + new DevExpress.XtraBars.LinkPersistInfo(this.miTurkish)}); this.barSubItem1.Name = "barSubItem1"; this.barSubItem1.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionInMenu; // @@ -1597,7 +1597,7 @@ this.miHungarian.ButtonStyle = DevExpress.XtraBars.BarButtonStyle.Check; resources.ApplyResources(this.miHungarian, "miHungarian"); this.miHungarian.Id = 111; - this.miHungarian.ImageOptions.ImageIndex = ((int)(resources.GetObject("barButtonItem1.ImageOptions.ImageIndex"))); + this.miHungarian.ImageOptions.ImageIndex = ((int)(resources.GetObject("miHungarian.ImageOptions.ImageIndex"))); this.miHungarian.Name = "miHungarian"; this.miHungarian.Tag = "hu-HU"; this.miHungarian.DownChanged += new DevExpress.XtraBars.ItemClickEventHandler(this.miLanguage_DownChanged); diff --git a/source/ChanSort/MainForm.resx b/source/ChanSort/MainForm.resx index 9f4fc54..43e0bfe 100644 --- a/source/ChanSort/MainForm.resx +++ b/source/ChanSort/MainForm.resx @@ -279,7 +279,7 @@ gridLeft - ChanSort.XGridControl, ChanSort, Version=1.0.7644.32206, Culture=neutral, PublicKeyToken=null + ChanSort.XGridControl, ChanSort, Version=1.0.7665.29929, Culture=neutral, PublicKeyToken=null grpOutputList @@ -615,6 +615,13 @@ 44 + + Magyar + @Invariant + + + 47 + Polski @Invariant @@ -650,13 +657,6 @@ 46 - - Magyar - @Invariant - - - 47 - &Character set @@ -1229,7 +1229,7 @@ gviewLeft - ChanSort.XGridView, ChanSort, Version=1.0.7644.32206, Culture=neutral, PublicKeyToken=null + ChanSort.XGridView, ChanSort, Version=1.0.7665.29929, Culture=neutral, PublicKeyToken=null colIndex1 @@ -1313,13 +1313,13 @@ globalImageCollection1 - ChanSort.Ui.GlobalImageCollection, ChanSort, Version=1.0.7644.32206, Culture=neutral, PublicKeyToken=null + ChanSort.Ui.GlobalImageCollection, ChanSort, Version=1.0.7665.29929, Culture=neutral, PublicKeyToken=null gviewRight - ChanSort.XGridView, ChanSort, Version=1.0.7644.32206, Culture=neutral, PublicKeyToken=null + ChanSort.XGridView, ChanSort, Version=1.0.7665.29929, Culture=neutral, PublicKeyToken=null colIndex @@ -2066,7 +2066,7 @@ DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v20.1, Version=20.1.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - 12/05/2020 17:57:36 + 12/26/2020 17:01:09 16, 16 @@ -2891,7 +2891,7 @@ gridRight - ChanSort.XGridControl, ChanSort, Version=1.0.7644.32206, Culture=neutral, PublicKeyToken=null + ChanSort.XGridControl, ChanSort, Version=1.0.7665.29929, Culture=neutral, PublicKeyToken=null grpInputList diff --git a/source/changelog.md b/source/changelog.md index 3f42640..fd5c45e 100644 --- a/source/changelog.md +++ b/source/changelog.md @@ -1,6 +1,9 @@ ChanSort Change Log =================== +2020-12-26_2 +- Panasonic: channel name editing is now supported when all channels implicitly use valid utf-8 encoding + 2020-12-26 - LG WebOS 5: added warning that support is only experimental. - Panasonic: Channel name editing is now supported for svl.bin files (unless there is no indicator what encoding to use)