diff --git a/source/ChanSort.Api/Controller/Editor.cs b/source/ChanSort.Api/Controller/Editor.cs index d259253..a934288 100644 --- a/source/ChanSort.Api/Controller/Editor.cs +++ b/source/ChanSort.Api/Controller/Editor.cs @@ -402,5 +402,24 @@ namespace ChanSort.Api } #endregion + + #region SequentializeFavPos() + /// + /// Put the numbers in channel.FavIndex[i] in a sequential order, starting with 1 + /// + /// + /// Number of favorite lists (i=0..favCount-1) + public static void SequentializeFavPos(ChannelList channelList, int favCount) + { + for (int fav = 0; fav < favCount; fav++) + { + var list = channelList.Channels.Where(c => c.FavIndex[fav] >= 0).OrderBy(c => c.FavIndex[fav]).ToList(); + int i = 0; + foreach (var channel in list) + channel.FavIndex[fav] = ++i; + } + } + #endregion + } } diff --git a/source/ChanSort.Loader.Hisense/ChanSort.Loader.Hisense.csproj b/source/ChanSort.Loader.Hisense/ChanSort.Loader.Hisense.csproj index 01885a8..100143d 100644 --- a/source/ChanSort.Loader.Hisense/ChanSort.Loader.Hisense.csproj +++ b/source/ChanSort.Loader.Hisense/ChanSort.Loader.Hisense.csproj @@ -66,8 +66,8 @@ - - + + diff --git a/source/ChanSort.Loader.Hisense/HisSerializer.cs b/source/ChanSort.Loader.Hisense/DbSerializer.cs similarity index 87% rename from source/ChanSort.Loader.Hisense/HisSerializer.cs rename to source/ChanSort.Loader.Hisense/DbSerializer.cs index bce34c5..ca19167 100644 --- a/source/ChanSort.Loader.Hisense/HisSerializer.cs +++ b/source/ChanSort.Loader.Hisense/DbSerializer.cs @@ -3,11 +3,12 @@ using System.Collections.Generic; using System.Data; using ChanSort.Api; using System.Data.SQLite; +using System.Text; using System.Text.RegularExpressions; namespace ChanSort.Loader.Hisense { - public class HisSerializer : SerializerBase + public class DbSerializer : SerializerBase { public override string DisplayName => "Hisense *.db Loader"; @@ -32,7 +33,7 @@ namespace ChanSort.Loader.Hisense #region ctor() - public HisSerializer(string inputFile) : base(inputFile) + public DbSerializer(string inputFile) : base(inputFile) { DepencencyChecker.AssertVc2010RedistPackageX86Installed(); @@ -324,55 +325,38 @@ namespace ChanSort.Loader.Hisense int x = (int)((ulong)ci.RecordIndex >> 32); // the table number is kept in the higher 32 bits int id = (int)(ci.RecordIndex & 0xFFFFFFFF); // the record id is kept in the lower 32 bits - if (ci.NewProgramNr != ci.OldProgramNr) - { - if (ci.NewProgramNr >= 0) - { - cmd.CommandText = $"update svl_{x} set channel_id=(channel_id & {0xFFFC}) | @chnr, option_mask=option_mask | " + ((int) OptionMask.ChNumEdited) + " where svl_rec_id=@id"; - cmd.Parameters.Clear(); - cmd.Parameters.Add("@id", DbType.Int32); - cmd.Parameters.Add("@chnr", DbType.Int32); - cmd.Parameters["@id"].Value = id; - cmd.Parameters["@chnr"].Value = ci.NewProgramNr << 18; - cmd.ExecuteNonQuery(); - } - else - { - cmd.CommandText = $"update svl_{x} set nw_mask=nw_mask | " + ((int)OptionMask.DeletedByUser) + " where svl_rec_id=@id"; - cmd.Parameters.Clear(); - cmd.Parameters.Add("@id", DbType.Int32); - cmd.Parameters.Add("@fav", DbType.Int32); - cmd.Parameters["@id"].Value = id; - cmd.Parameters["@fav"].Value = ((int)ci.Favorites & 0x0F) << 4; - cmd.ExecuteNonQuery(); - } - } - - if (ci.IsNameModified) - { - cmd.CommandText = $"update svl_{x} set name=@name, option_mask=option_mask|" + ((int)OptionMask.NameEdited) + " where svl_rec_id=@id"; - cmd.Parameters.Clear(); - cmd.Parameters.Add("@id", DbType.Int32); - cmd.Parameters.Add("@name", DbType.String); - cmd.Parameters["@id"].Value = id; - cmd.Parameters["@name"].Value = ci.Name; - cmd.ExecuteNonQuery(); - } - var resetFlags = NwMask.Fav1 | NwMask.Fav2 | NwMask.Fav3 | NwMask.Fav4 | NwMask.Lock | NwMask.Visible; var setFlags = (NwMask)(((int)ci.Favorites & 0x0F) << 4); if (ci.Lock) setFlags |= NwMask.Lock; if (!ci.Hidden) setFlags |= NwMask.Visible; - cmd.CommandText = $"update svl_{x} set nw_mask=(nw_mask & @resetFlags)|@setFlags where svl_rec_id=@id"; - cmd.Parameters.Clear(); - cmd.Parameters.Add("@id", DbType.Int32); - cmd.Parameters.Add("@resetFlags", DbType.Int32); - cmd.Parameters.Add("@setFlags", DbType.Int32); - cmd.Parameters["@id"].Value = id; - cmd.Parameters["@resetFlags"].Value = ~(int)resetFlags; - cmd.Parameters["@setFlags"].Value = (int)setFlags; - cmd.ExecuteNonQuery(); + //if (ci.NewProgramNr >= 0) + { + cmd.CommandText = $"update svl_{x} set channel_id=(channel_id&{0xFFFC})|@chnr, name=cast(@name as varchar), " + + $"option_mask=option_mask|{(int)(OptionMask.ChNumEdited|OptionMask.NameEdited)}, nw_mask=(nw_mask&@resetFlags)|@setFlags where svl_rec_id=@id"; + cmd.Parameters.Clear(); + cmd.Parameters.Add("@id", DbType.Int32); + cmd.Parameters.Add("@chnr", DbType.Int32); + cmd.Parameters.Add("@name", DbType.Binary); + cmd.Parameters.Add("@resetFlags", DbType.Int32); + cmd.Parameters.Add("@setFlags", DbType.Int32); + cmd.Parameters["@id"].Value = id; + cmd.Parameters["@chnr"].Value = ci.NewProgramNr << 18; + cmd.Parameters["@name"].Value = Encoding.BigEndianUnicode.GetBytes(ci.Name); + cmd.Parameters["@resetFlags"].Value = ~(int)resetFlags; + cmd.Parameters["@setFlags"].Value = (int)setFlags; + cmd.ExecuteNonQuery(); + } + //else + //{ + // cmd.CommandText = $"update svl_{x} set nw_mask=nw_mask | " + ((int)OptionMask.DeletedByUser) + " where svl_rec_id=@id"; + // cmd.Parameters.Clear(); + // cmd.Parameters.Add("@id", DbType.Int32); + // cmd.Parameters.Add("@fav", DbType.Int32); + // cmd.Parameters["@id"].Value = id; + // cmd.Parameters["@fav"].Value = ((int)ci.Favorites & 0x0F) << 4; + // cmd.ExecuteNonQuery(); + //} } #endregion diff --git a/source/ChanSort.Loader.Hisense/HisSerializerPlugin.cs b/source/ChanSort.Loader.Hisense/DbSerializerPlugin.cs similarity index 84% rename from source/ChanSort.Loader.Hisense/HisSerializerPlugin.cs rename to source/ChanSort.Loader.Hisense/DbSerializerPlugin.cs index be10f5b..1f763d4 100644 --- a/source/ChanSort.Loader.Hisense/HisSerializerPlugin.cs +++ b/source/ChanSort.Loader.Hisense/DbSerializerPlugin.cs @@ -10,7 +10,7 @@ using ChanSort.Api; namespace ChanSort.Loader.Hisense { #if HISENSE_ENABLED - public class HisSerializerPlugin : ISerializerPlugin + public class DbSerializerPlugin : ISerializerPlugin { public string PluginName => "Hisense *.db"; public string FileFilter => "channel.db"; @@ -18,7 +18,7 @@ namespace ChanSort.Loader.Hisense #region CreateSerializer() public SerializerBase CreateSerializer(string inputFile) { - return new HisSerializer(inputFile); + return new DbSerializer(inputFile); } #endregion } diff --git a/source/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.ini b/source/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.ini index 8a8e673..c7d4397 100644 --- a/source/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.ini +++ b/source/ChanSort.Loader.Samsung/ChanSort.Loader.Samsung.ini @@ -1,4 +1,5 @@ [Series:B] + ; "Clone" directory: must be manually zipped and renamed to .scm, favorites 1-4 are stored in a bitmask SatDataBase.dat = 145 TransponderDataBase.dat = 49 FineTune = 20 @@ -11,7 +12,7 @@ Favorites = 4 [Series:C] - ; _1001 format. favorites A-D are stored in a bitmask + ; _1001.scm format: favorites 1-4 are stored in a bitmask SatDataBase.dat = 145 TransponderDataBase.dat = 45 PTC = 12 @@ -22,7 +23,7 @@ Favorites = 4 [Series:D] - ; _1101 format. favorite A-E have individual number fields, but only allow 0 = not-a-fav, 1=is-a-fav + ; _1101.scm format: favorite 1-5 have individual number fields, but only allow 0 = not-a-fav, 1=is-a-fav SatDataBase.dat = 145 TransponderDataBase.dat = 45 PTC = 12 @@ -35,8 +36,8 @@ SortedFavorites = 0 [Series:E] - ; _1201 format with favorites A-E and individual numbering (-1 = not-a-fav, 0...x = fav program nr) - ; used by E models + ; _1201.scm format: with favorites 1-5 and individual numbering (-1 = not-a-fav, 1...x = [sequential?] fav nr) + ; used by E , F, H, some J models and LTxxBxxx, LTxxCxxx, HExxCxxx, ... SatDataBase.dat = 145 TransponderDataBase.dat = 45 PTC = 12 @@ -47,26 +48,15 @@ map-AstraHDPlusD = 212 map-CyfraPlusD = 172 Favorites = 5 + ; SortedFavorites: 1=allow individual ordering of each list, 2=force all lists to use the main program nr + ; some models don't seem to work correctly when the fav and prog numbers are different. SortedFavorites = 1 -[Series:F] - ; _1201 format with favorites A-E, but forced to use same numbers as main program number (-1 = not-a-fav, 0...x = main program nr) - ; used by F, H, low-end J and HExxC models - SatDataBase.dat = 145 - TransponderDataBase.dat = 45 - PTC = 12 - map-AirA = 64 - map-AirD = 320 - map-CableD = 320 - map-SateD = 168 - map-AstraHDPlusD = 212 - map-CyfraPlusD = 172 - Favorites = 5 - SortedFavorites = 2 + [Analog:28] - ; map-AirA and map-CableA for B series + ; map-AirA and map-CableA for B models offInUse = 0 maskInUse = 0x02 offProgramNr = 4 @@ -77,7 +67,7 @@ offChecksum = 27 [Analog:40] - ; map-AirA and map-CableA for C series + ; map-AirA and map-CableA for C models offInUse = 1 maskInUse = 0x01 offDeleted = 2 @@ -96,7 +86,7 @@ offChecksum = 39 [Analog:64] - ; map-AirA and map-CableA for D,E and F series + ; map-AirA and map-CableA for D,E,F,H,J models offInUse = 1 maskInUse = 0x01 offDeleted = 2 @@ -137,7 +127,7 @@ offName = 8 [DvbCT:248] - ; map-AirD and map-CableD for B series + ; map-AirD and map-CableD for B models offProgramNr = 0 offVideoPid = 2 offPcrPid = 4 @@ -166,7 +156,7 @@ offChecksum = 247 [DvbCT:292] - ; map-AirD and map-CableD for C series + ; map-AirD and map-CableD for C models offProgramNr = 0 offVideoPid = 2 offPcrPid = 4 @@ -202,7 +192,7 @@ [DvbCT:320] - ; map-AirD, map-CableD, Freesat for D,E and F series + ; map-AirD, map-CableD, Freesat for D,E,F,H,J models offProgramNr = 0 offVideoPid = 2 offPcrPid = 4 @@ -237,7 +227,7 @@ offChecksum = 319 [TransponderDataBase.dat:49] - ; B Series + ; B models offMagicByte = 0 offTransponderIndex = 1 offSatelliteIndex = 5 @@ -245,7 +235,7 @@ offSymbolRate = 17 [TransponderDataBase.dat:45] - ; C,D,E Series + ; C,D,E,F,H,J models offMagicByte = 0 offTransponderIndex = 1 offSatelliteIndex = 5 @@ -253,7 +243,7 @@ offSymbolRate = 13 [DvbS:144] - ; map-SateD for B and C Series + ; map-SateD for B and C models offProgramNr = 0 offVideoPid = 2 offPcrPid = 4 @@ -279,7 +269,7 @@ offChecksum = 143 [DvbS:172] - ; map-SateD for D Series + ; map-SateD for D models offProgramNr = 0 offVideoPid = 2 offPcrPid = 4 @@ -305,7 +295,7 @@ offChecksum = 171 [DvbS:168] - ; map-SateD for E and F Series + ; map-SateD for E,F,H,J models offProgramNr = 0 offVideoPid = 2 offPcrPid = 4 @@ -331,7 +321,7 @@ offChecksum = 167 [AstraHDPlusD:212] - ; map-AstraHDPlusD for D, E and F Series + ; map-AstraHDPlusD for D,E,F,H,J models offProgramNr = 0,20 offVideoPid=2 offPcrId=4 diff --git a/source/ChanSort.Loader.Samsung/ScmSerializer.cs b/source/ChanSort.Loader.Samsung/ScmSerializer.cs index 848907a..5973d82 100644 --- a/source/ChanSort.Loader.Samsung/ScmSerializer.cs +++ b/source/ChanSort.Loader.Samsung/ScmSerializer.cs @@ -163,10 +163,9 @@ namespace ChanSort.Loader.Samsung case "1001": series = "C"; break; case "1101": series = "D"; break; case "1201": - var letter = match.Groups[2].Value; - // E, F, H and low-end J series use same file format - // E however allows individually sorted favorites while the other require the fav number to be equal to the main program nr - series = letter == "E" ? "E" : "F"; + //var letter = match.Groups[2].Value; + // E, F, H and some J models use same file format + series = "E"; break; default: return false; @@ -191,12 +190,12 @@ namespace ChanSort.Loader.Samsung if (cloneInfo.Length >= 9) { char series = (char) cloneInfo[8]; - if (series == 'B') // LTxxBxxx uses E/F format. the old B-series has no CloneInfo file, so we can tell the difference - series = 'F'; - else if (series == 'C') // there are models with a C that are actually F: LTxxCxxx, HExxCxxx, ... so we can't decide here + if (series == 'B') // LTxxBxxx uses 1201 format. The 2009 B-models have no CloneInfo file, so we can tell the difference + series = 'E'; + else if (series == 'C') // "C" usually means 1001 format, but there some with 1201 format: LTxxCxxx, HExxCxxx, ... so we can't decide here return false; - else if (series >= 'F') // F, H, low-end J - series = 'F'; + else if (series >= 'E') // E, F, H, some J + series = 'E'; if (this.modelConstants.TryGetValue("Series:" + series, out this.c)) return true; } @@ -215,7 +214,7 @@ namespace ChanSort.Loader.Samsung DetectModelFromAstraHdPlusD(zip) }; - // E, F, B(2013), H, low-end J series use an identical format, so we only care about one here + // E, F, H, some J and a few others use an identical format, which we all treat as "E" string validCandidates = "BCDE"; foreach (var candidateList in candidates) { @@ -234,8 +233,6 @@ namespace ChanSort.Loader.Samsung return false; var series = validCandidates[0]; - if (series == 'E') // E allows favorites to be individually sorted, while F-J require them to match the main program nr - series = 'F'; // since we can't tell the difference from the format, we use the safe F/H/J logic, which also works for E this.modelConstants.TryGetValue("Series:" + series, out this.c); return true; } diff --git a/source/ChanSort.Loader.SamsungJ/DbChannel.cs b/source/ChanSort.Loader.SamsungJ/DbChannel.cs index a620378..232635b 100644 --- a/source/ChanSort.Loader.SamsungJ/DbChannel.cs +++ b/source/ChanSort.Loader.SamsungJ/DbChannel.cs @@ -6,11 +6,8 @@ namespace ChanSort.Loader.SamsungJ { internal class DbChannel : ChannelInfo { -#if INDIVIDUALLY_SORTED_FAVS - internal Dictionary OriginalFavIndex = new Dictionary(); -#else + internal List OriginalFavIndex = new List { -1, -1, -1, -1 , -1 }; internal Favorites OriginalFavs; -#endif #region ctor() internal DbChannel(SQLiteDataReader r, IDictionary field, DataRoot dataRoot, Dictionary providers, Satellite sat, Transponder tp) @@ -50,6 +47,7 @@ namespace ChanSort.Loader.SamsungJ base.IsDeleted = this.OldProgramNr == -1; } + #endregion #region ReadAnalogData() diff --git a/source/ChanSort.Loader.SamsungJ/DbSerializer.cs b/source/ChanSort.Loader.SamsungJ/DbSerializer.cs index e944336..c68d6d7 100644 --- a/source/ChanSort.Loader.SamsungJ/DbSerializer.cs +++ b/source/ChanSort.Loader.SamsungJ/DbSerializer.cs @@ -25,9 +25,9 @@ namespace ChanSort.Loader.SamsungJ DepencencyChecker.AssertVc2010RedistPackageX86Installed(); this.Features.ChannelNameEdit = ChannelNameEditMode.All; - this.Features.CanDeleteChannels = false; + this.Features.CanDeleteChannels = true; this.DataRoot.SupportedFavorites = Favorites.A | Favorites.B | Favorites.C | Favorites.D | Favorites.E; - this.DataRoot.SortedFavorites = false; + this.DataRoot.SortedFavorites = true; } #endregion @@ -268,14 +268,8 @@ namespace ChanSort.Loader.SamsungJ "SRV.srvId", "major", "progNum", "cast(srvName as blob)", "srvType", "hidden", "scrambled", "lockMode", "numSel", // SRV }; if (digital) - { fieldNames.AddRange(new[] {"onid", "tsid", "vidPid", "provId", "cast(shrtSrvName as blob)", "lcn"}); // SRV_DVB - // make LCN-based channel lists read-only - cmd.CommandText = "select count(1) from SRV_DVB where lcn<>65535"; - channelList.ReadOnly = (long)cmd.ExecuteScalar() > 0; - } - var sql = this.BuildQuery(table, fieldNames); var fields = this.GetFieldMap(fieldNames); @@ -410,15 +404,14 @@ namespace ChanSort.Loader.SamsungJ var channel = this.channelById.TryGet(r.GetInt64(0)); if (channel == null) continue; - int fav = r.GetInt32(1) - 1; - int pos = r.GetInt32(2); + int fav = r.GetInt32(1) - 1; // fav values start with 1 in the table + int pos = r.GetInt32(2); // pos values start with 0 if (pos >= 0) + { channel.Favorites |= (Favorites) (1 << fav); -#if INDIVIDUALLY_SORTED_FAVS - channel.FavIndex[fav] = channel.OriginalFavIndex[fav] = pos; -#else - channel.OriginalFavs = channel.Favorites; -#endif + channel.OriginalFavs = channel.Favorites; + channel.FavIndex[fav] = channel.OriginalFavIndex[fav] = pos + 1; + } } } #endregion @@ -477,6 +470,7 @@ namespace ChanSort.Loader.SamsungJ { using (var trans = conn.BeginTransaction()) { + Editor.SequentializeFavPos(channelList, 5); this.WriteChannels(cmdUpdateSrv, cmdDeleteSrv, cmdInsertFav, cmdUpdateFav, cmdDeleteFav, channelList); trans.Commit(); } @@ -492,7 +486,7 @@ namespace ChanSort.Loader.SamsungJ private static SQLiteCommand PrepareUpdateCommand(SQLiteConnection conn) { var cmd = conn.CreateCommand(); - cmd.CommandText = "update SRV set major=@nr, lockMode=@lock, hideGuide=@hidden, hidden=@hidden, numSel=@numsel, srvName=@srvname where srvId=@id"; + cmd.CommandText = "update SRV set major=@nr, lockMode=@lock, hideGuide=@hidden, hidden=@hidden, numSel=@numsel, srvName=cast(@srvname as varchar) where srvId=@id"; cmd.Parameters.Add(new SQLiteParameter("@id", DbType.Int64)); cmd.Parameters.Add(new SQLiteParameter("@nr", DbType.Int32)); cmd.Parameters.Add(new SQLiteParameter("@lock", DbType.Boolean)); @@ -554,7 +548,8 @@ namespace ChanSort.Loader.SamsungJ #region WriteChannels() private void WriteChannels(SQLiteCommand cmdUpdateSrv, SQLiteCommand cmdDeleteSrv, SQLiteCommand cmdInsertFav, SQLiteCommand cmdUpdateFav, SQLiteCommand cmdDeleteFav, ChannelList channelList, bool analog = false) - { + { + foreach (ChannelInfo channelInfo in channelList.Channels) { var channel = channelInfo as DbChannel; @@ -563,39 +558,33 @@ namespace ChanSort.Loader.SamsungJ if (channel.NewProgramNr < 0) { + // delete channel from all tables that have a reference to srvId cmdDeleteSrv.Parameters["@id"].Value = channel.RecordIndex; cmdDeleteSrv.ExecuteNonQuery(); - } - else - { - cmdUpdateSrv.Parameters["@id"].Value = channel.RecordIndex; - cmdUpdateSrv.Parameters["@nr"].Value = channel.NewProgramNr; - cmdUpdateSrv.Parameters["@lock"].Value = channel.Lock; - cmdUpdateSrv.Parameters["@hidden"].Value = channel.Hidden; - cmdUpdateSrv.Parameters["@numsel"].Value = !channel.Skip; - cmdUpdateSrv.Parameters["@srvname"].Value = channel.Name == null ? (object)DBNull.Value : Encoding.BigEndianUnicode.GetBytes(channel.Name); - cmdUpdateSrv.ExecuteNonQuery(); + continue; } + // update channel record + cmdUpdateSrv.Parameters["@id"].Value = channel.RecordIndex; + cmdUpdateSrv.Parameters["@nr"].Value = channel.NewProgramNr; + cmdUpdateSrv.Parameters["@lock"].Value = channel.Lock; + cmdUpdateSrv.Parameters["@hidden"].Value = channel.Hidden; + cmdUpdateSrv.Parameters["@numsel"].Value = !channel.Skip; + cmdUpdateSrv.Parameters["@srvname"].Value = channel.Name == null ? (object)DBNull.Value : Encoding.BigEndianUnicode.GetBytes(channel.Name); + cmdUpdateSrv.ExecuteNonQuery(); + + // update favorites for (int i=0, mask=1; i<5; i++, mask <<= 1) { -#if INDIVIDUALLY_SORTED_FAVS - int oldPos; - if (!channel.OriginalFavIndex.TryGetValue(i, out oldPos)) - oldPos = -1; - int newPos = channel.FavIndex[i]; - if (newPos == oldPos) - continue; -#else - int oldPos = ((int)channel.OriginalFavs & mask) != 0 ? channel.OldProgramNr : -1; - int newPos = ((int)channel.Favorites & mask) != 0 ? channel.NewProgramNr : -1; -#endif - if (newPos > 0) + int oldPos = channel.OriginalFavIndex[i]; + int newPos = ((int)channel.Favorites & mask) != 0 ? channel.FavIndex[i] : -1; + + if (newPos >= 0) { var c = oldPos < 0 ? cmdInsertFav : cmdUpdateFav; c.Parameters["@id"].Value = channel.RecordIndex; c.Parameters["@fav"].Value = i + 1; - c.Parameters["@pos"].Value = newPos; + c.Parameters["@pos"].Value = newPos - 1; c.ExecuteNonQuery(); } else @@ -604,10 +593,13 @@ namespace ChanSort.Loader.SamsungJ cmdDeleteFav.Parameters["@fav"].Value = i + 1; cmdDeleteFav.ExecuteNonQuery(); } + + channel.OriginalFavIndex[i] = channel.FavIndex[i] = newPos; } channel.OriginalFavs = channel.Favorites; } } #endregion + } } diff --git a/source/ChanSort/MainForm.cs b/source/ChanSort/MainForm.cs index 4753b50..415e21a 100644 --- a/source/ChanSort/MainForm.cs +++ b/source/ChanSort/MainForm.cs @@ -25,7 +25,7 @@ namespace ChanSort.Ui { public partial class MainForm : XtraForm { - public const string AppVersion = "v2015-11-28"; + public const string AppVersion = "v2015-11-29"; private const int MaxMruEntries = 10; @@ -1382,7 +1382,7 @@ namespace ChanSort.Ui { bool fileLoaded = this.dataRoot != null; bool isRight = this.lastFocusedGrid == this.gviewRight; - bool mayEdit = fileLoaded && this.currentChannelList != null && !this.currentChannelList.ReadOnly; + bool mayEdit = fileLoaded && this.currentChannelList != null && (!this.currentChannelList.ReadOnly || this.miAllowEditPredefinedLists.Down); foreach (BarItemLink link in this.miEdit.ItemLinks) link.Item.Enabled = mayEdit; @@ -2600,7 +2600,11 @@ namespace ChanSort.Ui #region miAllowEditPredefinedLists_DownChanged private void miAllowEditPredefinedLists_DownChanged(object sender, ItemClickEventArgs e) { - TryExecute(this.UpdateGridReadOnly); + TryExecute(() => + { + this.UpdateGridReadOnly(); + this.UpdateMenu(); + }); } #endregion } diff --git a/source/Test.Loader.Samsung/FileFormatDetectionTest.cs b/source/Test.Loader.Samsung/FileFormatDetectionTest.cs index e09ecb9..e92ec4c 100644 --- a/source/Test.Loader.Samsung/FileFormatDetectionTest.cs +++ b/source/Test.Loader.Samsung/FileFormatDetectionTest.cs @@ -1,6 +1,4 @@ -using System; -using System.IO; -using System.Text; +using System.Text; using ChanSort.Loader.Samsung; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -12,41 +10,6 @@ namespace Test.Loader.Samsung private readonly StringBuilder errors = new StringBuilder(); private const string RootPath = @"d:\sources\ChanSort\TestFiles_Samsung\"; - #region LoadAllFilesAndLogDetecedFileFormat() - - [TestMethod] - public void LoadAllFilesAndLogDetecedFileFormat() - { - - RecurseInto(RootPath); - - Assert.AreEqual("", errors.ToString()); - } - - private void RecurseInto(string dir) - { - foreach (var path in Directory.GetFiles(dir, "*.scm")) - { - if (path.Contains("_null")) - continue; - try - { - var s = new ScmSerializer(path); - s.Load(); - var series = s.Series; - System.Diagnostics.Debug.WriteLine($"{path.Substring(RootPath.Length)}: {series}"); - } - catch (Exception ex) - { - errors.AppendLine($"{path.Substring(RootPath.Length)} : {ex.Message}"); - } - } - - foreach (var path in Directory.GetDirectories(dir)) - RecurseInto(path); - } - #endregion - [TestMethod] public void LoadFileWithExcessiveHighFrequency_1() { @@ -69,7 +32,7 @@ namespace Test.Loader.Samsung // This file uses the 1201 format (E,F,H,J), but has a "C" in its model name var s = new ScmSerializer(RootPath + @"__C=F\Kinig\Reier Monika.scm"); s.Load(); - Assert.AreEqual("F", s.Series); + Assert.AreEqual("E", s.Series); } [TestMethod] @@ -78,7 +41,7 @@ namespace Test.Loader.Samsung // This file uses the 1201 format (E,F,H,J), but has a "B" in its model name var s = new ScmSerializer(RootPath + @"__B=F\DieterHerzberg_B\renamed.scm"); s.Load(); - Assert.AreEqual("F", s.Series); + Assert.AreEqual("E", s.Series); } [TestMethod] @@ -87,7 +50,7 @@ namespace Test.Loader.Samsung // J-series model with SCM format var s = new ScmSerializer(RootPath + @"__J\HenryLoenwind_SCM\channel_list_UE32J5170_1201_orig.scm"); s.Load(); - Assert.AreEqual("F", s.Series); + Assert.AreEqual("E", s.Series); } } diff --git a/source/changelog.md b/source/changelog.md index b26b9f9..d96ce05 100644 --- a/source/changelog.md +++ b/source/changelog.md @@ -1,8 +1,14 @@ ChanSort Change Log =================== +2015-11-29 +- Samsung E,F,H,J .scm file format: allow independant reordering of each + favorites list +- Samsung J .zip file format: predefined lists can be edited again, allow + independant reordering of each favorites list, allow deleting channels + 2015-11-28 -- fixed file format detection for Samsung J series models with .scm file extension +- fixed file format detection for Samsung J models with .scm file extension 2015-11-27 - disable editing of predefined channel lists (based on LCN).