- fixed Nuget hell: (auto) binding redirects to prevent compiler warning flood and ensure unit tests to be runnable

- put file name in Sqlite connect string in quotes
- improvements to Mediatek Philips 120+125/Sony serializer (physically reorder XML nodes, use flags stored in Java serialized blob)
- selecting a RefList changed the current working directory, which prevented .ini files to be found by loaders
This commit is contained in:
Horst Beham
2025-06-05 18:35:10 +02:00
parent 10a53f367f
commit 636b9c4151
74 changed files with 10491 additions and 1577 deletions

1
.gitignore vendored
View File

@@ -4,3 +4,4 @@ source/ChanSort.opensdf
/source/packages/
/source/ChanSort.Loader.PhilipsBin/DllClient.cs
/source/ChanSort.Loader.MediaTek/.vs/
/source/__.vs/

View File

@@ -81,7 +81,9 @@ System requirements
- winetricks (sudo apt-get install winetricks)
- start winetricks, select or create a wineprefix (32 bit or 64 bit), select
"Install Windows DLL or component" and install the "dotnet48" package and ignore dozens of message boxes
- right-click on ChanSort.exe and select "open with", "all applications", "A wine application"
- right-click on ChanSort.exe and select "open with", "all applications", "A wine application"
Last tested with Ubuntu 24.10, wine-9.0, winetricks 20240105
Or using Docker: https://github.com/PredatH0r/ChanSort/issues/285
**Mac**

View File

@@ -80,8 +80,10 @@ Systemvoraussetzungen
- winetricks (sudo apt-get install winetricks)
- Starte winetricks, wähle oder erstelle ein wineprefix (32 bit oder 64 bit), wähle
"Installiere Windows DLL oder Komponente", installiere das "dotnet48" Paket and ignore dutzende Popup-Dialoge
- Rechtsklick auf ChanSort.exe, wähle "Öffnen mit", "Alle Anwendungen", "Eine wine Anwendung"
Or mit Docker: https://github.com/PredatH0r/ChanSort/issues/285
- Rechtsklick auf ChanSort.exe, wähle "Öffnen mit", "Alle Anwendungen", "Eine wine Anwendung"
Zuletzt getestet mit Ubuntu 24.10, wine-9.0, winetricks 20240105
Oder mit Docker: https://github.com/PredatH0r/ChanSort/issues/285
**Mac**
- macOS wird nicht direkt unterstützt, aber mit Parallels oder UTM kann eine VM mit Windows 10/11 am Mac genutzt werden

View File

@@ -79,7 +79,8 @@ Wymagania systemowe
- wino (sudo apt-get install wine)
- winetricki (sudo apt-get install winetrics)
- uruchom winetricki, wybierz lub utwórz prefiks wina (32-bitowy lub 64-bitowy), wybierz
"Zainstaluj Windows DLL lub komponent" i zainstaluj pakiet "dotnet48" i zignoruj dziesiątki okienek komunikatów- right-click on ChanSort.exe and select "open with", "all applications", "A wine application"
"Zainstaluj Windows DLL lub komponent" i zainstaluj pakiet "dotnet48" i zignoruj dziesiątki okienek komunikatów- right-click on ChanSort.exe and select "open with", "all applications", "A wine application"
Ostatnio testowano z Ubuntu 24.10, wine-9.0, winetricks 20240105
**Sprzęt komputerowy**:
- Pamięć USB/karta SD do przesyłania listy kanałów między telewizorem a komputerem. Pendrive <= 32 GB z systemem plików FAT32

View File

@@ -75,7 +75,8 @@ Sistem Gereksinimleri
- wine (sudo apt-get install wine)
- winetricks (sudo apt-get install winetricks)
- winetricks'i başlatın, wineprefix'i seçin ya da oluşturun (32 bit ya da 64 bit), "Install Windows DLL or component"i seçin ve "dotnet48" paketini yükleyin, bu sırada çıkan düzinelerce uyarı mesajını görmezden gelin
- ChanSort.exe'ye sağ tıklayın ve "open with", "all applications", "A wine application" sırasınca seçin
- ChanSort.exe'ye sağ tıklayın ve "open with", "all applications", "A wine application" sırasınca seçin
Son olarak Ubuntu 24.10, wine-9.0, winetricks 20240105 ile test edildi
**Mac**
- macOS doğrudan desteklenmez, ancak Mac'te Windows 10/11 ile bir VM kurmak için Parallels veya UTM kullanabilirsiniz

View File

@@ -1,24 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>..\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>..\Release\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>..\Release\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<Compile Update="Resources.de.Designer.cs">

View File

