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