Compare commits
	
		
			8 Commits
		
	
	
		
			v1.0.0.0
			...
			d3157e4d48
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d3157e4d48 | |||
| 73fe4531cc | |||
| b6c03892b1 | |||
| 91950ad9fd | |||
| 77c3f388e7 | |||
| 6f3e1a8905 | |||
| 466c8a322c | |||
| ab7c7404e2 | 
							
								
								
									
										20
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,6 +2,26 @@ | |||||||
| Changelog | Changelog | ||||||
| ========= | ========= | ||||||
|  |  | ||||||
|  | [v1.0.0.2][v1.0.0.2] (2025-08-05) {#v1.0.0.2} | ||||||
|  | --------------------------------------------- | ||||||
|  |  | ||||||
|  | ### Sonstiges {#v1.0.0.2-misc} | ||||||
|  |  | ||||||
|  | * Explizit native SQLite-Bibliothek hinzugefügt. (77c3f388e7) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | [v1.0.0.1][v1.0.0.1] (2025-08-05) {#v1.0.0.1} | ||||||
|  | --------------------------------------------- | ||||||
|  |  | ||||||
|  | ### Sonstiges {#v1.0.0.1-misc} | ||||||
|  |  | ||||||
|  | * Abhängigkeiten aktualisiert. (466c8a322c) | ||||||
|  | * Angepasste Fehlermeldung, wenn Importieren fehlschlägt. (ab7c7404e2) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| [v1.0.0.0][v1.0.0.0] (2025-07-30) {#v1.0.0.0} | [v1.0.0.0][v1.0.0.0] (2025-07-30) {#v1.0.0.0} | ||||||
| --------------------------------------------- | --------------------------------------------- | ||||||
|   | |||||||
| @@ -1,20 +1,21 @@ | |||||||
| using System; |  | ||||||
| using System.Data; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Windows; |  | ||||||
| using System.IO; |  | ||||||
| using Elwig.Helpers; |  | ||||||
| using Elwig.Helpers.Weighing; |  | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Windows.Threading; |  | ||||||
| using System.Reflection; |  | ||||||
| using Elwig.Helpers.Printing; |  | ||||||
| using Elwig.Windows; |  | ||||||
| using Elwig.Dialogs; | using Elwig.Dialogs; | ||||||
| using System.Threading.Tasks; | using Elwig.Helpers; | ||||||
| using Elwig.Helpers.Billing; | using Elwig.Helpers.Billing; | ||||||
|  | using Elwig.Helpers.Export; | ||||||
|  | using Elwig.Helpers.Printing; | ||||||
|  | using Elwig.Helpers.Weighing; | ||||||
| using Elwig.Models.Entities; | using Elwig.Models.Entities; | ||||||
|  | using Elwig.Windows; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Data; | ||||||
|  | using System.IO; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Reflection; | ||||||
| using System.Text; | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using System.Windows; | ||||||
|  | using System.Windows.Threading; | ||||||
|  |  | ||||||
| namespace Elwig { | namespace Elwig { | ||||||
|     public partial class App : Application { |     public partial class App : Application { | ||||||
| @@ -239,6 +240,17 @@ namespace Elwig { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         public static async Task ReplaceDatabase(string filename) { | ||||||
|  |             try { | ||||||
|  |                 await ElwigData.ImportDatabase(filename); | ||||||
|  |                 MessageBox.Show("Das Ersetzen war erfolgreich!\n\nBitte starten Sie Elwig neu!", "Datenbank ersetzen", MessageBoxButton.OK, MessageBoxImage.Information); | ||||||
|  |                 ForceShutdown = true; | ||||||
|  |                 Current.Shutdown(); | ||||||
|  |             } catch (Exception exc) { | ||||||
|  |                 MessageBox.Show("Fehler beim Ersetzen:\n\n" + exc.Message, "Datenbank ersetzen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         private static T FocusWindow<T>(Func<T> constructor, Predicate<T>? selector = null) where T : Window { |         private static T FocusWindow<T>(Func<T> constructor, Predicate<T>? selector = null) where T : Window { | ||||||
|             foreach (Window w in CurrentApp.Windows) { |             foreach (Window w in CurrentApp.Windows) { | ||||||
|                 if (w is T t && (selector == null || selector(t))) { |                 if (w is T t && (selector == null || selector(t))) { | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|     <UseWPF>true</UseWPF> |     <UseWPF>true</UseWPF> | ||||||
|     <PreserveCompilationContext>true</PreserveCompilationContext> |     <PreserveCompilationContext>true</PreserveCompilationContext> | ||||||
|     <ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon> |     <ApplicationIcon>Resources\Images\Elwig.ico</ApplicationIcon> | ||||||
|     <Version>1.0.0.0</Version> |     <Version>1.0.0.2</Version> | ||||||
|     <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages> |     <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages> | ||||||
|     <AllowUnsafeBlocks>true</AllowUnsafeBlocks> |     <AllowUnsafeBlocks>true</AllowUnsafeBlocks> | ||||||
|     <ApplicationManifest>app.manifest</ApplicationManifest> |     <ApplicationManifest>app.manifest</ApplicationManifest> | ||||||
| @@ -25,17 +25,19 @@ | |||||||
|     <PackageReference Include="LinqKit" Version="1.3.8" /> |     <PackageReference Include="LinqKit" Version="1.3.8" /> | ||||||
|     <PackageReference Include="MailKit" Version="4.13.0" /> |     <PackageReference Include="MailKit" Version="4.13.0" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.36" /> |     <PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.36" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.7" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.8" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.7" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.8" /> | ||||||
|     <PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="9.0.7" /> |     <PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="9.0.8" /> | ||||||
|     <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3351.48" /> |     <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3351.48" /> | ||||||
|     <PackageReference Include="NJsonSchema" Version="11.3.2" /> |     <PackageReference Include="NJsonSchema" Version="11.4.0" /> | ||||||
|     <PackageReference Include="PdfiumViewer" Version="2.13.0" /> |     <PackageReference Include="PdfiumViewer" Version="2.13.0" /> | ||||||
|     <PackageReference Include="PdfiumViewer.Native.x86_64.no_v8-no_xfa" Version="2018.4.8.256" /> |     <PackageReference Include="PdfiumViewer.Native.x86_64.no_v8-no_xfa" Version="2018.4.8.256" /> | ||||||
|     <PackageReference Include="RazorLight" Version="2.3.1" /> |     <PackageReference Include="RazorLight" Version="2.3.1" /> | ||||||
|     <PackageReference Include="ScottPlot.WPF" Version="5.0.55" /> |     <PackageReference Include="ScottPlot.WPF" Version="5.0.55" /> | ||||||
|     <PackageReference Include="System.IO.Ports" Version="9.0.7" /> |     <PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="3.0.0" /> | ||||||
|     <PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.7" /> |     <PackageReference Include="System.IO.Hashing" Version="9.0.8" /> | ||||||
|  |     <PackageReference Include="System.IO.Ports" Version="9.0.8" /> | ||||||
|  |     <PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.8" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  |  | ||||||
| </Project> | </Project> | ||||||
|   | |||||||
| @@ -75,6 +75,7 @@ namespace Elwig.Helpers.Export { | |||||||
|                 foreach (var filename in filenames) { |                 foreach (var filename in filenames) { | ||||||
|                     // TODO read encrypted files |                     // TODO read encrypted files | ||||||
|                     using var zip = ZipFile.Open(filename, ZipArchiveMode.Read); |                     using var zip = ZipFile.Open(filename, ZipArchiveMode.Read); | ||||||
|  |                     await zip.CheckIntegrity(); | ||||||
|  |  | ||||||
|                     var version = zip.GetEntry("version"); |                     var version = zip.GetEntry("version"); | ||||||
|                     using (var reader = new StreamReader(version!.Open(), Utils.UTF8)) { |                     using (var reader = new StreamReader(version!.Open(), Utils.UTF8)) { | ||||||
| @@ -334,9 +335,9 @@ namespace Elwig.Helpers.Export { | |||||||
|                     "Importieren erfolgreich", |                     "Importieren erfolgreich", | ||||||
|                     MessageBoxButton.OK, MessageBoxImage.Information); |                     MessageBoxButton.OK, MessageBoxImage.Information); | ||||||
|             } catch (Exception exc) { |             } catch (Exception exc) { | ||||||
|                 var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message; |                 var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\nEvtl. muss die Datenbank manuell auf dieses Gerät kopieren werden.\n\n" + exc.Message; | ||||||
|                 if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; |                 if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; | ||||||
|                 MessageBox.Show(str, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); |                 MessageBox.Show(str, "Fehler beim Importieren", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|             } |             } | ||||||
|             GC.Collect(); |             GC.Collect(); | ||||||
|             GC.WaitForPendingFinalizers(); |             GC.WaitForPendingFinalizers(); | ||||||
| @@ -370,6 +371,29 @@ namespace Elwig.Helpers.Export { | |||||||
|             }.Export(filename); |             }.Export(filename); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         public static async Task ImportDatabase(string filename) { | ||||||
|  |             var oldName = Path.ChangeExtension(App.Config.DatabaseFile, ".old.sqlite3"); | ||||||
|  |             var newName = Path.ChangeExtension(App.Config.DatabaseFile, ".new.sqlite3"); | ||||||
|  |             try { | ||||||
|  |                 using (var zip = ZipFile.Open(filename, ZipArchiveMode.Read)) { | ||||||
|  |                     await zip.CheckIntegrity(); | ||||||
|  |                     var db = zip.GetEntry("database.sqlite3")!; | ||||||
|  |                     db.ExtractToFile(newName, true); | ||||||
|  |                 } | ||||||
|  |                 File.Move(App.Config.DatabaseFile, oldName, true); | ||||||
|  |                 File.Move(newName, App.Config.DatabaseFile, false); | ||||||
|  |             } finally { | ||||||
|  |                 if (File.Exists(newName)) | ||||||
|  |                     File.Delete(newName); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public static void ExportDatabase(string filename) { | ||||||
|  |             File.Delete(filename); | ||||||
|  |             using var zip = ZipFile.Open(filename, ZipArchiveMode.Create); | ||||||
|  |             var db = zip.CreateEntryFromFile(App.Config.DatabaseFile, "database.sqlite3", CompressionLevel.SmallestSize); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public class ElwigExport { |         public class ElwigExport { | ||||||
|             public (IEnumerable<Member> Members, IEnumerable<string> Filters)? Members { get; set; } |             public (IEnumerable<Member> Members, IEnumerable<string> Filters)? Members { get; set; } | ||||||
|             public (IEnumerable<AreaCom> AreaComs, IEnumerable<string> Filters)? AreaComs { get; set; } |             public (IEnumerable<AreaCom> AreaComs, IEnumerable<string> Filters)? AreaComs { get; set; } | ||||||
| @@ -586,7 +610,8 @@ namespace Elwig.Helpers.Export { | |||||||
|             WbRd? rd = null; |             WbRd? rd = null; | ||||||
|             bool newRd = false; |             bool newRd = false; | ||||||
|             if (ried != null) { |             if (ried != null) { | ||||||
|                 var rde = riede[kgnr] ?? throw new ArgumentException($"Für KG {(kgs.TryGetValue(kgnr, out var k) ? k.Name : "?")} ({kgnr:00000}) ist noch keine Großlage festgelegt!\n(Stammdaten → Herkunftshierarchie)"); |                 if (!riede.TryGetValue(kgnr, out var rde)) | ||||||
|  |                     throw new ArgumentException($"Für KG {(kgs.TryGetValue(kgnr, out var k) ? k.Name : "?")} ({kgnr:00000}) ist noch keine Großlage festgelegt!\n(Stammdaten → Herkunftshierarchie)"); | ||||||
|                 rd = rde.FirstOrDefault(r => r.Name == ried); |                 rd = rde.FirstOrDefault(r => r.Name == ried); | ||||||
|                 if (rd == null) { |                 if (rd == null) { | ||||||
|                     newRd = true; |                     newRd = true; | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| using System; | using System; | ||||||
| using System.IO; | using System.IO; | ||||||
|  | using System.IO.Compression; | ||||||
|  | using System.IO.Hashing; | ||||||
| using System.Net.Http; | using System.Net.Http; | ||||||
| using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| @@ -95,5 +97,16 @@ namespace Elwig.Helpers { | |||||||
|             await download.CopyToAsync(destination, 81920, relativeProgress, cancellationToken); |             await download.CopyToAsync(destination, 81920, relativeProgress, cancellationToken); | ||||||
|             progress.Report(100.0); |             progress.Report(100.0); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         public static async Task CheckIntegrity(this ZipArchive zip) { | ||||||
|  |             var crc = new Crc32(); | ||||||
|  |             foreach (var entry in zip.Entries) { | ||||||
|  |                 crc.Reset(); | ||||||
|  |                 using var stream = entry.Open(); | ||||||
|  |                 await crc.AppendAsync(stream); | ||||||
|  |                 if (crc.GetCurrentHashAsUInt32() != entry.Crc32) | ||||||
|  |                     throw new InvalidDataException($"CRC-32 mismatch in '{entry.FullName}'"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -457,7 +457,7 @@ namespace Elwig.Helpers { | |||||||
|                 url = "https://sync.elwig.at/" + url[25..]; |                 url = "https://sync.elwig.at/" + url[25..]; | ||||||
|             if (!url.EndsWith('/')) url += "/"; |             if (!url.EndsWith('/')) url += "/"; | ||||||
|             using var client = GetHttpClient(username, password, accept: "application/json"); |             using var client = GetHttpClient(username, password, accept: "application/json"); | ||||||
|             var content = new StreamContent(new FileStream(zip, FileMode.Open, FileAccess.Read)); |             using var content = new StreamContent(new FileStream(zip, FileMode.Open, FileAccess.Read)); | ||||||
|             content.Headers.ContentType = new("application/zip"); |             content.Headers.ContentType = new("application/zip"); | ||||||
|             using var res = await client.PutAsync(url + Path.GetFileName(zip), content); |             using var res = await client.PutAsync(url + Path.GetFileName(zip), content); | ||||||
|             res.EnsureSuccessStatusCode(); |             res.EnsureSuccessStatusCode(); | ||||||
|   | |||||||
| @@ -41,6 +41,17 @@ | |||||||
|                         <TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""/> |                         <TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""/> | ||||||
|                     </MenuItem.Icon> |                     </MenuItem.Icon> | ||||||
|                 </MenuItem> |                 </MenuItem> | ||||||
|  |                 <Separator/> | ||||||
|  |                 <MenuItem x:Name="Menu_Database_Upload" Header="Datenbank hochladen..." Click="Menu_Database_Upload_Click"> | ||||||
|  |                     <MenuItem.Icon> | ||||||
|  |                         <TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""/> | ||||||
|  |                     </MenuItem.Icon> | ||||||
|  |                 </MenuItem> | ||||||
|  |                 <MenuItem x:Name="Menu_Database_Download" Header="Datenbank herunterladen..." Click="Menu_Database_Download_Click" IsEnabled="False"> | ||||||
|  |                     <MenuItem.Icon> | ||||||
|  |                         <TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""/> | ||||||
|  |                     </MenuItem.Icon> | ||||||
|  |                 </MenuItem> | ||||||
|             </MenuItem> |             </MenuItem> | ||||||
|             <MenuItem Header="Waage"> |             <MenuItem Header="Waage"> | ||||||
|                 <MenuItem Header="Datum und Uhrzeit setzen" Click="Menu_Scale_SetDateTime_Click"> |                 <MenuItem Header="Datum und Uhrzeit setzen" Click="Menu_Scale_SetDateTime_Click"> | ||||||
|   | |||||||
| @@ -31,6 +31,8 @@ namespace Elwig.Windows { | |||||||
|             Menu_Help_Smtp.IsEnabled = App.Config.Smtp != null; |             Menu_Help_Smtp.IsEnabled = App.Config.Smtp != null; | ||||||
|             DownloadButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden; |             DownloadButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden; | ||||||
|             UploadButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden; |             UploadButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden; | ||||||
|  |             Menu_Database_Upload.IsEnabled = App.Config.SyncUrl != null; | ||||||
|  |             Menu_Database_Download.IsEnabled = App.Config.SyncUrl != null; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private void Window_Loaded(object sender, RoutedEventArgs evt) { |         private void Window_Loaded(object sender, RoutedEventArgs evt) { | ||||||
| @@ -156,7 +158,7 @@ namespace Elwig.Windows { | |||||||
|                             Name = f!["name"]!.AsValue().GetValue<string>(), |                             Name = f!["name"]!.AsValue().GetValue<string>(), | ||||||
|                             Timestamp = f!["timestamp"] != null && DateTime.TryParseExact(f!["timestamp"]!.AsValue().GetValue<string>(), "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) ? dt : (DateTime?)null, |                             Timestamp = f!["timestamp"] != null && DateTime.TryParseExact(f!["timestamp"]!.AsValue().GetValue<string>(), "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) ? dt : (DateTime?)null, | ||||||
|                             ZwstId = f!["meta"]?["zwstid"]?.AsValue().GetValue<string>() ?? f!["zwstid"]?.AsValue().GetValue<string>(), |                             ZwstId = f!["meta"]?["zwstid"]?.AsValue().GetValue<string>() ?? f!["zwstid"]?.AsValue().GetValue<string>(), | ||||||
|                             Device = f!["meta"]?["device"]!.AsValue().GetValue<string>(), |                             Device = f!["meta"]?["device"]?.AsValue().GetValue<string>(), | ||||||
|                             Url = f!["url"]!.AsValue().GetValue<string>(), |                             Url = f!["url"]!.AsValue().GetValue<string>(), | ||||||
|                             Size = f!["size"]!.AsValue().GetValue<long>(), |                             Size = f!["size"]!.AsValue().GetValue<long>(), | ||||||
|                         }) |                         }) | ||||||
| @@ -178,11 +180,11 @@ namespace Elwig.Windows { | |||||||
|                     } |                     } | ||||||
|                     await ElwigData.Import(paths, ElwigData.ImportMode.FromBranches); |                     await ElwigData.Import(paths, ElwigData.ImportMode.FromBranches); | ||||||
|                 } catch (HttpRequestException exc) { |                 } catch (HttpRequestException exc) { | ||||||
|                     MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); |                     MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|                 } catch (TaskCanceledException exc) { |                 } catch (TaskCanceledException exc) { | ||||||
|                     MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); |                     MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|                 } catch (Exception exc) { |                 } catch (Exception exc) { | ||||||
|                     MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); |                     MessageBox.Show(exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|             Mouse.OverrideCursor = null; |             Mouse.OverrideCursor = null; | ||||||
| @@ -225,6 +227,87 @@ namespace Elwig.Windows { | |||||||
|             Mouse.OverrideCursor = null; |             Mouse.OverrideCursor = null; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         private async void Menu_Database_Download_Click(object sender, RoutedEventArgs evt) { | ||||||
|  |             if (App.Config.SyncUrl == null) | ||||||
|  |                 return; | ||||||
|  |             Mouse.OverrideCursor = Cursors.Wait; | ||||||
|  |             await Task.Run(async () => { | ||||||
|  |                 try { | ||||||
|  |                     var data = await Utils.GetExportMetaData(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); | ||||||
|  |                     var file = data | ||||||
|  |                         .Select(f => new { | ||||||
|  |                             Name = f!["name"]!.AsValue().GetValue<string>(), | ||||||
|  |                             Timestamp = f!["modified"] != null && DateTime.TryParseExact(f!["modified"]!.AsValue().GetValue<string>(), "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) ? dt : (DateTime?)null, | ||||||
|  |                             Url = f!["url"]!.AsValue().GetValue<string>(), | ||||||
|  |                             Size = f!["size"]!.AsValue().GetValue<long>(), | ||||||
|  |                         }) | ||||||
|  |                         .Where(f => f.Name == "database.sqlite3.zip") | ||||||
|  |                         .FirstOrDefault(); | ||||||
|  |  | ||||||
|  |                     if (file == null) { | ||||||
|  |                         MessageBox.Show("Die Datenbank wurde noch nicht vom Hauptgerät hochgeladen!", "Datenbank herunterladen", | ||||||
|  |                             MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     var res = MessageBox.Show($"Es wurde eine komprimierte Datenbank (ca. {file.Size / 1024 / 1024} MB) vom {file.Timestamp:dd.MM.yyyy, HH:mm} gefunden.\n\nWollen Sie wirklich die aktuelle Datenbank unwiederruflich\nlöschen und durch die gefundene ersetzen?\n\nDas kann zu Datenverlust führen!", "Datenbank herunterladen", | ||||||
|  |                         MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); | ||||||
|  |                     if (res != MessageBoxResult.OK) | ||||||
|  |                         return; | ||||||
|  |  | ||||||
|  |                     var filename = Path.Combine(App.TempPath, file.Name); | ||||||
|  |                     using (var client = Utils.GetHttpClient(App.Config.SyncUsername, App.Config.SyncPassword)) { | ||||||
|  |                         using var stream = new FileStream(filename, FileMode.Create); | ||||||
|  |                         await client.DownloadAsync(file.Url, stream); | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     res = MessageBox.Show("Die Datenbank wurde erfolgreich heruntergeladen!\n\nSoll die Datenbank wirklich unwiederruflich ersetzt werden?\n\nWenn Sie unsicher sind sprechen Sie sich mit dem Benutzer des Hauptgerätes ab!", "Datenbank herunterladen", | ||||||
|  |                         MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); | ||||||
|  |                     if (res != MessageBoxResult.OK) | ||||||
|  |                         return; | ||||||
|  |  | ||||||
|  |                     await App.MainDispatcher.BeginInvoke(async () => { | ||||||
|  |                         await App.ReplaceDatabase(filename); | ||||||
|  |                     }); | ||||||
|  |                 } catch (HttpRequestException exc) { | ||||||
|  |                     MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Datenbank herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|  |                 } catch (TaskCanceledException exc) { | ||||||
|  |                     MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Datenbank herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|  |                 } catch (Exception exc) { | ||||||
|  |                     MessageBox.Show(exc.Message, "Datenbank herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |             Mouse.OverrideCursor = null; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private async void Menu_Database_Upload_Click(object sender, RoutedEventArgs evt) { | ||||||
|  |             if (App.Config.SyncUrl == null) | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             var res = MessageBox.Show("Sind Sie wirklich sicher, dass Sie die Datenbank dieses\nGerätes hochladen möchten? Das sollte nur vom Hauptgerät aus passieren!", "Datenbank hochladen", | ||||||
|  |                 MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); | ||||||
|  |             if (res != MessageBoxResult.OK) | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             Mouse.OverrideCursor = Cursors.Wait; | ||||||
|  |             await Task.Run(async () => { | ||||||
|  |                 try { | ||||||
|  |                     var path = Path.Combine(App.TempPath, "database.sqlite3.zip"); | ||||||
|  |                     ElwigData.ExportDatabase(path); | ||||||
|  |                     await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); | ||||||
|  |                     MessageBox.Show($"Hochladen der gesamten Datenbank erfolgreich!", "Datenbank hochladen", | ||||||
|  |                         MessageBoxButton.OK, MessageBoxImage.Information); | ||||||
|  |                 } catch (HttpRequestException exc) { | ||||||
|  |                     MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Datenbank hochladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|  |                 } catch (TaskCanceledException exc) { | ||||||
|  |                     MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Datenbank hochladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|  |                 } catch (Exception exc) { | ||||||
|  |                     MessageBox.Show(exc.Message, "Datenbank hochladen", MessageBoxButton.OK, MessageBoxImage.Error); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |             Mouse.OverrideCursor = null; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         private void MemberAdminButton_Click(object sender, RoutedEventArgs evt) { |         private void MemberAdminButton_Click(object sender, RoutedEventArgs evt) { | ||||||
|             var w = new MemberAdminWindow(); |             var w = new MemberAdminWindow(); | ||||||
|             w.Show(); |             w.Show(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user