@@ -105,6 +105,30 @@ namespace ChanSort.Api
}
#endregion
#region MemComp()
/// <summary>
/// Bytewise comparison of 2 arrays
/// </summary>
/// <returns>
/// &lt;0 if <param name="arr1"></param>[i] &lt; <param name="with"></param>[i] or ends earlier
/// </returns>
public static int MemComp(byte[] arr1, int idx1, byte[] with)
{
int i = idx1;
int j = 0;
int c = Math.Min(with.Length, arr1.Length - idx1);
while (j < c)
{
var v = arr1[i++] - with[j++];
if (v != 0)
return v;
}
return j - with.Length;
}
#endregion
#region ReverseByteOrder()
public static ushort ReverseByteOrder(ushort input)
{

View File

@@ -42,7 +42,7 @@ namespace ChanSort.Loader.Amdb
#region Load()
public override void Load()
{
string connString = $"Data Source={this.FileName};Pooling=False";
string connString = $"Data Source=\"{this.FileName}\";Pooling=False";
using var conn = new SqliteConnection(connString);
conn.Open();
@@ -253,7 +253,7 @@ order by t.db_sat_para_id, case p.service_type when 0 then 3 when 1 then 0 when
#region Save()
public override void Save()
{
string channelConnString = $"Data Source={this.FileName};Pooling=False";
string channelConnString = $"Data Source=\"{this.FileName}\";Pooling=False";
using var conn = new SqliteConnection(channelConnString);
conn.Open();
using var trans = conn.BeginTransaction();

View File

@@ -1,10 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<Import Project="..\Solution.props" />
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>..\Debug\</OutputPath>
@@ -13,8 +8,8 @@
<OutputPath>..\Release\</OutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
<ItemGroup>

View File

@@ -87,7 +87,7 @@ namespace ChanSort.Loader.Android
#region Load()
public override void Load()
{
using var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{this.FileName}\";Pooling=False");
conn.Open();
using var cmd = conn.CreateCommand();
@@ -162,7 +162,7 @@ namespace ChanSort.Loader.Android
/// </summary>
public override void Save()
{
using var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{this.FileName}\";Pooling=False");
conn.Open();
using var trans = conn.BeginTransaction();
using var cmd = conn.CreateCommand();

View File

@@ -1,4 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
@@ -15,11 +16,7 @@
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="System.Buffers" Version="4.6.0" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Numerics.Vectors" Version="4.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
</Project>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -1,4 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
@@ -44,23 +45,7 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="System.Buffers" Version="4.6.0" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Numerics.Vectors" Version="4.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
</ItemGroup>
<ItemGroup>
<Content Remove="C:\Users\horst\.nuget\packages\sqlitepclraw.lib.e_sqlite3\2.1.2\buildTransitive\net461\..\..\runtimes\win-x86\native\e_sqlite3.dll" />
</ItemGroup>
<ItemGroup>
<Content Remove="C:\Users\horst\.nuget\packages\sqlitepclraw.lib.e_sqlite3\2.1.2\buildTransitive\net461\..\..\runtimes\win-x64\native\e_sqlite3.dll" />
</ItemGroup>
<ItemGroup>
<Content Remove="C:\Users\horst\.nuget\packages\sqlitepclraw.lib.e_sqlite3\2.1.2\buildTransitive\net461\..\..\runtimes\win-arm\native\e_sqlite3.dll" />
</ItemGroup>
<ItemGroup>
<None Include="..\app.config" Link="app.config" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
</Project>

View File

@@ -141,7 +141,7 @@ namespace ChanSort.Loader.Hisense.ChannelDb
public override void Load()
{
using (var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False"))
using (var conn = new SqliteConnection($"Data Source=\"{this.FileName}\";Pooling=False"))
{
conn.Open();
using var cmd = conn.CreateCommand();
@@ -468,7 +468,7 @@ namespace ChanSort.Loader.Hisense.ChannelDb
{
Editor.SequentializeFavPos(this.channelLists[6], 4);
using var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{this.FileName}\";Pooling=False");
conn.Open();
using var trans = conn.BeginTransaction();
using var cmd = conn.CreateCommand();

View File

@@ -114,7 +114,7 @@ namespace ChanSort.Loader.Hisense.ServicelistDb
public override void Load()
{
using (var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False"))
using (var conn = new SqliteConnection($"Data Source=\"{this.FileName}\";Pooling=False"))
{
conn.Open();
using (var cmd = conn.CreateCommand())
@@ -445,7 +445,7 @@ left outer join {dbSchema.DvbServiceTable} digs on digs.ServiceId=s.Pid
public override void Save()
{
using var conn = new SqliteConnection($"Data Source={this.FileName};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{this.FileName}\";Pooling=False");
conn.Open();
using var trans = conn.BeginTransaction();
using var cmd = conn.CreateCommand();

View File

@@ -45,4 +45,8 @@
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Update="System.Memory" Version="4.6.3" />
<PackageReference Update="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
</ItemGroup>
</Project>

View File

@@ -1,28 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>..\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>true</CodeAnalysisFailOnMissingRules>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>..\Release\</OutputPath>
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisFailOnMissingRules>true</CodeAnalysisFailOnMissingRules>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<Compile Update="Resource.Designer.cs">

View File

@@ -1,4 +1,6 @@
using System.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
@@ -14,7 +16,7 @@ public class Serializer : SerializerBase
* Examples are Philips channel list formats 120 and 125 and Sony BRAVIA 7 (2024).
* However there are differences between Philips and Sony:
* - Sony lacks a number of XML elements
* - Sony seems to manage TV, Radio and Data channels internally in separate lists, all starting at 1, while Philips seems to use one combined list with no duplicate major_channel_numbers
* - Sony uses separate lists for TV, radio and data, while Philips puts them in a combine list. This is controlled by the MultiBank-setting in <internal><scan>
*
* <service_list_transfer>
* <service_list_infos>
@@ -45,7 +47,7 @@ public class Serializer : SerializerBase
* <satelliteName>
* <internal>
* <summary> (base64 encoded Java serialized binary)
* <scan> (base64 encoded Java serialized binary)
* <scan> (base64 encoded Java serialized binary, containing several scan settings)
* <service_database> (base64 encoded Java serialized binary, which contains proprietary MediaTek compressed/encrypted cl_Zip data)
*/
@@ -53,22 +55,22 @@ public class Serializer : SerializerBase
private byte[] content;
private string textContent;
private readonly StringBuilder fileInfo = new();
private readonly bool splitTvRadioData;
private bool splitTvRadioData; // controlled by the MultiBank setting inside the <scan> Java serialized stream; Philips=false, Sony=true
private bool usesLcn;
public readonly Dictionary<string, string> ScanParameters = new();
#region ctor()
public Serializer(string inputFile, bool separateTvRadioData = false) : base(inputFile)
public Serializer(string inputFile) : base(inputFile)
{
this.splitTvRadioData = separateTvRadioData;
this.Features.ChannelNameEdit = ChannelNameEditMode.All;
this.Features.DeleteMode = DeleteMode.NotSupported;
this.Features.FavoritesMode = FavoritesMode.None;
this.Features.CanSkipChannels = false;
this.Features.CanLockChannels = true;
this.Features.CanHideChannels = false;
this.Features.CanHideChannels = false; // unclear how "visible_service" works (3 for normal channels, 1 for hidden?)
this.Features.CanSaveAs = true;
}
#endregion
#region Load()
@@ -102,18 +104,74 @@ public class Serializer : SerializerBase
if (fail || root == null || root.LocalName != "service_list_transfer")
throw LoaderException.TryNext("\"" + this.FileName + "\" is not a supported MediaTek XML file");
var nodesByName = new Dictionary<string, XmlNode>();
foreach (XmlNode child in root.ChildNodes)
nodesByName[child.LocalName] = child;
// read <internal><scan> first to determine this.splitTvRadioData
if (nodesByName.TryGetValue("internal", out var node))
{
switch (child.LocalName)
foreach (XmlNode childNode in node.ChildNodes)
{
case "service_list_infos":
ReadServiceListInfos(child);
break;
case "internal":
// child elements: summary, scan, service_database
break;
if (childNode.LocalName == "scan")
ReadScanElement(Convert.FromBase64String(childNode.InnerText));
}
}
// now read the channels
if (nodesByName.TryGetValue("service_list_infos", out node))
ReadServiceListInfos(node);
}
#endregion
#region ReadScanElement()
private static readonly byte[] EnumMarker = [0, 0, 0, 0, 0, 0, 0, 0, 0x12, 0, 0, 0x78, 0x71, 0, 0x7e, 0]; // , 0x0e, 0x74 philips; , 0x14, 0x74 sony;
private void ReadScanElement(byte[] data)
{
/*
* The base64 encoded <scan> element contains serialized Java objects.
* The exact binary data layout is unknown and varies between brands and maybe firmware versions.
* Some data in it gives clues about LCNs are used and whether a FULL scan was used to setup the channel list, whether TV,radio and data channels are in a combined list or separated, ...
*
* To detectd values, we look for: (uiLen "com.[mediatek|sony].dtv.broadcast.middleware.scan.engine.ScanSettings$<name>") \x00{8} \x12 \x00\x00\x78\x71 \x00\x7e \x00\x?? \x74 (uiLen "<value>")
*/
var str = Encoding.ASCII.GetString(data);
for (int idx = str.IndexOf("com.", StringComparison.InvariantCulture); idx >= 2; idx = str.IndexOf("com.", idx, StringComparison.InvariantCulture))
{
// get the setting name
var len = data[idx - 2] * 256 + data[idx - 1];
var name = str.Substring(idx, len);
var i = name.IndexOf('$'); // only care about the name part after the $-sign
if (i >= 0)
name = name.Substring(i + 1);
// check for the EnumMarker, followed by 2 bytes (first of them varies between Philips and sony)
idx += len;
if (idx + EnumMarker.Length + 2 >= data.Length)
continue;
if (Tools.MemComp(data, idx, EnumMarker) != 0)
continue;
idx += EnumMarker.Length + 2;
// get the enum value
len = data[idx] * 256 + data[idx + 1];
idx += 2;
if (idx + len >= data.Length)
continue;
var value = str.Substring(idx, len);
idx += len;
this.ScanParameters[name] = value;
this.fileInfo.AppendLine($"{name}: {value}");
// handle relevant settings
if (name == "MultiBank")
splitTvRadioData |= value == "SEPARATE_TV_RADIO_DATA";
else if (name == "LcnType")
usesLcn |= value != "LCNS_DISABLED";
}
}
#endregion
@@ -176,10 +234,10 @@ public class Serializer : SerializerBase
chan.RecordOrder = idx;
chan.OldProgramNr = si.GetElementInt("major_channel_number");
// user_edit_flag ("none" in all observed records)
// user_edit_flag ("none" in all observed records, must be "update" for the TV to process the record)
chan.Name = si.GetElementString("service_name");
chan.ServiceType = si.GetElementInt("sdt_service_type");
// visible_service ("3" in all observed records)
chan.Hidden = si.GetElementInt("visible_service") != 3; // visible_service ("3" in most observed record, "1" in some others)
chan.ServiceId = si.GetElementInt("service_id");
chan.TransportStreamId = si.GetElementInt("transport_stream_id");
chan.FreqInMhz = si.GetElementInt("frequency");
@@ -212,6 +270,8 @@ public class Serializer : SerializerBase
name += " " + ((ss & SignalSource.Tv) != 0 ? " TV" : (ss & SignalSource.Radio) != 0 ? " Radio" : " Data");
list = new ChannelList(ss, name);
if (this.usesLcn)
list.ReadOnly = true;
this.DataRoot.AddChannelList(list);
}
@@ -219,11 +279,11 @@ public class Serializer : SerializerBase
list.ReadOnly |= elements.Count == 1 && elements[0].Attributes!["editable", si.NamespaceURI].InnerText == "false";
list.AddChannel(chan);
chan.SignalSource = ss;
}
#endregion
#region GetFileInformation()
public override string GetFileInformation()
@@ -238,17 +298,54 @@ public class Serializer : SerializerBase
#region Save()
public override void Save()
{
// if splitTvRadioData is set, the 3 lists must be recombined and sorted together as a single list; there may still be multiple lists depending on input sources (DVB-T/C/S)
var recombinedLists = new Dictionary<SignalSource, List<ChannelInfo>>();
foreach (var list in this.DataRoot.ChannelLists)
{
foreach (var chan in list.Channels)
if (list.Channels.Count == 0 || list.ReadOnly)
continue;
if (this.splitTvRadioData)
{
if (!recombinedLists.TryGetValue(list.SignalSource & ~SignalSource.MaskTvRadioData, out var combinedList))
{
combinedList = new List<ChannelInfo>();
recombinedLists[list.SignalSource & ~SignalSource.MaskTvRadioData] = combinedList;
}
combinedList.AddRange(list.Channels);
}
else
{
recombinedLists.Add(list.SignalSource, list.Channels.ToList());
}
}
// sort the channels in the recombined lists
foreach (var list in recombinedLists.Values)
{
XmlNode serviceListInfoNode = null;
foreach (var chan in list.OrderBy(c => c.NewProgramNr).ThenBy(c => c.OldProgramNr).ThenBy(c => c.RecordIndex))
{
if (chan is not Channel ch || ch.IsProxy)
continue;
var si = ch.Xml;
// reorder nodes physically: first remove all, then add them 1-by-1
if (serviceListInfoNode == null)
{
serviceListInfoNode = si.ParentNode;
while (serviceListInfoNode!.HasChildNodes)
serviceListInfoNode.RemoveChild(serviceListInfoNode.FirstChild);
}
serviceListInfoNode.AppendChild(si);
si["major_channel_number"]!.InnerText = ch.NewProgramNr.ToString();
si["service_name"]!.InnerText = ch.Name;
si["visible_service"]!.InnerText = ch.Hidden ? "1" : "3";
si["user_edit_flag"]!.InnerText = "update";
if (ch.IsNameModified)
si["service_name"]!.InnerText = ch.Name;
// si["visible_service"]!.InnerText = ch.Hidden ? "1" : "3"; // reported to have no effect in Philips v125 lists
if (si["lock"] != null) // Sony lists don't have this elements
si["lock"].InnerText = ch.Lock ? "1" : "0";
}

View File

@@ -1,25 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>..\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>..\Release\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<Service Include="{94E38DFF-614B-4cbd-B67C-F211BB35CE8B}" />
</ItemGroup>
@@ -32,11 +20,7 @@
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="System.Buffers" Version="4.6.0" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Numerics.Vectors" Version="4.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
</Project>

View File

@@ -1,4 +1,8 @@
using System;
// The NuGet packages Microsoft.Data.Sqlite 9.0.0-9.0.5 throw an AccessViolationException and terminate the program when reading a "string" column with GetBytes()
// uncomment this #define when using Sqlite < 9.x or when MS fixed the error
//#define NoAccessViolationInSQLitePCLRaw
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
@@ -200,8 +204,8 @@ namespace ChanSort.Loader.Panasonic
/// </summary>
private void ReadNamesWithEncodingDetection(IDataReader r, IDictionary<string, int> field, Encoding encoding)
{
#if true || NoAccessViolationInSQLitePCLRaw
// The NuGet packages Microsoft.Data.Sqlite 9.0.0-9.0.2 throw an AccessViolationException and terminate the program when reading a "string" column with GetBytes()
#if NoAccessViolationInSQLitePCLRaw
// The NuGet packages Microsoft.Data.Sqlite 9.0.0-9.0.5 throw an AccessViolationException and terminate the program when reading a "string" column with GetBytes()
byte[] buffer = new byte[300];
int len = (int)r.GetBytes(field["sname"], 0, buffer, 0, buffer.Length/3);
#else

View File

@@ -167,7 +167,7 @@ internal class IdtvChannelSerializer : SerializerBase
if (!File.Exists(binFile))
throw LoaderException.Fail("expected file not found: " + binFile);
string connString = $"Data Source={this.dbFile};Pooling=False";
string connString = $"Data Source=\"{this.dbFile}\";Pooling=False";
using var db = new SqliteConnection(connString);
db.Open();
using var cmd = db.CreateCommand();
@@ -590,7 +590,7 @@ internal class IdtvChannelSerializer : SerializerBase
#region SaveTvDb()
private void SaveTvDb(IDictionary<ushort, int> newChannelIndexMap)
{
string connString = $"Data Source={this.dbFile};Pooling=False";
string connString = $"Data Source=\"{this.dbFile}\";Pooling=False";
using var db = new SqliteConnection(connString);
db.Open();

View File

@@ -78,7 +78,7 @@ namespace ChanSort.Loader.Panasonic
this.CreateDummySatellites();
string channelConnString = $"Data Source={this.workFile};Pooling=False";
string channelConnString = $"Data Source=\"{this.workFile}\";Pooling=False";
using var conn = new SqliteConnection(channelConnString);
conn.Open();
using var cmd = conn.CreateCommand();
@@ -301,7 +301,7 @@ order by s.ntype,major_channel
#region Save()
public override void Save()
{
string channelConnString = $"Data Source={this.workFile};Pooling=False";
string channelConnString = $"Data Source=\"{this.workFile}\";Pooling=False";
using (var conn = new SqliteConnection(channelConnString))
{
conn.Open();

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -605,7 +605,7 @@ namespace ChanSort.Loader.Philips
return;
this.dataFilePaths.Add(dbPath);
using var conn = new SqliteConnection($"Data Source={dbPath};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{dbPath}\";Pooling=False");
conn.Open();
using var cmd = conn.CreateCommand();
@@ -677,7 +677,7 @@ namespace ChanSort.Loader.Philips
}
}
using var conn = new SqliteConnection($"Data Source={tvDb};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{tvDb}\";Pooling=False");
conn.Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = "select _id, display_number, display_name, original_network_id, transport_stream_id, service_id, service_type from channels";
@@ -737,7 +737,7 @@ namespace ChanSort.Loader.Philips
this.Features.FavoritesMode = FavoritesMode.OrderedPerSource;
this.Features.MaxFavoriteLists = 4;
using var conn = new SqliteConnection($"Data Source={listDb};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{listDb}\";Pooling=False");
conn.Open();
using var cmd = conn.CreateCommand();
@@ -795,7 +795,7 @@ namespace ChanSort.Loader.Philips
this.Features.MaxFavoriteLists = 8;
this.Features.AllowGapsInFavNumbers = false;
using var conn = new SqliteConnection($"Data Source={listDb};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{listDb}\";Pooling=False");
conn.Open();
// older versions of ChanSort wrote invalid "list_id" values starting at 0 instead of 1 and going past 8.
@@ -1105,7 +1105,7 @@ namespace ChanSort.Loader.Philips
if (!File.Exists(dbPath))
return;
using var conn = new SqliteConnection($"Data Source={dbPath};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{dbPath}\";Pooling=False");
conn.Open();
using var trans = conn.BeginTransaction();
using var cmd = conn.CreateCommand();
@@ -1144,7 +1144,7 @@ namespace ChanSort.Loader.Philips
if (!File.Exists(tvDb))
return;
using var conn = new SqliteConnection($"Data Source={tvDb};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{tvDb}\";Pooling=False");
conn.Open();
using var trans = conn.BeginTransaction();
using var cmd = conn.CreateCommand();
@@ -1185,7 +1185,7 @@ namespace ChanSort.Loader.Philips
if (!File.Exists(listDb) || this.channelsById.Count == 0)
return;
using var conn = new SqliteConnection($"Data Source={listDb};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{listDb}\";Pooling=False");
conn.Open();
using var trans = conn.BeginTransaction();
using var cmd = conn.CreateCommand();
@@ -1248,7 +1248,7 @@ namespace ChanSort.Loader.Philips
if (!File.Exists(listDb))
return;
using var conn = new SqliteConnection($"Data Source={listDb};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{listDb}\";Pooling=False");
conn.Open();
using var trans = conn.BeginTransaction();
using var cmd = conn.CreateCommand();

View File

@@ -1,24 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>..\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<LangVersion>latest</LangVersion>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
@@ -44,12 +38,8 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="System.Buffers" Version="4.6.0" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Numerics.Vectors" Version="4.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
<ItemGroup>
<Compile Remove="DllClient.cs" />

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Xml;
@@ -229,14 +230,14 @@ namespace ChanSort.Loader.Philips
LoadAndValidateMtkChannelList(dir);
// version 120 and 125 ignore the modified main channel numbers and only take changes from the favorites.xml
if ((chanLstBin?.VersionMajor ?? 0) >= 120)
{
foreach (var list in this.DataRoot.ChannelLists)
{
if (!list.IsMixedSourceFavoritesList)
list.ReadOnly = true;
}
}
//if ((chanLstBin?.VersionMajor ?? 0) >= 120)
//{
// foreach (var list in this.DataRoot.ChannelLists)
// {
// if (!list.IsMixedSourceFavoritesList)
// list.ReadOnly = true;
// }
//}
}
else
{
@@ -352,6 +353,8 @@ namespace ChanSort.Loader.Philips
medium = fname;
bool hasEncrypt = false;
var ver = this.chanLstBin?.VersionMajor ?? 0;
foreach (var list in this.DataRoot.ChannelLists)
{
list.VisibleColumnFieldNames.Remove("ServiceType");
@@ -417,7 +420,6 @@ namespace ChanSort.Loader.Philips
if (!hasEncrypt)
chList?.VisibleColumnFieldNames.Remove("Encrypted");
var ver = this.chanLstBin?.VersionMajor ?? 0;
if (ver > 0)
this.iniMapSection = ini.GetSection("Map" + ver);
@@ -765,12 +767,16 @@ namespace ChanSort.Loader.Philips
public override void Save()
{
bool readOnly = false;
foreach (var list in this.DataRoot.ChannelLists)
{
if (list.IsMixedSourceFavoritesList)
this.UpdateFavList();
else
{
this.UpdateChannelList(list);
readOnly |= list.ReadOnly;
}
}
// It is unclear whether XML nodes must be sorted by the new program number or kept in the original order. This may be different for the various format versions.
@@ -791,7 +797,14 @@ namespace ChanSort.Loader.Philips
}
this.chanLstBin?.Save(this.FileName);
this.mtkSerializer?.Save();
// save the MtkChannelList.xml for format 120 and 125
if (mtkSerializer != null && !readOnly)
{
foreach (var list in mtkSerializer.DataRoot.ChannelLists) // apply Philips' LCN-ReadOnly to MediaTek's ReadOnly
list.ReadOnly = false;
this.mtkSerializer.Save();
}
}
#endregion
@@ -799,6 +812,31 @@ namespace ChanSort.Loader.Philips
#region UpdateChannelList()
private void UpdateChannelList(ChannelList list)
{
if (list.ReadOnly)
return;
#if false
// ensure consecutive numbers for channels (seems to be a requirement for successful import of MtkChannelList.xml)
if (this.chanLstBin?.VersionMajor is >= 120 and <= 125)
{
var ordered = list.Channels
.Where(c => !c.IsProxy)
.OrderBy(c => (c.SignalSource & SignalSource.Tv) != 0 ? 0 : 1)
.ThenBy(c => c.NewProgramNr > 0 ? 0 : 1)
.ThenBy(c => c.NewProgramNr)
.ThenBy(c => c.OldProgramNr)
.ToList();
int i = 0;
foreach (var ch in ordered)
{
if (ch.IsProxy)
list.Channels.Remove(ch);
else
ch.NewProgramNr = ++i;
}
}
#endif
var padChannelNameBytes = this.iniMapSection?.GetBool("padChannelName", true) ?? true;
var setFavoriteNumber = this.iniMapSection?.GetBool("setFavoriteNumber", false) ?? false;
var userReorderChannel = this.iniMapSection?.GetString("userReorderChannel") ?? "";
@@ -826,7 +864,7 @@ namespace ChanSort.Loader.Philips
}
}
}
#endregion
#endregion
#region UpdateRepairXml()
@@ -898,7 +936,7 @@ namespace ChanSort.Loader.Philips
private void UpdateMtkChannel(Channel channel)
{
var mtk = channel.MtkChannel;
//mtk.Name = channel.Name;
mtk.Name = channel.Name;
mtk.NewProgramNr = channel.NewProgramNr;
mtk.Lock = channel.Lock;
mtk.Skip = channel.Skip;
@@ -1050,7 +1088,10 @@ namespace ChanSort.Loader.Philips
#region GetFileInformation()
public override string GetFileInformation()
{
return base.GetFileInformation() + this.logMessages.Replace("\n", "\r\n");
return base.GetFileInformation()
+ this.logMessages.Replace("\n", "\r\n")
+ "\r\n\r\n"
+ this.mtkSerializer?.GetFileInformation();
}
#endregion

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -1,29 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>..\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>..\Release\</OutputPath>
<CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
<CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>true</CodeAnalysisFailOnMissingRules>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
@@ -38,12 +32,8 @@
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.Buffers" Version="4.6.0" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Numerics.Vectors" Version="4.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
</ItemGroup>
</Project>

View File

@@ -77,7 +77,7 @@ namespace ChanSort.Loader.Samsung.Zip
{
try
{
using var conn = new SqliteConnection($"Data Source={(this.TempPath + "\\sat")};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{this.TempPath + "\\sat"}\";Pooling=False");
conn.Open();
this.ReadSatDatabase(conn);
}
@@ -100,7 +100,7 @@ namespace ChanSort.Loader.Samsung.Zip
FileType type;
try
{
using var conn = new SqliteConnection($"Data Source={filePath};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{filePath}\";Pooling=False");
conn.Open();
using (var cmd = conn.CreateCommand())
{
@@ -535,7 +535,7 @@ namespace ChanSort.Loader.Samsung.Zip
#region SaveChannelList()
private void SaveChannelList(ChannelList channelList, string dbPath)
{
using var conn = new SqliteConnection($"Data Source={dbPath};Pooling=False");
using var conn = new SqliteConnection($"Data Source=\"{dbPath}\";Pooling=False");
conn.Open();
using (var trans = conn.BeginTransaction())
{

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -11,14 +11,16 @@ namespace ChanSort.Loader.Sony
public SerializerBase CreateSerializer(string inputFile)
{
// Bravia 7 (and 8?) from 2024 onward use the same sdb.xml filename, but it contains Mediatek's XML
using (var rdr = new StreamReader(inputFile))
{
var line1 = rdr.ReadLine() ?? "";
var line2 = rdr.ReadLine() ?? "";
if (line1.Contains("<service_list_transfer>") || line2.Contains("<service_list_transfer>"))
return new MediaTek.Serializer(inputFile, true);
return new MediaTek.Serializer(inputFile);
}
// older versions use Sony's proprietary XML
return new Serializer(inputFile);
}
}

View File

@@ -6,11 +6,15 @@
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Update="System.Memory" Version="4.6.3" />
<PackageReference Update="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
</ItemGroup>
</Project>

View File

@@ -194,7 +194,7 @@ namespace ChanSort.Loader.TCL
{
if (this.satFile == null)
return;
string satConnString = $"Data Source={satFile};Pooling=False";
string satConnString = $"Data Source=\"{satFile}\";Pooling=False";
using var conn = new SqliteConnection(satConnString);
conn.Open();
using var cmd = conn.CreateCommand();
@@ -217,7 +217,7 @@ namespace ChanSort.Loader.TCL
#region ReadDtvDataDb()
private void ReadDtvDataDb()
{
string dtvConnString = $"Data Source={dtvFile};Pooling=False";
string dtvConnString = $"Data Source=\"{dtvFile}\";Pooling=False";
using var conn = new SqliteConnection(dtvConnString);
conn.Open();
using var cmd = conn.CreateCommand();
@@ -372,7 +372,7 @@ left outer join CurCIOPSerType c on c.u8DtvRoute=p.u8DtvRoute
#region Save()
public override void Save()
{
string channelConnString = $"Data Source={dtvFile};Pooling=False";
string channelConnString = $"Data Source=\"{dtvFile}\";Pooling=False";
using (var conn = new SqliteConnection(channelConnString))
{
conn.Open();

View File

@@ -1,4 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
@@ -30,12 +31,8 @@
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<PackageReference Include="System.Buffers" Version="4.6.0" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Numerics.Vectors" Version="4.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
</ItemGroup>
</Project>

View File

@@ -53,7 +53,7 @@ namespace ChanSort.Loader.Toshiba
else
workingDir = Path.GetDirectoryName(this.FileName);
var sysDataConnString = $"Data Source={this.workingDir + FILE_dvbSysData_db};Pooling=false";
var sysDataConnString = $"Data Source=\"{this.workingDir + FILE_dvbSysData_db}\";Pooling=false";
using (var conn = new SqliteConnection(sysDataConnString))
{
conn.Open();
@@ -63,7 +63,7 @@ namespace ChanSort.Loader.Toshiba
ReadTransponders(cmd);
}
var mainDataConnString = $"Data Source={this.workingDir + FILE_dvbMainData_db};Pooling=False";
var mainDataConnString = $"Data Source=\"{this.workingDir + FILE_dvbMainData_db}\";Pooling=False";
using (var conn = new SqliteConnection(mainDataConnString))
{
conn.Open();
@@ -71,7 +71,7 @@ namespace ChanSort.Loader.Toshiba
ReadCryptInfo(cmd);
}
var channelConnString = $"Data Source={this.workingDir + FILE_chmgt_db};Pooling=False";
var channelConnString = $"Data Source=\"{this.workingDir + FILE_chmgt_db}\";Pooling=False";
using (var conn = new SqliteConnection(channelConnString))
{
conn.Open();
@@ -260,7 +260,7 @@ namespace ChanSort.Loader.Toshiba
public override void Save()
{
var channelConnString = $"Data Source={this.workingDir + FILE_chmgt_db};Pooling=False";
var channelConnString = $"Data Source=\"{this.workingDir + FILE_chmgt_db}\";Pooling=False";
using (var conn = new SqliteConnection(channelConnString))
{
conn.Open();

View File

@@ -67,7 +67,7 @@ namespace ChanSort.Loader.Toshiba
#region Load()
public override void Load()
{
string sysDataConnString = $"Data Source={this.FileName};Pooling=False";
string sysDataConnString = $"Data Source=\"{this.FileName}\";Pooling=False";
using var conn = new SqliteConnection(sysDataConnString);
conn.Open();
@@ -208,7 +208,7 @@ left outer join ChanDataTable ac on ac.handle=a.m_channel_no
#region Save()
public override void Save()
{
string channelConnString = $"Data Source={this.FileName};Pooling=False";
string channelConnString = $"Data Source=\"{this.FileName}\";Pooling=False";
using (var conn = new SqliteConnection(channelConnString))
{
conn.Open();

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -1,4 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
@@ -13,12 +14,17 @@
<OutputPath>..\Release\</OutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Update="System.Memory" Version="4.6.3" />
<PackageReference Update="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
</ItemGroup>
</Project>

View File

@@ -47,7 +47,7 @@ namespace ChanSort.Loader.VisionEdge4K
#region Load()
public override void Load()
{
string connString = $"Data Source={this.FileName};Pooling=False";
string connString = $"Data Source=\"{this.FileName}\";Pooling=False";
using var conn = new SqliteConnection(connString);
conn.Open();
@@ -281,7 +281,7 @@ order by p.tv_type,p.disp_order";
#region Save()
public override void Save()
{
string channelConnString = $"Data Source={this.FileName};Pooling=False";
string channelConnString = $"Data Source=\"{this.FileName}\";Pooling=False";
using var conn = new SqliteConnection(channelConnString);
conn.Open();
using var trans = conn.BeginTransaction();

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<OutputType>WinExe</OutputType>
<RootNamespace>ChanSort.Ui</RootNamespace>
@@ -218,13 +217,17 @@
<PackageReference Include="DevExpress.Utils.UI" Version="23.2.5" />
<PackageReference Include="DevExpress.Win" Version="23.2.5" />
<PackageReference Include="DevExpress.Win.Reporting" Version="23.2.5" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Remove="ActionImages.resx" />
</ItemGroup>
<ItemGroup>
<PackageReference Update="System.Memory" Version="4.6.3" />
<PackageReference Update="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
</ItemGroup>
<PropertyGroup>
<PostBuildEvent>
$(MSBuildProjectDirectory)\..\deployLibs.cmd $(TargetDir)

View File

@@ -557,6 +557,8 @@ namespace ChanSort.Ui
return null;
}
SetCurrentDirectory(); // make sure .ini files are in the current dir
List<ISerializerPlugin> candidates = new List<ISerializerPlugin>();
if (hint != null)
candidates.Add(hint);
@@ -630,6 +632,20 @@ namespace ChanSort.Ui
#endregion
#region SetCurrentDirectory()
/// <summary>
/// Sets the current directory to the directory from where the .exe was started.
/// This is so that .ini files can be found by loaders
/// </summary>
internal static void SetCurrentDirectory()
{
var curDir = Path.GetDirectoryName(typeof(MainForm).Assembly.Location);
if (curDir == null)
return;
Directory.SetCurrentDirectory(curDir);
}
#endregion
#region LoadTvDataFile()
private bool LoadTvDataFile(ISerializerPlugin plugin, string tvDataFile)
@@ -641,6 +657,8 @@ namespace ChanSort.Ui
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
SetCurrentDirectory();
// abort action if there is no currentTvSerializer for the input file
SerializerBase serializer = this.GetSerializerForFile(tvDataFile, ref plugin);

View File

@@ -53,22 +53,6 @@
</System.Windows.Forms.ApplicationConfigurationSection>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -0,0 +1,204 @@
#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 TLL84_SatChannel;
typedef TLL84_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 LF252_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 LF252_AnalogBlock
{
dword BlockSize;
dword ChannelCount;
LF252_AnalogChannel Channels[ChannelCount];
};
struct LF252_FirmwareBlock
{
dword BlockSize;
byte u[BlockSize];
};
struct LF252_DvbCtChannel
{
byte t1[8];
TLL_SignalSource SignalSource;
byte t1b;
word ChannelTransponder1;
word ProgramNr;
word LogicalProgramNr1;
byte t2a[4];
byte Fav1;
byte t2b[3];
TLL_DvbID PcrPid1;
TLL_DvbID APID1;
byte t2c[8];
TLL_DvbID VPID1;
byte t3[6];
char CH_Name1[40];
byte CH_NameLength1;
byte t4;
word SID1;
byte t5a[47];
byte NitVersion;
word ChannelTransponder2;
byte t5b[2];
dword Frequency;
byte t6[4];
word ONID;
word TSID;
word NID;
dword SpecialData;
byte t7[15];
word ChannelTransponder3;
byte t7b;
word ProgramNr2;
word LogicalProgramNr2;
word ChannelTransponder4;
byte Favorites2;
TLL_EditFlags EditFlags;
byte t7c[2];
word SID2;
byte ServiceType;
byte CH_NameLength2;
char CH_Name2[40];
//byte t10[12];
TLL_DvbID PcrPid2;
TLL_DvbID APID2;
word u1;
word u2;
byte t11[14];
};
struct LF252_DvbCTBlock
{
dword BlockSize;
dword ChannelCount;
LF252_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 TLL84_SatChannel
{
word LnbIndex;
word t1;
TLL_SignalSource SignalSource;
//byte t2;
word TP_Number;
byte t2;
TLL_DvbID CH_Number;
word CH_NumberFixed;
word TP_Number2;
byte FavCrypt;
TLL_EditFlags EditFlags;
byte t3[2];
word SID;
byte ServiceType;
byte CH_NameLength;
char CH_Name[40];
TLL_DvbID VPID;
TLL_DvbID APID;
byte t3[18];
};
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 LF252
{
byte Header[4];
LF252_AnalogBlock Analog;
LF252_FirmwareBlock Firmware;
LF252_DvbCTBlock DvbCT;
TLL_DvbSBlock DvbS;
TLL_SettingsBlock Settings;
};

View File

@@ -61,3 +61,9 @@ struct TLL_SettingsBlock
dword BlockSize;
byte Data[BlockSize];
};
struct TLL_DvbID
{
word id : 12;
word flags : 4;
};

View File

@@ -1,13 +1,26 @@
<Project>
<PropertyGroup>
<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
<TargetFramework>net48</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
<ItemGroup>
<None Include="..\app.config" Link="app.config" />
</ItemGroup>
<!-- latest versions of nuget packages where older versions are indirectly included through other libraries; this should avoid a flood of compiler warnings -->
<!--
<ItemGroup>
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
<None Include="..\app.config" Link="app.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
-->
<ItemGroup>
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
<PackageReference Include="System.Numerics.Vectors" Version="4.6.1" />
<PackageReference Include="System.Buffers" Version="4.6.1" />
<PackageReference Include="System.Memory" Version="4.6.3" />
</ItemGroup>
</Project>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.1.0" newVersion="6.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -0,0 +1,103 @@
using System;
using System.IO;
using System.Text;
using ChanSort.Api;
namespace Spike.MediatekXml
{
class MediatekXmlStatsCollector
{
private static readonly string[] ChannelListFileNames = ["sdb.xml", "MtkChannelList.xml"]; // Sony, Philips
static void Main()
{
using var w = new StreamWriter(@"c:\sources\chansort\testfiles\testfiles_mediatek\stats.txt");
w.WriteLine(
"File\tNumChan\tDVB-?\tDVB-T\tDVB-C\tDVB-S\tDVB-IP\tOther\tTV\tRadio\tData\tInOrder\tConseq\tHasFav\t" +
"LcnType\tOperator\tMultiBank\tScanType\tServiceType");
var dirs = new[] { "testfiles_philips\\120.0", "testfiles_philips\\125.0", "testfiles_sony\\mediatek" };
foreach (var dir in dirs)
ProcessDir(Path.Combine(@"c:\sources\chansort\testfiles", dir), w);
}
private static void ProcessDir(string dir, StreamWriter w)
{
foreach (var bak in Directory.GetFiles(dir, "*.bak"))
File.Copy(bak, bak.Replace(".bak", ""), true);
foreach (var subdir in Directory.GetDirectories(dir))
ProcessDir(subdir, w);
foreach (var name in ChannelListFileNames)
{
var file = Path.Combine(dir, name);
if (File.Exists(file))
ProcessFile(file, w);
}
}
private static void ProcessFile(string file, StreamWriter w)
{
var sb = new StringBuilder();
sb.Append(file);
try
{
var ser = new ChanSort.Loader.MediaTek.Serializer(file);
ser.Load();
int totalChans = 0;
var conseq = true;
var inOrder = true;
var hasFav = false;
var srcSum = new int[5];
var typeSum = new int[4];
foreach (var list in ser.DataRoot.ChannelLists)
{
if (list.IsMixedSourceFavoritesList)
continue;
totalChans += list.Channels.Count;
var lastNr = 0;
var chanCountBySrc = new int[5,4];
foreach (var c in list.Channels)
{
inOrder &= c.OldProgramNr >= lastNr;
if (!inOrder)
{
}
conseq &= c.OldProgramNr == lastNr + 1;
if (!conseq)
{
}
lastNr = c.OldProgramNr;
hasFav |= c.GetOldPosition(1) != -1;
var s = c.SignalSource;
var i0 = (s & SignalSource.Antenna) != 0 ? 1 : (s & SignalSource.Cable) != 0 ? 2 : (s & SignalSource.Sat) != 0 ? 3 : (s & SignalSource.Ip) != 0 ? 4 : 0;
var i1 = (s & SignalSource.Tv) != 0 ? 1 : (s & SignalSource.Radio) != 0 ? 2 : (s & SignalSource.Data) != 0 ? 3 : 0;
++chanCountBySrc[i0, i1];
++srcSum[i0];
++typeSum[i1];
}
}
sb.Append($"\t{totalChans}");
foreach(var n in srcSum)
sb.Append("\t").Append(n);
foreach (var n in typeSum)
sb.Append("\t").Append(n);
sb.Append($"\t{inOrder}\t{conseq}\t{hasFav}");
var lcnType = ser.ScanParameters.TryGet("LcnType");
var operat = ser.ScanParameters.TryGet("Operator");
var multiBank = ser.ScanParameters.TryGet("MultiBank");
var scanType = ser.ScanParameters.TryGet("ScanType");
var serviceType = ser.ScanParameters.TryGet("ServiceType"); // n/a in Sony lists
sb.Append($"\t{lcnType}\t{operat}\t{multiBank}\t{scanType}\t{serviceType}");
}
catch (Exception ex)
{
sb.Append("\t").Append(ex.Message);
}
w.WriteLine(sb.ToString());
}
}
}

View File

@@ -1,21 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Exe</OutputType>
<RootNamespace>Spike.LgWebOs5</RootNamespace>
<AssemblyName>Spike.LgWebOs5</AssemblyName>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>bin\x86\Debug\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<None Include="ChecksumFinder.cs" />
<None Include="PhilipsXmlStatsCollector.cs" />
<None Include="TechnisatDecrypt.cs" />
<None Include="WebOs5StatsCollector.cs" />
@@ -26,12 +18,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
</ItemGroup>
<ItemGroup>
<Compile Remove="ChecksumFinder.cs" />
<Compile Remove="PhilipsXmlStatsCollector.cs" />
<Compile Remove="TechnisatDecrypt.cs" />
<Compile Remove="WebOs5StatsCollector.cs" />

View File

@@ -1,14 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>bin\x86\Debug\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
</PropertyGroup>
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj" />
@@ -17,13 +10,8 @@
<Folder Include="TestFiles\" />
</ItemGroup>
<ItemGroup>
<None Include="..\app.config" Link="app.config" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="System.Memory" Version="4.6.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
</Project>

View File

@@ -5,8 +5,8 @@
<ProjectReference Include="..\Test.Loader\Test.Loader.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<PropertyGroup />
<PropertyGroup>

View File

@@ -18,8 +18,8 @@
<Folder Include="TestFiles\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
</Project>

View File

@@ -18,8 +18,8 @@
<Folder Include="TestFiles\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
</Project>

View File

@@ -1,4 +1,5 @@
using System.Linq;
using System;
using System.Linq;
using ChanSort.Api;
using ChanSort.Loader.Hisense;
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -8,6 +9,14 @@ namespace Test.Loader.Hisense.ChannelDb
[TestClass]
public class HisenseChannelDbTest
{
static HisenseChannelDbTest()
{
foreach (var ass in AppDomain.CurrentDomain.GetAssemblies())
{
System.Diagnostics.Debug.WriteLine(ass.GetName().FullName+ ": GAC=" + ass.GlobalAssemblyCache + "; " + ass.Location);
}
}
#region TestSatChannelsAddedToCorrectLists
[TestMethod]
public void TestSatChannelsAddedToCorrectLists()

View File

@@ -1,29 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Import Project="..\Solution.props" />
<PropertyGroup>
<EmbeddedResourceUseDependentUponConvention>true</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj" />
<ProjectReference Include="..\ChanSort.Loader.Hisense\ChanSort.Loader.Hisense.csproj" />
<ProjectReference Include="..\Test.Loader\Test.Loader.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<PostBuildEvent>
$(MSBuildProjectDirectory)\..\deployLibs.cmd $(TargetDir)
</PostBuildEvent>
<PostBuildEvent>$(MSBuildProjectDirectory)\..\deployLibs.cmd $(MSBuildProjectDirectory)\bin\$(Configuration)\net48</PostBuildEvent>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
</Project>

View File

@@ -35,8 +35,8 @@
<Content Include="GlobalClone.xml" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
<PackageReference Include="NUnit" Version="3.14.0" />
</ItemGroup>
</Project>

View File

@@ -26,8 +26,8 @@
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
<PackageReference Include="NUnit" Version="3.14.0" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />

View File

@@ -1,22 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<Import Project="..\Solution.props" />
<ItemGroup>
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj" />
<ProjectReference Include="..\ChanSort.Loader.Panasonic\ChanSort.Loader.Panasonic.csproj" />
<ProjectReference Include="..\Test.Loader\Test.Loader.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
<PropertyGroup>

View File

@@ -205,10 +205,10 @@
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
</Project>

View File

@@ -45,7 +45,7 @@ namespace Test.Loader.Samsung.Scm
var models = new Dictionary<string, string>();
foreach (var file in list)
{
if (file.Contains("Apu TV") || file.Contains("__broken"))
if (file.Contains("Apu TV") || file.Contains("__broken") || file.Contains("unsupported"))
continue;
Debug.Print("Testing " + file);

View File

@@ -1,49 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<Choose>
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
</ItemGroup>
</When>
<Otherwise />
</Choose>
<Import Project="..\Solution.props" />
<ItemGroup>
<ProjectReference Include="..\ChanSort.Api\ChanSort.Api.csproj" />
<ProjectReference Include="..\ChanSort.Loader.Samsung\ChanSort.Loader.Samsung.csproj" />
<ProjectReference Include="..\Test.Loader\Test.Loader.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Choose>
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
</ItemGroup>
</When>
</Choose>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
<PropertyGroup>
<PostBuildEvent>
$(MSBuildProjectDirectory)\..\deployLibs.cmd $(TargetDir)

View File

@@ -21,8 +21,8 @@
<ProjectReference Include="..\Test.Loader\Test.Loader.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
</Project>

View File

@@ -18,7 +18,7 @@
<Folder Include="TestFiles\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
</Project>

View File

@@ -9,6 +9,7 @@ namespace Test.Loader.Sony
public class SonyXmlTest
{
// Android OS seems to use the "FormateVer" XML element, KDL 2012 and 2014 use "FormatVer"
// Bravia 7 and 8 (2024, 2025) contain a Mediatek XML inside sdb.xml, just like Philips' "MtkChannelList.xml" with slight differences
#region TestAndroid ... ChannelsAddedToCorrectLists
[TestMethod]
@@ -51,6 +52,17 @@ namespace Test.Loader.Sony
}
#endregion
#region TestMediatek (Bravia 2024,2025)
[TestMethod]
public void TestMediatekCableChannelsAddedToCorrectLists()
{
// there are 237 tv+radio channels in the list, but only a subset has assigned program numbers
this.TestChannelsAddedToCorrectLists("mediatek-sdb.xml", SignalSource.DvbC | SignalSource.Tv, 237, 237, 0);
this.TestChannelsAddedToCorrectLists("mediatek-sdb.xml", SignalSource.DvbC | SignalSource.Radio, 138, 0, 138);
this.TestChannelsAddedToCorrectLists("mediatek-sdb.xml", SignalSource.DvbC | SignalSource.Data, 0, 0, 0);
}
#endregion
#region TestChannelsAddedToCorrectList
private void TestChannelsAddedToCorrectLists(string fileName, SignalSource signalSource, int expectedTotal, int expectedTv, int expectedRadio, int dataProgramSid = 0, string dataProgramName = null)
@@ -63,7 +75,13 @@ namespace Test.Loader.Sony
var root = ser.DataRoot;
var list = root.GetChannelList(signalSource);
Assert.IsNotNull(list);
if (list == null)
{
if (expectedTotal == 0)
return;
Assert.IsNotNull(list);
}
Assert.AreEqual(expectedTotal, list.Channels.Count);
Assert.AreEqual(expectedTv, list.Channels.Count(ch => (ch.SignalSource & SignalSource.Tv) != 0));
Assert.AreEqual(expectedRadio, list.Channels.Count(ch => (ch.SignalSource & SignalSource.Radio) != 0));
@@ -190,6 +208,5 @@ namespace Test.Loader.Sony
RoundtripTest.TestChannelAndFavListEditing(tempFile, new SonyPlugin());
}
#endregion
}
}

View File

@@ -17,8 +17,8 @@
<ProjectReference Include="..\Test.Loader\Test.Loader.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
</Project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<Import Project="..\Solution.props" />
<ItemGroup>
<None Update="TestFiles\settingsDB.db">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -21,10 +14,10 @@
<ProjectReference Include="..\Test.Loader\Test.Loader.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.13" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="8.0.13" />
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
<PropertyGroup>

View File

@@ -22,8 +22,8 @@
<ProjectReference Include="..\Test.Loader\Test.Loader.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
<Import Project="..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\net48\NETStandard.Library.targets')" />
</Project>

View File

@@ -28,7 +28,7 @@ namespace Test.Loader
foreach(var file in list)
{
var lfile = file.ToLowerInvariant();
if (lfile.Contains("globalclone") || lfile.Contains("atsc") || lfile.Contains("broken") || lfile.Contains("bad") || lfile.Contains("incomplete"))
if (lfile.Contains("globalclone") || lfile.Contains("atsc") || lfile.Contains("broken") || lfile.Contains("bad") || lfile.Contains("incomplete") || lfile.Contains("unsupported"))
continue;
//Debug.Print("Testing " + file);
try

View File

@@ -1,19 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Solution.props" />
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<OutputPath>..\Debug\</OutputPath>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
</PropertyGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup>
<CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
<Visible>False</Visible>
@@ -24,7 +14,7 @@
<ProjectReference Include="..\ChanSort.Loader.LG\ChanSort.Loader.LG.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.8.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>
</Project>

View File

@@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.1.0" newVersion="6.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="SQLitePCLRaw.core" publicKeyToken="1488e028ca7ab535" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.5.1236" newVersion="2.0.5.1236" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="SQLitePCLRaw.provider.dynamic_cdecl" publicKeyToken="b68184102cba0b3b" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.5.1236" newVersion="2.0.5.1236" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- no longer used; using auto generated assembly bindings instead -->
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.1.0" newVersion="6.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
<bindingRedirect oldVersion="0.0.0.0-6.0.3.0" newVersion="6.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.6.0" newVersion="4.1.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="SQLitePCLRaw.core" publicKeyToken="1488e028ca7ab535" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.5.1236" newVersion="2.0.5.1236" />
<bindingRedirect oldVersion="0.0.0.0-2.1.10.2445" newVersion="2.1.10.2445" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="SQLitePCLRaw.provider.dynamic_cdecl" publicKeyToken="b68184102cba0b3b" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.5.1236" newVersion="2.0.5.1236" />
<bindingRedirect oldVersion="0.0.0.0-2.1.10.2445" newVersion="2.1.10.2445" />
</dependentAssembly>
</assemblyBinding>

View File

@@ -2,6 +2,13 @@
cd "%~dp0"
if "%1"=="" goto:eof
copy packages\SQLitePCLRaw.lib.e_sqlite3.2.1.2\runtimes\win-x64\native %1
rem this script is deactivated
rem copy packages\SQLitePCLRaw.lib.e_sqlite3.2.1.2\runtimes\win-x64\native %1
goto :eof
mkdir %1\runtimes\win-x64\native 2>nul
copy %userprofile%\.nuget\packages\SQLitePCLRaw.lib.e_sqlite3\2.1.10\runtimes\win-x64\native %1\runtimes\win-x64\native
copy %userprofile%\.nuget\packages\System.Memory\4.6.3\lib\net462\*.dll %1
:eof