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