diff --git a/source/ChanSort.Api/Model/ChannelInfo.cs b/source/ChanSort.Api/Model/ChannelInfo.cs
index bcf9680..74123fb 100644
--- a/source/ChanSort.Api/Model/ChannelInfo.cs
+++ b/source/ChanSort.Api/Model/ChannelInfo.cs
@@ -282,6 +282,14 @@ namespace ChanSort.Api
}
}
+ public void SetOldPosition(int subListIndex, int oldPos)
+ {
+ if (subListIndex == 0)
+ this.OldProgramNr = oldPos;
+ else
+ this.OldFavIndex[subListIndex - 1] = oldPos;
+ }
+
internal void ChangePosition(int subListIndex, int delta)
{
if (subListIndex == 0)
diff --git a/source/ChanSort.Api/Model/Enums.cs b/source/ChanSort.Api/Model/Enums.cs
index d0855f4..d95738a 100644
--- a/source/ChanSort.Api/Model/Enums.cs
+++ b/source/ChanSort.Api/Model/Enums.cs
@@ -16,8 +16,9 @@ namespace ChanSort.Api
Analog = 0x0001,
Digital = 0x0002,
- // bit 5+6+7+8: Antenna/Cable/Sat/IP
- MaskAntennaCableSat = 0x00F0,
+ // bit 4+5+6+7+8: AvInput/Antenna/Cable/Sat/IP
+ MaskAntennaCableSat = 0x00F8,
+ AvInput = 0x0008,
Antenna = 0x0010,
Cable = 0x0020,
Sat = 0x0040,
diff --git a/source/ChanSort.Loader.Hisense/HisDbSerializerPlugin.cs b/source/ChanSort.Loader.Hisense/HisDbSerializerPlugin.cs
index cb47f42..5a7e5e7 100644
--- a/source/ChanSort.Loader.Hisense/HisDbSerializerPlugin.cs
+++ b/source/ChanSort.Loader.Hisense/HisDbSerializerPlugin.cs
@@ -12,7 +12,7 @@ namespace ChanSort.Loader.Hisense
#if HISENSE_ENABLED
public class HisDbSerializerPlugin : ISerializerPlugin
{
- public string PluginName => "Hisense *.db";
+ public string PluginName => "Hisense channel.db";
public string FileFilter => "channel*.db";
#region CreateSerializer()
diff --git a/source/ChanSort.Loader.Hisense2017/ChanSort.Loader.Hisense2017.csproj b/source/ChanSort.Loader.Hisense2017/ChanSort.Loader.Hisense2017.csproj
new file mode 100644
index 0000000..ea6edbc
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/ChanSort.Loader.Hisense2017.csproj
@@ -0,0 +1,102 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}
+ Library
+ Properties
+ ChanSort.Loader.Hisense2017
+ ChanSort.Loader.Hisense2017
+ v4.0
+ 512
+
+
+
+
+ true
+ full
+ false
+ ..\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ x86
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+ ..\Debug\
+ DEBUG;TRACE
+ full
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+
+
+
+ False
+ ..\DLL\System.Data.SQLite.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Resources.resx
+ True
+ True
+
+
+
+
+ {dccffa08-472b-4d17-bb90-8f513fc01392}
+ ChanSort.Api
+
+
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+
+
+
\ No newline at end of file
diff --git a/source/ChanSort.Loader.Hisense2017/HisDbSerializer.cs b/source/ChanSort.Loader.Hisense2017/HisDbSerializer.cs
new file mode 100644
index 0000000..2cf3deb
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/HisDbSerializer.cs
@@ -0,0 +1,613 @@
+//#define LOCK_LCN_LISTS
+
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SQLite;
+using System.IO;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+using ChanSort.Api;
+
+namespace ChanSort.Loader.Hisense
+{
+ public class HisDbSerializer : SerializerBase
+ {
+ private readonly Dictionary channelsById = new Dictionary();
+ private readonly Dictionary channelLists = new Dictionary();
+ private ChannelList favlist;
+ private readonly Dictionary favListIdToFavIndex = new Dictionary();
+ private List tableNames;
+
+ private static readonly List ColumnNames = new List
+ {
+ "OldPosition",
+ "Position",
+ "Source",
+ "NewProgramNr",
+ "Name",
+ "ShortName",
+ "Favorites",
+ "Lock",
+ "Hidden",
+ "Encrypted",
+ "FreqInMhz",
+ "OriginalNetworkId",
+ "TransportStreamId",
+ "ServiceId",
+ "ServiceType",
+ "ServiceTypeName",
+ "NetworkName",
+ "Satellite",
+ "SymbolRate"
+ };
+
+ public class HisTransponder : Transponder
+ {
+ public SignalSource SignalSource { get; set; }
+ public string Source { get; set; }
+
+ public HisTransponder(int id) : base(id)
+ {
+ }
+ }
+
+ #region ctor()
+
+ public HisDbSerializer(string inputFile) : base(inputFile)
+ {
+ DepencencyChecker.AssertVc2010RedistPackageX86Installed();
+
+ Features.ChannelNameEdit = ChannelNameEditMode.All;
+ Features.CanDeleteChannels = false;
+ Features.CanSkipChannels = false;
+ Features.CanHaveGaps = true;
+ DataRoot.SortedFavorites = true;
+ }
+
+ #endregion
+
+ public override string DisplayName => "Hisense servicelist.db Loader";
+
+ #region Load()
+
+ public override void Load()
+ {
+ using (var conn = new SQLiteConnection("Data Source=" + FileName))
+ {
+ conn.Open();
+ using (var cmd = conn.CreateCommand())
+ {
+ RepairCorruptedDatabaseImage(cmd);
+ LoadLists(cmd);
+ LoadTableNames(cmd);
+ LoadSatelliteData(cmd);
+ LoadTunerData(cmd);
+ LoadServiceData(cmd);
+ LoadFavorites(cmd);
+ }
+ }
+
+ if (channelsById.Count == 0)
+ MessageBox.Show(Resources.Load_NoChannelsMsg, Resources.Load_NoChannelsCaption, MessageBoxButtons.OK);
+ }
+
+ #endregion
+
+ #region RepairCorruptedDatabaseImage()
+
+ private void RepairCorruptedDatabaseImage(SQLiteCommand cmd)
+ {
+ cmd.CommandText = "REINDEX";
+ cmd.ExecuteNonQuery();
+ }
+
+ #endregion
+
+ #region LoadTableNames()
+
+ private void LoadTableNames(SQLiteCommand cmd)
+ {
+ tableNames = new List();
+ cmd.CommandText = "SELECT name FROM sqlite_master WHERE type = 'table' order by name";
+ using (var r = cmd.ExecuteReader())
+ {
+ while (r.Read())
+ tableNames.Add(r.GetString(0).ToLower());
+ }
+ }
+
+ #endregion
+
+ #region LoadLists()
+ private void LoadLists(SQLiteCommand cmd)
+ {
+ cmd.CommandText = "select Pid, Name from FavoriteList";
+ using (var r = cmd.ExecuteReader())
+ {
+ while (r.Read())
+ {
+ int listId = r.GetInt32(0);
+ string name = r.GetString(1);
+ if (name.StartsWith("FAV"))
+ {
+ favListIdToFavIndex.Add(listId, int.Parse(name.Substring(3)));
+ continue;
+ }
+
+ var list = new ChannelList(SignalSource.Analog | SignalSource.AvInput | SignalSource.DvbCT | SignalSource.DvbS | SignalSource.TvAndRadio, name);
+ list.VisibleColumnFieldNames = ColumnNames;
+ list.IsMixedSourceFavoritesList = list.Caption.StartsWith("FAV");
+
+ channelLists.Add(listId, list);
+ DataRoot.AddChannelList(list);
+ }
+
+
+ favlist = new ChannelList(SignalSource.Analog | SignalSource.AvInput | SignalSource.DvbCT | SignalSource.DvbS | SignalSource.TvAndRadio, "Favorites");
+ favlist.VisibleColumnFieldNames = ColumnNames;
+ favlist.IsMixedSourceFavoritesList = true;
+ channelLists.Add(0, favlist);
+ DataRoot.AddChannelList(favlist);
+ }
+ }
+ #endregion
+
+
+ #region LoadSatelliteData()
+
+
+ private void LoadSatelliteData(SQLiteCommand cmd)
+ {
+ // sample data file doesn't contain any satellite information
+#if false
+ var regex = new Regex(@"^satellite$");
+ foreach (var tableName in this.tableNames)
+ {
+ if (!regex.IsMatch(tableName))
+ continue;
+ cmd.CommandText = "select satl_rec_id, i2_orb_pos, ac_sat_name from " + tableName;
+ using (var r = cmd.ExecuteReader())
+ {
+ while (r.Read())
+ {
+ var sat = new Satellite(r.GetInt32(0));
+ var pos = r.GetInt32(1);
+ sat.OrbitalPosition = $"{(decimal) Math.Abs(pos)/10:n1}{(pos < 0 ? 'W' : 'E')}";
+ sat.Name = r.GetString(2);
+ this.DataRoot.AddSatellite(sat);
+ }
+ }
+ }
+#endif
+ }
+
+ #endregion
+
+
+ #region LoadTunerData()
+
+ private void LoadTunerData(SQLiteCommand cmd)
+ {
+ List> inputs = new List>
+ {
+ Tuple.Create("C", SignalSource.DvbC, "symbolrate"),
+ Tuple.Create("C2", SignalSource.DvbC, "bandwidth"),
+ Tuple.Create("S", SignalSource.DvbS, "symbolrate"),
+ Tuple.Create("S2", SignalSource.DvbS, "symbolrate"),
+ Tuple.Create("T", SignalSource.DvbT, "bandwidth"),
+ Tuple.Create("T2", SignalSource.DvbT, "bandwidth"),
+ };
+ foreach (var input in inputs)
+ {
+ var table = input.Item1;
+ var symrate = input.Item3;
+ LoadTunerData(cmd, "DVB" + table + "Tuner", ", Frequency," + symrate, (t, r, i0) =>
+ {
+ t.Source = "DVB-" + input.Item1;
+ t.SignalSource = input.Item2;
+ t.FrequencyInMhz = (decimal) r.GetInt32(i0 + 0) / 1000;
+ t.SymbolRate = r.GetInt32(i0 + 1);
+ });
+ }
+
+#if false
+ this.LoadTunerData(cmd, "tsl_#_data_sat_dig", ", freq, sym_rate, orb_pos", (t, r, i0) =>
+ {
+ t.FrequencyInMhz = r.GetInt32(i0 + 0);
+ t.SymbolRate = r.GetInt32(i0 + 1);
+
+ // satellite information may or may not be available in the database. if there is none, create a proxy sat records from the orbital position in the TSL data
+ if (t.Satellite == null)
+ {
+ var opos = r.GetInt32(i0 + 2);
+ var sat = this.DataRoot.Satellites.TryGet(opos);
+ if (sat == null)
+ {
+ sat = new Satellite(opos);
+ var pos = (decimal) opos / 10;
+ sat.Name = pos < 0 ? (-pos).ToString("n1") + "W" : pos.ToString("n1") + "E";
+ }
+ t.Satellite = sat;
+ }
+ });
+#endif
+ }
+
+ private void LoadTunerData(SQLiteCommand cmd, string joinTable, string joinFields, Action enhanceTransponderInfo)
+ {
+ if (!tableNames.Contains(joinTable.ToLower()))
+ return;
+
+ cmd.CommandText = $"select tuner.tunerid, oid, tid, satellite {joinFields} "
+ + $" from tuner inner join {joinTable} on {joinTable}.tunerid=tuner.tunerid";
+
+ using (var r = cmd.ExecuteReader())
+ {
+ while (r.Read())
+ {
+ var id = r.GetInt32(0);
+ var trans = new HisTransponder(id);
+ trans.OriginalNetworkId = r.GetInt32(1);
+ trans.TransportStreamId = r.GetInt32(2);
+ trans.Satellite = DataRoot.Satellites.TryGet(r.GetInt32(3));
+
+ enhanceTransponderInfo(trans, r, 4);
+
+ DataRoot.AddTransponder(trans.Satellite, trans);
+ }
+ }
+ }
+
+ #endregion
+
+ #region LoadServiceData()
+
+ private void LoadServiceData(SQLiteCommand cmd)
+ {
+ cmd.CommandText = @"
+select s.pid, s.type, anls.Frequency, digs.TunerId, digs.Sid, Name, ShortName, Encrypted, Visible, Selectable, ParentalLock
+from service s
+left outer join AnalogService anls on anls.ServiceId=s.Pid
+left outer join DVBService digs on digs.ServiceId=s.Pid
+";
+
+ using (var r = cmd.ExecuteReader())
+ {
+ while (r.Read())
+ {
+ ChannelInfo ci = null;
+ if (!r.IsDBNull(2))
+ ci = new ChannelInfo(SignalSource.Analog, r.GetInt32(0), -1, r.GetString(5));
+ else if (!r.IsDBNull(3))
+ {
+ var trans = (HisTransponder)DataRoot.Transponder.TryGet(r.GetInt32(3));
+ ci = new ChannelInfo(trans.SignalSource, r.GetInt32(0), -1, r.GetString(5));
+ ci.Transponder = trans;
+ ci.FreqInMhz = trans.FrequencyInMhz;
+ ci.OriginalNetworkId = trans.OriginalNetworkId;
+ ci.TransportStreamId = trans.TransportStreamId;
+ ci.Source = trans.Source;
+ ci.ServiceId = r.GetInt32(4);
+ ci.ShortName = r.GetString(6);
+ ci.Encrypted = r.GetInt32(7) != 0;
+ ci.Hidden = r.GetInt32(8) == 0;
+ ci.Skip = r.GetInt32(9) == 0;
+ ci.Lock = r.GetInt32(10) != 0;
+ }
+ else if (r.GetInt32(1) == 0)
+ ci = new ChannelInfo(SignalSource.AvInput, r.GetInt32(0), -1, r.GetString(5));
+
+ if (ci != null)
+ channelsById.Add(ci.RecordIndex, ci);
+ }
+ }
+#if LOCK_LCN_LISTS
+// make the current list read-only if LCN is used
+ if (r.GetInt32(i0 + 3) != 0)
+ {
+ this.channelLists[x - 1].ReadOnly = true;
+ }
+#endif
+
+ }
+#if false
+ private void LoadServiceData(SQLiteCommand cmd, string joinTable, string joinFields, Action enhanceChannelInfo)
+ {
+ if (!tableNames.Contains(joinTable))
+ return;
+
+ cmd.CommandText = $"select service.pid, -1, {joinFields}"
+ + $" from service inner join {joinTable} on {joinTable}.ServiceId=";
+ using (var r = cmd.ExecuteReader())
+ {
+ while (r.Read())
+ {
+ var id = (uint)r.GetInt32(0);
+ var prNr = (int)(uint)r.GetInt32(1) >> 18;
+ var trans = DataRoot.Transponder.TryGet((r.GetInt32(2) << 16) | r.GetInt32(3));
+ var stype = (ServiceType)r.GetInt32(4);
+ var name = r.GetString(5);
+ var nwMask = (NwMask)r.GetInt32(6);
+ var sid = r.GetInt32(7);
+ var bmedium = (BroadcastMedium)r.GetInt32(8);
+
+ var ssource = DetermineSignalSource(bmedium, stype);
+ var ci = new ChannelInfo(ssource, id, prNr, name);
+ if (trans != null)
+ {
+ ci.Transponder = trans;
+ ci.OriginalNetworkId = trans.OriginalNetworkId;
+ ci.TransportStreamId = trans.TransportStreamId;
+ ci.SymbolRate = trans.SymbolRate;
+ ci.FreqInMhz = trans.FrequencyInMhz;
+ ci.Satellite = trans.Satellite?.ToString();
+ }
+
+ ci.ServiceId = sid;
+
+ //ci.Skip = (nwMask & NwMask.Active) == 0;
+ ci.Lock = (nwMask & NwMask.Lock) != 0;
+ ci.Hidden = (nwMask & NwMask.Visible) == 0;
+ ci.Favorites |= (Favorites)((int)(nwMask & (NwMask.Fav1 | NwMask.Fav2 | NwMask.Fav3 | NwMask.Fav4)) >> 4);
+
+ if (stype == ServiceType.Radio)
+ ci.ServiceTypeName = "Radio";
+ else if (stype == ServiceType.Tv)
+ ci.ServiceTypeName = "TV";
+ else if (stype == ServiceType.App)
+ ci.ServiceTypeName = "Data";
+
+ enhanceChannelInfo(ci, r, 9);
+
+ var list = channelLists[tableNr - 1];
+ ci.Source = list.ShortCaption;
+ DataRoot.AddChannel(list, ci);
+
+ // add the channel to all favorites lists
+ DataRoot.AddChannel(channelLists[6], ci);
+ channelsById[ci.RecordIndex] = ci;
+ }
+ }
+ }
+#endif
+ #endregion
+
+ #region LoadFavorites()
+
+ private void LoadFavorites(SQLiteCommand cmd)
+ {
+ cmd.CommandText = "select FavoriteId, ServiceId, ChannelNum from FavoriteItem fi";
+ using (var r = cmd.ExecuteReader())
+ {
+ while (r.Read())
+ {
+ int favListId = r.GetInt32(0);
+ var ci = channelsById.TryGet(r.GetInt32(1));
+ int favListIdx = favListIdToFavIndex.TryGet(favListId);
+ if (favListIdx != 0)
+ {
+ ci?.SetOldPosition(favListIdx, r.GetInt32(1));
+ }
+ else
+ {
+ var list = channelLists.TryGet(favListId);
+ // TODO create copy of channel for each channel list so that it can have an independant number
+ ci?.SetOldPosition(0, r.GetInt32(1));
+ DataRoot.AddChannel(list, ci);
+ }
+ }
+ }
+
+ foreach(var ci in channelsById.Values)
+ DataRoot.AddChannel(favlist, ci);
+ }
+ #endregion
+
+ // Saving ====================================
+
+ #region Save()
+
+ public override void Save(string tvOutputFile)
+ {
+ //Editor.SequentializeFavPos(channelLists[6], 4);
+
+ if (tvOutputFile != FileName)
+ File.Copy(FileName, tvOutputFile, true);
+
+ using (var conn = new SQLiteConnection("Data Source=" + tvOutputFile))
+ {
+ conn.Open();
+ using (var trans = conn.BeginTransaction())
+ using (var cmd = conn.CreateCommand())
+ {
+ cmd.Transaction = trans;
+ try
+ {
+ CreateFavTables(cmd);
+#if !LOCK_LCN_LISTS
+ ResetLcn(cmd);
+#endif
+ foreach (var list in DataRoot.ChannelLists)
+ {
+ if (list.ReadOnly)
+ continue;
+ foreach (var ci in list.Channels)
+ UpdateChannel(cmd, ci);
+ }
+ trans.Commit();
+ FileName = tvOutputFile;
+ }
+ catch
+ {
+ trans.Rollback();
+ throw;
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region CreateFavTables()
+
+ private void CreateFavTables(SQLiteCommand cmd)
+ {
+ for (var i = 1; i <= 4; i++)
+ if (!tableNames.Contains("fav_" + i))
+ {
+ cmd.CommandText = $"CREATE TABLE fav_{i} (ui2_svc_id INTEGER, ui2_svc_rec_id INTEGER, user_defined_ch_num VARCHAR, user_defined_ch_name VARCHAR)";
+ cmd.ExecuteNonQuery();
+ tableNames.Add($"fav_{i}");
+ }
+ }
+
+ #endregion
+
+ #region ResetLcn()
+
+ private void ResetLcn(SQLiteCommand cmd)
+ {
+ var regex = new Regex(@"^svl_\d_data_dvb$");
+ foreach (var table in tableNames)
+ {
+ if (!regex.IsMatch(table))
+ continue;
+ cmd.CommandText = "update " + table + " set cur_lcn=0, original_lcn=0, lcn_idx=0";
+ cmd.ExecuteNonQuery();
+ }
+ }
+
+ #endregion
+
+ #region UpdateChannel()
+
+ private void UpdateChannel(SQLiteCommand cmd, ChannelInfo ci)
+ {
+ if (ci.RecordIndex < 0) // skip reference list proxy channels
+ return;
+
+ var x = (int) ((ulong) ci.RecordIndex >> 32); // the table number is kept in the higher 32 bits
+ var id = (int) (ci.RecordIndex & 0xFFFFFFFF); // the record id is kept in the lower 32 bits
+
+ 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 && ci.NewProgramNr >= 0) setFlags |= NwMask.Visible;
+
+ cmd.CommandText = $"update svl_{x} set channel_id=(channel_id&{0x3FFFF})|(@chnr << 18)" +
+ $", ch_id_txt=@chnr || ' 0'" +
+ $", ac_name=@name" +
+ $", 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.String);
+ cmd.Parameters.Add("@resetFlags", DbType.Int32);
+ cmd.Parameters.Add("@setFlags", DbType.Int32);
+ cmd.Parameters["@id"].Value = id;
+ cmd.Parameters["@chnr"].Value = ci.NewProgramNr;
+ cmd.Parameters["@name"].Value = ci.Name;
+ cmd.Parameters["@resetFlags"].Value = ~(int) resetFlags;
+ cmd.Parameters["@setFlags"].Value = (int) setFlags;
+ cmd.ExecuteNonQuery();
+
+ for (var i = 0; i < 4; i++)
+ if (ci.FavIndex[i] <= 0)
+ {
+ cmd.CommandText = $"delete from fav_{i + 1} where ui2_svc_id={ci.RecordIndex >> 32} and ui2_svc_rec_id={ci.RecordIndex & 0xFFFF}";
+ cmd.ExecuteNonQuery();
+ }
+ else
+ {
+ cmd.CommandText = $"update fav_{i + 1} set user_defined_ch_num=@chnr, user_defined_ch_name=@name where ui2_svc_id=@svcid and ui2_svc_rec_id=@recid";
+ cmd.Parameters.Clear();
+ cmd.Parameters.Add("@chnr", DbType.String); // for some reason this is a VARCHAR in the database
+ cmd.Parameters.Add("@name", DbType.String);
+ cmd.Parameters.Add("@svcid", DbType.Int32);
+ cmd.Parameters.Add("@recid", DbType.Int32);
+ cmd.Parameters["@chnr"].Value = ci.FavIndex[i].ToString();
+ cmd.Parameters["@name"].Value = ci.Name;
+ cmd.Parameters["@svcid"].Value = ci.RecordIndex >> 32;
+ cmd.Parameters["@recid"].Value = ci.RecordIndex & 0xFFFF;
+ if (cmd.ExecuteNonQuery() == 0)
+ {
+ cmd.CommandText = $"insert into fav_{i + 1} (ui2_svc_id, ui2_svc_rec_id, user_defined_ch_num, user_defined_ch_name) values (@svcid,@recid,@chnr,@name)";
+ cmd.ExecuteNonQuery();
+ }
+ }
+ }
+
+ #endregion
+
+ #region enums and bitmasks
+
+ internal enum BroadcastType
+ {
+ Analog = 1,
+ Dvb = 2
+ }
+
+ internal enum BroadcastMedium
+ {
+ DigTer = 1,
+ DigCab = 2,
+ DigSat = 3,
+ AnaTer = 4,
+ AnaCab = 5,
+ AnaSat = 6
+ }
+
+ internal enum ServiceType
+ {
+ Tv = 1,
+ Radio = 2,
+ App = 3
+ }
+
+ [Flags]
+ internal enum NwMask
+ {
+ Active = 1 << 1,
+ Visible = 1 << 3,
+ Fav1 = 1 << 4,
+ Fav2 = 1 << 5,
+ Fav3 = 1 << 6,
+ Fav4 = 1 << 7,
+ Lock = 1 << 8
+ }
+
+ [Flags]
+ internal enum OptionMask
+ {
+ NameEdited = 1 << 3,
+ ChNumEdited = 1 << 10,
+ DeletedByUser = 1 << 13
+ }
+
+ [Flags]
+ internal enum HashCode
+ {
+ Name = 1 << 0,
+ ChannelId = 1 << 1,
+ BroadcastType = 1 << 2,
+ TsRecId = 1 << 3,
+ ProgNum = 1 << 4,
+ DvbShortName = 1 << 5,
+ Radio = 1 << 10,
+ Encrypted = 1 << 11,
+ Tv = 1 << 13
+ }
+
+ [Flags]
+ internal enum DvbLinkageMask
+ {
+ Ts = 1 << 2
+ }
+
+ #endregion
+
+ }
+}
\ No newline at end of file
diff --git a/source/ChanSort.Loader.Hisense2017/HisDbSerializerPlugin.cs b/source/ChanSort.Loader.Hisense2017/HisDbSerializerPlugin.cs
new file mode 100644
index 0000000..413aa56
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/HisDbSerializerPlugin.cs
@@ -0,0 +1,26 @@
+#define HISENSE_ENABLED
+
+/*
+Support for the Hisense file format (Sep 2015) is currently disabled due to the risk of damaging the TV when
+users import files in an older/newer format than the currently installed firmware expects.
+*/
+
+using ChanSort.Api;
+
+namespace ChanSort.Loader.Hisense
+{
+#if HISENSE_ENABLED
+ public class HisDbSerializerPlugin : ISerializerPlugin
+ {
+ public string PluginName => "Hisense servicelist.db";
+ public string FileFilter => "servicelist*.db";
+
+#region CreateSerializer()
+ public SerializerBase CreateSerializer(string inputFile)
+ {
+ return new HisDbSerializer(inputFile);
+ }
+#endregion
+ }
+#endif
+}
diff --git a/source/ChanSort.Loader.Hisense2017/Properties/AssemblyInfo.cs b/source/ChanSort.Loader.Hisense2017/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..8df14bb
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ChanSort.Loader.Hisense")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ChanSort.Loader.Hisense")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("d093e7ee-d3ad-4e7b-af82-c6918ca017fb")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/source/ChanSort.Loader.Hisense2017/Resources.Designer.cs b/source/ChanSort.Loader.Hisense2017/Resources.Designer.cs
new file mode 100644
index 0000000..2659a4e
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/Resources.Designer.cs
@@ -0,0 +1,83 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ChanSort.Loader.Hisense {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ChanSort.Loader.Hisense.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to No channels found.
+ ///
+ internal static string Load_NoChannelsCaption {
+ get {
+ return ResourceManager.GetString("Load_NoChannelsCaption", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to This channel list file does not contain any data.
+ ///Most likely a predefined channel list was selected during the TV's intial setup. Such lists do not get exported and cannot be edited on the TV or on your PC.
+ ///To get a list that can be edited on your PC you have to reset your TV to factory defaults and select the option 'Other' during the satellite channel setup..
+ ///
+ internal static string Load_NoChannelsMsg {
+ get {
+ return ResourceManager.GetString("Load_NoChannelsMsg", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/source/ChanSort.Loader.Hisense2017/Resources.cs.resx b/source/ChanSort.Loader.Hisense2017/Resources.cs.resx
new file mode 100644
index 0000000..d58980a
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/Resources.cs.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/source/ChanSort.Loader.Hisense2017/Resources.de.resx b/source/ChanSort.Loader.Hisense2017/Resources.de.resx
new file mode 100644
index 0000000..f5aade9
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/Resources.de.resx
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Diese Senderliste enthält keine Daten.
+Vermutlich wurde bei der Ersteinrichtung des Geräte eine vordefinierte Liste gewählt. Solche Listen können nicht exportiert und weder am TV noch am PC bearbeitet werden.
+Um eine bearbeitbare Liste zu erhalten, müssen Sie ihr Gerät auf Werkseinstellungen zurücksetzen und beim Sat-Suchlauf die Option 'Andere' auswählen.
+
+
+ Keine Sender gefunden
+
+
\ No newline at end of file
diff --git a/source/ChanSort.Loader.Hisense2017/Resources.pt.resx b/source/ChanSort.Loader.Hisense2017/Resources.pt.resx
new file mode 100644
index 0000000..d58980a
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/Resources.pt.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/source/ChanSort.Loader.Hisense2017/Resources.resx b/source/ChanSort.Loader.Hisense2017/Resources.resx
new file mode 100644
index 0000000..957e1f2
--- /dev/null
+++ b/source/ChanSort.Loader.Hisense2017/Resources.resx
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ This channel list file does not contain any data.
+Most likely a predefined channel list was selected during the TV's intial setup. Such lists do not get exported and cannot be edited on the TV or on your PC.
+To get a list that can be edited on your PC you have to reset your TV to factory defaults and select the option 'Other' during the satellite channel setup.
+
+
+ No channels found
+
+
\ No newline at end of file
diff --git a/source/ChanSort.Loader.LG/ChanSort.Loader.LG.ini b/source/ChanSort.Loader.LG/ChanSort.Loader.LG.ini
index f4c8a84..9e4ab77 100644
--- a/source/ChanSort.Loader.LG/ChanSort.Loader.LG.ini
+++ b/source/ChanSort.Loader.LG/ChanSort.Loader.LG.ini
@@ -101,6 +101,7 @@
[ACTChannelDataMapping:256]
; LA 2013 series firmware prior to 04.20.29
+ ; LH541V
reorderChannelData = 0
lenName = 40
offSignalSource = 8
@@ -550,6 +551,18 @@
lnbCount = 40
lnbLength = 48
+[DvbsBlock:663532]
+ ; LH541V
+ satCount = 64
+ satLength = 44
+ transponderCount = 2400
+ transponderLength = 48
+ linkedListExtraDataLength = 2
+ dvbsChannelCount = 6000
+ dvbsChannelLength = 80
+ lnbCount = 40
+ lnbLength = 48
+
[DvbsBlock:687880]
; everything before LM series + LM340S, LM611S, LS560S
satCount = 64
@@ -784,6 +797,33 @@
offVideoPid = 64
offAudioPid = 66
+[SatChannelDataMapping:80]
+ ; LH541V
+ lenName = 40
+ offSatelliteNr = 0
+ offSourceType = 4
+ offTransponderIndex = 5, 12
+ offProgramNr = 8
+ offProgramNrPreset = 10
+ offFavorites2 = 14
+ offDeleted = 14
+ maskDeleted = 0x42
+ offEncrypted = 14
+ maskEncrypted = 0x80
+ offLock = 15
+ maskLock = 0x01
+ offSkip = 15
+ maskSkip = 0x02
+ offHide = 15
+ maskHide = 0x04
+ offProgNrCustomized = 15
+ maskProgNrCustomized = 0x40
+ offServiceId = 16
+ offServiceType = 18
+ offNameLength = 19
+ offName = 20
+ offVideoPid = 60
+ offAudioPid = 62
[SatChannelDataMapping:92]
; LA series
@@ -920,6 +960,10 @@
; LB550U, LB561V
offSize = 0
+[FirmwareData:21460]
+ ; LH541V
+ offSize = 0
+
[FirmwareData:23072]
; LE3300, LD420, LD450, LD550
offSize = 0
diff --git a/source/ChanSort.sln b/source/ChanSort.sln
index 2d37003..7ef7e1b 100644
--- a/source/ChanSort.sln
+++ b/source/ChanSort.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.23107.0
+# Visual Studio 15
+VisualStudioVersion = 15.0.26228.4
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort", "ChanSort\ChanSort.csproj", "{5FAFDABC-A52F-498C-BD2F-AFFC4119797A}"
ProjectSection(ProjectDependencies) = postProject
@@ -46,6 +46,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort.Loader.Hisense", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Loader.Samsung", "Test.Loader.Samsung\Test.Loader.Samsung.csproj", "{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort.Loader.Hisense2017", "ChanSort.Loader.Hisense2017\ChanSort.Loader.Hisense2017.csproj", "{9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -78,7 +80,8 @@ Global
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|Any CPU.Build.0 = Release|Any CPU
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|Mixed Platforms.ActiveCfg = Release|x86
{DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|Mixed Platforms.Build.0 = Release|x86
- {DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|x86.ActiveCfg = Release|Any CPU
+ {DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|x86.ActiveCfg = Release|x86
+ {DCCFFA08-472B-4D17-BB90-8F513FC01392}.Release|x86.Build.0 = Release|x86
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
@@ -89,7 +92,8 @@ Global
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|Any CPU.Build.0 = Release|Any CPU
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|Mixed Platforms.ActiveCfg = Release|x86
{E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|Mixed Platforms.Build.0 = Release|x86
- {E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|x86.ActiveCfg = Release|Any CPU
+ {E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|x86.ActiveCfg = Release|x86
+ {E972D8A1-2F5F-421C-AC91-CFF45E5191BE}.Release|x86.Build.0 = Release|x86
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
@@ -100,7 +104,8 @@ Global
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|Any CPU.Build.0 = Release|Any CPU
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|Mixed Platforms.ActiveCfg = Release|x86
{68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|Mixed Platforms.Build.0 = Release|x86
- {68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|x86.ActiveCfg = Release|Any CPU
+ {68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|x86.ActiveCfg = Release|x86
+ {68CFCB2F-B52A-43A1-AA5C-5D64A1D655D2}.Release|x86.Build.0 = Release|x86
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
@@ -111,7 +116,8 @@ Global
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|Any CPU.Build.0 = Release|Any CPU
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|Mixed Platforms.ActiveCfg = Release|x86
{A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|Mixed Platforms.Build.0 = Release|x86
- {A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|x86.ActiveCfg = Release|Any CPU
+ {A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|x86.ActiveCfg = Release|x86
+ {A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5}.Release|x86.Build.0 = Release|x86
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
@@ -122,7 +128,8 @@ Global
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|Any CPU.Build.0 = Release|Any CPU
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|Mixed Platforms.ActiveCfg = Release|x86
{F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|Mixed Platforms.Build.0 = Release|x86
- {F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|x86.ActiveCfg = Release|Any CPU
+ {F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|x86.ActiveCfg = Release|x86
+ {F6F02792-07F1-48D5-9AF3-F945CA5E3931}.Release|x86.Build.0 = Release|x86
{68DA8072-3A29-4076-9F64-D66F38349585}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{68DA8072-3A29-4076-9F64-D66F38349585}.Debug|Any CPU.Build.0 = Debug|Any CPU
{68DA8072-3A29-4076-9F64-D66F38349585}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
@@ -133,7 +140,8 @@ Global
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|Any CPU.Build.0 = Release|Any CPU
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|Mixed Platforms.ActiveCfg = Release|x86
{68DA8072-3A29-4076-9F64-D66F38349585}.Release|Mixed Platforms.Build.0 = Release|x86
- {68DA8072-3A29-4076-9F64-D66F38349585}.Release|x86.ActiveCfg = Release|Any CPU
+ {68DA8072-3A29-4076-9F64-D66F38349585}.Release|x86.ActiveCfg = Release|x86
+ {68DA8072-3A29-4076-9F64-D66F38349585}.Release|x86.Build.0 = Release|x86
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
@@ -144,7 +152,8 @@ Global
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|Any CPU.Build.0 = Release|Any CPU
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|Mixed Platforms.ActiveCfg = Release|x86
{F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|Mixed Platforms.Build.0 = Release|x86
- {F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|x86.ActiveCfg = Release|Any CPU
+ {F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|x86.ActiveCfg = Release|x86
+ {F943DBFE-D3C3-4885-A38B-375148012FEC}.Release|x86.Build.0 = Release|x86
{74A18C6F-09FF-413E-90D9-827066FA5B36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74A18C6F-09FF-413E-90D9-827066FA5B36}.Debug|Any CPU.Build.0 = Debug|Any CPU
{74A18C6F-09FF-413E-90D9-827066FA5B36}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
@@ -167,7 +176,8 @@ Global
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|Any CPU.Build.0 = Release|Any CPU
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|x86.ActiveCfg = Release|Any CPU
+ {5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|x86.ActiveCfg = Release|x86
+ {5361C8CB-F737-4709-AF8C-E1F0456F3C5B}.Release|x86.Build.0 = Release|x86
{33897002-0537-49A4-B963-A18D17311B3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{33897002-0537-49A4-B963-A18D17311B3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{33897002-0537-49A4-B963-A18D17311B3D}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
@@ -190,8 +200,8 @@ Global
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|Any CPU.Build.0 = Release|Any CPU
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|x86.ActiveCfg = Release|Any CPU
- {D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|x86.Build.0 = Release|Any CPU
+ {D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|x86.ActiveCfg = Release|x86
+ {D093E7EE-D3AD-4E7B-AF82-C6918CA017FB}.Release|x86.Build.0 = Release|x86
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -202,8 +212,20 @@ Global
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|Any CPU.Build.0 = Release|Any CPU
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.ActiveCfg = Release|Any CPU
- {1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.Build.0 = Release|Any CPU
+ {1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.ActiveCfg = Release|x86
+ {1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.Build.0 = Release|x86
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|x86.ActiveCfg = Debug|x86
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Debug|x86.Build.0 = Debug|x86
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|Mixed Platforms.Build.0 = Release|x86
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|x86.ActiveCfg = Release|x86
+ {9282E1DB-CD1F-400A-ACA1-17E0C4562ACF}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/source/ChanSort/MainForm.Designer.cs b/source/ChanSort/MainForm.Designer.cs
index 5dcacd0..409a649 100644
--- a/source/ChanSort/MainForm.Designer.cs
+++ b/source/ChanSort/MainForm.Designer.cs
@@ -1563,7 +1563,7 @@
this.miCzech.Id = 95;
this.miCzech.ImageIndex = 41;
this.miCzech.Name = "miCzech";
- this.miCzech.Tag = "cs-CS";
+ this.miCzech.Tag = "cs-CZ";
this.miCzech.DownChanged += new DevExpress.XtraBars.ItemClickEventHandler(this.miLanguage_DownChanged);
//
// mnuCharset
diff --git a/source/ChanSort/MainForm.cs b/source/ChanSort/MainForm.cs
index ae5c250..146af0a 100644
--- a/source/ChanSort/MainForm.cs
+++ b/source/ChanSort/MainForm.cs
@@ -31,7 +31,7 @@ namespace ChanSort.Ui
{
public partial class MainForm : XtraForm
{
- public const string AppVersion = "v2016-08-10";
+ public const string AppVersion = "v2017-03-29";
private const int MaxMruEntries = 10;
private readonly List isoEncodings = new List();
diff --git a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/tll-256-LH.h b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/tll-256-LH.h
new file mode 100644
index 0000000..7c33a85
--- /dev/null
+++ b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/tll-256-LH.h
@@ -0,0 +1,200 @@
+#include "tll-common.h"
+
+#define MAX_SAT_COUNT 64
+struct TLL44_Satellite;
+typedef TLL44_Satellite TLL_Satellite;
+
+#define MAX_TP_COUNT 2400
+struct TLL48_Transponder;
+typedef TLL48_Transponder TLL_Transponder;
+
+#define MAX_DVBS_COUNT 6000
+struct TLL80_SatChannel;
+typedef TLL80_SatChannel TLL_SatChannel;
+
+#define MAX_LNB_COUNT 40
+struct TLL48_Lnb;
+typedef TLL48_Lnb TLL_Lnb;
+
+#define DVBS_CHANNELLIST_PREFIXSIZE 2
+
+#include "tll-satellite.h"
+
+struct LH256_AnalogChannel
+{
+ byte t1[8];
+ TLL_SignalSource SignalSource;
+ byte t1b;
+ word ChannelTransponder1;
+ word ProgramNr;
+ word LogicalProgramNr1;
+ byte t2[4];
+ byte Favorites1;
+ byte t2b[3];
+ word Frequency1Div50;
+ word APID1;
+ byte ChannelNumberInBand;
+ byte ChannelBand;
+ byte t3[10];
+ char CH_Name1[40];
+ byte CH_NameLength1;
+ byte t4;
+ word SID1;
+ byte t5a[38];
+ word ChannelTransponder2;
+ dword FrequencyDiv50;
+ byte t6[6];
+ word ONID;
+ word TSID;
+ byte t7[32];
+ word ChannelTransponder3;
+ word ProgramNr2;
+ word LogicalProgramNr2;
+ word ChannelTransponder4;
+ byte Favorites2;
+ TLL_EditFlags EditFlags;
+ word SID2;
+ byte ServiceType;
+ byte CH_NameLength2;
+ char CH_Name2[40];
+ byte t10[12];
+ word Frequency2Div50;
+ word APID2;
+ word u1;
+ word u2;
+ byte t11[12];
+};
+
+struct LH256_AnalogBlock
+{
+ dword BlockSize;
+ dword ChannelCount;
+ LH256_AnalogChannel Channels[ChannelCount];
+};
+
+struct LH256_FirmwareBlock
+{
+ dword BlockSize;
+ byte u[BlockSize];
+};
+
+struct LH256_DvbCtChannel
+{
+ byte t1[8];
+ TLL_SignalSource SignalSource;
+ byte t1b;
+ word ChannelTransponder1;
+ word ProgramNr;
+ word LogicalProgramNr1;
+ byte t2a[4];
+ byte Fav1;
+ byte t2b[3];
+ word PcrPid1;
+ word APID1;
+ byte t2c[8];
+ word VPID1;
+ byte t3[2];
+ char CH_Name1[40];
+ byte CH_NameLength1;
+ byte t4;
+ word SID1;
+ byte t5a[37];
+ byte NitVersion;
+ word ChannelTransponder2;
+ dword Frequency;
+ byte t6[6];
+ word ONID;
+ word TSID;
+ word NID;
+ dword SpecialData;
+ byte t7[26];
+ word ChannelTransponder3;
+ word ProgramNr2;
+ word LogicalProgramNr2;
+ word ChannelTransponder4;
+ byte Favorites2;
+ TLL_EditFlags EditFlags;
+ word SID2;
+ byte ServiceType;
+ byte CH_NameLength2;
+ char CH_Name2[40];
+ byte t10[12];
+ word PcrPid2;
+ word APID2;
+ word u1;
+ word u2;
+ byte t11[12];
+};
+
+struct LH256_DvbCTBlock
+{
+ dword BlockSize;
+ dword ChannelCount;
+ LH256_DvbCtChannel Channels[ChannelCount];
+};
+
+struct TLL48_Transponder
+{
+ byte t1[10];
+ word TP_Number;
+ word TP_Freq;
+ byte t2[8];
+ word NID;
+ word TID;
+ byte t3[3];
+ word SRateTimes2;
+ byte t4[9];
+ byte SatIndexTimes2;
+ byte t5[3];
+ byte u40[4];
+};
+
+struct TLL80_SatChannel
+{
+ word LnbIndex;
+ word t1;
+ TLL_SignalSource SignalSource;
+ byte t2;
+ word TP_Number;
+ word CH_Number;
+ word CH_NumberFixed;
+ word TP_Number2;
+ byte FavCrypt;
+ TLL_EditFlags EditFlags;
+ word SID;
+ byte ServiceType;
+ byte CH_NameLength;
+ char CH_Name[52];
+ word VPID;
+ word APID;
+ word t3;
+ word t4;
+};
+
+struct TLL48_Lnb
+{
+ byte SettingsID;
+ byte t2[3];
+ byte SatelliteID;
+ byte ScanSearchType;
+ byte NetworkSearch;
+ byte BlindSearch;
+ byte t3[4];
+ char FrequencyName[12];
+ word LOF1;
+ byte t4[2];
+ word LOF2;
+ byte t5[18];
+};
+
+
+public struct LH256
+{
+ byte Header[4];
+
+ LH256_AnalogBlock Analog;
+ LH256_FirmwareBlock Firmware;
+ LH256_DvbCTBlock DvbCT;
+ TLL_DvbSBlock DvbS;
+ TLL_SettingsBlock Settings;
+};
diff --git a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/tll-satellite.h b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/tll-satellite.h
index 417018c..9afc3a7 100644
--- a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/tll-satellite.h
+++ b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/tll-satellite.h
@@ -1,6 +1,6 @@
struct TLL_DvbsHeaderSubblock
{
- dword Crc32;
+ dword Crc_32;
byte DVBS_S2_Tag[8];
word Temp03[2];
};