From 4eacc744c7dfd5a0db2715f37f32937c392e45ee Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:13:18 +0200 Subject: [PATCH 01/22] chore: add solution file and Core project structure --- ProxmoxDesktop.sln | 25 ++++++++++++++++++ .../ProxmoxDesktop.App.csproj | 26 +++++++++++++++++++ .../ProxmoxDesktop.Core.csproj | 13 ++++++++++ 3 files changed, 64 insertions(+) create mode 100644 ProxmoxDesktop.sln create mode 100644 src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj create mode 100644 src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj diff --git a/ProxmoxDesktop.sln b/ProxmoxDesktop.sln new file mode 100644 index 0000000..60bc7c9 --- /dev/null +++ b/ProxmoxDesktop.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxmoxDesktop.App", "src\ProxmoxDesktop.App\ProxmoxDesktop.App.csproj", "{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxmoxDesktop.Core", "src\ProxmoxDesktop.Core\ProxmoxDesktop.Core.csproj", "{B2C3D4E5-F6A7-8901-BCDE-F12345678901}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.ActiveCfg = Debug|x64 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.Build.0 = Debug|x64 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.ActiveCfg = Release|x64 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.Build.0 = Release|x64 + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|x64.ActiveCfg = Debug|x64 + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|x64.Build.0 = Debug|x64 + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|x64.ActiveCfg = Release|x64 + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|x64.Build.0 = Release|x64 + EndGlobalSection +EndGlobal diff --git a/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj b/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj new file mode 100644 index 0000000..d0556d3 --- /dev/null +++ b/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj @@ -0,0 +1,26 @@ + + + WinExe + net9.0-windows10.0.22621.0 + 10.0.17763.0 + ProxmoxDesktop.App + ProxmoxDesktop.App + Assets/proxmox.ico + true + enable + enable + true + + + + + + + + + + + + + + diff --git a/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj b/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj new file mode 100644 index 0000000..cb4d7bf --- /dev/null +++ b/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj @@ -0,0 +1,13 @@ + + + net9.0-windows + enable + enable + ProxmoxDesktop.Core + ProxmoxDesktop.Core + + + + + + From 8c18268a9f1425b84e1fcf3f152208a7db1681f5 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:14:37 +0200 Subject: [PATCH 02/22] feat(core): add API models, ApiClient async, AuthService, ConfigurationService --- src/ProxmoxDesktop.Core/Api/ApiClient.cs | 254 ++++++++++++++++++ src/ProxmoxDesktop.Core/Api/LoginResult.cs | 15 ++ .../Api/Models/DataTicket.cs | 23 ++ .../Api/Models/MachineData.cs | 78 ++++++ .../Api/Models/NodeData.cs | 24 ++ .../Api/Models/RealmData.cs | 15 ++ .../Api/Models/RootObject.cs | 9 + .../Api/Models/SpiceObject.cs | 39 +++ src/ProxmoxDesktop.Core/Api/ServerInfo.cs | 3 + .../Config/ConfigurationService.cs | 71 +++++ 10 files changed, 531 insertions(+) create mode 100644 src/ProxmoxDesktop.Core/Api/ApiClient.cs create mode 100644 src/ProxmoxDesktop.Core/Api/LoginResult.cs create mode 100644 src/ProxmoxDesktop.Core/Api/Models/DataTicket.cs create mode 100644 src/ProxmoxDesktop.Core/Api/Models/MachineData.cs create mode 100644 src/ProxmoxDesktop.Core/Api/Models/NodeData.cs create mode 100644 src/ProxmoxDesktop.Core/Api/Models/RealmData.cs create mode 100644 src/ProxmoxDesktop.Core/Api/Models/RootObject.cs create mode 100644 src/ProxmoxDesktop.Core/Api/Models/SpiceObject.cs create mode 100644 src/ProxmoxDesktop.Core/Api/ServerInfo.cs create mode 100644 src/ProxmoxDesktop.Core/Config/ConfigurationService.cs diff --git a/src/ProxmoxDesktop.Core/Api/ApiClient.cs b/src/ProxmoxDesktop.Core/Api/ApiClient.cs new file mode 100644 index 0000000..ee5c9cd --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/ApiClient.cs @@ -0,0 +1,254 @@ +using System.Net; +using System.Net.Http.Headers; +using System.Text.Json; +using ProxmoxDesktop.Core.Api.Models; + +namespace ProxmoxDesktop.Core.Api; + +/// +/// Client HTTP async pour l'API Proxmox VE. +/// Toutes les méthodes sont async — aucun appel bloquant. +/// +public class ApiClient : IDisposable +{ + private readonly HttpClient _http; + private readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); + + public DataTicket? Ticket { get; private set; } + public ServerInfo Server { get; } + public List Machines { get; private set; } = []; + + public ApiClient(string server, string port, bool skipSsl) + { + Server = new ServerInfo(server, port, skipSsl); + var handler = new HttpClientHandler { UseCookies = false }; + if (skipSsl) + handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; + + _http = new HttpClient(handler) + { + BaseAddress = new Uri($"https://{server}:{port}/api2/json/"), + Timeout = TimeSpan.FromSeconds(15) + }; + } + + // ------------------------------------------------------------------------- + // Auth + // ------------------------------------------------------------------------- + + public async Task> GetRealmsAsync(CancellationToken ct = default) + { + var json = await GetRawAsync("access/domains", authenticated: false, ct); + var root = JsonSerializer.Deserialize>(json, _jsonOptions); + return root?.Data ?? []; + } + + public async Task LoginAsync(string username, string password, string realm, string? otp = null, CancellationToken ct = default) + { + var form = new FormUrlEncodedContent(new Dictionary + { + ["username"] = username, + ["password"] = password, + ["realm"] = realm + }); + + using var response = await _http.PostAsync("access/ticket", form, ct); + if (!response.IsSuccessStatusCode) + return LoginResult.Failure("Identifiants incorrects."); + + var json = await response.Content.ReadAsStringAsync(ct); + var loginResp = JsonSerializer.Deserialize(json, _jsonOptions); + Ticket = loginResp?.Data; + + if (Ticket is null) return LoginResult.Failure("Réponse invalide du serveur."); + + if (Ticket.RequiresTotp) + { + if (string.IsNullOrWhiteSpace(otp)) + return LoginResult.TotpRequired(); + return await TotpChallengeAsync(otp, ct); + } + + return LoginResult.Success(); + } + + private async Task TotpChallengeAsync(string otpCode, CancellationToken ct) + { + var form = new FormUrlEncodedContent(new Dictionary + { + ["username"] = Ticket!.Username, + ["password"] = $"totp:{otpCode}", + ["tfa-challenge"] = Ticket.Ticket + }); + + using var response = await _http.PostAsync("access/ticket", form, ct); + if (!response.IsSuccessStatusCode) + return LoginResult.Failure("Code TOTP invalide."); + + var json = await response.Content.ReadAsStringAsync(ct); + var loginResp = JsonSerializer.Deserialize(json, _jsonOptions); + Ticket = loginResp?.Data; + return Ticket is not null ? LoginResult.Success() : LoginResult.Failure("Erreur TOTP."); + } + + public async Task RenewTicketAsync(CancellationToken ct = default) + { + if (Ticket is null) return; + var form = new FormUrlEncodedContent(new Dictionary + { + ["username"] = Ticket.Username, + ["password"] = Ticket.Ticket // Le ticket actuel sert de password pour le renouvellement + }); + using var response = await _http.PostAsync("access/ticket", form, ct); + if (!response.IsSuccessStatusCode) return; + var json = await response.Content.ReadAsStringAsync(ct); + var loginResp = JsonSerializer.Deserialize(json, _jsonOptions); + if (loginResp?.Data is not null) Ticket = loginResp.Data; + } + + // ------------------------------------------------------------------------- + // Machines + // ------------------------------------------------------------------------- + + public async Task> GetAllMachinesAsync(CancellationToken ct = default) + { + var all = new List(); + var nodesJson = await GetRawAsync("nodes", ct: ct); + var nodesRoot = JsonSerializer.Deserialize>(nodesJson, _jsonOptions); + if (nodesRoot?.Data is null) return all; + + var tasks = nodesRoot.Data.SelectMany(node => new[] + { + FetchMachinesForNodeAsync(node, "lxc", ct), + FetchMachinesForNodeAsync(node, "qemu", ct) + }); + + var results = await Task.WhenAll(tasks); + all.AddRange(results.SelectMany(r => r)); + Machines = [.. all.OrderBy(m => m.Vmid)]; + return Machines; + } + + private async Task> FetchMachinesForNodeAsync(NodeData node, string type, CancellationToken ct) + { + try + { + var json = await GetRawAsync($"nodes/{node.Node}/{type}", ct: ct); + var root = JsonSerializer.Deserialize>(json, _jsonOptions); + if (root?.Data is null) return []; + foreach (var m in root.Data) m.NodeName = node.Node; + return root.Data; + } + catch { return []; } + } + + public async Task HasSpiceAsync(MachineData machine, CancellationToken ct = default) + { + try + { + var json = await GetRawAsync($"nodes/{machine.NodeName}/qemu/{machine.Vmid}/status/current", ct: ct); + using var doc = JsonDocument.Parse(json); + var spice = doc.RootElement.GetProperty("data").GetProperty("spice"); + return spice.ValueKind == JsonValueKind.Number && spice.GetInt32() == 1; + } + catch { return false; } + } + + // ------------------------------------------------------------------------- + // Power + // ------------------------------------------------------------------------- + + public async Task PowerActionAsync(MachineData machine, string action, bool toDisk = false, CancellationToken ct = default) + { + var data = new Dictionary + { + ["node"] = machine.NodeName, + ["vmid"] = machine.Vmid.ToString() + }; + if (toDisk && action == "suspend") data["todisk"] = "1"; + + var result = await PostRawAsync( + $"nodes/{machine.NodeName}/{machine.Type}/{machine.Vmid}/status/{action}", + data, ct); + + return result switch + { + "403" => PowerResult.Forbidden, + null => PowerResult.Error, + _ => PowerResult.Success + }; + } + + // ------------------------------------------------------------------------- + // Console (NoVNC / xTermJS) + // ------------------------------------------------------------------------- + + public async Task GetConsoleUrlAsync(MachineData machine, string consoleType, CancellationToken ct = default) + { + string path = machine.IsLxc + ? $"nodes/{machine.NodeName}/lxc/{machine.Vmid}/vncwebsocket" + : $"nodes/{machine.NodeName}/qemu/{machine.Vmid}/vncwebsocket"; + + // On reconstruit l'URL complète de la WebUI Proxmox pour le console WebView2 + string ticketEncoded = Uri.EscapeDataString(Ticket!.Ticket); + string baseUrl = $"https://{Server.Host}:{Server.Port}"; + string consoleUrl = consoleType switch + { + "novnc" => $"{baseUrl}/?console=kvm&novnc=1&vmid={machine.Vmid}&vmname={machine.Name}&node={machine.NodeName}&resize=off&PVEAuthCookie={ticketEncoded}", + "xtermjs" => $"{baseUrl}/?console=shell&xtermjs=1&vmid={machine.Vmid}&vmname={machine.Name}&node={machine.NodeName}&PVEAuthCookie={ticketEncoded}", + _ => $"{baseUrl}/?console=kvm&novnc=1&vmid={machine.Vmid}&vmname={machine.Name}&node={machine.NodeName}&PVEAuthCookie={ticketEncoded}" + }; + return consoleUrl; + } + + public async Task GetSpiceConfigAsync(MachineData machine, string? proxyOverride = null, CancellationToken ct = default) + { + var data = new Dictionary(); + if (!string.IsNullOrEmpty(proxyOverride)) data["proxy"] = proxyOverride; + + var json = await PostRawAsync( + $"nodes/{machine.NodeName}/{machine.Type}/{machine.Vmid}/spiceproxy", + data, ct); + + if (json is null || json == "403") return null; + var resp = JsonSerializer.Deserialize(json, _jsonOptions); + return resp?.Data; + } + + // ------------------------------------------------------------------------- + // HTTP primitives + // ------------------------------------------------------------------------- + + private async Task GetRawAsync(string path, bool authenticated = true, CancellationToken ct = default) + { + using var req = new HttpRequestMessage(HttpMethod.Get, path); + if (authenticated && Ticket is not null) + req.Headers.TryAddWithoutValidation("Cookie", $"PVEAuthCookie={Ticket.Ticket}"); + req.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + using var response = await _http.SendAsync(req, ct); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadAsStringAsync(ct); + } + + private async Task PostRawAsync(string path, Dictionary postData, CancellationToken ct = default) + { + using var req = new HttpRequestMessage(HttpMethod.Post, path) + { + Content = new FormUrlEncodedContent(postData) + }; + if (Ticket is not null) + { + req.Headers.TryAddWithoutValidation("Cookie", $"PVEAuthCookie={Ticket.Ticket}"); + req.Headers.TryAddWithoutValidation("CSRFPreventionToken", Ticket.CsrfPreventionToken); + } + req.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + using var response = await _http.SendAsync(req, ct); + if (response.StatusCode == HttpStatusCode.Forbidden) return "403"; + if (!response.IsSuccessStatusCode) return null; + return await response.Content.ReadAsStringAsync(ct); + } + + public void Dispose() => _http.Dispose(); +} diff --git a/src/ProxmoxDesktop.Core/Api/LoginResult.cs b/src/ProxmoxDesktop.Core/Api/LoginResult.cs new file mode 100644 index 0000000..36f6719 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/LoginResult.cs @@ -0,0 +1,15 @@ +namespace ProxmoxDesktop.Core.Api; + +public enum LoginStatus { Success, Failure, TotpRequired } + +public record LoginResult(LoginStatus Status, string? Message = null) +{ + public bool IsSuccess => Status == LoginStatus.Success; + public bool NeedsTotp => Status == LoginStatus.TotpRequired; + + public static LoginResult Success() => new(LoginStatus.Success); + public static LoginResult Failure(string msg) => new(LoginStatus.Failure, msg); + public static LoginResult TotpRequired() => new(LoginStatus.TotpRequired, "Code TOTP requis."); +} + +public enum PowerResult { Success, Forbidden, Error } diff --git a/src/ProxmoxDesktop.Core/Api/Models/DataTicket.cs b/src/ProxmoxDesktop.Core/Api/Models/DataTicket.cs new file mode 100644 index 0000000..78c27c1 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Models/DataTicket.cs @@ -0,0 +1,23 @@ +using System.Text.Json.Serialization; + +namespace ProxmoxDesktop.Core.Api.Models; + +public class DataTicket +{ + [JsonPropertyName("ticket")] + public string Ticket { get; set; } = string.Empty; + + [JsonPropertyName("CSRFPreventionToken")] + public string CsrfPreventionToken { get; set; } = string.Empty; + + [JsonPropertyName("username")] + public string Username { get; set; } = string.Empty; + + public bool RequiresTotp => Ticket.Contains("PVE:!tfa!"); +} + +public class LoginResponse +{ + [JsonPropertyName("data")] + public DataTicket? Data { get; set; } +} diff --git a/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs b/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs new file mode 100644 index 0000000..f7378e9 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs @@ -0,0 +1,78 @@ +using System.Text.Json.Serialization; + +namespace ProxmoxDesktop.Core.Api.Models; + +public class MachineData +{ + [JsonPropertyName("pid")] + public int Pid { get; set; } + + [JsonPropertyName("vmid")] + public int Vmid { get; set; } + + [JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + // Set manually after fetch — not returned by PVE at the list level + public string NodeName { get; set; } = string.Empty; + + [JsonPropertyName("type")] + public string Type { get; set; } = "qemu"; + + [JsonPropertyName("cpu")] + public double Cpu { get; set; } + + [JsonPropertyName("cpus")] + public int Cpus { get; set; } + + [JsonPropertyName("mem")] + public long Mem { get; set; } + + [JsonPropertyName("maxmem")] + public long MaxMem { get; set; } + + [JsonPropertyName("netin")] + public long NetIn { get; set; } + + [JsonPropertyName("netout")] + public long NetOut { get; set; } + + [JsonPropertyName("disk")] + public long Disk { get; set; } + + [JsonPropertyName("diskread")] + public long DiskRead { get; set; } + + [JsonPropertyName("diskwrite")] + public long DiskWrite { get; set; } + + [JsonPropertyName("maxdisk")] + public long MaxDisk { get; set; } + + [JsonPropertyName("swap")] + public long Swap { get; set; } + + [JsonPropertyName("maxswap")] + public long MaxSwap { get; set; } + + [JsonPropertyName("tags")] + public string? Tags { get; set; } + + [JsonPropertyName("uptime")] + public long Uptime { get; set; } + + [JsonPropertyName("status")] + public string Status { get; set; } = string.Empty; + + [JsonPropertyName("serial")] + public int Serial { get; set; } + + [JsonPropertyName("lock")] + public string? Lock { get; set; } + + // Computed helpers + public bool IsRunning => Status.Equals("running", StringComparison.OrdinalIgnoreCase); + public bool IsLxc => Type.Equals("lxc", StringComparison.OrdinalIgnoreCase); + public double CpuPercent => Math.Round(Cpu * 100, 1); + public double MemPercent => MaxMem > 0 ? Math.Round((double)Mem / MaxMem * 100, 1) : 0; +} diff --git a/src/ProxmoxDesktop.Core/Api/Models/NodeData.cs b/src/ProxmoxDesktop.Core/Api/Models/NodeData.cs new file mode 100644 index 0000000..55f4af7 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Models/NodeData.cs @@ -0,0 +1,24 @@ +using System.Text.Json.Serialization; + +namespace ProxmoxDesktop.Core.Api.Models; + +public class NodeData +{ + [JsonPropertyName("level")] + public string? Level { get; set; } + + [JsonPropertyName("type")] + public string? Type { get; set; } + + [JsonPropertyName("node")] + public string Node { get; set; } = string.Empty; + + [JsonPropertyName("status")] + public string? Status { get; set; } + + [JsonPropertyName("ssl_fingerprint")] + public string? SslFingerprint { get; set; } + + [JsonPropertyName("id")] + public string? Id { get; set; } +} diff --git a/src/ProxmoxDesktop.Core/Api/Models/RealmData.cs b/src/ProxmoxDesktop.Core/Api/Models/RealmData.cs new file mode 100644 index 0000000..edb2901 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Models/RealmData.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Serialization; + +namespace ProxmoxDesktop.Core.Api.Models; + +public class RealmData +{ + [JsonPropertyName("realm")] + public string Realm { get; set; } = string.Empty; + + [JsonPropertyName("comment")] + public string? Comment { get; set; } + + [JsonPropertyName("type")] + public string? Type { get; set; } +} diff --git a/src/ProxmoxDesktop.Core/Api/Models/RootObject.cs b/src/ProxmoxDesktop.Core/Api/Models/RootObject.cs new file mode 100644 index 0000000..cd63af6 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Models/RootObject.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace ProxmoxDesktop.Core.Api.Models; + +public class RootObject +{ + [JsonPropertyName("data")] + public List Data { get; set; } = []; +} diff --git a/src/ProxmoxDesktop.Core/Api/Models/SpiceObject.cs b/src/ProxmoxDesktop.Core/Api/Models/SpiceObject.cs new file mode 100644 index 0000000..0009961 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Models/SpiceObject.cs @@ -0,0 +1,39 @@ +using System.Text.Json.Serialization; + +namespace ProxmoxDesktop.Core.Api.Models; + +public class SpiceObject +{ + [JsonPropertyName("title")] + public string? Title { get; set; } + + [JsonPropertyName("proxy")] + public string? Proxy { get; set; } + + [JsonPropertyName("type")] + public string? Type { get; set; } + + [JsonPropertyName("ca")] + public string? Ca { get; set; } + + [JsonPropertyName("host-subject")] + public string? HostSubject { get; set; } + + [JsonPropertyName("tls-port")] + public int TlsPort { get; set; } + + [JsonPropertyName("password")] + public string? Password { get; set; } + + [JsonPropertyName("host")] + public string? Host { get; set; } + + [JsonPropertyName("delete-this-file")] + public int DeleteThisFile { get; set; } +} + +public class SpiceResponse +{ + [JsonPropertyName("data")] + public SpiceObject? Data { get; set; } +} diff --git a/src/ProxmoxDesktop.Core/Api/ServerInfo.cs b/src/ProxmoxDesktop.Core/Api/ServerInfo.cs new file mode 100644 index 0000000..0050e59 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/ServerInfo.cs @@ -0,0 +1,3 @@ +namespace ProxmoxDesktop.Core.Api; + +public record ServerInfo(string Host, string Port, bool SkipSsl); diff --git a/src/ProxmoxDesktop.Core/Config/ConfigurationService.cs b/src/ProxmoxDesktop.Core/Config/ConfigurationService.cs new file mode 100644 index 0000000..c17eefc --- /dev/null +++ b/src/ProxmoxDesktop.Core/Config/ConfigurationService.cs @@ -0,0 +1,71 @@ +using System.Text.Json; + +namespace ProxmoxDesktop.Core.Config; + +/// +/// Service de configuration avec sauvegarde différée (lazy). +/// Remplace l'ancienne classe Configurations qui sauvegardait à chaque SetSetting(). +/// +public class ConfigurationService +{ + private Dictionary _settings = []; + private readonly string _filePath; + private bool _isDirty; + + private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web) + { + WriteIndented = true + }; + + public ConfigurationService(string appName = "ProxmoxDesktopClient") + { + var folder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + appName); + Directory.CreateDirectory(folder); + _filePath = Path.Combine(folder, "settings.json"); + Load(); + } + + public T? Get(string key, T? defaultValue = default) + { + if (!_settings.TryGetValue(key, out var raw)) return defaultValue; + try + { + if (raw is JsonElement el) + return el.Deserialize(_jsonOptions) ?? defaultValue; + return (T?)raw ?? defaultValue; + } + catch { return defaultValue; } + } + + public void Set(string key, object? value) + { + _settings[key] = value; + _isDirty = true; + } + + /// Persiste les paramètres si des modifications sont en attente. + public void SaveIfDirty() + { + if (!_isDirty) return; + var json = JsonSerializer.Serialize(_settings, _jsonOptions); + File.WriteAllText(_filePath, json); + _isDirty = false; + } + + /// Force la sauvegarde immédiate. + public void Save() + { + var json = JsonSerializer.Serialize(_settings, _jsonOptions); + File.WriteAllText(_filePath, json); + _isDirty = false; + } + + private void Load() + { + if (!File.Exists(_filePath)) return; + var json = File.ReadAllText(_filePath); + _settings = JsonSerializer.Deserialize>(_filePath, _jsonOptions) ?? []; + } +} From b22793016bfdbd5187d532fe0301ab2728afd0c3 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:15:37 +0200 Subject: [PATCH 03/22] feat(app): add App.xaml, MainWindow, LoginPage + LoginViewModel --- src/ProxmoxDesktop.App/App.xaml | 13 ++ src/ProxmoxDesktop.App/App.xaml.cs | 17 ++ .../ViewModels/LoginViewModel.cs | 164 ++++++++++++++++++ src/ProxmoxDesktop.App/Views/LoginPage.xaml | 101 +++++++++++ .../Views/LoginPage.xaml.cs | 33 ++++ src/ProxmoxDesktop.App/Views/MainWindow.xaml | 9 + .../Views/MainWindow.xaml.cs | 27 +++ 7 files changed, 364 insertions(+) create mode 100644 src/ProxmoxDesktop.App/App.xaml create mode 100644 src/ProxmoxDesktop.App/App.xaml.cs create mode 100644 src/ProxmoxDesktop.App/ViewModels/LoginViewModel.cs create mode 100644 src/ProxmoxDesktop.App/Views/LoginPage.xaml create mode 100644 src/ProxmoxDesktop.App/Views/LoginPage.xaml.cs create mode 100644 src/ProxmoxDesktop.App/Views/MainWindow.xaml create mode 100644 src/ProxmoxDesktop.App/Views/MainWindow.xaml.cs diff --git a/src/ProxmoxDesktop.App/App.xaml b/src/ProxmoxDesktop.App/App.xaml new file mode 100644 index 0000000..49e2dee --- /dev/null +++ b/src/ProxmoxDesktop.App/App.xaml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/src/ProxmoxDesktop.App/App.xaml.cs b/src/ProxmoxDesktop.App/App.xaml.cs new file mode 100644 index 0000000..80e002d --- /dev/null +++ b/src/ProxmoxDesktop.App/App.xaml.cs @@ -0,0 +1,17 @@ +using Microsoft.UI.Xaml; +using ProxmoxDesktop.App.Views; + +namespace ProxmoxDesktop.App; + +public partial class App : Application +{ + public static MainWindow? MainWindow { get; private set; } + + public App() => InitializeComponent(); + + protected override void OnLaunched(LaunchActivatedEventArgs args) + { + MainWindow = new MainWindow(); + MainWindow.Activate(); + } +} diff --git a/src/ProxmoxDesktop.App/ViewModels/LoginViewModel.cs b/src/ProxmoxDesktop.App/ViewModels/LoginViewModel.cs new file mode 100644 index 0000000..655d8ee --- /dev/null +++ b/src/ProxmoxDesktop.App/ViewModels/LoginViewModel.cs @@ -0,0 +1,164 @@ +using System.Collections.ObjectModel; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using ProxmoxDesktop.Core.Api; +using ProxmoxDesktop.Core.Api.Models; +using ProxmoxDesktop.Core.Config; + +namespace ProxmoxDesktop.App.ViewModels; + +public partial class LoginViewModel : ObservableObject +{ + // ------------------------------------------------------------------------- + // State + // ------------------------------------------------------------------------- + + [ObservableProperty] + private string _server = string.Empty; + + [ObservableProperty] + private string _port = "8006"; + + [ObservableProperty] + private string _username = string.Empty; + + [ObservableProperty] + private string _password = string.Empty; + + [ObservableProperty] + private string _otp = string.Empty; + + [ObservableProperty] + private bool _skipSsl; + + [ObservableProperty] + private bool _isBusy; + + [ObservableProperty] + private bool _totpVisible; + + [ObservableProperty] + private string? _errorMessage; + + [ObservableProperty] + private RealmData? _selectedRealm; + + public ObservableCollection Realms { get; } = []; + + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + private readonly ConfigurationService _config; + private ApiClient? _api; + + public ApiClient? ApiClient => _api; + + public LoginViewModel(ConfigurationService config) + { + _config = config; + LoadSavedCredentials(); + } + + // ------------------------------------------------------------------------- + // Commands + // ------------------------------------------------------------------------- + + /// Charge les realms disponibles quand l'URL du serveur est validée. + [RelayCommand] + public async Task LoadRealmsAsync() + { + if (string.IsNullOrWhiteSpace(Server) || string.IsNullOrWhiteSpace(Port)) return; + + IsBusy = true; + ErrorMessage = null; + Realms.Clear(); + + try + { + _api = new ApiClient(Server.Trim(), Port.Trim(), SkipSsl); + var realms = await _api.GetRealmsAsync(); + foreach (var r in realms) Realms.Add(r); + SelectedRealm = Realms.FirstOrDefault(); + } + catch (Exception ex) + { + ErrorMessage = $"Impossible de contacter le serveur : {ex.Message}"; + _api = null; + } + finally { IsBusy = false; } + } + + /// Tente l'authentification avec les identifiants fournis. + [RelayCommand(CanExecute = nameof(CanLogin))] + public async Task LoginAsync() + { + if (_api is null) return; + + IsBusy = true; + ErrorMessage = null; + + try + { + var result = await _api.LoginAsync( + Username.Trim(), + Password, + SelectedRealm?.Realm ?? "pam", + TotpVisible ? Otp : null); + + if (result.IsSuccess) + { + SaveCredentials(); + OnLoginSuccess?.Invoke(); + } + else if (result.NeedsTotp) + { + TotpVisible = true; + } + else + { + ErrorMessage = result.Message; + } + } + catch (Exception ex) + { + ErrorMessage = $"Erreur lors de la connexion : {ex.Message}"; + } + finally { IsBusy = false; } + } + + private bool CanLogin() => + !string.IsNullOrWhiteSpace(Username) && + !string.IsNullOrWhiteSpace(Password) && + SelectedRealm is not null && + !IsBusy; + + // ------------------------------------------------------------------------- + // Events + // ------------------------------------------------------------------------- + + /// Déclenché quand le login réussit — la View s'en charge pour naviguer. + public event Action? OnLoginSuccess; + + // ------------------------------------------------------------------------- + // Persistence + // ------------------------------------------------------------------------- + + private void LoadSavedCredentials() + { + Server = _config.Get("server") ?? string.Empty; + Port = _config.Get("port") ?? "8006"; + Username = _config.Get("username") ?? string.Empty; + SkipSsl = _config.Get("skipSsl"); + } + + private void SaveCredentials() + { + _config.Set("server", Server); + _config.Set("port", Port); + _config.Set("username", Username); + _config.Set("skipSsl", SkipSsl); + _config.Save(); + // Le mot de passe n'est jamais persisté + } +} diff --git a/src/ProxmoxDesktop.App/Views/LoginPage.xaml b/src/ProxmoxDesktop.App/Views/LoginPage.xaml new file mode 100644 index 0000000..b7a9df8 --- /dev/null +++ b/src/ProxmoxDesktop.App/Views/LoginPage.xaml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ProxmoxDesktop.App/Views/LoginPage.xaml.cs b/src/ProxmoxDesktop.App/Views/LoginPage.xaml.cs new file mode 100644 index 0000000..fbe3c35 --- /dev/null +++ b/src/ProxmoxDesktop.App/Views/LoginPage.xaml.cs @@ -0,0 +1,33 @@ +using Microsoft.UI.Xaml.Controls; +using ProxmoxDesktop.App.ViewModels; +using ProxmoxDesktop.Core.Config; + +namespace ProxmoxDesktop.App.Views; + +public sealed partial class LoginPage : Page +{ + public LoginViewModel ViewModel { get; } + + public LoginPage() + { + InitializeComponent(); + ViewModel = new LoginViewModel(new ConfigurationService()); + ViewModel.OnLoginSuccess += OnLoginSuccess; + } + + private void OnLoginSuccess() + { + // Passer la page principale avec l'ApiClient validé + if (App.MainWindow is MainWindow win) + { + win.RootFrame.Navigate(typeof(MainPage), ViewModel.ApiClient); + win.RootFrame.BackStack.Clear(); + } + } + + private async void Server_LostFocus(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + // Recharger les realms quand le serveur ou le port change + await ViewModel.LoadRealmsCommand.ExecuteAsync(null); + } +} diff --git a/src/ProxmoxDesktop.App/Views/MainWindow.xaml b/src/ProxmoxDesktop.App/Views/MainWindow.xaml new file mode 100644 index 0000000..c11fca9 --- /dev/null +++ b/src/ProxmoxDesktop.App/Views/MainWindow.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/src/ProxmoxDesktop.App/Views/MainWindow.xaml.cs b/src/ProxmoxDesktop.App/Views/MainWindow.xaml.cs new file mode 100644 index 0000000..aeb079e --- /dev/null +++ b/src/ProxmoxDesktop.App/Views/MainWindow.xaml.cs @@ -0,0 +1,27 @@ +using Microsoft.UI.Xaml; +using ProxmoxDesktop.App.Views; + +namespace ProxmoxDesktop.App.Views; + +public sealed partial class MainWindow : Window +{ + public MainWindow() + { + InitializeComponent(); + // Démarrer sur la page de login + RootFrame.Navigate(typeof(LoginPage)); + } + + /// Navigue vers la page principale après authentification réussie. + public void NavigateToMain() + { + RootFrame.Navigate(typeof(MainPage)); + } + + /// Revient à la page de login (déconnexion). + public void NavigateToLogin() + { + RootFrame.Navigate(typeof(LoginPage)); + RootFrame.BackStack.Clear(); + } +} From afead14800d862d9e0c3bbb1d4f0663b3d0034e7 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:17:11 +0200 Subject: [PATCH 04/22] feat(app): add MainPage, MainViewModel, MachineCard control --- .../Controls/MachineCard.xaml | 111 +++++++++++ .../Controls/MachineCard.xaml.cs | 68 +++++++ .../ViewModels/MainViewModel.cs | 181 ++++++++++++++++++ src/ProxmoxDesktop.App/Views/MainPage.xaml | 77 ++++++++ src/ProxmoxDesktop.App/Views/MainPage.xaml.cs | 53 +++++ 5 files changed, 490 insertions(+) create mode 100644 src/ProxmoxDesktop.App/Controls/MachineCard.xaml create mode 100644 src/ProxmoxDesktop.App/Controls/MachineCard.xaml.cs create mode 100644 src/ProxmoxDesktop.App/ViewModels/MainViewModel.cs create mode 100644 src/ProxmoxDesktop.App/Views/MainPage.xaml create mode 100644 src/ProxmoxDesktop.App/Views/MainPage.xaml.cs diff --git a/src/ProxmoxDesktop.App/Controls/MachineCard.xaml b/src/ProxmoxDesktop.App/Controls/MachineCard.xaml new file mode 100644 index 0000000..4aef59e --- /dev/null +++ b/src/ProxmoxDesktop.App/Controls/MachineCard.xaml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ProxmoxDesktop.App/Controls/MachineCard.xaml.cs b/src/ProxmoxDesktop.App/Controls/MachineCard.xaml.cs new file mode 100644 index 0000000..1e4fbd6 --- /dev/null +++ b/src/ProxmoxDesktop.App/Controls/MachineCard.xaml.cs @@ -0,0 +1,68 @@ +using Microsoft.UI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; +using CommunityToolkit.Mvvm.Input; +using ProxmoxDesktop.App.ViewModels; +using ProxmoxDesktop.Core.Api.Models; + +namespace ProxmoxDesktop.App.Controls; + +public sealed partial class MachineCard : UserControl +{ + // ------------------------------------------------------------------------- + // DependencyProperty + // ------------------------------------------------------------------------- + + public static readonly DependencyProperty MachineProperty = + DependencyProperty.Register(nameof(Machine), typeof(MachineData), + typeof(MachineCard), new PropertyMetadata(null, OnMachineChanged)); + + public MachineData Machine + { + get => (MachineData)GetValue(MachineProperty); + set => SetValue(MachineProperty, value); + } + + private static void OnMachineChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + => ((MachineCard)d).Bindings.Update(); + + // ------------------------------------------------------------------------- + // Computed pour {x:Bind} + // ------------------------------------------------------------------------- + + public SolidColorBrush StatusBrush => Machine?.IsRunning == true + ? new SolidColorBrush(Colors.ForestGreen) + : new SolidColorBrush(Colors.Crimson); + + public string MachineIcon => Machine?.IsLxc == true + ? "/Assets/lxc.png" + : "/Assets/vm.png"; + + public bool CanStart => Machine is { IsRunning: false } m && m.Lock != "suspended"; + public bool CanResume => Machine is { IsRunning: false } m && m.Lock == "suspended" && !m.IsLxc; + public bool CanSuspend => Machine?.IsRunning == true && Machine?.IsLxc == false; + public bool CanReset => Machine?.IsRunning == true && Machine?.IsLxc == false; + public bool CanOpenXterm => Machine is { } m && (m.IsLxc || m.Serial == 1); + + // ------------------------------------------------------------------------- + // Commands — délégués au MainViewModel via le DataContext + // ------------------------------------------------------------------------- + + private MainViewModel? VM => (DataContext as MainViewModel) + ?? (this.FindParent()?.DataContext as MainViewModel); + + public IRelayCommand OpenNoVncCommand => new RelayCommand(() => VM?.OpenConsoleCommand.Execute(new ConsoleArgs(Machine, "novnc"))); + public IRelayCommand OpenXtermCommand => new RelayCommand(() => VM?.OpenConsoleCommand.Execute(new ConsoleArgs(Machine, "xtermjs"))); + public IRelayCommand OpenSpiceCommand => new RelayCommand(() => VM?.OpenSpiceCommand.Execute(Machine)); + public IRelayCommand StartCommand => new RelayCommand(() => VM?.PowerActionCommand.Execute(new PowerActionArgs(Machine, "start"))); + public IRelayCommand ShutdownCommand => new RelayCommand(() => VM?.PowerActionCommand.Execute(new PowerActionArgs(Machine, "shutdown"))); + public IRelayCommand RebootCommand => new RelayCommand(() => VM?.PowerActionCommand.Execute(new PowerActionArgs(Machine, "reboot"))); + public IRelayCommand SuspendCommand => new RelayCommand(() => VM?.PowerActionCommand.Execute(new PowerActionArgs(Machine, "suspend"))); + public IRelayCommand ResumeCommand => new RelayCommand(() => VM?.PowerActionCommand.Execute(new PowerActionArgs(Machine, "start"))); + public IRelayCommand HibernateCommand => new RelayCommand(() => VM?.PowerActionCommand.Execute(new PowerActionArgs(Machine, "suspend", Extra: true))); + public IRelayCommand StopCommand => new RelayCommand(() => VM?.PowerActionCommand.Execute(new PowerActionArgs(Machine, "stop"))); + public IRelayCommand ResetCommand => new RelayCommand(() => VM?.PowerActionCommand.Execute(new PowerActionArgs(Machine, "reset"))); + + public MachineCard() => InitializeComponent(); +} diff --git a/src/ProxmoxDesktop.App/ViewModels/MainViewModel.cs b/src/ProxmoxDesktop.App/ViewModels/MainViewModel.cs new file mode 100644 index 0000000..39837a5 --- /dev/null +++ b/src/ProxmoxDesktop.App/ViewModels/MainViewModel.cs @@ -0,0 +1,181 @@ +using System.Collections.ObjectModel; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using ProxmoxDesktop.Core.Api; +using ProxmoxDesktop.Core.Api.Models; + +namespace ProxmoxDesktop.App.ViewModels; + +public partial class MainViewModel : ObservableObject, IDisposable +{ + private readonly ApiClient _api; + private readonly PeriodicTimer _refreshTimer; + private readonly PeriodicTimer _ticketTimer; + private CancellationTokenSource _cts = new(); + + // ------------------------------------------------------------------------- + // State + // ------------------------------------------------------------------------- + + [ObservableProperty] + private ObservableCollection _machines = []; + + [ObservableProperty] + private ObservableCollection _filteredMachines = []; + + [ObservableProperty] + private bool _isLoading; + + [ObservableProperty] + private string _searchQuery = string.Empty; + + [ObservableProperty] + private string? _statusMessage; + + partial void OnSearchQueryChanged(string value) => ApplyFilter(); + + // ------------------------------------------------------------------------- + // Init + // ------------------------------------------------------------------------- + + public MainViewModel(ApiClient api) + { + _api = api; + + // Timer de refresh UI : toutes les 60 secondes + _refreshTimer = new PeriodicTimer(TimeSpan.FromSeconds(60)); + // Timer de renouvellement de ticket : toutes les 90 minutes + _ticketTimer = new PeriodicTimer(TimeSpan.FromMinutes(90)); + + StartTimers(); + } + + private void StartTimers() + { + _ = Task.Run(async () => + { + while (await _refreshTimer.WaitForNextTickAsync(_cts.Token)) + await RefreshAsync(_cts.Token); + }); + + _ = Task.Run(async () => + { + while (await _ticketTimer.WaitForNextTickAsync(_cts.Token)) + await _api.RenewTicketAsync(_cts.Token); + }); + } + + // ------------------------------------------------------------------------- + // Commands + // ------------------------------------------------------------------------- + + [RelayCommand] + public async Task RefreshAsync(CancellationToken ct = default) + { + IsLoading = true; + StatusMessage = null; + try + { + var all = await _api.GetAllMachinesAsync(ct); + // Mise à jour différentielle : évite de recréer toute la liste + var existing = Machines.ToDictionary(m => m.Vmid); + foreach (var m in all) + { + if (existing.TryGetValue(m.Vmid, out _)) + { + var idx = Machines.IndexOf(Machines.First(x => x.Vmid == m.Vmid)); + Machines[idx] = m; + } + else Machines.Add(m); + } + // Supprimer les VMs qui n'existent plus + var toRemove = Machines.Where(m => all.All(a => a.Vmid != m.Vmid)).ToList(); + foreach (var m in toRemove) Machines.Remove(m); + ApplyFilter(); + } + catch (OperationCanceledException) { } + catch (Exception ex) { StatusMessage = $"Erreur de chargement : {ex.Message}"; } + finally { IsLoading = false; } + } + + [RelayCommand] + public async Task PowerActionAsync(PowerActionArgs args) + { + var result = await _api.PowerActionAsync( + args.Machine, args.Action, + args.Action == "suspend" && args.Extra); + + StatusMessage = result switch + { + PowerResult.Forbidden => "Permission refusée (VM.PowerMgmt requis).", + PowerResult.Error => "Erreur lors de l'action d'alimentation.", + _ => null + }; + + await Task.Delay(3000); + await RefreshAsync(); + } + + [RelayCommand] + public async Task OpenConsoleAsync(ConsoleArgs args) + { + var url = await _api.GetConsoleUrlAsync(args.Machine, args.ConsoleType); + if (url is not null) + OnOpenConsole?.Invoke(args.Machine, url); + } + + [RelayCommand] + public async Task OpenSpiceAsync(MachineData machine) + { + string? proxy = null; // TODO: lire depuis ConfigurationService si configuré + var spiceConfig = await _api.GetSpiceConfigAsync(machine, proxy); + if (spiceConfig is not null) + OnOpenSpice?.Invoke(spiceConfig); + } + + // ------------------------------------------------------------------------- + // Filtrage + // ------------------------------------------------------------------------- + + private void ApplyFilter() + { + var q = SearchQuery.Trim().ToLowerInvariant(); + var filtered = string.IsNullOrEmpty(q) + ? Machines + : new ObservableCollection( + Machines.Where(m => + m.Name.Contains(q, StringComparison.OrdinalIgnoreCase) || + m.Vmid.ToString().Contains(q) || + m.NodeName.Contains(q, StringComparison.OrdinalIgnoreCase))); + + FilteredMachines = filtered is ObservableCollection oc + ? oc + : new ObservableCollection(filtered); + } + + // ------------------------------------------------------------------------- + // Events vers la View + // ------------------------------------------------------------------------- + + public event Action? OnOpenConsole; + public event Action? OnOpenSpice; + public event Action? OnLogout; + + [RelayCommand] + public void Logout() => OnLogout?.Invoke(); + + // ------------------------------------------------------------------------- + // IDisposable + // ------------------------------------------------------------------------- + + public void Dispose() + { + _cts.Cancel(); + _refreshTimer.Dispose(); + _ticketTimer.Dispose(); + _api.Dispose(); + } +} + +public record PowerActionArgs(MachineData Machine, string Action, bool Extra = false); +public record ConsoleArgs(MachineData Machine, string ConsoleType); diff --git a/src/ProxmoxDesktop.App/Views/MainPage.xaml b/src/ProxmoxDesktop.App/Views/MainPage.xaml new file mode 100644 index 0000000..4fe4cbc --- /dev/null +++ b/src/ProxmoxDesktop.App/Views/MainPage.xaml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ProxmoxDesktop.App/Views/MainPage.xaml.cs b/src/ProxmoxDesktop.App/Views/MainPage.xaml.cs new file mode 100644 index 0000000..d8dc6c1 --- /dev/null +++ b/src/ProxmoxDesktop.App/Views/MainPage.xaml.cs @@ -0,0 +1,53 @@ +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; +using ProxmoxDesktop.App.ViewModels; +using ProxmoxDesktop.Core.Api; +using ProxmoxDesktop.Core.Api.Models; + +namespace ProxmoxDesktop.App.Views; + +public sealed partial class MainPage : Page +{ + public MainViewModel ViewModel { get; private set; } = null!; + + public MainPage() => InitializeComponent(); + + protected override async void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + if (e.Parameter is not ApiClient api) return; + + ViewModel = new MainViewModel(api); + ViewModel.OnLogout += () => + { + ViewModel.Dispose(); + if (App.MainWindow is MainWindow win) win.NavigateToLogin(); + }; + ViewModel.OnOpenConsole += OpenConsole; + ViewModel.OnOpenSpice += OpenSpice; + + Bindings.Update(); + await ViewModel.RefreshAsync(); + } + + protected override void OnNavigatedFrom(NavigationEventArgs e) + { + base.OnNavigatedFrom(e); + ViewModel?.Dispose(); + } + + private void OpenConsole(MachineData machine, string url) + { + var page = new ConsolePage(machine, url); + var window = new Microsoft.UI.Xaml.Window(); + window.Content = page; + window.Title = $"Console — {machine.Name}"; + window.Activate(); + } + + private async void OpenSpice(SpiceObject spiceConfig) + { + // Lance virt-viewer via le SpiceLauncher (logique identique à l'ancienne app) + await ProxmoxDesktop.Core.Console.SpiceLauncher.LaunchAsync(spiceConfig); + } +} From af1db5cdb0d27ae9e856d0449fa334f69f059439 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:18:24 +0200 Subject: [PATCH 05/22] feat(app): add ConsolePage (WebView2), SpiceLauncher, helpers and manifest --- src/ProxmoxDesktop.App/Assets/.gitkeep | 2 + .../Converters/NotNullToBoolConverter.cs | 19 +++++++ .../Helpers/VisualTreeHelperExtensions.cs | 19 +++++++ src/ProxmoxDesktop.App/Package.appxmanifest | 47 ++++++++++++++++ src/ProxmoxDesktop.App/Views/ConsolePage.xaml | 32 +++++++++++ .../Views/ConsolePage.xaml.cs | 37 ++++++++++++ .../Console/SpiceLauncher.cs | 56 +++++++++++++++++++ 7 files changed, 212 insertions(+) create mode 100644 src/ProxmoxDesktop.App/Assets/.gitkeep create mode 100644 src/ProxmoxDesktop.App/Converters/NotNullToBoolConverter.cs create mode 100644 src/ProxmoxDesktop.App/Helpers/VisualTreeHelperExtensions.cs create mode 100644 src/ProxmoxDesktop.App/Package.appxmanifest create mode 100644 src/ProxmoxDesktop.App/Views/ConsolePage.xaml create mode 100644 src/ProxmoxDesktop.App/Views/ConsolePage.xaml.cs create mode 100644 src/ProxmoxDesktop.Core/Console/SpiceLauncher.cs diff --git a/src/ProxmoxDesktop.App/Assets/.gitkeep b/src/ProxmoxDesktop.App/Assets/.gitkeep new file mode 100644 index 0000000..c3238b8 --- /dev/null +++ b/src/ProxmoxDesktop.App/Assets/.gitkeep @@ -0,0 +1,2 @@ +# Place proxmox.png, vm.png, lxc.png in this folder. +# Copy from the original WinForms project Resources/ folder. diff --git a/src/ProxmoxDesktop.App/Converters/NotNullToBoolConverter.cs b/src/ProxmoxDesktop.App/Converters/NotNullToBoolConverter.cs new file mode 100644 index 0000000..9842e14 --- /dev/null +++ b/src/ProxmoxDesktop.App/Converters/NotNullToBoolConverter.cs @@ -0,0 +1,19 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Data; + +namespace ProxmoxDesktop.App.Converters; + +/// Convertit un objet nullable en bool (true si non null) et en Visibility. +public class NotNullToBoolConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, string language) + { + bool isNotNull = value is string s ? !string.IsNullOrEmpty(s) : value is not null; + if (targetType == typeof(Visibility)) + return isNotNull ? Visibility.Visible : Visibility.Collapsed; + return isNotNull; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + => throw new NotImplementedException(); +} diff --git a/src/ProxmoxDesktop.App/Helpers/VisualTreeHelperExtensions.cs b/src/ProxmoxDesktop.App/Helpers/VisualTreeHelperExtensions.cs new file mode 100644 index 0000000..e2c2f90 --- /dev/null +++ b/src/ProxmoxDesktop.App/Helpers/VisualTreeHelperExtensions.cs @@ -0,0 +1,19 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Media; + +namespace ProxmoxDesktop.App.Helpers; + +public static class VisualTreeHelperExtensions +{ + /// Remonte l'arbre visuel pour trouver un parent du type T. + public static T? FindParent(this DependencyObject child) where T : DependencyObject + { + var parent = VisualTreeHelper.GetParent(child); + while (parent is not null) + { + if (parent is T target) return target; + parent = VisualTreeHelper.GetParent(parent); + } + return null; + } +} diff --git a/src/ProxmoxDesktop.App/Package.appxmanifest b/src/ProxmoxDesktop.App/Package.appxmanifest new file mode 100644 index 0000000..a201240 --- /dev/null +++ b/src/ProxmoxDesktop.App/Package.appxmanifest @@ -0,0 +1,47 @@ + + + + + + + Proxmox Desktop Client + Kofysh + Assets/proxmox.png + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ProxmoxDesktop.App/Views/ConsolePage.xaml b/src/ProxmoxDesktop.App/Views/ConsolePage.xaml new file mode 100644 index 0000000..ba32ba6 --- /dev/null +++ b/src/ProxmoxDesktop.App/Views/ConsolePage.xaml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/ProxmoxDesktop.App/Views/ConsolePage.xaml.cs b/src/ProxmoxDesktop.App/Views/ConsolePage.xaml.cs new file mode 100644 index 0000000..ccccf5e --- /dev/null +++ b/src/ProxmoxDesktop.App/Views/ConsolePage.xaml.cs @@ -0,0 +1,37 @@ +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; +using ProxmoxDesktop.Core.Api.Models; + +namespace ProxmoxDesktop.App.Views; + +public sealed partial class ConsolePage : Page +{ + private readonly MachineData _machine; + private readonly string _url; + + public ConsolePage(MachineData machine, string url) + { + InitializeComponent(); + _machine = machine; + _url = url; + } + + protected override async void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + ConsoleTitleBlock.Text = $"{_machine.Name} ({_machine.Vmid}) — {_machine.NodeName}"; + await ConsoleWebView.EnsureCoreWebView2Async(); + // Autoriser les certificats auto-signés Proxmox + ConsoleWebView.CoreWebView2.Settings.AreBrowserAcceleratorKeysEnabled = true; + ConsoleWebView.Source = new Uri(_url); + } + + private void Reload_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + => ConsoleWebView.Reload(); + + private void WebView_NavigationStarting(WebView2 sender, + Microsoft.Web.WebView2.Core.CoreWebView2NavigationStartingEventArgs e) { } + + private void WebView_NavigationCompleted(WebView2 sender, + Microsoft.Web.WebView2.Core.CoreWebView2NavigationCompletedEventArgs e) { } +} diff --git a/src/ProxmoxDesktop.Core/Console/SpiceLauncher.cs b/src/ProxmoxDesktop.Core/Console/SpiceLauncher.cs new file mode 100644 index 0000000..90c6df4 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Console/SpiceLauncher.cs @@ -0,0 +1,56 @@ +using System.Diagnostics; +using System.Text; +using ProxmoxDesktop.Core.Api.Models; + +namespace ProxmoxDesktop.Core.Console; + +/// +/// Lance une session SPICE via virt-viewer en générant un fichier .vv temporaire. +/// Logique identique à l'ancienne app WinForms, portée en async. +/// +public static class SpiceLauncher +{ + public static async Task LaunchAsync(SpiceObject spice, string virtViewerPath = @"C:\Program Files\VirtViewer v?.?-x64\bin\remote-viewer.exe") + { + var vvContent = BuildVvFile(spice); + var tempFile = Path.Combine(Path.GetTempPath(), $"proxmox_spice_{Guid.NewGuid():N}.vv"); + + try + { + await File.WriteAllTextAsync(tempFile, vvContent, Encoding.UTF8); + + var psi = new ProcessStartInfo + { + FileName = virtViewerPath, + Arguments = $"\"{tempFile}\"", + UseShellExecute = true + }; + Process.Start(psi); + + // Attendre 3s puis supprimer le fichier temporaire + await Task.Delay(3000); + } + finally + { + if (File.Exists(tempFile)) + File.Delete(tempFile); + } + } + + private static string BuildVvFile(SpiceObject spice) + { + var sb = new StringBuilder(); + sb.AppendLine("[virt-viewer]"); + sb.AppendLine("type=spice"); + sb.AppendLine($"host={spice.Host}"); + sb.AppendLine($"tls-port={spice.TlsPort}"); + sb.AppendLine($"password={spice.Password}"); + if (!string.IsNullOrEmpty(spice.Ca)) sb.AppendLine($"ca={spice.Ca}"); + if (!string.IsNullOrEmpty(spice.HostSubject)) sb.AppendLine($"host-subject={spice.HostSubject}"); + if (!string.IsNullOrEmpty(spice.Proxy)) sb.AppendLine($"proxy={spice.Proxy}"); + sb.AppendLine($"title={spice.Title ?? "Proxmox SPICE"}"); + sb.AppendLine("delete-this-file=1"); + sb.AppendLine("fullscreen=0"); + return sb.ToString(); + } +} From 6a03b8a9141015ab3dfb7ddea9d83c4e3ff67fcb Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:23:23 +0200 Subject: [PATCH 06/22] feat(core): add Models, ConfigurationService, ApiClient async (System.Text.Json) --- .../ProxmoxDesktop.App.csproj | 41 +- src/ProxmoxDesktop.Core/Api/ApiClient.cs | 437 +++++++++++------- .../Api/Internal/PveResponse.cs | 23 + .../Api/Models/DataTicket.cs | 27 +- .../Api/Models/LoginResult.cs | 16 + .../Api/Models/MachineData.cs | 109 ++--- .../Api/Models/NodeData.cs | 25 +- .../Api/Models/PowerResult.cs | 8 + .../Api/Models/RealmData.cs | 15 +- .../Api/Models/SpiceObject.cs | 46 +- .../Config/ConfigurationService.cs | 86 ++-- .../ProxmoxDesktop.Core.csproj | 12 +- 12 files changed, 476 insertions(+), 369 deletions(-) create mode 100644 src/ProxmoxDesktop.Core/Api/Internal/PveResponse.cs create mode 100644 src/ProxmoxDesktop.Core/Api/Models/LoginResult.cs create mode 100644 src/ProxmoxDesktop.Core/Api/Models/PowerResult.cs diff --git a/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj b/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj index d0556d3..8541caa 100644 --- a/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj +++ b/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj @@ -1,26 +1,43 @@ + WinExe - net9.0-windows10.0.22621.0 + net8.0-windows10.0.19041.0 10.0.17763.0 - ProxmoxDesktop.App - ProxmoxDesktop.App - Assets/proxmox.ico - true enable enable - true + 12 + true + app.manifest + x86;x64;arm64 + win-x86;win-x64;win-arm64 + ProxmoxDesktop.App + ProxmoxDesktop + 2.0.0.0 + + 2.0.0 - - - - - + + + + + + + + + + + + + - + + PreserveNewest + + diff --git a/src/ProxmoxDesktop.Core/Api/ApiClient.cs b/src/ProxmoxDesktop.Core/Api/ApiClient.cs index ee5c9cd..85415a5 100644 --- a/src/ProxmoxDesktop.Core/Api/ApiClient.cs +++ b/src/ProxmoxDesktop.Core/Api/ApiClient.cs @@ -1,254 +1,377 @@ using System.Net; using System.Net.Http.Headers; +using System.Text; using System.Text.Json; +using ProxmoxDesktop.Core.Api.Internal; using ProxmoxDesktop.Core.Api.Models; namespace ProxmoxDesktop.Core.Api; /// -/// Client HTTP async pour l'API Proxmox VE. -/// Toutes les méthodes sont async — aucun appel bloquant. +/// Client HTTP asynchrone pour l'API Proxmox VE. +/// Toutes les méthodes sont async/await — aucun .GetAwaiter().GetResult(). +/// Utilise System.Text.Json (pas de Newtonsoft.Json). +/// Le mot de passe n'est jamais conservé après l'authentification. /// -public class ApiClient : IDisposable +public sealed class ApiClient : IDisposable { + // ------------------------------------------------------------------------- + // Options JSON partagées + // ------------------------------------------------------------------------- + private static readonly JsonSerializerOptions _jsonOptions = new() + { + PropertyNameCaseInsensitive = true, + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull + }; + + // ------------------------------------------------------------------------- + // Champs privés + // ------------------------------------------------------------------------- private readonly HttpClient _http; - private readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); + private readonly string _baseUrl; + private DataTicket? _ticket; + private bool _disposed; - public DataTicket? Ticket { get; private set; } - public ServerInfo Server { get; } - public List Machines { get; private set; } = []; + // ------------------------------------------------------------------------- + // Constructeur + // ------------------------------------------------------------------------- + /// IP ou hostname du serveur Proxmox (sans https://). + /// Port de l'API PVE, généralement 8006. + /// Si true, accepte les certificats self-signed sans erreur. public ApiClient(string server, string port, bool skipSsl) { - Server = new ServerInfo(server, port, skipSsl); + _baseUrl = $"https://{server}:{port}/api2/json/"; + var handler = new HttpClientHandler { UseCookies = false }; if (skipSsl) - handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; + handler.ServerCertificateCustomValidationCallback = (_, _, _, _) => true; _http = new HttpClient(handler) { - BaseAddress = new Uri($"https://{server}:{port}/api2/json/"), - Timeout = TimeSpan.FromSeconds(15) + BaseAddress = new Uri(_baseUrl), + Timeout = TimeSpan.FromSeconds(15) }; + _http.DefaultRequestHeaders.Accept.Add( + new MediaTypeWithQualityHeaderValue("application/json")); } - // ------------------------------------------------------------------------- - // Auth - // ------------------------------------------------------------------------- + // ========================================================================= + // AUTHENTIFICATION + // ========================================================================= + /// + /// Récupère la liste des realms disponibles sur le serveur. + /// Appelé avant le login pour peupler le ComboBox de la LoginPage. + /// public async Task> GetRealmsAsync(CancellationToken ct = default) { - var json = await GetRawAsync("access/domains", authenticated: false, ct); - var root = JsonSerializer.Deserialize>(json, _jsonOptions); - return root?.Data ?? []; + var response = await _http.GetAsync("access/domains", ct).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + var body = await response.Content.ReadAsStringAsync(ct).ConfigureAwait(false); + var parsed = JsonSerializer.Deserialize>(body, _jsonOptions); + return parsed?.Data ?? []; } - public async Task LoginAsync(string username, string password, string realm, string? otp = null, CancellationToken ct = default) + /// + /// Tente l'authentification username/password (+TOTP optionnel). + /// Le mot de passe n'est pas conservé après cet appel. + /// + public async Task LoginAsync( + string username, string password, string realm, + string? otp = null, CancellationToken ct = default) { - var form = new FormUrlEncodedContent(new Dictionary + var form = new Dictionary { - ["username"] = username, + ["username"] = $"{username}@{realm}", ["password"] = password, ["realm"] = realm - }); - - using var response = await _http.PostAsync("access/ticket", form, ct); - if (!response.IsSuccessStatusCode) - return LoginResult.Failure("Identifiants incorrects."); - - var json = await response.Content.ReadAsStringAsync(ct); - var loginResp = JsonSerializer.Deserialize(json, _jsonOptions); - Ticket = loginResp?.Data; + }; + if (!string.IsNullOrWhiteSpace(otp)) + form["otp"] = otp; - if (Ticket is null) return LoginResult.Failure("Réponse invalide du serveur."); + var result = await PostTicketAsync(form, ct).ConfigureAwait(false); + if (result is null) return LoginResult.Failure("Réponse invalide du serveur."); - if (Ticket.RequiresTotp) + // Ticket PVE indique que le TFA est requis + if (result.Ticket?.Contains("PVE:!tfa!") == true) { if (string.IsNullOrWhiteSpace(otp)) return LoginResult.TotpRequired(); - return await TotpChallengeAsync(otp, ct); + + // Deuxième passe : challenge TOTP + return await TotpChallengeAsync(result.Ticket, result.Username ?? username, otp, ct) + .ConfigureAwait(false); } - return LoginResult.Success(); + // Succès direct + if (result.Ticket is not null && result.CsrfPreventionToken is not null) + { + _ticket = new DataTicket + { + Ticket = result.Ticket, + CsrfPreventionToken = result.CsrfPreventionToken, + Username = result.Username ?? username + }; + return LoginResult.Success(); + } + + return LoginResult.Failure("Identifiants incorrects."); } - private async Task TotpChallengeAsync(string otpCode, CancellationToken ct) + private async Task TotpChallengeAsync( + string tfaTicket, string username, string otp, CancellationToken ct) { - var form = new FormUrlEncodedContent(new Dictionary + var form = new Dictionary { - ["username"] = Ticket!.Username, - ["password"] = $"totp:{otpCode}", - ["tfa-challenge"] = Ticket.Ticket - }); + ["username"] = username, + ["password"] = $"totp:{otp}", + ["tfa-challenge"] = tfaTicket + }; - using var response = await _http.PostAsync("access/ticket", form, ct); - if (!response.IsSuccessStatusCode) + var result = await PostTicketAsync(form, ct).ConfigureAwait(false); + if (result?.Ticket is null || result.CsrfPreventionToken is null) return LoginResult.Failure("Code TOTP invalide."); - var json = await response.Content.ReadAsStringAsync(ct); - var loginResp = JsonSerializer.Deserialize(json, _jsonOptions); - Ticket = loginResp?.Data; - return Ticket is not null ? LoginResult.Success() : LoginResult.Failure("Erreur TOTP."); + _ticket = new DataTicket + { + Ticket = result.Ticket, + CsrfPreventionToken = result.CsrfPreventionToken, + Username = result.Username ?? username + }; + return LoginResult.Success(); } + /// Renouvelle le ticket d'auth existant (appel toutes les ~90 min). public async Task RenewTicketAsync(CancellationToken ct = default) { - if (Ticket is null) return; - var form = new FormUrlEncodedContent(new Dictionary + EnsureAuthenticated(); + var form = new Dictionary { - ["username"] = Ticket.Username, - ["password"] = Ticket.Ticket // Le ticket actuel sert de password pour le renouvellement - }); - using var response = await _http.PostAsync("access/ticket", form, ct); - if (!response.IsSuccessStatusCode) return; - var json = await response.Content.ReadAsStringAsync(ct); - var loginResp = JsonSerializer.Deserialize(json, _jsonOptions); - if (loginResp?.Data is not null) Ticket = loginResp.Data; + ["username"] = _ticket!.Username, + ["password"] = _ticket.Ticket // Le ticket courant sert de password + }; + var result = await PostTicketAsync(form, ct).ConfigureAwait(false); + if (result?.Ticket is not null && result.CsrfPreventionToken is not null) + { + _ticket = new DataTicket + { + Ticket = result.Ticket, + CsrfPreventionToken = result.CsrfPreventionToken, + Username = result.Username ?? _ticket.Username + }; + } } - // ------------------------------------------------------------------------- - // Machines - // ------------------------------------------------------------------------- + // ========================================================================= + // NŒUDS & MACHINES + // ========================================================================= + /// Retourne la liste des nœuds du cluster. + public async Task> GetNodesAsync(CancellationToken ct = default) + { + var json = await GetAsync("nodes", ct).ConfigureAwait(false); + var parsed = JsonSerializer.Deserialize>(json, _jsonOptions); + return parsed?.Data ?? []; + } + + /// + /// Retourne toutes les VMs QEMU + containers LXC de tous les nœuds, + /// en parallèle (une requête par nœud pour chaque type). + /// public async Task> GetAllMachinesAsync(CancellationToken ct = default) { - var all = new List(); - var nodesJson = await GetRawAsync("nodes", ct: ct); - var nodesRoot = JsonSerializer.Deserialize>(nodesJson, _jsonOptions); - if (nodesRoot?.Data is null) return all; + var nodes = await GetNodesAsync(ct).ConfigureAwait(false); - var tasks = nodesRoot.Data.SelectMany(node => new[] + // Lancer toutes les requêtes en parallèle + var tasks = nodes.SelectMany(n => new[] { - FetchMachinesForNodeAsync(node, "lxc", ct), - FetchMachinesForNodeAsync(node, "qemu", ct) + FetchMachinesForNodeAsync(n.Node, "qemu", ct), + FetchMachinesForNodeAsync(n.Node, "lxc", ct) }); - var results = await Task.WhenAll(tasks); - all.AddRange(results.SelectMany(r => r)); - Machines = [.. all.OrderBy(m => m.Vmid)]; - return Machines; + var results = await Task.WhenAll(tasks).ConfigureAwait(false); + return results.SelectMany(r => r).ToList(); } - private async Task> FetchMachinesForNodeAsync(NodeData node, string type, CancellationToken ct) + private async Task> FetchMachinesForNodeAsync( + string node, string type, CancellationToken ct) { try { - var json = await GetRawAsync($"nodes/{node.Node}/{type}", ct: ct); - var root = JsonSerializer.Deserialize>(json, _jsonOptions); - if (root?.Data is null) return []; - foreach (var m in root.Data) m.NodeName = node.Node; - return root.Data; - } - catch { return []; } - } + var json = await GetAsync($"nodes/{node}/{type}", ct).ConfigureAwait(false); + var parsed = JsonSerializer.Deserialize>(json, _jsonOptions); + if (parsed?.Data is null) return []; - public async Task HasSpiceAsync(MachineData machine, CancellationToken ct = default) - { - try - { - var json = await GetRawAsync($"nodes/{machine.NodeName}/qemu/{machine.Vmid}/status/current", ct: ct); - using var doc = JsonDocument.Parse(json); - var spice = doc.RootElement.GetProperty("data").GetProperty("spice"); - return spice.ValueKind == JsonValueKind.Number && spice.GetInt32() == 1; + // Injecter le nodename et le type (absents de la réponse list) + return parsed.Data.Select(m => + m with { NodeName = node, Type = type }).ToList(); } - catch { return false; } + catch { return []; } // Un nœud hors-ligne ne doit pas bloquer les autres } - // ------------------------------------------------------------------------- - // Power - // ------------------------------------------------------------------------- - - public async Task PowerActionAsync(MachineData machine, string action, bool toDisk = false, CancellationToken ct = default) + // ========================================================================= + // ACTIONS D'ALIMENTATION + // ========================================================================= + + /// + /// Exécute une action d'alimentation sur une VM/CT. + /// : start | shutdown | reboot | stop | reset | suspend. + /// : true pour suspendre en mode hibernation (QEMU uniquement). + /// + public async Task PowerActionAsync( + MachineData machine, string action, + bool hibernate = false, CancellationToken ct = default) { - var data = new Dictionary - { - ["node"] = machine.NodeName, - ["vmid"] = machine.Vmid.ToString() - }; - if (toDisk && action == "suspend") data["todisk"] = "1"; + var type = machine.IsLxc ? "lxc" : "qemu"; + var path = $"nodes/{machine.NodeName}/{type}/{machine.Vmid}/status/{action}"; - var result = await PostRawAsync( - $"nodes/{machine.NodeName}/{machine.Type}/{machine.Vmid}/status/{action}", - data, ct); + var postData = new Dictionary(); + if (hibernate && action == "suspend") + postData["todisk"] = "1"; - return result switch + var raw = await PostAsync(path, postData, ct).ConfigureAwait(false); + return raw switch { - "403" => PowerResult.Forbidden, - null => PowerResult.Error, - _ => PowerResult.Success + null => PowerResult.Error, + "403" => PowerResult.Forbidden, + _ => PowerResult.Ok }; } - // ------------------------------------------------------------------------- - // Console (NoVNC / xTermJS) - // ------------------------------------------------------------------------- + // ========================================================================= + // CONSOLES + // ========================================================================= - public async Task GetConsoleUrlAsync(MachineData machine, string consoleType, CancellationToken ct = default) + /// + /// Génère l'URL d'accès à une console NoVNC ou xTermJS. + /// : "novnc" ou "xtermjs". + /// + public async Task GetConsoleUrlAsync( + MachineData machine, string consoleType, CancellationToken ct = default) { - string path = machine.IsLxc - ? $"nodes/{machine.NodeName}/lxc/{machine.Vmid}/vncwebsocket" - : $"nodes/{machine.NodeName}/qemu/{machine.Vmid}/vncwebsocket"; - - // On reconstruit l'URL complète de la WebUI Proxmox pour le console WebView2 - string ticketEncoded = Uri.EscapeDataString(Ticket!.Ticket); - string baseUrl = $"https://{Server.Host}:{Server.Port}"; - string consoleUrl = consoleType switch - { - "novnc" => $"{baseUrl}/?console=kvm&novnc=1&vmid={machine.Vmid}&vmname={machine.Name}&node={machine.NodeName}&resize=off&PVEAuthCookie={ticketEncoded}", - "xtermjs" => $"{baseUrl}/?console=shell&xtermjs=1&vmid={machine.Vmid}&vmname={machine.Name}&node={machine.NodeName}&PVEAuthCookie={ticketEncoded}", - _ => $"{baseUrl}/?console=kvm&novnc=1&vmid={machine.Vmid}&vmname={machine.Name}&node={machine.NodeName}&PVEAuthCookie={ticketEncoded}" - }; - return consoleUrl; + EnsureAuthenticated(); + var type = machine.IsLxc ? "lxc" : "qemu"; + var server = _http.BaseAddress!.Host; + var port = _http.BaseAddress.Port; + + // Générer le VNC ticket pour cette VM + var path = $"nodes/{machine.NodeName}/{type}/{machine.Vmid}/vncproxy"; + var postData = new Dictionary { ["websocket"] = "1" }; + var raw = await PostAsync(path, postData, ct).ConfigureAwait(false); + if (raw is null or "403") return null; + + var resp = JsonSerializer.Deserialize>(raw, _jsonOptions); + if (resp?.Data is null) return null; + + var vncTicket = Uri.EscapeDataString(resp.Data.Ticket ?? string.Empty); + var vmName = Uri.EscapeDataString(machine.Name); + var authTicket= Uri.EscapeDataString(_ticket!.Ticket); + + return consoleType == "xtermjs" + ? $"https://{server}:{port}/?console=xtermjs&vmid={machine.Vmid}&vmname={vmName}" + + $"&node={machine.NodeName}&resize=1&cmd=" + + $"#pve_data=token_ticket={vncTicket}" + : $"https://{server}:{port}/?console=kvm&novnc=1&vmid={machine.Vmid}&vmname={vmName}" + + $"&node={machine.NodeName}&resize=scale&autoconnect=1" + + $"&path=api2/json/nodes/{machine.NodeName}/{type}/{machine.Vmid}/vncwebsocket" + + $"&vncticket={vncTicket}&PVEAuthCookie={authTicket}"; } - public async Task GetSpiceConfigAsync(MachineData machine, string? proxyOverride = null, CancellationToken ct = default) + /// Récupère la configuration SPICE pour une VM (QEMU uniquement). + public async Task GetSpiceConfigAsync( + MachineData machine, string? proxy = null, CancellationToken ct = default) { - var data = new Dictionary(); - if (!string.IsNullOrEmpty(proxyOverride)) data["proxy"] = proxyOverride; + if (machine.IsLxc) return null; + + var path = $"nodes/{machine.NodeName}/qemu/{machine.Vmid}/spiceproxy"; + var postData = new Dictionary(); + if (!string.IsNullOrEmpty(proxy)) + postData["proxy"] = proxy!; - var json = await PostRawAsync( - $"nodes/{machine.NodeName}/{machine.Type}/{machine.Vmid}/spiceproxy", - data, ct); + var raw = await PostAsync(path, postData, ct).ConfigureAwait(false); + if (raw is null or "403") return null; - if (json is null || json == "403") return null; - var resp = JsonSerializer.Deserialize(json, _jsonOptions); + var resp = JsonSerializer.Deserialize>(raw, _jsonOptions); return resp?.Data; } - // ------------------------------------------------------------------------- - // HTTP primitives - // ------------------------------------------------------------------------- + // ========================================================================= + // HELPERS HTTP INTERNES + // ========================================================================= - private async Task GetRawAsync(string path, bool authenticated = true, CancellationToken ct = default) + private async Task GetAsync(string path, CancellationToken ct = default) { + EnsureAuthenticated(); using var req = new HttpRequestMessage(HttpMethod.Get, path); - if (authenticated && Ticket is not null) - req.Headers.TryAddWithoutValidation("Cookie", $"PVEAuthCookie={Ticket.Ticket}"); - req.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + AddAuthHeaders(req); + var resp = await _http.SendAsync(req, ct).ConfigureAwait(false); + if (resp.StatusCode == HttpStatusCode.Forbidden) return "403"; + resp.EnsureSuccessStatusCode(); + return await resp.Content.ReadAsStringAsync(ct).ConfigureAwait(false); + } - using var response = await _http.SendAsync(req, ct); - response.EnsureSuccessStatusCode(); - return await response.Content.ReadAsStringAsync(ct); + private async Task PostAsync( + string path, Dictionary? data, CancellationToken ct = default) + { + EnsureAuthenticated(); + using var req = new HttpRequestMessage(HttpMethod.Post, path); + AddAuthHeaders(req, includeCsrf: true); + if (data is { Count: > 0 }) + req.Content = new FormUrlEncodedContent(data); + + var resp = await _http.SendAsync(req, ct).ConfigureAwait(false); + if (resp.StatusCode == HttpStatusCode.Forbidden) return "403"; + if (!resp.IsSuccessStatusCode) return null; + return await resp.Content.ReadAsStringAsync(ct).ConfigureAwait(false); } - private async Task PostRawAsync(string path, Dictionary postData, CancellationToken ct = default) + /// + /// POST sur /access/ticket (sans auth cookie — utilisé pour login et renew). + /// + private async Task PostTicketAsync( + Dictionary form, CancellationToken ct) { - using var req = new HttpRequestMessage(HttpMethod.Post, path) - { - Content = new FormUrlEncodedContent(postData) - }; - if (Ticket is not null) - { - req.Headers.TryAddWithoutValidation("Cookie", $"PVEAuthCookie={Ticket.Ticket}"); - req.Headers.TryAddWithoutValidation("CSRFPreventionToken", Ticket.CsrfPreventionToken); - } - req.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + using var content = new FormUrlEncodedContent(form); + var resp = await _http.PostAsync("access/ticket", content, ct).ConfigureAwait(false); + if (!resp.IsSuccessStatusCode) return null; + var body = await resp.Content.ReadAsStringAsync(ct).ConfigureAwait(false); + var parsed = JsonSerializer.Deserialize>(body, _jsonOptions); + return parsed?.Data; + } + + private void AddAuthHeaders(HttpRequestMessage req, bool includeCsrf = false) + { + req.Headers.TryAddWithoutValidation("Cookie", $"PVEAuthCookie={_ticket!.Ticket}"); + if (includeCsrf) + req.Headers.TryAddWithoutValidation("CSRFPreventionToken", _ticket.CsrfPreventionToken); + } - using var response = await _http.SendAsync(req, ct); - if (response.StatusCode == HttpStatusCode.Forbidden) return "403"; - if (!response.IsSuccessStatusCode) return null; - return await response.Content.ReadAsStringAsync(ct); + private void EnsureAuthenticated() + { + if (_ticket is null) + throw new InvalidOperationException("ApiClient : non authentifié. Appelez LoginAsync() d'abord."); + } + + // ========================================================================= + // IDisposable + // ========================================================================= + + public void Dispose() + { + if (_disposed) return; + _http.Dispose(); + _disposed = true; } - public void Dispose() => _http.Dispose(); + // ------------------------------------------------------------------------- + // DTO interne VNC ticket + // ------------------------------------------------------------------------- + private sealed class VncTicketData + { + [System.Text.Json.Serialization.JsonPropertyName("ticket")] + public string? Ticket { get; init; } + [System.Text.Json.Serialization.JsonPropertyName("port")] + public int Port { get; init; } + } } diff --git a/src/ProxmoxDesktop.Core/Api/Internal/PveResponse.cs b/src/ProxmoxDesktop.Core/Api/Internal/PveResponse.cs new file mode 100644 index 0000000..0357d5b --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Internal/PveResponse.cs @@ -0,0 +1,23 @@ +using System.Text.Json.Serialization; + +namespace ProxmoxDesktop.Core.Api.Internal; + +/// Enveloppe générique des réponses PVE : { "data": T } +internal sealed class PveResponse +{ + [JsonPropertyName("data")] public T? Data { get; init; } +} + +/// Enveloppe quand data est un tableau. +internal sealed class PveListResponse +{ + [JsonPropertyName("data")] public List? Data { get; init; } +} + +/// Réponse de /access/ticket +internal sealed class TicketResponse +{ + [JsonPropertyName("ticket")] public string? Ticket { get; init; } + [JsonPropertyName("CSRFPreventionToken")] public string? CsrfPreventionToken { get; init; } + [JsonPropertyName("username")] public string? Username { get; init; } +} diff --git a/src/ProxmoxDesktop.Core/Api/Models/DataTicket.cs b/src/ProxmoxDesktop.Core/Api/Models/DataTicket.cs index 78c27c1..3ed8714 100644 --- a/src/ProxmoxDesktop.Core/Api/Models/DataTicket.cs +++ b/src/ProxmoxDesktop.Core/Api/Models/DataTicket.cs @@ -1,23 +1,12 @@ -using System.Text.Json.Serialization; - namespace ProxmoxDesktop.Core.Api.Models; -public class DataTicket -{ - [JsonPropertyName("ticket")] - public string Ticket { get; set; } = string.Empty; - - [JsonPropertyName("CSRFPreventionToken")] - public string CsrfPreventionToken { get; set; } = string.Empty; - - [JsonPropertyName("username")] - public string Username { get; set; } = string.Empty; - - public bool RequiresTotp => Ticket.Contains("PVE:!tfa!"); -} - -public class LoginResponse +/// +/// Ticket d'authentification PVE retourné par /access/ticket. +/// Seul le ticket et le CSRF sont conservés — le mot de passe n'est JAMAIS stocké ici. +/// +public sealed class DataTicket { - [JsonPropertyName("data")] - public DataTicket? Data { get; set; } + public string Ticket { get; init; } = string.Empty; + public string CsrfPreventionToken { get; init; } = string.Empty; + public string Username { get; init; } = string.Empty; } diff --git a/src/ProxmoxDesktop.Core/Api/Models/LoginResult.cs b/src/ProxmoxDesktop.Core/Api/Models/LoginResult.cs new file mode 100644 index 0000000..11ff426 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Models/LoginResult.cs @@ -0,0 +1,16 @@ +namespace ProxmoxDesktop.Core.Api.Models; + +/// +/// Résultat d'une tentative de connexion. +/// Utilise un discriminated-union léger via les propriétés booléennes. +/// +public sealed class LoginResult +{ + public static LoginResult Success() => new() { IsSuccess = true }; + public static LoginResult TotpRequired() => new() { NeedsTotp = true, Message = "TOTP requis." }; + public static LoginResult Failure(string msg) => new() { Message = msg }; + + public bool IsSuccess { get; private init; } + public bool NeedsTotp { get; private init; } + public string Message { get; private init; } = string.Empty; +} diff --git a/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs b/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs index f7378e9..094c26c 100644 --- a/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs +++ b/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs @@ -2,77 +2,42 @@ namespace ProxmoxDesktop.Core.Api.Models; -public class MachineData +/// Représente une VM QEMU ou un container LXC retourné par l'API PVE. +public sealed class MachineData { - [JsonPropertyName("pid")] - public int Pid { get; set; } - - [JsonPropertyName("vmid")] - public int Vmid { get; set; } - - [JsonPropertyName("name")] - public string Name { get; set; } = string.Empty; - - // Set manually after fetch — not returned by PVE at the list level - public string NodeName { get; set; } = string.Empty; - - [JsonPropertyName("type")] - public string Type { get; set; } = "qemu"; - - [JsonPropertyName("cpu")] - public double Cpu { get; set; } - - [JsonPropertyName("cpus")] - public int Cpus { get; set; } - - [JsonPropertyName("mem")] - public long Mem { get; set; } - - [JsonPropertyName("maxmem")] - public long MaxMem { get; set; } - - [JsonPropertyName("netin")] - public long NetIn { get; set; } - - [JsonPropertyName("netout")] - public long NetOut { get; set; } - - [JsonPropertyName("disk")] - public long Disk { get; set; } - - [JsonPropertyName("diskread")] - public long DiskRead { get; set; } - - [JsonPropertyName("diskwrite")] - public long DiskWrite { get; set; } - - [JsonPropertyName("maxdisk")] - public long MaxDisk { get; set; } - - [JsonPropertyName("swap")] - public long Swap { get; set; } - - [JsonPropertyName("maxswap")] - public long MaxSwap { get; set; } - - [JsonPropertyName("tags")] - public string? Tags { get; set; } - - [JsonPropertyName("uptime")] - public long Uptime { get; set; } - - [JsonPropertyName("status")] - public string Status { get; set; } = string.Empty; - - [JsonPropertyName("serial")] - public int Serial { get; set; } - - [JsonPropertyName("lock")] - public string? Lock { get; set; } - - // Computed helpers - public bool IsRunning => Status.Equals("running", StringComparison.OrdinalIgnoreCase); - public bool IsLxc => Type.Equals("lxc", StringComparison.OrdinalIgnoreCase); - public double CpuPercent => Math.Round(Cpu * 100, 1); - public double MemPercent => MaxMem > 0 ? Math.Round((double)Mem / MaxMem * 100, 1) : 0; + [JsonPropertyName("vmid")] public int Vmid { get; init; } + [JsonPropertyName("name")] public string Name { get; init; } = string.Empty; + [JsonPropertyName("nodename")]public string NodeName { get; init; } = string.Empty; + [JsonPropertyName("type")] public string Type { get; init; } = "qemu"; + [JsonPropertyName("status")] public string Status { get; init; } = string.Empty; + [JsonPropertyName("lock")] public string? Lock { get; init; } + [JsonPropertyName("tags")] public string? Tags { get; init; } + + // Ressources + [JsonPropertyName("cpu")] public double Cpu { get; init; } + [JsonPropertyName("cpus")] public int Cpus { get; init; } + [JsonPropertyName("mem")] public long Mem { get; init; } + [JsonPropertyName("maxmem")] public long MaxMem { get; init; } + [JsonPropertyName("disk")] public long Disk { get; init; } + [JsonPropertyName("maxdisk")]public long MaxDisk { get; init; } + [JsonPropertyName("swap")] public long Swap { get; init; } + [JsonPropertyName("maxswap")]public long MaxSwap { get; init; } + [JsonPropertyName("uptime")] public long Uptime { get; init; } + [JsonPropertyName("netin")] public long NetIn { get; init; } + [JsonPropertyName("netout")] public long NetOut { get; init; } + [JsonPropertyName("diskread")]public long DiskRead { get; init; } + [JsonPropertyName("diskwrite")]public long DiskWrite { get; init; } + [JsonPropertyName("serial")] public int Serial { get; init; } + [JsonPropertyName("pid")] public int Pid { get; init; } + + // Propriétés calculées (pas de champ JSON correspondant) + [JsonIgnore] public bool IsRunning => Status == "running"; + [JsonIgnore] public bool IsLxc => Type == "lxc"; + + /// CPU en % (0-100), arrondi à 1 décimale. + [JsonIgnore] public double CpuPercent => Math.Round(Cpu * 100, 1); + + /// RAM utilisée en % (0-100), arrondi à 1 décimale. + [JsonIgnore] public double MemPercent => + MaxMem > 0 ? Math.Round((double)Mem / MaxMem * 100, 1) : 0; } diff --git a/src/ProxmoxDesktop.Core/Api/Models/NodeData.cs b/src/ProxmoxDesktop.Core/Api/Models/NodeData.cs index 55f4af7..650cc4b 100644 --- a/src/ProxmoxDesktop.Core/Api/Models/NodeData.cs +++ b/src/ProxmoxDesktop.Core/Api/Models/NodeData.cs @@ -2,23 +2,12 @@ namespace ProxmoxDesktop.Core.Api.Models; -public class NodeData +public sealed class NodeData { - [JsonPropertyName("level")] - public string? Level { get; set; } - - [JsonPropertyName("type")] - public string? Type { get; set; } - - [JsonPropertyName("node")] - public string Node { get; set; } = string.Empty; - - [JsonPropertyName("status")] - public string? Status { get; set; } - - [JsonPropertyName("ssl_fingerprint")] - public string? SslFingerprint { get; set; } - - [JsonPropertyName("id")] - public string? Id { get; set; } + [JsonPropertyName("node")] public string Node { get; init; } = string.Empty; + [JsonPropertyName("status")] public string Status { get; init; } = string.Empty; + [JsonPropertyName("type")] public string Type { get; init; } = string.Empty; + [JsonPropertyName("level")] public string? Level { get; init; } + [JsonPropertyName("id")] public string? Id { get; init; } + [JsonPropertyName("ssl_fingerprint")] public string? SslFingerprint{ get; init; } } diff --git a/src/ProxmoxDesktop.Core/Api/Models/PowerResult.cs b/src/ProxmoxDesktop.Core/Api/Models/PowerResult.cs new file mode 100644 index 0000000..ed2bc65 --- /dev/null +++ b/src/ProxmoxDesktop.Core/Api/Models/PowerResult.cs @@ -0,0 +1,8 @@ +namespace ProxmoxDesktop.Core.Api.Models; + +public enum PowerResult +{ + Ok, + Forbidden, + Error +} diff --git a/src/ProxmoxDesktop.Core/Api/Models/RealmData.cs b/src/ProxmoxDesktop.Core/Api/Models/RealmData.cs index edb2901..7a14780 100644 --- a/src/ProxmoxDesktop.Core/Api/Models/RealmData.cs +++ b/src/ProxmoxDesktop.Core/Api/Models/RealmData.cs @@ -2,14 +2,13 @@ namespace ProxmoxDesktop.Core.Api.Models; -public class RealmData +public sealed class RealmData { - [JsonPropertyName("realm")] - public string Realm { get; set; } = string.Empty; + [JsonPropertyName("realm")] public string Realm { get; init; } = string.Empty; + [JsonPropertyName("comment")] public string? Comment { get; init; } + [JsonPropertyName("type")] public string? Type { get; init; } - [JsonPropertyName("comment")] - public string? Comment { get; set; } - - [JsonPropertyName("type")] - public string? Type { get; set; } + // Affiché dans le ComboBox + public override string ToString() => + string.IsNullOrEmpty(Comment) ? Realm : $"{Realm} — {Comment}"; } diff --git a/src/ProxmoxDesktop.Core/Api/Models/SpiceObject.cs b/src/ProxmoxDesktop.Core/Api/Models/SpiceObject.cs index 0009961..d799bd9 100644 --- a/src/ProxmoxDesktop.Core/Api/Models/SpiceObject.cs +++ b/src/ProxmoxDesktop.Core/Api/Models/SpiceObject.cs @@ -2,38 +2,18 @@ namespace ProxmoxDesktop.Core.Api.Models; -public class SpiceObject +public sealed class SpiceObject { - [JsonPropertyName("title")] - public string? Title { get; set; } - - [JsonPropertyName("proxy")] - public string? Proxy { get; set; } - - [JsonPropertyName("type")] - public string? Type { get; set; } - - [JsonPropertyName("ca")] - public string? Ca { get; set; } - - [JsonPropertyName("host-subject")] - public string? HostSubject { get; set; } - - [JsonPropertyName("tls-port")] - public int TlsPort { get; set; } - - [JsonPropertyName("password")] - public string? Password { get; set; } - - [JsonPropertyName("host")] - public string? Host { get; set; } - - [JsonPropertyName("delete-this-file")] - public int DeleteThisFile { get; set; } -} - -public class SpiceResponse -{ - [JsonPropertyName("data")] - public SpiceObject? Data { get; set; } + [JsonPropertyName("host")] public string Host { get; init; } = string.Empty; + [JsonPropertyName("tls-port")] public int TlsPort { get; init; } + [JsonPropertyName("password")] public string Password { get; init; } = string.Empty; + [JsonPropertyName("ca")] public string? Ca { get; init; } + [JsonPropertyName("host-subject")] public string? HostSubject { get; init; } + [JsonPropertyName("proxy")] public string? Proxy { get; init; } + [JsonPropertyName("title")] public string? Title { get; init; } + [JsonPropertyName("type")] public string? Type { get; init; } + [JsonPropertyName("toggle-fullscreen")]public string? ToggleFullscreen{ get; init; } + [JsonPropertyName("release-cursor")] public string? ReleaseCursor { get; init; } + [JsonPropertyName("secure-attention")] public string? SecureAttention{ get; init; } + [JsonPropertyName("delete-this-file")] public int DeleteThisFile { get; init; } } diff --git a/src/ProxmoxDesktop.Core/Config/ConfigurationService.cs b/src/ProxmoxDesktop.Core/Config/ConfigurationService.cs index c17eefc..e576454 100644 --- a/src/ProxmoxDesktop.Core/Config/ConfigurationService.cs +++ b/src/ProxmoxDesktop.Core/Config/ConfigurationService.cs @@ -1,71 +1,67 @@ using System.Text.Json; +using System.Text.Json.Nodes; namespace ProxmoxDesktop.Core.Config; /// -/// Service de configuration avec sauvegarde différée (lazy). +/// Service de configuration persisté dans un fichier JSON local. /// Remplace l'ancienne classe Configurations qui sauvegardait à chaque SetSetting(). +/// Sauvegarde uniquement lors d'un appel explicite à Save(). +/// Le mot de passe n'est JAMAIS stocké. /// -public class ConfigurationService +public sealed class ConfigurationService { - private Dictionary _settings = []; - private readonly string _filePath; - private bool _isDirty; + private static readonly string ConfigPath = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "ProxmoxDesktop", "config.json"); - private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web) - { - WriteIndented = true - }; + private readonly JsonObject _data; + private bool _dirty; - public ConfigurationService(string appName = "ProxmoxDesktopClient") + public ConfigurationService() { - var folder = Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), - appName); - Directory.CreateDirectory(folder); - _filePath = Path.Combine(folder, "settings.json"); - Load(); - } - - public T? Get(string key, T? defaultValue = default) - { - if (!_settings.TryGetValue(key, out var raw)) return defaultValue; try { - if (raw is JsonElement el) - return el.Deserialize(_jsonOptions) ?? defaultValue; - return (T?)raw ?? defaultValue; + if (File.Exists(ConfigPath)) + { + var json = File.ReadAllText(ConfigPath); + _data = JsonNode.Parse(json) as JsonObject ?? new JsonObject(); + } + else + { + _data = new JsonObject(); + } } - catch { return defaultValue; } + catch { _data = new JsonObject(); } } - public void Set(string key, object? value) + /// Lit une valeur de configuration. Retourne la valeur par défaut si absente. + public T? Get(string key) { - _settings[key] = value; - _isDirty = true; + if (!_data.TryGetPropertyValue(key, out var node) || node is null) + return default; + try { return node.GetValue(); } + catch { return default; } } - /// Persiste les paramètres si des modifications sont en attente. - public void SaveIfDirty() + /// Définit une valeur. La sauvegarde n'est effectuée qu'après Save(). + public void Set(string key, T value) { - if (!_isDirty) return; - var json = JsonSerializer.Serialize(_settings, _jsonOptions); - File.WriteAllText(_filePath, json); - _isDirty = false; + _data[key] = JsonValue.Create(value); + _dirty = true; } - /// Force la sauvegarde immédiate. + /// Persiste la configuration sur disque (appel explicite uniquement). public void Save() { - var json = JsonSerializer.Serialize(_settings, _jsonOptions); - File.WriteAllText(_filePath, json); - _isDirty = false; - } - - private void Load() - { - if (!File.Exists(_filePath)) return; - var json = File.ReadAllText(_filePath); - _settings = JsonSerializer.Deserialize>(_filePath, _jsonOptions) ?? []; + if (!_dirty) return; + try + { + Directory.CreateDirectory(Path.GetDirectoryName(ConfigPath)!); + var json = _data.ToJsonString(new JsonSerializerOptions { WriteIndented = true }); + File.WriteAllText(ConfigPath, json); + _dirty = false; + } + catch { /* log silencieux — ne pas planter l'UI pour un échec de sauvegarde */ } } } diff --git a/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj b/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj index cb4d7bf..7bdfef3 100644 --- a/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj +++ b/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj @@ -1,13 +1,15 @@ + - net9.0-windows + net8.0-windows enable enable - ProxmoxDesktop.Core + 12 ProxmoxDesktop.Core + ProxmoxDesktop.Core + true - - - + + From edae886b7c83bdc0a5dcfdb5fa5ec453b6efa429 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:28:14 +0200 Subject: [PATCH 07/22] chore(assets): add copy-assets script, solution file and app manifest --- .github/workflows/build.yml | 32 +++++++++++++++++++ scripts/copy-assets.ps1 | 42 +++++++++++++++++++++++++ scripts/copy-assets.sh | 33 +++++++++++++++++++ src/ProxmoxDesktop.App/Assets/README.md | 28 +++++++++++++++++ src/ProxmoxDesktop.App/app.manifest | 27 ++++++++++++++++ src/ProxmoxDesktop.sln | 38 ++++++++++++++++++++++ 6 files changed, 200 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 scripts/copy-assets.ps1 create mode 100644 scripts/copy-assets.sh create mode 100644 src/ProxmoxDesktop.App/Assets/README.md create mode 100644 src/ProxmoxDesktop.App/app.manifest create mode 100644 src/ProxmoxDesktop.sln diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..dfda414 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,32 @@ +name: Build WinUI 3 + +on: + push: + branches: [ feature/winui3-migration ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET 8 + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Copy assets from Resources/ + shell: pwsh + run: .\scripts\copy-assets.ps1 + + - name: Restore NuGet packages + run: dotnet restore src/ProxmoxDesktop.sln + + - name: Build (Release x64) + run: dotnet build src/ProxmoxDesktop.sln + --configuration Release + --no-restore + -p:Platform=x64 diff --git a/scripts/copy-assets.ps1 b/scripts/copy-assets.ps1 new file mode 100644 index 0000000..0bccbf0 --- /dev/null +++ b/scripts/copy-assets.ps1 @@ -0,0 +1,42 @@ +# copy-assets.ps1 +# Copie les assets depuis l'ancien projet WinForms vers le nouveau projet WinUI 3. +# A executer UNE SEULE FOIS apres avoir clone la branche feature/winui3-migration. +# +# Usage depuis la racine du repo : +# .\scripts\copy-assets.ps1 + +[CmdletBinding()] +param( + [string]$SourceRoot = $PSScriptRoot + "\..\Resources", + [string]$DestRoot = $PSScriptRoot + "\..\src\ProxmoxDesktop.App\Assets" +) + +$ErrorActionPreference = "Stop" + +# Creer le dossier de destination s'il n'existe pas +New-Item -ItemType Directory -Force -Path $DestRoot | Out-Null + +$copies = @( + # Source (relatif a $SourceRoot) -> Destination (relatif a $DestRoot) + @{ Src = "Icons\default.png"; Dst = "proxmox.png" } + @{ Src = "Icons\default-icon.ico"; Dst = "app.ico" } + @{ Src = "vm_logo.png"; Dst = "vm.png" } + @{ Src = "lxc_logo.png"; Dst = "lxc.png" } +) + +foreach ($item in $copies) { + $src = Join-Path $SourceRoot $item.Src + $dst = Join-Path $DestRoot $item.Dst + + if (-not (Test-Path $src)) { + Write-Warning "Source introuvable : $src" + continue + } + + Copy-Item -Path $src -Destination $dst -Force + Write-Host "[OK] $($item.Src) -> Assets/$($item.Dst)" +} + +Write-Host "" +Write-Host "Assets copies avec succes dans : $DestRoot" -ForegroundColor Green +Write-Host "Tu peux maintenant compiler le projet avec Visual Studio ou 'dotnet build'." diff --git a/scripts/copy-assets.sh b/scripts/copy-assets.sh new file mode 100644 index 0000000..27b5d10 --- /dev/null +++ b/scripts/copy-assets.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# copy-assets.sh +# Equivalent bash de copy-assets.ps1 (pour WSL ou CI Linux). +# Usage depuis la racine du repo : +# bash scripts/copy-assets.sh + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"; pwd)" +SOURCE_ROOT="$SCRIPT_DIR/../Resources" +DEST_ROOT="$SCRIPT_DIR/../src/ProxmoxDesktop.App/Assets" + +mkdir -p "$DEST_ROOT" + +copy_asset() { + local src="$SOURCE_ROOT/$1" + local dst="$DEST_ROOT/$2" + if [ ! -f "$src" ]; then + echo "[WARN] Source introuvable : $src" + return + fi + cp "$src" "$dst" + echo "[OK] $1 -> Assets/$2" +} + +copy_asset "Icons/default.png" "proxmox.png" +copy_asset "Icons/default-icon.ico" "app.ico" +copy_asset "vm_logo.png" "vm.png" +copy_asset "lxc_logo.png" "lxc.png" + +echo "" +echo "Assets copiés avec succès dans : $DEST_ROOT" +echo "Tu peux maintenant compiler avec : dotnet build src/ProxmoxDesktop.sln" diff --git a/src/ProxmoxDesktop.App/Assets/README.md b/src/ProxmoxDesktop.App/Assets/README.md new file mode 100644 index 0000000..7b69709 --- /dev/null +++ b/src/ProxmoxDesktop.App/Assets/README.md @@ -0,0 +1,28 @@ +# Assets — ProxmoxDesktop.App + +Ce dossier contient les images utilisées par l'interface WinUI 3. +Les fichiers binaires (PNG, ICO) ne sont **pas** commités dans Git +pour éviter de dupliquer les ressources déjà présentes dans `/Resources/`. + +## Copier les assets + +Exécute **une seule fois** depuis la racine du repo : + +**Windows (PowerShell) :** +```powershell +.\scripts\copy-assets.ps1 +``` + +**Linux / WSL (Bash) :** +```bash +bash scripts/copy-assets.sh +``` + +## Fichiers attendus + +| Fichier | Source originale | Rôle | +|---|---|---| +| `proxmox.png` | `Resources/Icons/default.png` | Logo Proxmox (header, splash) | +| `vm.png` | `Resources/vm_logo.png` | Icône des VM QEMU sur les tiles | +| `lxc.png` | `Resources/lxc_logo.png` | Icône des containers LXC sur les tiles | +| `app.ico` | `Resources/Icons/default-icon.ico` | Icône de l'application (barre des tâches) | diff --git a/src/ProxmoxDesktop.App/app.manifest b/src/ProxmoxDesktop.App/app.manifest new file mode 100644 index 0000000..4c4ffe6 --- /dev/null +++ b/src/ProxmoxDesktop.App/app.manifest @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + PerMonitorV2 + true/PM + + UTF-8 + + + diff --git a/src/ProxmoxDesktop.sln b/src/ProxmoxDesktop.sln new file mode 100644 index 0000000..38729c7 --- /dev/null +++ b/src/ProxmoxDesktop.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34607.119 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxmoxDesktop.App", "ProxmoxDesktop.App\ProxmoxDesktop.App.csproj", "{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProxmoxDesktop.Core", "ProxmoxDesktop.Core\ProxmoxDesktop.Core.csproj", "{B2C3D4E5-F6A7-8901-BCDE-F12345678901}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.ActiveCfg = Debug|x64 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.Build.0 = Debug|x64 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x86.ActiveCfg = Debug|x86 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x86.Build.0 = Debug|x86 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.ActiveCfg = Release|x64 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.Build.0 = Release|x64 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x86.ActiveCfg = Release|x86 + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x86.Build.0 = Release|x86 + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|x64.ActiveCfg = Debug|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|x64.Build.0 = Debug|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|x86.ActiveCfg = Debug|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|x86.Build.0 = Debug|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|x64.ActiveCfg = Release|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|x64.Build.0 = Release|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|x86.ActiveCfg = Release|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal From 2335212fa298155145da166e9d1a84183f39fdaf Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:35:46 +0200 Subject: [PATCH 08/22] fix(scripts): use MyInvocation pour resoudre PSScriptRoot en dot-sourcing --- scripts/copy-assets.ps1 | 76 ++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/scripts/copy-assets.ps1 b/scripts/copy-assets.ps1 index 0bccbf0..842de7f 100644 --- a/scripts/copy-assets.ps1 +++ b/scripts/copy-assets.ps1 @@ -2,41 +2,91 @@ # Copie les assets depuis l'ancien projet WinForms vers le nouveau projet WinUI 3. # A executer UNE SEULE FOIS apres avoir clone la branche feature/winui3-migration. # -# Usage depuis la racine du repo : -# .\scripts\copy-assets.ps1 +# Usage depuis la racine du repo (3 manieres equivalentes) : +# .\scripts\copy-assets.ps1 <- appel direct (recommande) +# & '.\scripts\copy-assets.ps1' <- appel avec & +# . '.\scripts\copy-assets.ps1' <- dot-sourcing (fonctionne aussi) [CmdletBinding()] param( - [string]$SourceRoot = $PSScriptRoot + "\..\Resources", - [string]$DestRoot = $PSScriptRoot + "\..\src\ProxmoxDesktop.App\Assets" + [string]$SourceRoot, + [string]$DestRoot ) $ErrorActionPreference = "Stop" -# Creer le dossier de destination s'il n'existe pas +# $PSScriptRoot est vide en dot-sourcing ; on le reconstruit depuis MyInvocation +if (-not $PSScriptRoot -or $PSScriptRoot -eq '') { + $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +} else { + $ScriptDir = $PSScriptRoot +} + +# Si toujours vide (appel interactif rare), on part du repertoire courant +if (-not $ScriptDir -or $ScriptDir -eq '') { + $ScriptDir = Join-Path (Get-Location).Path 'scripts' +} + +# Resoudre les chemins par defaut si non passes en parametre +if (-not $SourceRoot) { + $SourceRoot = Resolve-Path (Join-Path $ScriptDir '..' 'Resources') -ErrorAction SilentlyContinue + if (-not $SourceRoot) { + $SourceRoot = Join-Path $ScriptDir '..' 'Resources' + } +} +if (-not $DestRoot) { + $DestRoot = Join-Path $ScriptDir '..' 'src' 'ProxmoxDesktop.App' 'Assets' +} + +# Normaliser les chemins (supprime les ..\ pour l'affichage) +$SourceRoot = [System.IO.Path]::GetFullPath($SourceRoot) +$DestRoot = [System.IO.Path]::GetFullPath($DestRoot) + +Write-Host "Source : $SourceRoot" +Write-Host "Dest : $DestRoot" +Write-Host "" + +if (-not (Test-Path $SourceRoot)) { + Write-Error "Dossier Resources introuvable : $SourceRoot`nLance ce script depuis la racine du repo." + exit 1 +} + New-Item -ItemType Directory -Force -Path $DestRoot | Out-Null $copies = @( - # Source (relatif a $SourceRoot) -> Destination (relatif a $DestRoot) - @{ Src = "Icons\default.png"; Dst = "proxmox.png" } - @{ Src = "Icons\default-icon.ico"; Dst = "app.ico" } - @{ Src = "vm_logo.png"; Dst = "vm.png" } - @{ Src = "lxc_logo.png"; Dst = "lxc.png" } + @{ Src = "Icons\default.png"; Dst = "proxmox.png" } + @{ Src = "Icons\default-icon.ico"; Dst = "app.ico" } + @{ Src = "vm_logo.png"; Dst = "vm.png" } + @{ Src = "lxc_logo.png"; Dst = "lxc.png" } ) +$ok = 0 +$warn = 0 + foreach ($item in $copies) { $src = Join-Path $SourceRoot $item.Src $dst = Join-Path $DestRoot $item.Dst if (-not (Test-Path $src)) { Write-Warning "Source introuvable : $src" + $warn++ continue } Copy-Item -Path $src -Destination $dst -Force - Write-Host "[OK] $($item.Src) -> Assets/$($item.Dst)" + Write-Host "[OK] $($item.Src) -> Assets/$($item.Dst)" -ForegroundColor Cyan + $ok++ } Write-Host "" -Write-Host "Assets copies avec succes dans : $DestRoot" -ForegroundColor Green -Write-Host "Tu peux maintenant compiler le projet avec Visual Studio ou 'dotnet build'." +if ($warn -gt 0) { + Write-Warning "$warn fichier(s) manquant(s). Le dossier Resources est-il bien present ?" +} +if ($ok -gt 0) { + Write-Host "$ok asset(s) copies avec succes dans : $DestRoot" -ForegroundColor Green + Write-Host "Tu peux maintenant compiler : dotnet build src/ProxmoxDesktop.sln" +} +if ($ok -eq 0) { + Write-Error "Aucun asset copie. Verifie que le dossier Resources/ est bien present a la racine du repo." + exit 1 +} From 4e5accdc385118d0f6e858ea10e540119c67b486 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:37:31 +0200 Subject: [PATCH 09/22] fix(scripts): supprimer param() pour eviter conflit d'arguments en dot-sourcing --- scripts/copy-assets.ps1 | 66 ++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 44 deletions(-) diff --git a/scripts/copy-assets.ps1 b/scripts/copy-assets.ps1 index 842de7f..86855d0 100644 --- a/scripts/copy-assets.ps1 +++ b/scripts/copy-assets.ps1 @@ -1,54 +1,34 @@ # copy-assets.ps1 -# Copie les assets depuis l'ancien projet WinForms vers le nouveau projet WinUI 3. -# A executer UNE SEULE FOIS apres avoir clone la branche feature/winui3-migration. +# Copie les assets depuis Resources/ vers src/ProxmoxDesktop.App/Assets/ # -# Usage depuis la racine du repo (3 manieres equivalentes) : -# .\scripts\copy-assets.ps1 <- appel direct (recommande) -# & '.\scripts\copy-assets.ps1' <- appel avec & -# . '.\scripts\copy-assets.ps1' <- dot-sourcing (fonctionne aussi) - -[CmdletBinding()] -param( - [string]$SourceRoot, - [string]$DestRoot -) +# Usage (toutes les formes fonctionnent) : +# .\scripts\copy-assets.ps1 +# & '.\scripts\copy-assets.ps1' +# . '.\scripts\copy-assets.ps1' $ErrorActionPreference = "Stop" -# $PSScriptRoot est vide en dot-sourcing ; on le reconstruit depuis MyInvocation -if (-not $PSScriptRoot -or $PSScriptRoot -eq '') { - $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +# Retrouver le dossier du script de facon robuste (appel direct ET dot-sourcing) +$_scriptPath = if ($MyInvocation.MyCommand.Path) { + $MyInvocation.MyCommand.Path +} elseif ($PSCommandPath) { + $PSCommandPath } else { - $ScriptDir = $PSScriptRoot -} - -# Si toujours vide (appel interactif rare), on part du repertoire courant -if (-not $ScriptDir -or $ScriptDir -eq '') { - $ScriptDir = Join-Path (Get-Location).Path 'scripts' -} - -# Resoudre les chemins par defaut si non passes en parametre -if (-not $SourceRoot) { - $SourceRoot = Resolve-Path (Join-Path $ScriptDir '..' 'Resources') -ErrorAction SilentlyContinue - if (-not $SourceRoot) { - $SourceRoot = Join-Path $ScriptDir '..' 'Resources' - } -} -if (-not $DestRoot) { - $DestRoot = Join-Path $ScriptDir '..' 'src' 'ProxmoxDesktop.App' 'Assets' + Join-Path (Get-Location).Path 'scripts\copy-assets.ps1' } -# Normaliser les chemins (supprime les ..\ pour l'affichage) -$SourceRoot = [System.IO.Path]::GetFullPath($SourceRoot) -$DestRoot = [System.IO.Path]::GetFullPath($DestRoot) +$_repoRoot = [System.IO.Path]::GetFullPath((Join-Path (Split-Path $_scriptPath) '..')) +$SourceRoot = Join-Path $_repoRoot 'Resources' +$DestRoot = Join-Path $_repoRoot 'src' 'ProxmoxDesktop.App' 'Assets' +Write-Host "Repo : $_repoRoot" Write-Host "Source : $SourceRoot" Write-Host "Dest : $DestRoot" Write-Host "" if (-not (Test-Path $SourceRoot)) { - Write-Error "Dossier Resources introuvable : $SourceRoot`nLance ce script depuis la racine du repo." - exit 1 + Write-Error "Dossier Resources introuvable : $SourceRoot`nVerifie que tu es bien dans la racine du repo." + return } New-Item -ItemType Directory -Force -Path $DestRoot | Out-Null @@ -60,7 +40,7 @@ $copies = @( @{ Src = "lxc_logo.png"; Dst = "lxc.png" } ) -$ok = 0 +$ok = 0 $warn = 0 foreach ($item in $copies) { @@ -80,13 +60,11 @@ foreach ($item in $copies) { Write-Host "" if ($warn -gt 0) { - Write-Warning "$warn fichier(s) manquant(s). Le dossier Resources est-il bien present ?" + Write-Warning "$warn fichier(s) manquant(s)." } if ($ok -gt 0) { Write-Host "$ok asset(s) copies avec succes dans : $DestRoot" -ForegroundColor Green - Write-Host "Tu peux maintenant compiler : dotnet build src/ProxmoxDesktop.sln" -} -if ($ok -eq 0) { - Write-Error "Aucun asset copie. Verifie que le dossier Resources/ est bien present a la racine du repo." - exit 1 + Write-Host "Lance maintenant : dotnet build src/ProxmoxDesktop.sln" +} else { + Write-Error "Aucun asset copie. Verifie que Resources/ est bien present." } From 54abcaaa5a3fac8099afd4da672b0cdf0e452c3b Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:38:59 +0200 Subject: [PATCH 10/22] fix(scripts): compatibilite PowerShell 5 - Join-Path chaine + [IO.Path]::Combine --- scripts/copy-assets.ps1 | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/scripts/copy-assets.ps1 b/scripts/copy-assets.ps1 index 86855d0..b7c004d 100644 --- a/scripts/copy-assets.ps1 +++ b/scripts/copy-assets.ps1 @@ -1,6 +1,7 @@ # copy-assets.ps1 # Copie les assets depuis Resources/ vers src/ProxmoxDesktop.App/Assets/ # +# Compatible PowerShell 5.1 et PowerShell 7+ # Usage (toutes les formes fonctionnent) : # .\scripts\copy-assets.ps1 # & '.\scripts\copy-assets.ps1' @@ -8,18 +9,18 @@ $ErrorActionPreference = "Stop" -# Retrouver le dossier du script de facon robuste (appel direct ET dot-sourcing) +# Retrouver le dossier du script (robuste en appel direct ET dot-sourcing) $_scriptPath = if ($MyInvocation.MyCommand.Path) { $MyInvocation.MyCommand.Path } elseif ($PSCommandPath) { $PSCommandPath } else { - Join-Path (Get-Location).Path 'scripts\copy-assets.ps1' + [IO.Path]::Combine((Get-Location).Path, 'scripts', 'copy-assets.ps1') } -$_repoRoot = [System.IO.Path]::GetFullPath((Join-Path (Split-Path $_scriptPath) '..')) -$SourceRoot = Join-Path $_repoRoot 'Resources' -$DestRoot = Join-Path $_repoRoot 'src' 'ProxmoxDesktop.App' 'Assets' +$_repoRoot = [IO.Path]::GetFullPath([IO.Path]::Combine((Split-Path $_scriptPath), '..')) +$SourceRoot = [IO.Path]::Combine($_repoRoot, 'Resources') +$DestRoot = [IO.Path]::Combine($_repoRoot, 'src', 'ProxmoxDesktop.App', 'Assets') Write-Host "Repo : $_repoRoot" Write-Host "Source : $SourceRoot" @@ -27,25 +28,25 @@ Write-Host "Dest : $DestRoot" Write-Host "" if (-not (Test-Path $SourceRoot)) { - Write-Error "Dossier Resources introuvable : $SourceRoot`nVerifie que tu es bien dans la racine du repo." + Write-Error "Dossier Resources introuvable : $SourceRoot`nVerifie que tu lances le script depuis la racine du repo." return } New-Item -ItemType Directory -Force -Path $DestRoot | Out-Null $copies = @( - @{ Src = "Icons\default.png"; Dst = "proxmox.png" } - @{ Src = "Icons\default-icon.ico"; Dst = "app.ico" } - @{ Src = "vm_logo.png"; Dst = "vm.png" } - @{ Src = "lxc_logo.png"; Dst = "lxc.png" } + @{ Src = [IO.Path]::Combine('Icons', 'default.png'); Dst = 'proxmox.png' } + @{ Src = [IO.Path]::Combine('Icons', 'default-icon.ico'); Dst = 'app.ico' } + @{ Src = 'vm_logo.png'; Dst = 'vm.png' } + @{ Src = 'lxc_logo.png'; Dst = 'lxc.png' } ) $ok = 0 $warn = 0 foreach ($item in $copies) { - $src = Join-Path $SourceRoot $item.Src - $dst = Join-Path $DestRoot $item.Dst + $src = [IO.Path]::Combine($SourceRoot, $item.Src) + $dst = [IO.Path]::Combine($DestRoot, $item.Dst) if (-not (Test-Path $src)) { Write-Warning "Source introuvable : $src" @@ -66,5 +67,5 @@ if ($ok -gt 0) { Write-Host "$ok asset(s) copies avec succes dans : $DestRoot" -ForegroundColor Green Write-Host "Lance maintenant : dotnet build src/ProxmoxDesktop.sln" } else { - Write-Error "Aucun asset copie. Verifie que Resources/ est bien present." + Write-Error "Aucun asset copie. Verifie que Resources/ est bien present a la racine du repo." } From 55be33d90482a5e491403952b98bbd4bce4b2f06 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:44:06 +0200 Subject: [PATCH 11/22] fix(csproj): migrer net8 -> net10, maj versions packages pour SDK .NET 10 --- .../ProxmoxDesktop.App.csproj | 22 +++++++++---------- .../ProxmoxDesktop.Core.csproj | 6 ++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj b/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj index 8541caa..8111042 100644 --- a/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj +++ b/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj @@ -2,33 +2,33 @@ WinExe - net8.0-windows10.0.19041.0 + net10.0-windows10.0.19041.0 10.0.17763.0 enable enable - 12 + latest true app.manifest - x86;x64;arm64 - win-x86;win-x64;win-arm64 + + x64 + win-x64 ProxmoxDesktop.App ProxmoxDesktop 2.0.0.0 - 2.0.0 - - - - + + + + - + - + diff --git a/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj b/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj index 7bdfef3..5a54e5a 100644 --- a/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj +++ b/src/ProxmoxDesktop.Core/ProxmoxDesktop.Core.csproj @@ -1,15 +1,15 @@ - net8.0-windows + net10.0-windows enable enable - 12 + latest ProxmoxDesktop.Core ProxmoxDesktop.Core true - + From bf9d6c8ad0480d6758b15db9dcdfd7668359d69c Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:46:18 +0200 Subject: [PATCH 12/22] fix(build): global.json + nuget.config + maj packages vers dernieres versions stables --- .../ProxmoxDesktop.App.csproj | 18 ++++++++++-------- src/global.json | 6 ++++++ src/nuget.config | 12 ++++++++++++ 3 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 src/global.json create mode 100644 src/nuget.config diff --git a/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj b/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj index 8111042..f9095e5 100644 --- a/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj +++ b/src/ProxmoxDesktop.App/ProxmoxDesktop.App.csproj @@ -9,28 +9,30 @@ latest true app.manifest - x64 win-x64 ProxmoxDesktop.App ProxmoxDesktop 2.0.0.0 2.0.0 + + false + false - - - - + + + + - + - + - + diff --git a/src/global.json b/src/global.json new file mode 100644 index 0000000..f3c46b6 --- /dev/null +++ b/src/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "10.0.300", + "rollForward": "latestMinor" + } +} diff --git a/src/nuget.config b/src/nuget.config new file mode 100644 index 0000000..4e800bf --- /dev/null +++ b/src/nuget.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + From a6ba30d907187e2147365f016ef95330a2cb0341 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:48:22 +0200 Subject: [PATCH 13/22] fix(models): MachineData -> record class (support 'with'), PowerResult enum avec Ok/Forbidden/Error --- .../Api/Models/MachineData.cs | 74 ++++++++++--------- .../Api/Models/PowerResult.cs | 6 ++ 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs b/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs index 094c26c..e068e0a 100644 --- a/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs +++ b/src/ProxmoxDesktop.Core/Api/Models/MachineData.cs @@ -2,42 +2,50 @@ namespace ProxmoxDesktop.Core.Api.Models; -/// Représente une VM QEMU ou un container LXC retourné par l'API PVE. -public sealed class MachineData +/// +/// Représente une VM QEMU ou un container LXC retourné par l'API PVE. +/// Déclaré en tant que record pour autoriser l'expression 'with' dans ApiClient. +/// +public sealed record MachineData { - [JsonPropertyName("vmid")] public int Vmid { get; init; } - [JsonPropertyName("name")] public string Name { get; init; } = string.Empty; - [JsonPropertyName("nodename")]public string NodeName { get; init; } = string.Empty; - [JsonPropertyName("type")] public string Type { get; init; } = "qemu"; - [JsonPropertyName("status")] public string Status { get; init; } = string.Empty; - [JsonPropertyName("lock")] public string? Lock { get; init; } - [JsonPropertyName("tags")] public string? Tags { get; init; } - - // Ressources - [JsonPropertyName("cpu")] public double Cpu { get; init; } - [JsonPropertyName("cpus")] public int Cpus { get; init; } - [JsonPropertyName("mem")] public long Mem { get; init; } - [JsonPropertyName("maxmem")] public long MaxMem { get; init; } - [JsonPropertyName("disk")] public long Disk { get; init; } - [JsonPropertyName("maxdisk")]public long MaxDisk { get; init; } - [JsonPropertyName("swap")] public long Swap { get; init; } - [JsonPropertyName("maxswap")]public long MaxSwap { get; init; } - [JsonPropertyName("uptime")] public long Uptime { get; init; } - [JsonPropertyName("netin")] public long NetIn { get; init; } - [JsonPropertyName("netout")] public long NetOut { get; init; } - [JsonPropertyName("diskread")]public long DiskRead { get; init; } - [JsonPropertyName("diskwrite")]public long DiskWrite { get; init; } - [JsonPropertyName("serial")] public int Serial { get; init; } - [JsonPropertyName("pid")] public int Pid { get; init; } - - // Propriétés calculées (pas de champ JSON correspondant) - [JsonIgnore] public bool IsRunning => Status == "running"; - [JsonIgnore] public bool IsLxc => Type == "lxc"; - - /// CPU en % (0-100), arrondi à 1 décimale. + [JsonPropertyName("vmid")] public int Vmid { get; init; } + [JsonPropertyName("name")] public string Name { get; init; } = string.Empty; + [JsonPropertyName("status")] public string Status { get; init; } = string.Empty; + [JsonPropertyName("node")] public string Node { get; init; } = string.Empty; + + /// CPU usage (0.0 – 1.0) retourné par l'API. + [JsonPropertyName("cpu")] public double Cpu { get; init; } + + /// RAM utilisée en octets. + [JsonPropertyName("mem")] public long Mem { get; init; } + + /// RAM totale allouée en octets. + [JsonPropertyName("maxmem")] public long MaxMem { get; init; } + + // ------------------------------------------------------------------------- + // Champs injectés après désérialisation (absents de la réponse list PVE) + // ------------------------------------------------------------------------- + + /// Nom du nœud hôte (injecté par ApiClient). + public string NodeName { get; init; } = string.Empty; + + /// "qemu" ou "lxc" (injecté par ApiClient). + public string Type { get; init; } = string.Empty; + + // ------------------------------------------------------------------------- + // Propriétés calculées + // ------------------------------------------------------------------------- + + /// True si la VM/CT est en cours d'exécution. + [JsonIgnore] public bool IsRunning => Status == "running"; + + /// True si c'est un container LXC (et non une VM QEMU). + [JsonIgnore] public bool IsLxc => Type == "lxc"; + + /// CPU en pourcentage (0–100). [JsonIgnore] public double CpuPercent => Math.Round(Cpu * 100, 1); - /// RAM utilisée en % (0-100), arrondi à 1 décimale. + /// RAM utilisée en pourcentage (0–100). [JsonIgnore] public double MemPercent => MaxMem > 0 ? Math.Round((double)Mem / MaxMem * 100, 1) : 0; } diff --git a/src/ProxmoxDesktop.Core/Api/Models/PowerResult.cs b/src/ProxmoxDesktop.Core/Api/Models/PowerResult.cs index ed2bc65..4b9a49e 100644 --- a/src/ProxmoxDesktop.Core/Api/Models/PowerResult.cs +++ b/src/ProxmoxDesktop.Core/Api/Models/PowerResult.cs @@ -1,8 +1,14 @@ namespace ProxmoxDesktop.Core.Api.Models; +/// Résultat d'une action d'alimentation sur une VM/CT. public enum PowerResult { + /// Commande acceptée par Proxmox VE. Ok, + + /// Refusé : droits insuffisants (HTTP 403). Forbidden, + + /// Erreur inattendue (timeout, nœud hors-ligne, etc.). Error } From 7e1c340532abae4696de1ac11404d6d70f316c3b Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:52:06 +0200 Subject: [PATCH 14/22] fix(build): supprimer LoginResult.cs doublon (definissait PowerResult sans Ok) --- src/ProxmoxDesktop.Core/Api/LoginResult.cs | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 src/ProxmoxDesktop.Core/Api/LoginResult.cs diff --git a/src/ProxmoxDesktop.Core/Api/LoginResult.cs b/src/ProxmoxDesktop.Core/Api/LoginResult.cs deleted file mode 100644 index 36f6719..0000000 --- a/src/ProxmoxDesktop.Core/Api/LoginResult.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace ProxmoxDesktop.Core.Api; - -public enum LoginStatus { Success, Failure, TotpRequired } - -public record LoginResult(LoginStatus Status, string? Message = null) -{ - public bool IsSuccess => Status == LoginStatus.Success; - public bool NeedsTotp => Status == LoginStatus.TotpRequired; - - public static LoginResult Success() => new(LoginStatus.Success); - public static LoginResult Failure(string msg) => new(LoginStatus.Failure, msg); - public static LoginResult TotpRequired() => new(LoginStatus.TotpRequired, "Code TOTP requis."); -} - -public enum PowerResult { Success, Forbidden, Error } From 2cf0508a0ce08f6b59a897a5a02b9f2c91a41863 Mon Sep 17 00:00:00 2001 From: Kofy Date: Thu, 4 Jun 2026 18:55:12 +0200 Subject: [PATCH 15/22] fix(xaml): supprimer TextTransform (WinUI3) + doublon Content sur Button login --- src/ProxmoxDesktop.App/Controls/MachineCard.xaml | 2 +- src/ProxmoxDesktop.App/Views/LoginPage.xaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ProxmoxDesktop.App/Controls/MachineCard.xaml b/src/ProxmoxDesktop.App/Controls/MachineCard.xaml index 4aef59e..d2f999a 100644 --- a/src/ProxmoxDesktop.App/Controls/MachineCard.xaml +++ b/src/ProxmoxDesktop.App/Controls/MachineCard.xaml @@ -22,7 +22,7 @@ Background="{x:Bind StatusBrush, Mode=OneWay}"> + CharacterSpacing="75" FontWeight="SemiBold"/> diff --git a/src/ProxmoxDesktop.App/Views/LoginPage.xaml b/src/ProxmoxDesktop.App/Views/LoginPage.xaml index b7a9df8..f01dd37 100644 --- a/src/ProxmoxDesktop.App/Views/LoginPage.xaml +++ b/src/ProxmoxDesktop.App/Views/LoginPage.xaml @@ -17,6 +17,7 @@ + @@ -82,8 +83,7 @@ Margin="0,4,0,0"/> - + + + + + + + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/ConsolePage.xbf b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/ConsolePage.xbf new file mode 100644 index 0000000000000000000000000000000000000000..c363830327340cac3e989d8878efa4fdf435b47e GIT binary patch literal 1458 zcmcIj-D(q25dN~8-E22$MH^H$RT^!JNJyL1ZIWK4*)$+nEn2LKg8fN<&^Dn-Y_Fur zf>jU^FQmSJ7vckm7hZTPK7?2GG5ltCLv7I;!Lyv5IWu!+=9`&wr&Pfg75Etf6aXaH z;g2|Hgd*-j>F=dzAdo}SJZ^7eGu z881&1>}hAL;Mf(XQ^Y@x1|q6i6={m!yF}V;3D@FQPhb>s&I&4mi#JhN~BA8L|!V?V!UO{1@#l{ zmY2sG{pg;r7Hd!=`pY~;k4aLD(*XjESF|#Hlo6Wyu1N1Y_ zD1A4)PBi)VJ5yt)Hki#0G1t9H0VioI_%~@)qwgxwtTTdeCH`w3TEL*)Ey`p%N}lC1 zC2{VXl*$Ax5W7@p3xmA3z`sn*pq2N8Mig$gRZOkG%MD46MC*8VB7aN=& znTa~P;Llnb-7d@fJDP2G?#}dfhR$^~74gsQ!~<6gqyKq_ymjC8lC<`p`2&aDBEwFB zG;z<>Gz{%^G~KiQ(YEde)?eLdTM;DIw><*hEn55S=toZ?ek<+7wT>2n^{!3r>nZDn zPm@OcWjhv@h`pMDM8B)`;P7hFP-rpGiG`(z5=;teS-YBv_@}lt?`lz4b1ttA5KJ;PqD4}wSX5>4d5O-4+!M`19`80ZPddJIDkaTu*Q26V;Nm8Uw^4Gfyd8aQhz z2^}|dOd2?CDn%80Asr)OOz23(kXOy`AywtW95KSfx{_9r)Nvt(^NMm+H8plotd(Ii IyrL +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ProxmoxDesktop.App.Views +{ + partial class LoginPage : + global::Microsoft.UI.Xaml.Controls.Page, + global::Microsoft.UI.Xaml.Markup.IComponentConnector + { + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + private static class XamlBindingSetters + { + public static void Set_Microsoft_UI_Xaml_Controls_TextBox_Text(global::Microsoft.UI.Xaml.Controls.TextBox obj, global::System.String value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = targetNullValue; + } + obj.Text = value ?? global::System.String.Empty; + } + public static void Set_Microsoft_UI_Xaml_Controls_ItemsControl_ItemsSource(global::Microsoft.UI.Xaml.Controls.ItemsControl obj, global::System.Object value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = (global::System.Object) global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Object), targetNullValue); + } + obj.ItemsSource = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_Primitives_Selector_SelectedItem(global::Microsoft.UI.Xaml.Controls.Primitives.Selector obj, global::System.Object value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = (global::System.Object) global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Object), targetNullValue); + } + obj.SelectedItem = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_PasswordBox_Password(global::Microsoft.UI.Xaml.Controls.PasswordBox obj, global::System.String value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = targetNullValue; + } + obj.Password = value ?? global::System.String.Empty; + } + public static void Set_Microsoft_UI_Xaml_UIElement_Visibility(global::Microsoft.UI.Xaml.UIElement obj, global::Microsoft.UI.Xaml.Visibility value) + { + obj.Visibility = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_Primitives_ToggleButton_IsChecked(global::Microsoft.UI.Xaml.Controls.Primitives.ToggleButton obj, global::System.Nullable value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = (global::System.Boolean) global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Boolean), targetNullValue); + } + obj.IsChecked = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_InfoBar_IsOpen(global::Microsoft.UI.Xaml.Controls.InfoBar obj, global::System.Boolean value) + { + obj.IsOpen = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_InfoBar_Message(global::Microsoft.UI.Xaml.Controls.InfoBar obj, global::System.String value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = targetNullValue; + } + obj.Message = value ?? global::System.String.Empty; + } + public static void Set_Microsoft_UI_Xaml_Controls_Primitives_ButtonBase_Command(global::Microsoft.UI.Xaml.Controls.Primitives.ButtonBase obj, global::System.Windows.Input.ICommand value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = (global::System.Windows.Input.ICommand) global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Windows.Input.ICommand), targetNullValue); + } + obj.Command = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_ProgressRing_IsActive(global::Microsoft.UI.Xaml.Controls.ProgressRing obj, global::System.Boolean value) + { + obj.IsActive = value; + } + }; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + private partial class LoginPage_obj1_Bindings : + global::Microsoft.UI.Xaml.Markup.IDataTemplateComponent, + global::Microsoft.UI.Xaml.Markup.IXamlBindScopeDiagnostics, + global::Microsoft.UI.Xaml.Markup.IComponentConnector, + ILoginPage_Bindings + { + private global::ProxmoxDesktop.App.Views.LoginPage dataRoot; + private bool initialized = false; + private const int NOT_PHASED = (1 << 31); + private const int DATA_CHANGED = (1 << 30); + private global::Microsoft.UI.Xaml.ResourceDictionary localResources; + private global::System.WeakReference converterLookupRoot; + + // Fields for each control that has bindings. + private global::Microsoft.UI.Xaml.Controls.TextBox obj2; + private global::Microsoft.UI.Xaml.Controls.TextBox obj3; + private global::Microsoft.UI.Xaml.Controls.ComboBox obj4; + private global::Microsoft.UI.Xaml.Controls.TextBox obj5; + private global::Microsoft.UI.Xaml.Controls.PasswordBox obj6; + private global::Microsoft.UI.Xaml.Controls.TextBox obj7; + private global::Microsoft.UI.Xaml.Controls.CheckBox obj8; + private global::Microsoft.UI.Xaml.Controls.InfoBar obj9; + private global::Microsoft.UI.Xaml.Controls.Button obj10; + private global::Microsoft.UI.Xaml.Controls.ProgressRing obj11; + + // Static fields for each binding's enabled/disabled state + private static bool isobj2TextDisabled = false; + private static bool isobj3TextDisabled = false; + private static bool isobj4ItemsSourceDisabled = false; + private static bool isobj4SelectedItemDisabled = false; + private static bool isobj5TextDisabled = false; + private static bool isobj6PasswordDisabled = false; + private static bool isobj7TextDisabled = false; + private static bool isobj7VisibilityDisabled = false; + private static bool isobj8IsCheckedDisabled = false; + private static bool isobj9IsOpenDisabled = false; + private static bool isobj9MessageDisabled = false; + private static bool isobj10CommandDisabled = false; + private static bool isobj11IsActiveDisabled = false; + private static bool isobj11VisibilityDisabled = false; + + private LoginPage_obj1_BindingsTracking bindingsTracking; + + public LoginPage_obj1_Bindings() + { + this.bindingsTracking = new LoginPage_obj1_BindingsTracking(this); + } + + public void Disable(int lineNumber, int columnNumber) + { + if (lineNumber == 35 && columnNumber == 18) + { + isobj2TextDisabled = true; + } + else if (lineNumber == 42 && columnNumber == 18) + { + isobj3TextDisabled = true; + } + else if (lineNumber == 49 && columnNumber == 19) + { + isobj4ItemsSourceDisabled = true; + } + else if (lineNumber == 50 && columnNumber == 19) + { + isobj4SelectedItemDisabled = true; + } + else if (lineNumber == 58 && columnNumber == 18) + { + isobj5TextDisabled = true; + } + else if (lineNumber == 63 && columnNumber == 22) + { + isobj6PasswordDisabled = true; + } + else if (lineNumber == 69 && columnNumber == 18) + { + isobj7TextDisabled = true; + } + else if (lineNumber == 70 && columnNumber == 18) + { + isobj7VisibilityDisabled = true; + } + else if (lineNumber == 75 && columnNumber == 19) + { + isobj8IsCheckedDisabled = true; + } + else if (lineNumber == 79 && columnNumber == 18) + { + isobj9IsOpenDisabled = true; + } + else if (lineNumber == 81 && columnNumber == 18) + { + isobj9MessageDisabled = true; + } + else if (lineNumber == 89 && columnNumber == 17) + { + isobj10CommandDisabled = true; + } + else if (lineNumber == 93 && columnNumber == 35) + { + isobj11IsActiveDisabled = true; + } + else if (lineNumber == 95 && columnNumber == 35) + { + isobj11VisibilityDisabled = true; + } + } + + // IComponentConnector + + public void Connect(int connectionId, global::System.Object target) + { + switch(connectionId) + { + case 2: // Views\LoginPage.xaml line 32 + this.obj2 = global::WinRT.CastExtensions.As(target); + this.bindingsTracking.RegisterTwoWayListener_2(this.obj2); + break; + case 3: // Views\LoginPage.xaml line 39 + this.obj3 = global::WinRT.CastExtensions.As(target); + this.bindingsTracking.RegisterTwoWayListener_3(this.obj3); + break; + case 4: // Views\LoginPage.xaml line 46 + this.obj4 = global::WinRT.CastExtensions.As(target); + this.bindingsTracking.RegisterTwoWayListener_4(this.obj4); + break; + case 5: // Views\LoginPage.xaml line 55 + this.obj5 = global::WinRT.CastExtensions.As(target); + this.bindingsTracking.RegisterTwoWayListener_5(this.obj5); + break; + case 6: // Views\LoginPage.xaml line 61 + this.obj6 = global::WinRT.CastExtensions.As(target); + this.bindingsTracking.RegisterTwoWayListener_6(this.obj6); + break; + case 7: // Views\LoginPage.xaml line 66 + this.obj7 = global::WinRT.CastExtensions.As(target); + this.bindingsTracking.RegisterTwoWayListener_7(this.obj7); + break; + case 8: // Views\LoginPage.xaml line 73 + this.obj8 = global::WinRT.CastExtensions.As(target); + this.bindingsTracking.RegisterTwoWayListener_8(this.obj8); + break; + case 9: // Views\LoginPage.xaml line 78 + this.obj9 = global::WinRT.CastExtensions.As(target); + break; + case 10: // Views\LoginPage.xaml line 86 + this.obj10 = global::WinRT.CastExtensions.As(target); + break; + case 11: // Views\LoginPage.xaml line 93 + this.obj11 = global::WinRT.CastExtensions.As(target); + break; + default: + break; + } + } + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.IComponentConnector GetBindingConnector(int connectionId, object target) + { + return null; + } + + // IDataTemplateComponent + + public void ProcessBindings(global::System.Object item, int itemIndex, int phase, out int nextPhase) + { + nextPhase = -1; + } + + public void Recycle() + { + return; + } + + // ILoginPage_Bindings + + public void Initialize() + { + if (!this.initialized) + { + this.Update(); + } + } + + public void Update() + { + this.Update_(this.dataRoot, NOT_PHASED); + this.initialized = true; + } + + public void StopTracking() + { + this.bindingsTracking.ReleaseAllListeners(); + this.initialized = false; + } + + public void DisconnectUnloadedObject(int connectionId) + { + throw new global::System.ArgumentException("No unloadable elements to disconnect."); + } + + public bool SetDataRoot(global::System.Object newDataRoot) + { + this.bindingsTracking.ReleaseAllListeners(); + if (newDataRoot != null) + { + this.dataRoot = global::WinRT.CastExtensions.As(newDataRoot); + return true; + } + return false; + } + + public void Activated(object obj, global::Microsoft.UI.Xaml.WindowActivatedEventArgs data) + { + this.Initialize(); + } + + public void Loading(global::Microsoft.UI.Xaml.FrameworkElement src, object data) + { + this.Initialize(); + } + public void SetConverterLookupRoot(global::Microsoft.UI.Xaml.FrameworkElement rootElement) + { + this.converterLookupRoot = new global::System.WeakReference(rootElement); + } + + public global::Microsoft.UI.Xaml.Data.IValueConverter LookupConverter(string key) + { + if (this.localResources == null) + { + global::Microsoft.UI.Xaml.FrameworkElement rootElement; + this.converterLookupRoot.TryGetTarget(out rootElement); + this.localResources = rootElement.Resources; + this.converterLookupRoot = null; + } + return (global::Microsoft.UI.Xaml.Data.IValueConverter) (this.localResources.ContainsKey(key) ? this.localResources[key] : global::Microsoft.UI.Xaml.Application.Current.Resources[key]); + } + + // Update methods for each path node used in binding steps. + private void Update_(global::ProxmoxDesktop.App.Views.LoginPage obj, int phase) + { + if (obj != null) + { + if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) + { + this.Update_ViewModel(obj.ViewModel, phase); + } + } + } + private void Update_ViewModel(global::ProxmoxDesktop.App.ViewModels.LoginViewModel obj, int phase) + { + this.bindingsTracking.UpdateChildListeners_ViewModel(obj); + if (obj != null) + { + if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) + { + this.Update_ViewModel_Server(obj.Server, phase); + this.Update_ViewModel_Port(obj.Port, phase); + this.Update_ViewModel_Realms(obj.Realms, phase); + this.Update_ViewModel_SelectedRealm(obj.SelectedRealm, phase); + this.Update_ViewModel_Username(obj.Username, phase); + this.Update_ViewModel_Password(obj.Password, phase); + this.Update_ViewModel_Otp(obj.Otp, phase); + this.Update_ViewModel_TotpVisible(obj.TotpVisible, phase); + this.Update_ViewModel_SkipSsl(obj.SkipSsl, phase); + this.Update_ViewModel_ErrorMessage(obj.ErrorMessage, phase); + } + if ((phase & (NOT_PHASED | (1 << 0))) != 0) + { + this.Update_ViewModel_LoginCommand(obj.LoginCommand, phase); + } + if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) + { + this.Update_ViewModel_IsBusy(obj.IsBusy, phase); + } + } + } + private void Update_ViewModel_Server(global::System.String obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 32 + if (!isobj2TextDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_TextBox_Text(this.obj2, obj, null); + } + } + } + private void Update_ViewModel_Port(global::System.String obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 39 + if (!isobj3TextDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_TextBox_Text(this.obj3, obj, null); + } + } + } + private void Update_ViewModel_Realms(global::System.Collections.ObjectModel.ObservableCollection obj, int phase) + { + this.bindingsTracking.UpdateChildListeners_ViewModel_Realms(obj); + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 46 + if (!isobj4ItemsSourceDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_ItemsControl_ItemsSource(this.obj4, obj, null); + } + } + } + private void Update_ViewModel_SelectedRealm(global::ProxmoxDesktop.Core.Api.Models.RealmData obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 46 + if (!isobj4SelectedItemDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_Primitives_Selector_SelectedItem(this.obj4, obj, null); + } + } + } + private void Update_ViewModel_Username(global::System.String obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 55 + if (!isobj5TextDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_TextBox_Text(this.obj5, obj, null); + } + } + } + private void Update_ViewModel_Password(global::System.String obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 61 + if (!isobj6PasswordDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_PasswordBox_Password(this.obj6, obj, null); + } + } + } + private void Update_ViewModel_Otp(global::System.String obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 66 + if (!isobj7TextDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_TextBox_Text(this.obj7, obj, null); + } + } + } + private void Update_ViewModel_TotpVisible(global::System.Boolean obj, int phase) + { + if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) + { + this.Update_ViewModel_TotpVisible_Cast_TotpVisible_To_Visibility(obj ? global::Microsoft.UI.Xaml.Visibility.Visible : global::Microsoft.UI.Xaml.Visibility.Collapsed, phase); + } + } + private void Update_ViewModel_TotpVisible_Cast_TotpVisible_To_Visibility(global::Microsoft.UI.Xaml.Visibility obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 66 + if (!isobj7VisibilityDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_UIElement_Visibility(this.obj7, obj); + } + } + } + private void Update_ViewModel_SkipSsl(global::System.Boolean obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 73 + if (!isobj8IsCheckedDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_Primitives_ToggleButton_IsChecked(this.obj8, obj, null); + } + } + } + private void Update_ViewModel_ErrorMessage(global::System.String obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 78 + if (!isobj9IsOpenDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_InfoBar_IsOpen(this.obj9, (global::System.Boolean)this.LookupConverter("NotNullToBoolConverter").Convert(obj, typeof(global::System.Boolean), null, null)); + } + // Views\LoginPage.xaml line 78 + if (!isobj9MessageDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_InfoBar_Message(this.obj9, obj, null); + } + } + } + private void Update_ViewModel_LoginCommand(global::CommunityToolkit.Mvvm.Input.IAsyncRelayCommand obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED )) != 0) + { + // Views\LoginPage.xaml line 86 + if (!isobj10CommandDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_Primitives_ButtonBase_Command(this.obj10, obj, null); + } + } + } + private void Update_ViewModel_IsBusy(global::System.Boolean obj, int phase) + { + if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) + { + this.Update_ViewModel_IsBusy_Cast_IsBusy_To_Visibility(obj ? global::Microsoft.UI.Xaml.Visibility.Visible : global::Microsoft.UI.Xaml.Visibility.Collapsed, phase); + } + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 93 + if (!isobj11IsActiveDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_ProgressRing_IsActive(this.obj11, obj); + } + } + } + private void Update_ViewModel_IsBusy_Cast_IsBusy_To_Visibility(global::Microsoft.UI.Xaml.Visibility obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\LoginPage.xaml line 93 + if (!isobj11VisibilityDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_UIElement_Visibility(this.obj11, obj); + } + } + } + private void UpdateTwoWay_2_Text() + { + if (this.initialized) + { + if (this.dataRoot != null) + { + if (this.dataRoot.ViewModel != null) + { + this.dataRoot.ViewModel.Server = this.obj2.Text; + } + } + } + } + private void UpdateTwoWay_3_Text() + { + if (this.initialized) + { + if (this.dataRoot != null) + { + if (this.dataRoot.ViewModel != null) + { + this.dataRoot.ViewModel.Port = this.obj3.Text; + } + } + } + } + private void UpdateTwoWay_4_SelectedItem() + { + if (this.initialized) + { + if (this.dataRoot != null) + { + if (this.dataRoot.ViewModel != null) + { + this.dataRoot.ViewModel.SelectedRealm = (global::ProxmoxDesktop.Core.Api.Models.RealmData)this.obj4.SelectedItem; + } + } + } + } + private void UpdateTwoWay_5_Text() + { + if (this.initialized) + { + if (this.dataRoot != null) + { + if (this.dataRoot.ViewModel != null) + { + this.dataRoot.ViewModel.Username = this.obj5.Text; + } + } + } + } + private void UpdateTwoWay_6_Password() + { + if (this.initialized) + { + if (this.dataRoot != null) + { + if (this.dataRoot.ViewModel != null) + { + this.dataRoot.ViewModel.Password = this.obj6.Password; + } + } + } + } + private void UpdateTwoWay_7_Text() + { + if (this.initialized) + { + if (this.dataRoot != null) + { + if (this.dataRoot.ViewModel != null) + { + this.dataRoot.ViewModel.Otp = this.obj7.Text; + } + } + } + } + private void UpdateTwoWay_8_IsChecked() + { + if (this.initialized) + { + if (this.dataRoot != null) + { + if (this.dataRoot.ViewModel != null) + { + this.dataRoot.ViewModel.SkipSsl = (global::System.Boolean)this.obj8.IsChecked; + } + } + } + } + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + private class LoginPage_obj1_BindingsTracking + { + private global::System.WeakReference weakRefToBindingObj; + + public LoginPage_obj1_BindingsTracking(LoginPage_obj1_Bindings obj) + { + weakRefToBindingObj = new global::System.WeakReference(obj); + } + + public LoginPage_obj1_Bindings TryGetBindingObject() + { + LoginPage_obj1_Bindings bindingObject = null; + if (weakRefToBindingObj != null) + { + weakRefToBindingObj.TryGetTarget(out bindingObject); + if (bindingObject == null) + { + weakRefToBindingObj = null; + ReleaseAllListeners(); + } + } + return bindingObject; + } + + public void ReleaseAllListeners() + { + UpdateChildListeners_ViewModel(null); + UpdateChildListeners_ViewModel_Realms(null); + } + + public void PropertyChanged_ViewModel(object sender, global::System.ComponentModel.PropertyChangedEventArgs e) + { + LoginPage_obj1_Bindings bindings = TryGetBindingObject(); + if (bindings != null) + { + string propName = e.PropertyName; + global::ProxmoxDesktop.App.ViewModels.LoginViewModel obj = sender as global::ProxmoxDesktop.App.ViewModels.LoginViewModel; + if (global::System.String.IsNullOrEmpty(propName)) + { + if (obj != null) + { + bindings.Update_ViewModel_Server(obj.Server, DATA_CHANGED); + bindings.Update_ViewModel_Port(obj.Port, DATA_CHANGED); + bindings.Update_ViewModel_Realms(obj.Realms, DATA_CHANGED); + bindings.Update_ViewModel_SelectedRealm(obj.SelectedRealm, DATA_CHANGED); + bindings.Update_ViewModel_Username(obj.Username, DATA_CHANGED); + bindings.Update_ViewModel_Password(obj.Password, DATA_CHANGED); + bindings.Update_ViewModel_Otp(obj.Otp, DATA_CHANGED); + bindings.Update_ViewModel_TotpVisible(obj.TotpVisible, DATA_CHANGED); + bindings.Update_ViewModel_SkipSsl(obj.SkipSsl, DATA_CHANGED); + bindings.Update_ViewModel_ErrorMessage(obj.ErrorMessage, DATA_CHANGED); + bindings.Update_ViewModel_IsBusy(obj.IsBusy, DATA_CHANGED); + } + } + else + { + switch (propName) + { + case "Server": + { + if (obj != null) + { + bindings.Update_ViewModel_Server(obj.Server, DATA_CHANGED); + } + break; + } + case "Port": + { + if (obj != null) + { + bindings.Update_ViewModel_Port(obj.Port, DATA_CHANGED); + } + break; + } + case "Realms": + { + if (obj != null) + { + bindings.Update_ViewModel_Realms(obj.Realms, DATA_CHANGED); + } + break; + } + case "SelectedRealm": + { + if (obj != null) + { + bindings.Update_ViewModel_SelectedRealm(obj.SelectedRealm, DATA_CHANGED); + } + break; + } + case "Username": + { + if (obj != null) + { + bindings.Update_ViewModel_Username(obj.Username, DATA_CHANGED); + } + break; + } + case "Password": + { + if (obj != null) + { + bindings.Update_ViewModel_Password(obj.Password, DATA_CHANGED); + } + break; + } + case "Otp": + { + if (obj != null) + { + bindings.Update_ViewModel_Otp(obj.Otp, DATA_CHANGED); + } + break; + } + case "TotpVisible": + { + if (obj != null) + { + bindings.Update_ViewModel_TotpVisible(obj.TotpVisible, DATA_CHANGED); + } + break; + } + case "SkipSsl": + { + if (obj != null) + { + bindings.Update_ViewModel_SkipSsl(obj.SkipSsl, DATA_CHANGED); + } + break; + } + case "ErrorMessage": + { + if (obj != null) + { + bindings.Update_ViewModel_ErrorMessage(obj.ErrorMessage, DATA_CHANGED); + } + break; + } + case "IsBusy": + { + if (obj != null) + { + bindings.Update_ViewModel_IsBusy(obj.IsBusy, DATA_CHANGED); + } + break; + } + default: + break; + } + } + } + } + private global::ProxmoxDesktop.App.ViewModels.LoginViewModel cache_ViewModel = null; + public void UpdateChildListeners_ViewModel(global::ProxmoxDesktop.App.ViewModels.LoginViewModel obj) + { + if (obj != cache_ViewModel) + { + if (cache_ViewModel != null) + { + ((global::System.ComponentModel.INotifyPropertyChanged)cache_ViewModel).PropertyChanged -= PropertyChanged_ViewModel; + cache_ViewModel = null; + } + if (obj != null) + { + cache_ViewModel = obj; + ((global::System.ComponentModel.INotifyPropertyChanged)obj).PropertyChanged += PropertyChanged_ViewModel; + } + } + } + public void PropertyChanged_ViewModel_Realms(object sender, global::System.ComponentModel.PropertyChangedEventArgs e) + { + LoginPage_obj1_Bindings bindings = TryGetBindingObject(); + if (bindings != null) + { + string propName = e.PropertyName; + global::System.Collections.ObjectModel.ObservableCollection obj = sender as global::System.Collections.ObjectModel.ObservableCollection; + if (global::System.String.IsNullOrEmpty(propName)) + { + } + else + { + switch (propName) + { + default: + break; + } + } + } + } + public void CollectionChanged_ViewModel_Realms(object sender, global::System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + LoginPage_obj1_Bindings bindings = TryGetBindingObject(); + if (bindings != null) + { + global::System.Collections.ObjectModel.ObservableCollection obj = sender as global::System.Collections.ObjectModel.ObservableCollection; + } + } + private global::System.Collections.ObjectModel.ObservableCollection cache_ViewModel_Realms = null; + public void UpdateChildListeners_ViewModel_Realms(global::System.Collections.ObjectModel.ObservableCollection obj) + { + if (obj != cache_ViewModel_Realms) + { + if (cache_ViewModel_Realms != null) + { + ((global::System.ComponentModel.INotifyPropertyChanged)cache_ViewModel_Realms).PropertyChanged -= PropertyChanged_ViewModel_Realms; + ((global::System.Collections.Specialized.INotifyCollectionChanged)cache_ViewModel_Realms).CollectionChanged -= CollectionChanged_ViewModel_Realms; + cache_ViewModel_Realms = null; + } + if (obj != null) + { + cache_ViewModel_Realms = obj; + ((global::System.ComponentModel.INotifyPropertyChanged)obj).PropertyChanged += PropertyChanged_ViewModel_Realms; + ((global::System.Collections.Specialized.INotifyCollectionChanged)obj).CollectionChanged += CollectionChanged_ViewModel_Realms; + } + } + } + public void RegisterTwoWayListener_2(global::Microsoft.UI.Xaml.Controls.TextBox sourceObject) + { + sourceObject.RegisterPropertyChangedCallback(global::Microsoft.UI.Xaml.Controls.TextBox.TextProperty, (sender, prop) => + { + var bindingObj = this.TryGetBindingObject(); + if (bindingObj != null) + { + bindingObj.UpdateTwoWay_2_Text(); + } + }); + } + public void RegisterTwoWayListener_3(global::Microsoft.UI.Xaml.Controls.TextBox sourceObject) + { + sourceObject.RegisterPropertyChangedCallback(global::Microsoft.UI.Xaml.Controls.TextBox.TextProperty, (sender, prop) => + { + var bindingObj = this.TryGetBindingObject(); + if (bindingObj != null) + { + bindingObj.UpdateTwoWay_3_Text(); + } + }); + } + public void RegisterTwoWayListener_4(global::Microsoft.UI.Xaml.Controls.ComboBox sourceObject) + { + sourceObject.RegisterPropertyChangedCallback(global::Microsoft.UI.Xaml.Controls.Primitives.Selector.SelectedItemProperty, (sender, prop) => + { + var bindingObj = this.TryGetBindingObject(); + if (bindingObj != null) + { + bindingObj.UpdateTwoWay_4_SelectedItem(); + } + }); + } + public void RegisterTwoWayListener_5(global::Microsoft.UI.Xaml.Controls.TextBox sourceObject) + { + sourceObject.RegisterPropertyChangedCallback(global::Microsoft.UI.Xaml.Controls.TextBox.TextProperty, (sender, prop) => + { + var bindingObj = this.TryGetBindingObject(); + if (bindingObj != null) + { + bindingObj.UpdateTwoWay_5_Text(); + } + }); + } + public void RegisterTwoWayListener_6(global::Microsoft.UI.Xaml.Controls.PasswordBox sourceObject) + { + sourceObject.RegisterPropertyChangedCallback(global::Microsoft.UI.Xaml.Controls.PasswordBox.PasswordProperty, (sender, prop) => + { + var bindingObj = this.TryGetBindingObject(); + if (bindingObj != null) + { + bindingObj.UpdateTwoWay_6_Password(); + } + }); + } + public void RegisterTwoWayListener_7(global::Microsoft.UI.Xaml.Controls.TextBox sourceObject) + { + sourceObject.RegisterPropertyChangedCallback(global::Microsoft.UI.Xaml.Controls.TextBox.TextProperty, (sender, prop) => + { + var bindingObj = this.TryGetBindingObject(); + if (bindingObj != null) + { + bindingObj.UpdateTwoWay_7_Text(); + } + }); + } + public void RegisterTwoWayListener_8(global::Microsoft.UI.Xaml.Controls.CheckBox sourceObject) + { + sourceObject.RegisterPropertyChangedCallback(global::Microsoft.UI.Xaml.Controls.Primitives.ToggleButton.IsCheckedProperty, (sender, prop) => + { + var bindingObj = this.TryGetBindingObject(); + if (bindingObj != null) + { + bindingObj.UpdateTwoWay_8_IsChecked(); + } + }); + } + } + } + + /// + /// Connect() + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void Connect(int connectionId, object target) + { + switch(connectionId) + { + case 2: // Views\LoginPage.xaml line 32 + { + global::Microsoft.UI.Xaml.Controls.TextBox element2 = global::WinRT.CastExtensions.As(target); + ((global::Microsoft.UI.Xaml.Controls.TextBox)element2).LostFocus += this.Server_LostFocus; + } + break; + case 3: // Views\LoginPage.xaml line 39 + { + global::Microsoft.UI.Xaml.Controls.TextBox element3 = global::WinRT.CastExtensions.As(target); + ((global::Microsoft.UI.Xaml.Controls.TextBox)element3).LostFocus += this.Server_LostFocus; + } + break; + default: + break; + } + this._contentLoaded = true; + } + + + /// + /// GetBindingConnector(int connectionId, object target) + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.IComponentConnector GetBindingConnector(int connectionId, object target) + { + global::Microsoft.UI.Xaml.Markup.IComponentConnector returnValue = null; + switch(connectionId) + { + case 1: // Views\LoginPage.xaml line 2 + { + global::Microsoft.UI.Xaml.Controls.Page element1 = (global::Microsoft.UI.Xaml.Controls.Page)target; + LoginPage_obj1_Bindings bindings = new LoginPage_obj1_Bindings(); + returnValue = bindings; + bindings.SetDataRoot(this); + bindings.SetConverterLookupRoot(this); + this.Bindings = bindings; + element1.Loading += bindings.Loading; + global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.SetDataTemplateComponent(element1, bindings); + } + break; + } + return returnValue; + } + } +} + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/LoginPage.g.i.cs b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/LoginPage.g.i.cs new file mode 100644 index 0000000..7e5b2e4 --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/LoginPage.g.i.cs @@ -0,0 +1,66 @@ +#pragma checksum "C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.App\Views\LoginPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "D01FE6AA10D6C89C9EEF9F5F7407AEFBA6FEAB81FB4BAE2F8229EDF891DF598D" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ProxmoxDesktop.App.Views +{ + partial class LoginPage : global::Microsoft.UI.Xaml.Controls.Page + { + + +#pragma warning disable 0169 // Proactively suppress unused/uninitialized field warning in case they aren't used, for things like x:Name +#pragma warning disable 0649 +#pragma warning restore 0649 +#pragma warning restore 0169 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private bool _contentLoaded; + + /// + /// InitializeComponent() + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void InitializeComponent() + { + if (_contentLoaded) + return; + + _contentLoaded = true; + + global::System.Uri resourceLocator = new global::System.Uri("ms-appx:///Views/LoginPage.xaml"); + global::Microsoft.UI.Xaml.Application.LoadComponent(this, resourceLocator, global::Microsoft.UI.Xaml.Controls.Primitives.ComponentResourceLocation.Application); + } + + partial void UnloadObject(global::Microsoft.UI.Xaml.DependencyObject unloadableObject); + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private interface ILoginPage_Bindings + { + void Initialize(); + void Update(); + void StopTracking(); + void DisconnectUnloadedObject(int connectionId); + } + + private interface ILoginPage_BindingsScopeConnector + { + global::System.WeakReference Parent { get; set; } + bool ContainsElement(int connectionId); + void RegisterForElementConnection(int connectionId, global::Microsoft.UI.Xaml.Markup.IComponentConnector connector); + } +#pragma warning disable 0169 // Proactively suppress unused field warning in case Bindings is not used. +#pragma warning disable 0649 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private ILoginPage_Bindings Bindings; +#pragma warning restore 0649 +#pragma warning restore 0169 + } +} + + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/LoginPage.xaml b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/LoginPage.xaml new file mode 100644 index 0000000..872220a --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/LoginPage.xaml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/LoginPage.xbf b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/LoginPage.xbf new file mode 100644 index 0000000000000000000000000000000000000000..dc43baab91a0ec2d1a11566fc5e45b3567ea0b72 GIT binary patch literal 2344 zcmd5+%WfN082;zX#gnm<(!_Pp1S+SrP$BBrCUNWviHu_pN)^3)#zt#T!7*Mgu@Zq-)njnziG9X7(HaCx!39JIq`Pz&2Z zvt9|Ci_M^24eQlvqumPYjY=zAYSde^@X-LgF9ZDga$6SgJC+?#I?|PG;3e#Ppd3jL zr=GkA$r8>z&==%Bc!!{!0fp(0u$P8cs){b=^1ALRbddRa2-BZ+~ z5B*)pT>@-qiz8l9TDk)J$h`--#NHO78X&d~e0E@A0FMXYGonqLKGZysX~+kNEU6;v zSj6cBU*bn{58o5)A{>bgSU7^Vhz)oRylvR&0-pq|BAadSnSB?)j+FFIBn$rQIPXDz z54Ksaam%bxPg~AG@>Pv962{YqbW$6U3GJtsa<=3y^4kDy4zLE#hdM$=UWBJ@eDBHM zIPGDEF7~O2I&8{1^fFqPQ`Xa6W41Q||9)zBbe2g4MsvFii!NXjIkBpYiG4_F*~XbQ zpl=VbhKyHXg?D0G-T~GD^)etp4|i~4b(`o7Zx$zhysNBXG9{co-j8E+i#LfgL@uK! z!VWbLf$zWyV>(}aGe*Fv8{t<{{E1YQF^zCevYFD2l+K;&J{Z#pY8vTlG&^~gvnY_g zhR?;hzBtvT^tP4c4dl_myTF%Y9r5q#yhgX~`qO8&lKhX6|8120LD9DVd6exZ*mn_v z_+{1q^%LwX!OYun{)3_aaL5V38ooU5{%;9t=F_wMpOODotRLsGtbSuQ68K+5j!xt8 zXBbc?jONzQY*T!l{jlkO#wuWcTo+{hW#kuQ+mfr_M7BLvvUyj5`!LE`>_46BlKvdq zj`)AX6P%?A-uNoIQNi0>*E{jDq>2oVirN4aGg^^J)YAtYf;9{RNfguyA3w0&G!A|4 z#XNuUz@8Y{Xu?b=zge@DEm1=(8c>)6hX^w?}Nv;g!bbv!&(kj9I$C`(8L zRu&KwZ!Cqi(n@Skk%22@@gX9E0(gAvY4I`D=RFv%fT0%@o`NObYAR?&U3%uldgtX_ z4P%}z_WGwd8zqyQ_L%)N;GNHD+Rq^EX8=D*7Ym3{&1Y6(z5Nx>XFP90iJ7q+Wv)5m zIM+>M){~m2mRxz#wYMjr?fB4nl{V{ZOXdg wSc35?Oc`bdl$)-4&Qk(n-nwH-#gnRQU2=>o^d$w)n#;=bwslLXSzBcv0fL`UWB>pF literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.g.cs b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.g.cs new file mode 100644 index 0000000..13efe5a --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.g.cs @@ -0,0 +1,765 @@ +#pragma checksum "C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.App\Views\MainPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "0F09963950B4DB063BDCF45E86DD69E149910E4C469C8762C6F358CDE6ABA8C2" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ProxmoxDesktop.App.Views +{ + partial class MainPage : + global::Microsoft.UI.Xaml.Controls.Page, + global::Microsoft.UI.Xaml.Markup.IComponentConnector + { + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + private static class XamlBindingSetters + { + public static void Set_Microsoft_UI_Xaml_Controls_InfoBar_IsOpen(global::Microsoft.UI.Xaml.Controls.InfoBar obj, global::System.Boolean value) + { + obj.IsOpen = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_InfoBar_Message(global::Microsoft.UI.Xaml.Controls.InfoBar obj, global::System.String value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = targetNullValue; + } + obj.Message = value ?? global::System.String.Empty; + } + public static void Set_Microsoft_UI_Xaml_Controls_ItemsView_ItemsSource(global::Microsoft.UI.Xaml.Controls.ItemsView obj, global::System.Object value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = (global::System.Object) global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Object), targetNullValue); + } + obj.ItemsSource = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_AutoSuggestBox_Text(global::Microsoft.UI.Xaml.Controls.AutoSuggestBox obj, global::System.String value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = targetNullValue; + } + obj.Text = value ?? global::System.String.Empty; + } + public static void Set_Microsoft_UI_Xaml_Controls_Primitives_ButtonBase_Command(global::Microsoft.UI.Xaml.Controls.Primitives.ButtonBase obj, global::System.Windows.Input.ICommand value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = (global::System.Windows.Input.ICommand) global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Windows.Input.ICommand), targetNullValue); + } + obj.Command = value; + } + public static void Set_Microsoft_UI_Xaml_Controls_ProgressRing_IsActive(global::Microsoft.UI.Xaml.Controls.ProgressRing obj, global::System.Boolean value) + { + obj.IsActive = value; + } + public static void Set_ProxmoxDesktop_App_Controls_MachineCard_Machine(global::ProxmoxDesktop.App.Controls.MachineCard obj, global::ProxmoxDesktop.Core.Api.Models.MachineData value, string targetNullValue) + { + if (value == null && targetNullValue != null) + { + value = (global::ProxmoxDesktop.Core.Api.Models.MachineData) global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::ProxmoxDesktop.Core.Api.Models.MachineData), targetNullValue); + } + obj.Machine = value; + } + }; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + private partial class MainPage_obj5_Bindings : + global::Microsoft.UI.Xaml.IDataTemplateExtension, + global::Microsoft.UI.Xaml.Markup.IDataTemplateComponent, + global::Microsoft.UI.Xaml.Markup.IXamlBindScopeDiagnostics, + global::Microsoft.UI.Xaml.Markup.IComponentConnector, + IMainPage_Bindings + { + private global::ProxmoxDesktop.Core.Api.Models.MachineData dataRoot; + private bool initialized = false; + private const int NOT_PHASED = (1 << 31); + private const int DATA_CHANGED = (1 << 30); + private bool removedDataContextHandler = false; + + // Fields for each control that has bindings. + private global::System.WeakReference obj5; + + // Static fields for each binding's enabled/disabled state + private static bool isobj5MachineDisabled = false; + + public MainPage_obj5_Bindings() + { + } + + public void Disable(int lineNumber, int columnNumber) + { + if (lineNumber == 71 && columnNumber == 47) + { + isobj5MachineDisabled = true; + } + } + + // IComponentConnector + + public void Connect(int connectionId, global::System.Object target) + { + switch(connectionId) + { + case 5: // Views\MainPage.xaml line 71 + this.obj5 = new global::System.WeakReference(global::WinRT.CastExtensions.As(target)); + break; + default: + break; + } + } + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.IComponentConnector GetBindingConnector(int connectionId, object target) + { + return null; + } + + public void DataContextChangedHandler(global::Microsoft.UI.Xaml.FrameworkElement sender, global::Microsoft.UI.Xaml.DataContextChangedEventArgs args) + { + if (this.SetDataRoot(args.NewValue)) + { + this.Update(); + } + } + + // IDataTemplateExtension + + public bool ProcessBinding(uint phase) + { + throw new global::System.NotImplementedException(); + } + + public int ProcessBindings(global::Microsoft.UI.Xaml.Controls.ContainerContentChangingEventArgs args) + { + int nextPhase = -1; + ProcessBindings(args.Item, args.ItemIndex, (int)args.Phase, out nextPhase); + return nextPhase; + } + + public void ResetTemplate() + { + Recycle(); + } + + // IDataTemplateComponent + + public void ProcessBindings(global::System.Object item, int itemIndex, int phase, out int nextPhase) + { + nextPhase = -1; + switch(phase) + { + case 0: + nextPhase = -1; + this.SetDataRoot(item); + if (!removedDataContextHandler) + { + removedDataContextHandler = true; + var rootElement = (this.obj5.Target as global::ProxmoxDesktop.App.Controls.MachineCard); + if (rootElement != null) + { + rootElement.DataContextChanged -= this.DataContextChangedHandler; + } + } + this.initialized = true; + break; + } + this.Update_(global::WinRT.CastExtensions.As(item), 1 << phase); + } + + public void Recycle() + { + } + + // IMainPage_Bindings + + public void Initialize() + { + if (!this.initialized) + { + this.Update(); + } + } + + public void Update() + { + this.Update_(this.dataRoot, NOT_PHASED); + this.initialized = true; + } + + public void StopTracking() + { + } + + public void DisconnectUnloadedObject(int connectionId) + { + throw new global::System.ArgumentException("No unloadable elements to disconnect."); + } + + public bool SetDataRoot(global::System.Object newDataRoot) + { + if (newDataRoot != null) + { + this.dataRoot = global::WinRT.CastExtensions.As(newDataRoot); + return true; + } + return false; + } + + // Update methods for each path node used in binding steps. + private void Update_(global::ProxmoxDesktop.Core.Api.Models.MachineData obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED )) != 0) + { + // Views\MainPage.xaml line 71 + if (!isobj5MachineDisabled) + { + if ((this.obj5.Target as global::ProxmoxDesktop.App.Controls.MachineCard) != null) + { + XamlBindingSetters.Set_ProxmoxDesktop_App_Controls_MachineCard_Machine((this.obj5.Target as global::ProxmoxDesktop.App.Controls.MachineCard), obj, null); + } + } + } + } + } + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + private partial class MainPage_obj1_Bindings : + global::Microsoft.UI.Xaml.Markup.IDataTemplateComponent, + global::Microsoft.UI.Xaml.Markup.IXamlBindScopeDiagnostics, + global::Microsoft.UI.Xaml.Markup.IComponentConnector, + IMainPage_Bindings + { + private global::ProxmoxDesktop.App.Views.MainPage dataRoot; + private bool initialized = false; + private const int NOT_PHASED = (1 << 31); + private const int DATA_CHANGED = (1 << 30); + private global::Microsoft.UI.Xaml.ResourceDictionary localResources; + private global::System.WeakReference converterLookupRoot; + + // Fields for each control that has bindings. + private global::Microsoft.UI.Xaml.Controls.InfoBar obj2; + private global::Microsoft.UI.Xaml.Controls.ItemsView obj3; + private global::Microsoft.UI.Xaml.Controls.AutoSuggestBox obj6; + private global::Microsoft.UI.Xaml.Controls.Button obj7; + private global::Microsoft.UI.Xaml.Controls.ProgressRing obj8; + private global::Microsoft.UI.Xaml.Controls.Button obj9; + + // Static fields for each binding's enabled/disabled state + private static bool isobj2IsOpenDisabled = false; + private static bool isobj2MessageDisabled = false; + private static bool isobj3ItemsSourceDisabled = false; + private static bool isobj6TextDisabled = false; + private static bool isobj7CommandDisabled = false; + private static bool isobj8IsActiveDisabled = false; + private static bool isobj9CommandDisabled = false; + + private MainPage_obj1_BindingsTracking bindingsTracking; + + public MainPage_obj1_Bindings() + { + this.bindingsTracking = new MainPage_obj1_BindingsTracking(this); + } + + public void Disable(int lineNumber, int columnNumber) + { + if (lineNumber == 51 && columnNumber == 18) + { + isobj2IsOpenDisabled = true; + } + else if (lineNumber == 53 && columnNumber == 18) + { + isobj2MessageDisabled = true; + } + else if (lineNumber == 59 && columnNumber == 24) + { + isobj3ItemsSourceDisabled = true; + } + else if (lineNumber == 26 && columnNumber == 29) + { + isobj6TextDisabled = true; + } + else if (lineNumber == 31 && columnNumber == 21) + { + isobj7CommandDisabled = true; + } + else if (lineNumber == 38 && columnNumber == 27) + { + isobj8IsActiveDisabled = true; + } + else if (lineNumber == 43 && columnNumber == 21) + { + isobj9CommandDisabled = true; + } + } + + // IComponentConnector + + public void Connect(int connectionId, global::System.Object target) + { + switch(connectionId) + { + case 2: // Views\MainPage.xaml line 50 + this.obj2 = global::WinRT.CastExtensions.As(target); + break; + case 3: // Views\MainPage.xaml line 58 + this.obj3 = global::WinRT.CastExtensions.As(target); + break; + case 6: // Views\MainPage.xaml line 24 + this.obj6 = global::WinRT.CastExtensions.As(target); + this.bindingsTracking.RegisterTwoWayListener_6(this.obj6); + break; + case 7: // Views\MainPage.xaml line 30 + this.obj7 = global::WinRT.CastExtensions.As(target); + break; + case 8: // Views\MainPage.xaml line 37 + this.obj8 = global::WinRT.CastExtensions.As(target); + break; + case 9: // Views\MainPage.xaml line 42 + this.obj9 = global::WinRT.CastExtensions.As(target); + break; + default: + break; + } + } + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.IComponentConnector GetBindingConnector(int connectionId, object target) + { + return null; + } + + // IDataTemplateComponent + + public void ProcessBindings(global::System.Object item, int itemIndex, int phase, out int nextPhase) + { + nextPhase = -1; + } + + public void Recycle() + { + return; + } + + // IMainPage_Bindings + + public void Initialize() + { + if (!this.initialized) + { + this.Update(); + } + } + + public void Update() + { + this.Update_(this.dataRoot, NOT_PHASED); + this.initialized = true; + } + + public void StopTracking() + { + this.bindingsTracking.ReleaseAllListeners(); + this.initialized = false; + } + + public void DisconnectUnloadedObject(int connectionId) + { + throw new global::System.ArgumentException("No unloadable elements to disconnect."); + } + + public bool SetDataRoot(global::System.Object newDataRoot) + { + this.bindingsTracking.ReleaseAllListeners(); + if (newDataRoot != null) + { + this.dataRoot = global::WinRT.CastExtensions.As(newDataRoot); + return true; + } + return false; + } + + public void Activated(object obj, global::Microsoft.UI.Xaml.WindowActivatedEventArgs data) + { + this.Initialize(); + } + + public void Loading(global::Microsoft.UI.Xaml.FrameworkElement src, object data) + { + this.Initialize(); + } + public void SetConverterLookupRoot(global::Microsoft.UI.Xaml.FrameworkElement rootElement) + { + this.converterLookupRoot = new global::System.WeakReference(rootElement); + } + + public global::Microsoft.UI.Xaml.Data.IValueConverter LookupConverter(string key) + { + if (this.localResources == null) + { + global::Microsoft.UI.Xaml.FrameworkElement rootElement; + this.converterLookupRoot.TryGetTarget(out rootElement); + this.localResources = rootElement.Resources; + this.converterLookupRoot = null; + } + return (global::Microsoft.UI.Xaml.Data.IValueConverter) (this.localResources.ContainsKey(key) ? this.localResources[key] : global::Microsoft.UI.Xaml.Application.Current.Resources[key]); + } + + // Update methods for each path node used in binding steps. + private void Update_(global::ProxmoxDesktop.App.Views.MainPage obj, int phase) + { + if (obj != null) + { + if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) + { + this.Update_ViewModel(obj.ViewModel, phase); + } + } + } + private void Update_ViewModel(global::ProxmoxDesktop.App.ViewModels.MainViewModel obj, int phase) + { + this.bindingsTracking.UpdateChildListeners_ViewModel(obj); + if (obj != null) + { + if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) + { + this.Update_ViewModel_StatusMessage(obj.StatusMessage, phase); + this.Update_ViewModel_FilteredMachines(obj.FilteredMachines, phase); + this.Update_ViewModel_SearchQuery(obj.SearchQuery, phase); + } + if ((phase & (NOT_PHASED | (1 << 0))) != 0) + { + this.Update_ViewModel_RefreshCommand(obj.RefreshCommand, phase); + } + if ((phase & (NOT_PHASED | DATA_CHANGED | (1 << 0))) != 0) + { + this.Update_ViewModel_IsLoading(obj.IsLoading, phase); + } + if ((phase & (NOT_PHASED | (1 << 0))) != 0) + { + this.Update_ViewModel_LogoutCommand(obj.LogoutCommand, phase); + } + } + } + private void Update_ViewModel_StatusMessage(global::System.String obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\MainPage.xaml line 50 + if (!isobj2IsOpenDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_InfoBar_IsOpen(this.obj2, (global::System.Boolean)this.LookupConverter("NotNullToBoolConverter").Convert(obj, typeof(global::System.Boolean), null, null)); + } + // Views\MainPage.xaml line 50 + if (!isobj2MessageDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_InfoBar_Message(this.obj2, obj, null); + } + } + } + private void Update_ViewModel_FilteredMachines(global::System.Collections.ObjectModel.ObservableCollection obj, int phase) + { + this.bindingsTracking.UpdateChildListeners_ViewModel_FilteredMachines(obj); + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\MainPage.xaml line 58 + if (!isobj3ItemsSourceDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_ItemsView_ItemsSource(this.obj3, obj, null); + } + } + } + private void Update_ViewModel_SearchQuery(global::System.String obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\MainPage.xaml line 24 + if (!isobj6TextDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_AutoSuggestBox_Text(this.obj6, obj, null); + } + } + } + private void Update_ViewModel_RefreshCommand(global::CommunityToolkit.Mvvm.Input.IAsyncRelayCommand obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED )) != 0) + { + // Views\MainPage.xaml line 30 + if (!isobj7CommandDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_Primitives_ButtonBase_Command(this.obj7, obj, null); + } + } + } + private void Update_ViewModel_IsLoading(global::System.Boolean obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED | DATA_CHANGED)) != 0) + { + // Views\MainPage.xaml line 37 + if (!isobj8IsActiveDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_ProgressRing_IsActive(this.obj8, obj); + } + } + } + private void Update_ViewModel_LogoutCommand(global::CommunityToolkit.Mvvm.Input.IRelayCommand obj, int phase) + { + if ((phase & ((1 << 0) | NOT_PHASED )) != 0) + { + // Views\MainPage.xaml line 42 + if (!isobj9CommandDisabled) + { + XamlBindingSetters.Set_Microsoft_UI_Xaml_Controls_Primitives_ButtonBase_Command(this.obj9, obj, null); + } + } + } + private void UpdateTwoWay_6_Text() + { + if (this.initialized) + { + if (this.dataRoot != null) + { + if (this.dataRoot.ViewModel != null) + { + this.dataRoot.ViewModel.SearchQuery = this.obj6.Text; + } + } + } + } + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + private class MainPage_obj1_BindingsTracking + { + private global::System.WeakReference weakRefToBindingObj; + + public MainPage_obj1_BindingsTracking(MainPage_obj1_Bindings obj) + { + weakRefToBindingObj = new global::System.WeakReference(obj); + } + + public MainPage_obj1_Bindings TryGetBindingObject() + { + MainPage_obj1_Bindings bindingObject = null; + if (weakRefToBindingObj != null) + { + weakRefToBindingObj.TryGetTarget(out bindingObject); + if (bindingObject == null) + { + weakRefToBindingObj = null; + ReleaseAllListeners(); + } + } + return bindingObject; + } + + public void ReleaseAllListeners() + { + UpdateChildListeners_ViewModel(null); + UpdateChildListeners_ViewModel_FilteredMachines(null); + } + + public void PropertyChanged_ViewModel(object sender, global::System.ComponentModel.PropertyChangedEventArgs e) + { + MainPage_obj1_Bindings bindings = TryGetBindingObject(); + if (bindings != null) + { + string propName = e.PropertyName; + global::ProxmoxDesktop.App.ViewModels.MainViewModel obj = sender as global::ProxmoxDesktop.App.ViewModels.MainViewModel; + if (global::System.String.IsNullOrEmpty(propName)) + { + if (obj != null) + { + bindings.Update_ViewModel_StatusMessage(obj.StatusMessage, DATA_CHANGED); + bindings.Update_ViewModel_FilteredMachines(obj.FilteredMachines, DATA_CHANGED); + bindings.Update_ViewModel_SearchQuery(obj.SearchQuery, DATA_CHANGED); + bindings.Update_ViewModel_IsLoading(obj.IsLoading, DATA_CHANGED); + } + } + else + { + switch (propName) + { + case "StatusMessage": + { + if (obj != null) + { + bindings.Update_ViewModel_StatusMessage(obj.StatusMessage, DATA_CHANGED); + } + break; + } + case "FilteredMachines": + { + if (obj != null) + { + bindings.Update_ViewModel_FilteredMachines(obj.FilteredMachines, DATA_CHANGED); + } + break; + } + case "SearchQuery": + { + if (obj != null) + { + bindings.Update_ViewModel_SearchQuery(obj.SearchQuery, DATA_CHANGED); + } + break; + } + case "IsLoading": + { + if (obj != null) + { + bindings.Update_ViewModel_IsLoading(obj.IsLoading, DATA_CHANGED); + } + break; + } + default: + break; + } + } + } + } + private global::ProxmoxDesktop.App.ViewModels.MainViewModel cache_ViewModel = null; + public void UpdateChildListeners_ViewModel(global::ProxmoxDesktop.App.ViewModels.MainViewModel obj) + { + if (obj != cache_ViewModel) + { + if (cache_ViewModel != null) + { + ((global::System.ComponentModel.INotifyPropertyChanged)cache_ViewModel).PropertyChanged -= PropertyChanged_ViewModel; + cache_ViewModel = null; + } + if (obj != null) + { + cache_ViewModel = obj; + ((global::System.ComponentModel.INotifyPropertyChanged)obj).PropertyChanged += PropertyChanged_ViewModel; + } + } + } + public void PropertyChanged_ViewModel_FilteredMachines(object sender, global::System.ComponentModel.PropertyChangedEventArgs e) + { + MainPage_obj1_Bindings bindings = TryGetBindingObject(); + if (bindings != null) + { + string propName = e.PropertyName; + global::System.Collections.ObjectModel.ObservableCollection obj = sender as global::System.Collections.ObjectModel.ObservableCollection; + if (global::System.String.IsNullOrEmpty(propName)) + { + } + else + { + switch (propName) + { + default: + break; + } + } + } + } + public void CollectionChanged_ViewModel_FilteredMachines(object sender, global::System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + MainPage_obj1_Bindings bindings = TryGetBindingObject(); + if (bindings != null) + { + global::System.Collections.ObjectModel.ObservableCollection obj = sender as global::System.Collections.ObjectModel.ObservableCollection; + } + } + private global::System.Collections.ObjectModel.ObservableCollection cache_ViewModel_FilteredMachines = null; + public void UpdateChildListeners_ViewModel_FilteredMachines(global::System.Collections.ObjectModel.ObservableCollection obj) + { + if (obj != cache_ViewModel_FilteredMachines) + { + if (cache_ViewModel_FilteredMachines != null) + { + ((global::System.ComponentModel.INotifyPropertyChanged)cache_ViewModel_FilteredMachines).PropertyChanged -= PropertyChanged_ViewModel_FilteredMachines; + ((global::System.Collections.Specialized.INotifyCollectionChanged)cache_ViewModel_FilteredMachines).CollectionChanged -= CollectionChanged_ViewModel_FilteredMachines; + cache_ViewModel_FilteredMachines = null; + } + if (obj != null) + { + cache_ViewModel_FilteredMachines = obj; + ((global::System.ComponentModel.INotifyPropertyChanged)obj).PropertyChanged += PropertyChanged_ViewModel_FilteredMachines; + ((global::System.Collections.Specialized.INotifyCollectionChanged)obj).CollectionChanged += CollectionChanged_ViewModel_FilteredMachines; + } + } + } + public void RegisterTwoWayListener_6(global::Microsoft.UI.Xaml.Controls.AutoSuggestBox sourceObject) + { + sourceObject.RegisterPropertyChangedCallback(global::Microsoft.UI.Xaml.Controls.AutoSuggestBox.TextProperty, (sender, prop) => + { + var bindingObj = this.TryGetBindingObject(); + if (bindingObj != null) + { + bindingObj.UpdateTwoWay_6_Text(); + } + }); + } + } + } + + /// + /// Connect() + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void Connect(int connectionId, object target) + { + switch(connectionId) + { + case 3: // Views\MainPage.xaml line 58 + { + this.MachineGrid = global::WinRT.CastExtensions.As(target); + } + break; + default: + break; + } + this._contentLoaded = true; + } + + + /// + /// GetBindingConnector(int connectionId, object target) + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.IComponentConnector GetBindingConnector(int connectionId, object target) + { + global::Microsoft.UI.Xaml.Markup.IComponentConnector returnValue = null; + switch(connectionId) + { + case 1: // Views\MainPage.xaml line 2 + { + global::Microsoft.UI.Xaml.Controls.Page element1 = (global::Microsoft.UI.Xaml.Controls.Page)target; + MainPage_obj1_Bindings bindings = new MainPage_obj1_Bindings(); + returnValue = bindings; + bindings.SetDataRoot(this); + bindings.SetConverterLookupRoot(this); + this.Bindings = bindings; + element1.Loading += bindings.Loading; + global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.SetDataTemplateComponent(element1, bindings); + } + break; + case 5: // Views\MainPage.xaml line 71 + { + global::ProxmoxDesktop.App.Controls.MachineCard element5 = (global::ProxmoxDesktop.App.Controls.MachineCard)target; + MainPage_obj5_Bindings bindings = new MainPage_obj5_Bindings(); + returnValue = bindings; + bindings.SetDataRoot(element5.DataContext); + element5.DataContextChanged += bindings.DataContextChangedHandler; + global::Microsoft.UI.Xaml.DataTemplate.SetExtensionInstance(element5, bindings); + global::Microsoft.UI.Xaml.Markup.XamlBindingHelper.SetDataTemplateComponent(element5, bindings); + } + break; + } + return returnValue; + } + } +} + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.g.i.cs b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.g.i.cs new file mode 100644 index 0000000..e563cb9 --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.g.i.cs @@ -0,0 +1,68 @@ +#pragma checksum "C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.App\Views\MainPage.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "0F09963950B4DB063BDCF45E86DD69E149910E4C469C8762C6F358CDE6ABA8C2" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ProxmoxDesktop.App.Views +{ + partial class MainPage : global::Microsoft.UI.Xaml.Controls.Page + { + + +#pragma warning disable 0169 // Proactively suppress unused/uninitialized field warning in case they aren't used, for things like x:Name +#pragma warning disable 0649 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private global::Microsoft.UI.Xaml.Controls.ItemsView MachineGrid; +#pragma warning restore 0649 +#pragma warning restore 0169 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private bool _contentLoaded; + + /// + /// InitializeComponent() + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void InitializeComponent() + { + if (_contentLoaded) + return; + + _contentLoaded = true; + + global::System.Uri resourceLocator = new global::System.Uri("ms-appx:///Views/MainPage.xaml"); + global::Microsoft.UI.Xaml.Application.LoadComponent(this, resourceLocator, global::Microsoft.UI.Xaml.Controls.Primitives.ComponentResourceLocation.Application); + } + + partial void UnloadObject(global::Microsoft.UI.Xaml.DependencyObject unloadableObject); + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private interface IMainPage_Bindings + { + void Initialize(); + void Update(); + void StopTracking(); + void DisconnectUnloadedObject(int connectionId); + } + + private interface IMainPage_BindingsScopeConnector + { + global::System.WeakReference Parent { get; set; } + bool ContainsElement(int connectionId); + void RegisterForElementConnection(int connectionId, global::Microsoft.UI.Xaml.Markup.IComponentConnector connector); + } +#pragma warning disable 0169 // Proactively suppress unused field warning in case Bindings is not used. +#pragma warning disable 0649 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private IMainPage_Bindings Bindings; +#pragma warning restore 0649 +#pragma warning restore 0169 + } +} + + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.xaml b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.xaml new file mode 100644 index 0000000..b94c6d0 --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.xaml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.xbf b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainPage.xbf new file mode 100644 index 0000000000000000000000000000000000000000..c53e9a545ea0d8b3ea68d822fb07cdd63bea8483 GIT binary patch literal 2786 zcmcIm%THWY82{$n#|*;uq(l?1g$E#Rp{@6 z78&~=w}rf}X#592wF`6wjp-K9>;hp*viQqAud!9NZW-1hBmc?|?U}FV zaU1(GI2+)2-rj&WFIHLC^r#+JP@662<*={IEzqp@KG1K-HNP8_R&-W3;ipsk+SfUZ z!D~RB1)p&)!_yr^*=ni!b-b6*Gv>bu{yuP3QJXcyd39`&-nKYr(YK>mFH<5t&>x4+ zp6+@Tf4wPS-M#9kP-}KYEpR zmWd3*;wm(}DXu)8N<%^B;=e(PA8|Ogc_&xPsD_$1e)!S;q<W z!g>etV6r?s%g|%>y?QQc|Eypa7Gtu9>xk1r{37Xwl?*R3-#$7?2z|$r8 zzXv_eyjS&Q9cu~i#IuUG4bVI%jM*-|2pyga_QJCc?Dq5=v2#_8|7Zfrz$|k7xi6md zGUD$5-wNiL`38MHig*=TcVCk8@@~(7J#4R89v&;mp&cLReh1OYkTTPwhkfH$gcHkC z70^750o~t1Cw!VR-WKdLv*X0XTWFp>@~JoA)A(S?sTO*$g&u05lP$FC)ATdkLXUtZ zc0Pf* zTj!s?2fG`w)+WDZ#4#>!ZhGmQM@IFw~vS46& zd*c1371r9n)t&b|ZRbg|v#yBE`Sk&_&pHq5oj+&}{VvoKml{??oNwxo9%h}-yxon& zKd(EN zn4Utlcx}*>O>wj-&Ge&PI8M##lK4+`XSHb^6X#kJ*0rn~zR-jRjIPN`h8~#ID?R9p z9{CwP%KCwMx6q8WWRUJ4$cYz%Fv$?&XoRRelf-CSz2by~!ZQuFM2pYyzo#02AFa58 zEwOc3Cncf8awKkuV{im#@{Y;V`Y8n6`4m zPn&Ky8tqWhucSwb(P`SsSd5Bo#yTRSc4!ctwADadhHU#|Tec&TjLK9*PDWM2mbY!0 zk4RtCT*Q#ulCssgn9Lc+dJN08WfaPBRkTfrhNIC*J?NTg7HyR>1Ukbp8B(z~4WrlB zH;Z%_b$w;?bepDHGLDChFdU9XAcALm#E=1ijNAR5i3$EO1)T_vn-W|9joFr=YN4pP WYARQ$kfr+LChE!K?8=v+kNyVcmV|@= literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.g.cs b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.g.cs new file mode 100644 index 0000000..8da119b --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.g.cs @@ -0,0 +1,51 @@ +#pragma checksum "C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.App\Views\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "253CE9193F1DA0790362FE4E1173CED360BD4F68776CD9B23252DAEA05F15EF8" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ProxmoxDesktop.App.Views +{ + partial class MainWindow : + global::Microsoft.UI.Xaml.Window, + global::Microsoft.UI.Xaml.Markup.IComponentConnector + { + + /// + /// Connect() + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void Connect(int connectionId, object target) + { + switch(connectionId) + { + case 2: // Views\MainWindow.xaml line 8 + { + this.RootFrame = global::WinRT.CastExtensions.As(target); + } + break; + default: + break; + } + this._contentLoaded = true; + } + + + /// + /// GetBindingConnector(int connectionId, object target) + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.IComponentConnector GetBindingConnector(int connectionId, object target) + { + global::Microsoft.UI.Xaml.Markup.IComponentConnector returnValue = null; + return returnValue; + } + } +} + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.g.i.cs b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.g.i.cs new file mode 100644 index 0000000..9d73112 --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.g.i.cs @@ -0,0 +1,47 @@ +#pragma checksum "C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.App\Views\MainWindow.xaml" "{8829d00f-11b8-4213-878b-770e8597ac16}" "253CE9193F1DA0790362FE4E1173CED360BD4F68776CD9B23252DAEA05F15EF8" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ProxmoxDesktop.App.Views +{ + partial class MainWindow : global::Microsoft.UI.Xaml.Window + { + + +#pragma warning disable 0169 // Proactively suppress unused/uninitialized field warning in case they aren't used, for things like x:Name +#pragma warning disable 0649 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private global::Microsoft.UI.Xaml.Controls.Frame RootFrame; +#pragma warning restore 0649 +#pragma warning restore 0169 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private bool _contentLoaded; + + /// + /// InitializeComponent() + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public void InitializeComponent() + { + if (_contentLoaded) + return; + + _contentLoaded = true; + + global::System.Uri resourceLocator = new global::System.Uri("ms-appx:///Views/MainWindow.xaml"); + global::Microsoft.UI.Xaml.Application.LoadComponent(this, resourceLocator, global::Microsoft.UI.Xaml.Controls.Primitives.ComponentResourceLocation.Application); + } + + partial void UnloadObject(global::Microsoft.UI.Xaml.DependencyObject unloadableObject); + + } +} + + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.xaml b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.xaml new file mode 100644 index 0000000..7ef56a2 --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.xaml @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.xbf b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/Views/MainWindow.xbf new file mode 100644 index 0000000000000000000000000000000000000000..6b731b8dc6bd21fd2c99ff8906f100a222c9116e GIT binary patch literal 603 zcmcJMJx{|h5Qg72{h$RFgg|0ygl?fy>iEExTnM>*&%viglmNRx>arumLc8+k%Xw1HheHl+psZM!b zG6wel@m^qqzkXaW=OmFNY9T2|Zpa|X)j~|dp(X^NaXvM$)E{y|3Vuc=unQzOu0 zzysqoB?3lCPjY#i*&@OsfQg70V?O3-fiWu{`-m5-Cp{~^SHziN^Z9Y>eO@hN{pV?= eq5xK_2HN$(yj^cL8wL(*XjHlec52vN!rm_gU0Y`W literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/WinUIEx.pri.xml b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/WinUIEx.pri.xml new file mode 100644 index 0000000..59d9b1a --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/WinUIEx.pri.xml @@ -0,0 +1,1087 @@ + + + + + EN-US,EN-GB,AF-ZA,AM-ET,AR-SA,AS-IN,AZ-LATN-AZ,BG-BG,BN-IN,BS-LATN-BA,CA-ES,CA-ES-VALENCIA,CS-CZ,CY-GB,DA-DK,DE-DE,EL-GR,ES-ES,ES-MX,ET-EE,EU-ES,FA-IR,FI-FI,FIL-PH,FR-CA,FR-FR,GA-IE,GD-GB,GL-ES,GU-IN,HE-IL,HI-IN,HR-HR,HU-HU,HY-AM,ID-ID,IS-IS,IT-IT,JA-JP,KA-GE,KK-KZ,KM-KH,KN-IN,KO-KR,KOK-IN,LB-LU,LO-LA,LT-LT,LV-LV,MI-NZ,MK-MK,ML-IN,MR-IN,MS-MY,MT-MT,NB-NO,NE-NP,NL-NL,NN-NO,OR-IN,PA-IN,PL-PL,PT-BR,PT-PT,QUZ-PE,RO-RO,RU-RU,SK-SK,SL-SI,SQ-AL,SR-CYRL-BA,SR-CYRL-RS,SR-LATN-RS,SV-SE,TA-IN,TE-IN,TH-TH,TR-TR,TT-RU,UG-CN,UK-UA,UR-PK,UZ-LATN-UZ,VI-VN,ZH-CN,ZH-TW + + + + + + + [Embedded Binary Data] + + + + + [Embedded Binary Data] + + + + + + + [Embedded Binary Data] + + + + + + + [Embedded Binary Data] + + + + + [Embedded Binary Data] + + + + + + + + + + 減少 + + + 减少 + + + Giảm + + + Kamaytirish + + + کم کريں + + + Зменшити + + + كېمىيىش + + + Киметү + + + Azalt + + + ลด + + + తగ్గించు + + + குறை + + + Minska + + + Smanji + + + Смањи + + + Смањи + + + Zvogëlo + + + Zmanjšaj + + + Zmenšiť + + + Уменьшение + + + Micșorare + + + Pisiyachiy + + + Diminuir + + + Diminuir + + + Zmniejsz + + + ਘਟਾਓ + + + ହ୍ରାସ କରନ୍ତୁ + + + Reduser + + + Verkleinen + + + घटाउनुहोस् + + + Reduser + + + Naqqas + + + Kurangkan + + + कमी करा + + + കുറയ്ക്കുക + + + Намали + + + Whakaero + + + Samazinājums + + + Mažinti + + + ຫຼຸດລົງ + + + Reduzéieren + + + उणावचें + + + 좁게 + + + ಕಡಿಮೆಗೊಳಿಸು + + + បន្ថយ + + + Азайту + + + შემცირება + + + 減少 + + + Diminuisci + + + Minnkun + + + Kurangi + + + Նվազեցնել + + + Csökkentés + + + Smanjenje + + + घटाएँ + + + הקטן + + + ઘટાડો + + + Redución + + + Lùghdaich + + + Laghdaigh + + + Diminuer + + + Diminuer + + + Bawasan + + + Vähennä + + + کاهش دادن + + + Txikitu + + + Vähenda + + + Reducir + + + Disminuir + + + Decrease + + + Decrease + + + Μείωση + + + Verringerung + + + Formindsk + + + Lleihau + + + Pokles + + + Disminueix + + + Disminueix + + + Smanji + + + হ্রাস + + + Намаляване + + + Azalt + + + হ্ৰাস কৰক + + + تخفيض + + + ቀንስ + + + Verminder + + + + + 最大值 + + + 最大 + + + Tối đa + + + Maksimum + + + زيادہ سے زيادہ + + + Максимум + + + ئەڭ چوڭ + + + Максимум + + + Maksimum + + + สูงสุด + + + గరిష్టం + + + அதிகபட்சம் + + + Högsta + + + Maksimum + + + Максимално + + + Максимум + + + Maksimumi + + + Največje + + + Maximum + + + Максимальное значение + + + Maximă + + + Kuraq + + + Máximo + + + Máximo + + + Maksimum + + + ਅਧਿਕਤਮ + + + ସର୍ବାଧିକ + + + Maksimum + + + Maximum + + + अधिकतम + + + Maksimum + + + Massimu + + + Maksimum + + + कमाल + + + പരമാവധി + + + Максимум + + + Mōrahi + + + Maksimālā + + + Maksimalus + + + ສູງສຸດ + + + Maximum + + + कमाल + + + 최대 + + + ಗರಿಷ್ಠ + + + អតិបរមា + + + Ең үлкен мән + + + მაქსიმუმი + + + 最大 + + + Massimo + + + Hámark + + + Maksimum + + + Առավելագույն + + + Maximum + + + Maksimum + + + अधिकतम + + + מקסימום + + + મહત્તમ + + + Máximo + + + As motha + + + Uasmhéid + + + Maximal + + + Maximal + + + Maximum + + + Suurin + + + حداکثر + + + Gehienez + + + Maksimum + + + Máximo + + + Máximo + + + Maximum + + + Maximum + + + Μέγιστο + + + Maximum + + + Maksimum + + + Uchafswm + + + Maximum + + + Màxim + + + Màxim + + + Maksimum + + + সর্বাধিক + + + Максимум + + + Maksimum + + + সৰ্বাধিক + + + الحد الأقصى + + + ከፍተኛው + + + Maksimum + + + + + 最小值 + + + 最小 + + + Tối thiểu + + + Minimum + + + کم از کم + + + Мінімум + + + ئەڭ كىچىك + + + Минимум + + + Minimum + + + ต่ำสุด + + + కనిష్టం + + + குறைந்தபட்சம் + + + Minimal + + + Minimum + + + Минимално + + + Минимум + + + Minimumi + + + Najmanjše + + + Minimum + + + Минимальное значение + + + Minimă + + + Huchuycha + + + Mínimo + + + Mínimo + + + Minimum + + + ਨਿਊਨਤਮ + + + ସର୍ବନିମ୍ନ + + + Minimum + + + Minimum + + + न्यूनतम + + + Minimum + + + Minimu + + + Minimum + + + किमान + + + കുറഞ്ഞത് + + + Минимум + + + Mōkito + + + Minimālā + + + Minimalus + + + ຕ່ຳສຸດ + + + Minimum + + + किमान + + + 최소 + + + ಕನಿಷ್ಠ + + + អប្បបរមា + + + Ең кіші мән + + + მინიმუმი + + + 最小 + + + Minimo + + + Lágmark + + + Minimum + + + Նվազագույն + + + Minimum + + + Minimum + + + न्यूनतम + + + מינימום + + + ન્યૂનતમ + + + Mínimo + + + As lugha + + + Íosmhéid + + + Minimal + + + Minimal + + + Minimum + + + Pienin + + + حداقل + + + Gutxienez + + + Miinimum + + + Mínimo + + + Mínimo + + + Minimum + + + Minimum + + + Ελάχιστο + + + Minimum + + + Minimum + + + Isafswm + + + Minimum + + + Mínim + + + Mínim + + + Minimalno + + + ন্যূনতম + + + Минимум + + + Minimum + + + ন্যূনতম + + + الحد الأدنى + + + ዝቅተኛው + + + Minimum + + + + + 增加 + + + 增加 + + + Tăng + + + Oshirish + + + بڑھائیں + + + Збільшити + + + ئېشىش + + + Арттыру + + + Artır + + + เพิ่ม + + + పెంచు + + + அதிகரி + + + Öka + + + Povećanje + + + Повећање + + + Повећај + + + Zmadho + + + Povečaj + + + Zväčšiť + + + Увеличение + + + Mărire + + + Yapariy + + + Aumentar + + + Aumentar + + + Zwiększ + + + ਵਧਾਓ + + + ବୃଦ୍ଧି ହେବା + + + Auk + + + Vergroten + + + बढाउनुहोस् + + + Øk + + + Żieda + + + Meningkat + + + वाढवा + + + വർദ്ധിപ്പിക്കുക + + + Зголеми + + + Whakanui + + + Palielinājums + + + Didinti + + + ເພີ່ມ + + + Vergréisseren + + + वाडोवचें + + + 증가 + + + ಹೆಚ್ಚಿಸು + + + បង្កើន + + + Ұлғайту + + + გაზრდა + + + 増加 + + + Aumenta + + + Hækkun + + + Tambahkan + + + Ավելացնել + + + Növelés + + + Povećanje + + + बढ़ाएँ + + + הגדל + + + વધારો + + + Aumento + + + Meudaich + + + Méadaigh + + + Augmenter + + + Hausse + + + Dagdagan + + + Lisää + + + افزایش + + + Handitu + + + Suurenda + + + Aumentar + + + Aumento + + + Increase + + + Increase + + + Αύξηση + + + Anstieg + + + Forøgelse + + + Cynyddu + + + Nárůst + + + Augmenta + + + Augmenta + + + Povećaj + + + বৃদ্ধি + + + Увеличаване + + + Artırmaq + + + বৃদ্ধি কৰক + + + زيادة + + + ጨምር + + + Vermeerder + + + + + + \ No newline at end of file diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/XamlSaveStateFile.xml b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/XamlSaveStateFile.xml new file mode 100644 index 0000000..d962d41 --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/XamlSaveStateFile.xml @@ -0,0 +1 @@ +EnableXBindDiagnostics, EnableDefaultValidationContextGeneration, EnableWin32Codegen, UsingCSWinRT \ No newline at end of file diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/XamlTypeInfo.g.cs b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/XamlTypeInfo.g.cs new file mode 100644 index 0000000..03bba67 --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/XamlTypeInfo.g.cs @@ -0,0 +1,2496 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System.Diagnostics.CodeAnalysis; + + +namespace ProxmoxDesktop.App +{ + public partial class App : global::Microsoft.UI.Xaml.Markup.IXamlMetadataProvider + { + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + private global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMetaDataProvider __appProvider; + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + private global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMetaDataProvider _AppProvider + { + get + { + if (__appProvider == null) + { + __appProvider = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMetaDataProvider(); + } + return __appProvider; + } + } + + /// + /// GetXamlType(Type) + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.IXamlType GetXamlType(global::System.Type type) + { + return _AppProvider.GetXamlType(type); + } + + /// + /// GetXamlType(String) + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.IXamlType GetXamlType(string fullName) + { + return _AppProvider.GetXamlType(fullName); + } + + /// + /// GetXmlnsDefinitions() + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public global::Microsoft.UI.Xaml.Markup.XmlnsDefinition[] GetXmlnsDefinitions() + { + return _AppProvider.GetXmlnsDefinitions(); + } + } +} + +namespace ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo +{ + /// + /// Main class for providing metadata for the app or library + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + public sealed partial class XamlMetaDataProvider : global::Microsoft.UI.Xaml.Markup.IXamlMetadataProvider + { + private global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlTypeInfoProvider _provider = null; + + private global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlTypeInfoProvider Provider + { + get + { + if (_provider == null) + { + _provider = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlTypeInfoProvider(); + } + return _provider; + } + } + + /// + /// GetXamlType(Type) + /// + [global::Windows.Foundation.Metadata.DefaultOverload] + public global::Microsoft.UI.Xaml.Markup.IXamlType GetXamlType(global::System.Type type) + { + return Provider.GetXamlTypeByType(type); + } + + /// + /// GetXamlType(String) + /// + public global::Microsoft.UI.Xaml.Markup.IXamlType GetXamlType(string fullName) + { + return Provider.GetXamlTypeByName(fullName); + } + + /// + /// GetXmlnsDefinitions() + /// + public global::Microsoft.UI.Xaml.Markup.XmlnsDefinition[] GetXmlnsDefinitions() + { + return new global::Microsoft.UI.Xaml.Markup.XmlnsDefinition[0]; + } + } + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + internal partial class XamlTypeInfoProvider + { + public global::Microsoft.UI.Xaml.Markup.IXamlType GetXamlTypeByType(global::System.Type type) + { + global::Microsoft.UI.Xaml.Markup.IXamlType xamlType; + lock (_xamlTypeCacheByType) + { + if (_xamlTypeCacheByType.TryGetValue(type, out xamlType)) + { + return xamlType; + } + int typeIndex = LookupTypeIndexByType(type); + if(typeIndex != -1) + { + xamlType = CreateXamlType(typeIndex); + } + var userXamlType = xamlType as global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType; + if(xamlType == null || (userXamlType != null && userXamlType.IsReturnTypeStub && !userXamlType.IsLocalType)) + { + global::Microsoft.UI.Xaml.Markup.IXamlType libXamlType = CheckOtherMetadataProvidersForType(type); + if (libXamlType != null) + { + if(libXamlType.IsConstructible || xamlType == null) + { + xamlType = libXamlType; + } + } + } + if (xamlType != null) + { + _xamlTypeCacheByName.Add(xamlType.FullName, xamlType); + _xamlTypeCacheByType.Add(xamlType.UnderlyingType, xamlType); + } + } + return xamlType; + } + + public global::Microsoft.UI.Xaml.Markup.IXamlType GetXamlTypeByName(string typeName) + { + if (string.IsNullOrEmpty(typeName)) + { + return null; + } + global::Microsoft.UI.Xaml.Markup.IXamlType xamlType; + lock (_xamlTypeCacheByType) + { + if (_xamlTypeCacheByName.TryGetValue(typeName, out xamlType)) + { + return xamlType; + } + int typeIndex = LookupTypeIndexByName(typeName); + if(typeIndex != -1) + { + xamlType = CreateXamlType(typeIndex); + } + var userXamlType = xamlType as global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType; + if(xamlType == null || (userXamlType != null && userXamlType.IsReturnTypeStub && !userXamlType.IsLocalType)) + { + global::Microsoft.UI.Xaml.Markup.IXamlType libXamlType = CheckOtherMetadataProvidersForName(typeName); + if (libXamlType != null) + { + if(libXamlType.IsConstructible || xamlType == null) + { + xamlType = libXamlType; + } + } + } + if (xamlType != null) + { + _xamlTypeCacheByName.Add(xamlType.FullName, xamlType); + _xamlTypeCacheByType.Add(xamlType.UnderlyingType, xamlType); + } + } + return xamlType; + } + + public global::Microsoft.UI.Xaml.Markup.IXamlMember GetMemberByLongName(string longMemberName) + { + if (string.IsNullOrEmpty(longMemberName)) + { + return null; + } + global::Microsoft.UI.Xaml.Markup.IXamlMember xamlMember; + lock (_xamlMembers) + { + if (_xamlMembers.TryGetValue(longMemberName, out xamlMember)) + { + return xamlMember; + } + xamlMember = CreateXamlMember(longMemberName); + if (xamlMember != null) + { + _xamlMembers.Add(longMemberName, xamlMember); + } + } + return xamlMember; + } + + global::System.Collections.Generic.Dictionary + _xamlTypeCacheByName = new global::System.Collections.Generic.Dictionary(); + + global::System.Collections.Generic.Dictionary + _xamlTypeCacheByType = new global::System.Collections.Generic.Dictionary(); + + global::System.Collections.Generic.Dictionary + _xamlMembers = new global::System.Collections.Generic.Dictionary(); + + string[] _typeNameTable = null; + global::System.Type[] _typeTable = null; + + private void InitTypeTables() + { + _typeNameTable = new string[60]; + _typeNameTable[0] = "Microsoft.UI.Xaml.Controls.XamlControlsResources"; + _typeNameTable[1] = "Microsoft.UI.Xaml.ResourceDictionary"; + _typeNameTable[2] = "Object"; + _typeNameTable[3] = "Boolean"; + _typeNameTable[4] = "Microsoft.UI.Xaml.Controls.ProgressBar"; + _typeNameTable[5] = "Microsoft.UI.Xaml.Controls.Primitives.RangeBase"; + _typeNameTable[6] = "Microsoft.UI.Xaml.Controls.ProgressBarTemplateSettings"; + _typeNameTable[7] = "Microsoft.UI.Xaml.DependencyObject"; + _typeNameTable[8] = "ProxmoxDesktop.App.Controls.MachineCard"; + _typeNameTable[9] = "Microsoft.UI.Xaml.Controls.UserControl"; + _typeNameTable[10] = "ProxmoxDesktop.Core.Api.Models.MachineData"; + _typeNameTable[11] = "Microsoft.UI.Xaml.Media.SolidColorBrush"; + _typeNameTable[12] = "String"; + _typeNameTable[13] = "CommunityToolkit.Mvvm.Input.IRelayCommand"; + _typeNameTable[14] = "Microsoft.UI.Xaml.Controls.WebView2"; + _typeNameTable[15] = "Microsoft.UI.Xaml.FrameworkElement"; + _typeNameTable[16] = "Microsoft.Web.WebView2.Core.CoreWebView2"; + _typeNameTable[17] = "Windows.UI.Color"; + _typeNameTable[18] = "System.ValueType"; + _typeNameTable[19] = "System.Uri"; + _typeNameTable[20] = "ProxmoxDesktop.App.Views.ConsolePage"; + _typeNameTable[21] = "Microsoft.UI.Xaml.Controls.Page"; + _typeNameTable[22] = "Microsoft.UI.Xaml.Controls.InfoBar"; + _typeNameTable[23] = "Microsoft.UI.Xaml.Controls.Control"; + _typeNameTable[24] = "Microsoft.UI.Xaml.Controls.InfoBarSeverity"; + _typeNameTable[25] = "System.Enum"; + _typeNameTable[26] = "Microsoft.UI.Xaml.Controls.Primitives.ButtonBase"; + _typeNameTable[27] = "System.Windows.Input.ICommand"; + _typeNameTable[28] = "Microsoft.UI.Xaml.Style"; + _typeNameTable[29] = "Microsoft.UI.Xaml.DataTemplate"; + _typeNameTable[30] = "Microsoft.UI.Xaml.Controls.IconSource"; + _typeNameTable[31] = "Microsoft.UI.Xaml.Controls.InfoBarTemplateSettings"; + _typeNameTable[32] = "Microsoft.UI.Xaml.Controls.ProgressRing"; + _typeNameTable[33] = "Double"; + _typeNameTable[34] = "Microsoft.UI.Xaml.Controls.ProgressRingTemplateSettings"; + _typeNameTable[35] = "ProxmoxDesktop.App.Views.LoginPage"; + _typeNameTable[36] = "ProxmoxDesktop.App.ViewModels.LoginViewModel"; + _typeNameTable[37] = "CommunityToolkit.Mvvm.ComponentModel.ObservableObject"; + _typeNameTable[38] = "Microsoft.UI.Xaml.Controls.ItemsView"; + _typeNameTable[39] = "Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode"; + _typeNameTable[40] = "Microsoft.UI.Xaml.Controls.Layout"; + _typeNameTable[41] = "Microsoft.UI.Xaml.IElementFactory"; + _typeNameTable[42] = "Int32"; + _typeNameTable[43] = "Microsoft.UI.Xaml.Controls.ItemCollectionTransitionProvider"; + _typeNameTable[44] = "Microsoft.UI.Xaml.Controls.ScrollView"; + _typeNameTable[45] = "Microsoft.UI.Xaml.UIElement"; + _typeNameTable[46] = "System.Collections.Generic.IReadOnlyList`1"; + _typeNameTable[47] = "Microsoft.UI.Xaml.Controls.Primitives.IScrollController"; + _typeNameTable[48] = "Microsoft.UI.Xaml.Controls.UniformGridLayout"; + _typeNameTable[49] = "Microsoft.UI.Xaml.Controls.VirtualizingLayout"; + _typeNameTable[50] = "Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch"; + _typeNameTable[51] = "Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification"; + _typeNameTable[52] = "Microsoft.UI.Xaml.Controls.Orientation"; + _typeNameTable[53] = "Microsoft.UI.Xaml.Controls.IndexBasedLayoutOrientation"; + _typeNameTable[54] = "ProxmoxDesktop.App.Views.MainPage"; + _typeNameTable[55] = "ProxmoxDesktop.App.ViewModels.MainViewModel"; + _typeNameTable[56] = "ProxmoxDesktop.App.Views.MainWindow"; + _typeNameTable[57] = "Microsoft.UI.Xaml.Window"; + _typeNameTable[58] = "Microsoft.UI.Xaml.Controls.TreeViewNode"; + _typeNameTable[59] = "System.Collections.Generic.IList`1"; + + _typeTable = new global::System.Type[60]; + _typeTable[0] = typeof(global::Microsoft.UI.Xaml.Controls.XamlControlsResources); + _typeTable[1] = typeof(global::Microsoft.UI.Xaml.ResourceDictionary); + _typeTable[2] = typeof(global::System.Object); + _typeTable[3] = typeof(global::System.Boolean); + _typeTable[4] = typeof(global::Microsoft.UI.Xaml.Controls.ProgressBar); + _typeTable[5] = typeof(global::Microsoft.UI.Xaml.Controls.Primitives.RangeBase); + _typeTable[6] = typeof(global::Microsoft.UI.Xaml.Controls.ProgressBarTemplateSettings); + _typeTable[7] = typeof(global::Microsoft.UI.Xaml.DependencyObject); + _typeTable[8] = typeof(global::ProxmoxDesktop.App.Controls.MachineCard); + _typeTable[9] = typeof(global::Microsoft.UI.Xaml.Controls.UserControl); + _typeTable[10] = typeof(global::ProxmoxDesktop.Core.Api.Models.MachineData); + _typeTable[11] = typeof(global::Microsoft.UI.Xaml.Media.SolidColorBrush); + _typeTable[12] = typeof(global::System.String); + _typeTable[13] = typeof(global::CommunityToolkit.Mvvm.Input.IRelayCommand); + _typeTable[14] = typeof(global::Microsoft.UI.Xaml.Controls.WebView2); + _typeTable[15] = typeof(global::Microsoft.UI.Xaml.FrameworkElement); + _typeTable[16] = typeof(global::Microsoft.Web.WebView2.Core.CoreWebView2); + _typeTable[17] = typeof(global::Windows.UI.Color); + _typeTable[18] = typeof(global::System.ValueType); + _typeTable[19] = typeof(global::System.Uri); + _typeTable[20] = typeof(global::ProxmoxDesktop.App.Views.ConsolePage); + _typeTable[21] = typeof(global::Microsoft.UI.Xaml.Controls.Page); + _typeTable[22] = typeof(global::Microsoft.UI.Xaml.Controls.InfoBar); + _typeTable[23] = typeof(global::Microsoft.UI.Xaml.Controls.Control); + _typeTable[24] = typeof(global::Microsoft.UI.Xaml.Controls.InfoBarSeverity); + _typeTable[25] = typeof(global::System.Enum); + _typeTable[26] = typeof(global::Microsoft.UI.Xaml.Controls.Primitives.ButtonBase); + _typeTable[27] = typeof(global::System.Windows.Input.ICommand); + _typeTable[28] = typeof(global::Microsoft.UI.Xaml.Style); + _typeTable[29] = typeof(global::Microsoft.UI.Xaml.DataTemplate); + _typeTable[30] = typeof(global::Microsoft.UI.Xaml.Controls.IconSource); + _typeTable[31] = typeof(global::Microsoft.UI.Xaml.Controls.InfoBarTemplateSettings); + _typeTable[32] = typeof(global::Microsoft.UI.Xaml.Controls.ProgressRing); + _typeTable[33] = typeof(global::System.Double); + _typeTable[34] = typeof(global::Microsoft.UI.Xaml.Controls.ProgressRingTemplateSettings); + _typeTable[35] = typeof(global::ProxmoxDesktop.App.Views.LoginPage); + _typeTable[36] = typeof(global::ProxmoxDesktop.App.ViewModels.LoginViewModel); + _typeTable[37] = typeof(global::CommunityToolkit.Mvvm.ComponentModel.ObservableObject); + _typeTable[38] = typeof(global::Microsoft.UI.Xaml.Controls.ItemsView); + _typeTable[39] = typeof(global::Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode); + _typeTable[40] = typeof(global::Microsoft.UI.Xaml.Controls.Layout); + _typeTable[41] = typeof(global::Microsoft.UI.Xaml.IElementFactory); + _typeTable[42] = typeof(global::System.Int32); + _typeTable[43] = typeof(global::Microsoft.UI.Xaml.Controls.ItemCollectionTransitionProvider); + _typeTable[44] = typeof(global::Microsoft.UI.Xaml.Controls.ScrollView); + _typeTable[45] = typeof(global::Microsoft.UI.Xaml.UIElement); + _typeTable[46] = typeof(global::System.Collections.Generic.IReadOnlyList); + _typeTable[47] = typeof(global::Microsoft.UI.Xaml.Controls.Primitives.IScrollController); + _typeTable[48] = typeof(global::Microsoft.UI.Xaml.Controls.UniformGridLayout); + _typeTable[49] = typeof(global::Microsoft.UI.Xaml.Controls.VirtualizingLayout); + _typeTable[50] = typeof(global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch); + _typeTable[51] = typeof(global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification); + _typeTable[52] = typeof(global::Microsoft.UI.Xaml.Controls.Orientation); + _typeTable[53] = typeof(global::Microsoft.UI.Xaml.Controls.IndexBasedLayoutOrientation); + _typeTable[54] = typeof(global::ProxmoxDesktop.App.Views.MainPage); + _typeTable[55] = typeof(global::ProxmoxDesktop.App.ViewModels.MainViewModel); + _typeTable[56] = typeof(global::ProxmoxDesktop.App.Views.MainWindow); + _typeTable[57] = typeof(global::Microsoft.UI.Xaml.Window); + _typeTable[58] = typeof(global::Microsoft.UI.Xaml.Controls.TreeViewNode); + _typeTable[59] = typeof(global::System.Collections.Generic.IList); + } + + private int LookupTypeIndexByName(string typeName) + { + if (_typeNameTable == null) + { + InitTypeTables(); + } + for (int i=0; i<_typeNameTable.Length; i++) + { + if(0 == string.CompareOrdinal(_typeNameTable[i], typeName)) + { + return i; + } + } + return -1; + } + + private int LookupTypeIndexByType(global::System.Type type) + { + if (_typeTable == null) + { + InitTypeTables(); + } + for(int i=0; i<_typeTable.Length; i++) + { + if(type == _typeTable[i]) + { + return i; + } + } + return -1; + } + + private object Activate_0_XamlControlsResources() { return new global::Microsoft.UI.Xaml.Controls.XamlControlsResources(); } + private object Activate_4_ProgressBar() { return new global::Microsoft.UI.Xaml.Controls.ProgressBar(); } + private object Activate_8_MachineCard() { return new global::ProxmoxDesktop.App.Controls.MachineCard(); } + private object Activate_10_MachineData() { return new global::ProxmoxDesktop.Core.Api.Models.MachineData(); } + private object Activate_14_WebView2() { return new global::Microsoft.UI.Xaml.Controls.WebView2(); } + private object Activate_22_InfoBar() { return new global::Microsoft.UI.Xaml.Controls.InfoBar(); } + private object Activate_31_InfoBarTemplateSettings() { return new global::Microsoft.UI.Xaml.Controls.InfoBarTemplateSettings(); } + private object Activate_32_ProgressRing() { return new global::Microsoft.UI.Xaml.Controls.ProgressRing(); } + private object Activate_35_LoginPage() { return new global::ProxmoxDesktop.App.Views.LoginPage(); } + private object Activate_38_ItemsView() { return new global::Microsoft.UI.Xaml.Controls.ItemsView(); } + private object Activate_43_ItemCollectionTransitionProvider() { return new global::Microsoft.UI.Xaml.Controls.ItemCollectionTransitionProvider(); } + private object Activate_44_ScrollView() { return new global::Microsoft.UI.Xaml.Controls.ScrollView(); } + private object Activate_48_UniformGridLayout() { return new global::Microsoft.UI.Xaml.Controls.UniformGridLayout(); } + private object Activate_49_VirtualizingLayout() { return new global::Microsoft.UI.Xaml.Controls.VirtualizingLayout(); } + private object Activate_54_MainPage() { return new global::ProxmoxDesktop.App.Views.MainPage(); } + private object Activate_56_MainWindow() { return new global::ProxmoxDesktop.App.Views.MainWindow(); } + private object Activate_58_TreeViewNode() { return new global::Microsoft.UI.Xaml.Controls.TreeViewNode(); } + private void StaticInitializer_0_XamlControlsResources() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.XamlControlsResources).TypeHandle); + private void StaticInitializer_4_ProgressBar() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.ProgressBar).TypeHandle); + private void StaticInitializer_6_ProgressBarTemplateSettings() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.ProgressBarTemplateSettings).TypeHandle); + private void StaticInitializer_8_MachineCard() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::ProxmoxDesktop.App.Controls.MachineCard).TypeHandle); + private void StaticInitializer_10_MachineData() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::ProxmoxDesktop.Core.Api.Models.MachineData).TypeHandle); + private void StaticInitializer_13_IRelayCommand() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::CommunityToolkit.Mvvm.Input.IRelayCommand).TypeHandle); + private void StaticInitializer_14_WebView2() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.WebView2).TypeHandle); + private void StaticInitializer_16_CoreWebView2() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.Web.WebView2.Core.CoreWebView2).TypeHandle); + private void StaticInitializer_17_Color() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Windows.UI.Color).TypeHandle); + private void StaticInitializer_18_ValueType() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::System.ValueType).TypeHandle); + private void StaticInitializer_19_Uri() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::System.Uri).TypeHandle); + private void StaticInitializer_20_ConsolePage() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::ProxmoxDesktop.App.Views.ConsolePage).TypeHandle); + private void StaticInitializer_22_InfoBar() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.InfoBar).TypeHandle); + private void StaticInitializer_24_InfoBarSeverity() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.InfoBarSeverity).TypeHandle); + private void StaticInitializer_25_Enum() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::System.Enum).TypeHandle); + private void StaticInitializer_27_ICommand() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::System.Windows.Input.ICommand).TypeHandle); + private void StaticInitializer_31_InfoBarTemplateSettings() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.InfoBarTemplateSettings).TypeHandle); + private void StaticInitializer_32_ProgressRing() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.ProgressRing).TypeHandle); + private void StaticInitializer_34_ProgressRingTemplateSettings() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.ProgressRingTemplateSettings).TypeHandle); + private void StaticInitializer_35_LoginPage() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::ProxmoxDesktop.App.Views.LoginPage).TypeHandle); + private void StaticInitializer_36_LoginViewModel() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::ProxmoxDesktop.App.ViewModels.LoginViewModel).TypeHandle); + private void StaticInitializer_37_ObservableObject() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::CommunityToolkit.Mvvm.ComponentModel.ObservableObject).TypeHandle); + private void StaticInitializer_38_ItemsView() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.ItemsView).TypeHandle); + private void StaticInitializer_39_ItemsViewSelectionMode() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode).TypeHandle); + private void StaticInitializer_40_Layout() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.Layout).TypeHandle); + private void StaticInitializer_43_ItemCollectionTransitionProvider() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.ItemCollectionTransitionProvider).TypeHandle); + private void StaticInitializer_44_ScrollView() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.ScrollView).TypeHandle); + private void StaticInitializer_46_IReadOnlyList() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::System.Collections.Generic.IReadOnlyList).TypeHandle); + private void StaticInitializer_47_IScrollController() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.Primitives.IScrollController).TypeHandle); + private void StaticInitializer_48_UniformGridLayout() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.UniformGridLayout).TypeHandle); + private void StaticInitializer_49_VirtualizingLayout() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.VirtualizingLayout).TypeHandle); + private void StaticInitializer_50_UniformGridLayoutItemsStretch() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch).TypeHandle); + private void StaticInitializer_51_UniformGridLayoutItemsJustification() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification).TypeHandle); + private void StaticInitializer_53_IndexBasedLayoutOrientation() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.IndexBasedLayoutOrientation).TypeHandle); + private void StaticInitializer_54_MainPage() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::ProxmoxDesktop.App.Views.MainPage).TypeHandle); + private void StaticInitializer_55_MainViewModel() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::ProxmoxDesktop.App.ViewModels.MainViewModel).TypeHandle); + private void StaticInitializer_56_MainWindow() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::ProxmoxDesktop.App.Views.MainWindow).TypeHandle); + private void StaticInitializer_58_TreeViewNode() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::Microsoft.UI.Xaml.Controls.TreeViewNode).TypeHandle); + private void StaticInitializer_59_IList() => global::System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(global::System.Collections.Generic.IList).TypeHandle); + private void MapAdd_0_XamlControlsResources(object instance, object key, object item) + { + var collection = (global::System.Collections.Generic.IDictionary)instance; + var newKey = (global::System.Object)key; + var newItem = (global::System.Object)item; + collection.Add(newKey, newItem); + } + private void VectorAdd_59_IList(object instance, object item) + { + var collection = (global::System.Collections.Generic.ICollection)instance; + var newItem = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)item; + collection.Add(newItem); + } + + private global::Microsoft.UI.Xaml.Markup.IXamlType CreateXamlType(int typeIndex) + { + global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType xamlType = null; + global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType userType; + string typeName = _typeNameTable[typeIndex]; + global::System.Type type = _typeTable[typeIndex]; + + switch (typeIndex) + { + + case 0: // Microsoft.UI.Xaml.Controls.XamlControlsResources + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.ResourceDictionary")); + userType.Activator = Activate_0_XamlControlsResources; + userType.StaticInitializer = StaticInitializer_0_XamlControlsResources; + userType.DictionaryAdd = MapAdd_0_XamlControlsResources; + userType.AddMemberName("UseCompactResources"); + xamlType = userType; + break; + + case 1: // Microsoft.UI.Xaml.ResourceDictionary + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 2: // Object + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 3: // Boolean + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 4: // Microsoft.UI.Xaml.Controls.ProgressBar + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Primitives.RangeBase")); + userType.Activator = Activate_4_ProgressBar; + userType.StaticInitializer = StaticInitializer_4_ProgressBar; + userType.AddMemberName("IsIndeterminate"); + userType.AddMemberName("ShowError"); + userType.AddMemberName("ShowPaused"); + userType.AddMemberName("TemplateSettings"); + xamlType = userType; + break; + + case 5: // Microsoft.UI.Xaml.Controls.Primitives.RangeBase + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 6: // Microsoft.UI.Xaml.Controls.ProgressBarTemplateSettings + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.DependencyObject")); + userType.StaticInitializer = StaticInitializer_6_ProgressBarTemplateSettings; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 7: // Microsoft.UI.Xaml.DependencyObject + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 8: // ProxmoxDesktop.App.Controls.MachineCard + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UserControl")); + userType.Activator = Activate_8_MachineCard; + userType.StaticInitializer = StaticInitializer_8_MachineCard; + userType.AddMemberName("Machine"); + userType.AddMemberName("StatusBrush"); + userType.AddMemberName("MachineIcon"); + userType.AddMemberName("CanStart"); + userType.AddMemberName("CanResume"); + userType.AddMemberName("CanSuspend"); + userType.AddMemberName("CanReset"); + userType.AddMemberName("CanOpenXterm"); + userType.AddMemberName("OpenNoVncCommand"); + userType.AddMemberName("OpenXtermCommand"); + userType.AddMemberName("OpenSpiceCommand"); + userType.AddMemberName("StartCommand"); + userType.AddMemberName("ShutdownCommand"); + userType.AddMemberName("RebootCommand"); + userType.AddMemberName("SuspendCommand"); + userType.AddMemberName("ResumeCommand"); + userType.AddMemberName("HibernateCommand"); + userType.AddMemberName("StopCommand"); + userType.AddMemberName("ResetCommand"); + userType.SetIsLocalType(); + xamlType = userType; + break; + + case 9: // Microsoft.UI.Xaml.Controls.UserControl + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 10: // ProxmoxDesktop.Core.Api.Models.MachineData + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Object")); + userType.StaticInitializer = StaticInitializer_10_MachineData; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 11: // Microsoft.UI.Xaml.Media.SolidColorBrush + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 12: // String + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 13: // CommunityToolkit.Mvvm.Input.IRelayCommand + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, null); + userType.StaticInitializer = StaticInitializer_13_IRelayCommand; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 14: // Microsoft.UI.Xaml.Controls.WebView2 + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.FrameworkElement")); + userType.Activator = Activate_14_WebView2; + userType.StaticInitializer = StaticInitializer_14_WebView2; + userType.AddMemberName("CanGoBack"); + userType.AddMemberName("CanGoForward"); + userType.AddMemberName("CoreWebView2"); + userType.AddMemberName("DefaultBackgroundColor"); + userType.AddMemberName("Source"); + xamlType = userType; + break; + + case 15: // Microsoft.UI.Xaml.FrameworkElement + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 16: // Microsoft.Web.WebView2.Core.CoreWebView2 + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Object")); + userType.StaticInitializer = StaticInitializer_16_CoreWebView2; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 17: // Windows.UI.Color + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("System.ValueType")); + userType.StaticInitializer = StaticInitializer_17_Color; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 18: // System.ValueType + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Object")); + userType.StaticInitializer = StaticInitializer_18_ValueType; + xamlType = userType; + break; + + case 19: // System.Uri + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Object")); + userType.StaticInitializer = StaticInitializer_19_Uri; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 20: // ProxmoxDesktop.App.Views.ConsolePage + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Page")); + userType.StaticInitializer = StaticInitializer_20_ConsolePage; + userType.SetIsLocalType(); + xamlType = userType; + break; + + case 21: // Microsoft.UI.Xaml.Controls.Page + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 22: // Microsoft.UI.Xaml.Controls.InfoBar + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Control")); + userType.Activator = Activate_22_InfoBar; + userType.StaticInitializer = StaticInitializer_22_InfoBar; + userType.SetContentPropertyName("Microsoft.UI.Xaml.Controls.InfoBar.Content"); + userType.AddMemberName("Content"); + userType.AddMemberName("IsOpen"); + userType.AddMemberName("Severity"); + userType.AddMemberName("Message"); + userType.AddMemberName("IsClosable"); + userType.AddMemberName("ActionButton"); + userType.AddMemberName("CloseButtonCommand"); + userType.AddMemberName("CloseButtonCommandParameter"); + userType.AddMemberName("CloseButtonStyle"); + userType.AddMemberName("ContentTemplate"); + userType.AddMemberName("IconSource"); + userType.AddMemberName("IsIconVisible"); + userType.AddMemberName("TemplateSettings"); + userType.AddMemberName("Title"); + xamlType = userType; + break; + + case 23: // Microsoft.UI.Xaml.Controls.Control + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 24: // Microsoft.UI.Xaml.Controls.InfoBarSeverity + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("System.Enum")); + userType.StaticInitializer = StaticInitializer_24_InfoBarSeverity; + userType.AddEnumValue("Informational", global::Microsoft.UI.Xaml.Controls.InfoBarSeverity.Informational); + userType.AddEnumValue("Success", global::Microsoft.UI.Xaml.Controls.InfoBarSeverity.Success); + userType.AddEnumValue("Warning", global::Microsoft.UI.Xaml.Controls.InfoBarSeverity.Warning); + userType.AddEnumValue("Error", global::Microsoft.UI.Xaml.Controls.InfoBarSeverity.Error); + xamlType = userType; + break; + + case 25: // System.Enum + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("System.ValueType")); + userType.StaticInitializer = StaticInitializer_25_Enum; + xamlType = userType; + break; + + case 26: // Microsoft.UI.Xaml.Controls.Primitives.ButtonBase + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 27: // System.Windows.Input.ICommand + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, null); + userType.StaticInitializer = StaticInitializer_27_ICommand; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 28: // Microsoft.UI.Xaml.Style + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 29: // Microsoft.UI.Xaml.DataTemplate + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 30: // Microsoft.UI.Xaml.Controls.IconSource + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 31: // Microsoft.UI.Xaml.Controls.InfoBarTemplateSettings + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.DependencyObject")); + userType.StaticInitializer = StaticInitializer_31_InfoBarTemplateSettings; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 32: // Microsoft.UI.Xaml.Controls.ProgressRing + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Control")); + userType.Activator = Activate_32_ProgressRing; + userType.StaticInitializer = StaticInitializer_32_ProgressRing; + userType.AddMemberName("IsActive"); + userType.AddMemberName("IsIndeterminate"); + userType.AddMemberName("Maximum"); + userType.AddMemberName("Minimum"); + userType.AddMemberName("TemplateSettings"); + userType.AddMemberName("Value"); + xamlType = userType; + break; + + case 33: // Double + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 34: // Microsoft.UI.Xaml.Controls.ProgressRingTemplateSettings + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.DependencyObject")); + userType.StaticInitializer = StaticInitializer_34_ProgressRingTemplateSettings; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 35: // ProxmoxDesktop.App.Views.LoginPage + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Page")); + userType.Activator = Activate_35_LoginPage; + userType.StaticInitializer = StaticInitializer_35_LoginPage; + userType.AddMemberName("ViewModel"); + userType.SetIsLocalType(); + xamlType = userType; + break; + + case 36: // ProxmoxDesktop.App.ViewModels.LoginViewModel + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("CommunityToolkit.Mvvm.ComponentModel.ObservableObject")); + userType.StaticInitializer = StaticInitializer_36_LoginViewModel; + userType.SetIsReturnTypeStub(); + userType.SetIsLocalType(); + xamlType = userType; + break; + + case 37: // CommunityToolkit.Mvvm.ComponentModel.ObservableObject + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Object")); + userType.StaticInitializer = StaticInitializer_37_ObservableObject; + xamlType = userType; + break; + + case 38: // Microsoft.UI.Xaml.Controls.ItemsView + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Control")); + userType.Activator = Activate_38_ItemsView; + userType.StaticInitializer = StaticInitializer_38_ItemsView; + userType.AddMemberName("ItemsSource"); + userType.AddMemberName("SelectionMode"); + userType.AddMemberName("Layout"); + userType.AddMemberName("ItemTemplate"); + userType.AddMemberName("CurrentItemIndex"); + userType.AddMemberName("IsItemInvokedEnabled"); + userType.AddMemberName("ItemTransitionProvider"); + userType.AddMemberName("ScrollView"); + userType.AddMemberName("SelectedItem"); + userType.AddMemberName("SelectedItems"); + userType.AddMemberName("VerticalScrollController"); + xamlType = userType; + break; + + case 39: // Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("System.Enum")); + userType.StaticInitializer = StaticInitializer_39_ItemsViewSelectionMode; + userType.AddEnumValue("None", global::Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode.None); + userType.AddEnumValue("Single", global::Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode.Single); + userType.AddEnumValue("Multiple", global::Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode.Multiple); + userType.AddEnumValue("Extended", global::Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode.Extended); + xamlType = userType; + break; + + case 40: // Microsoft.UI.Xaml.Controls.Layout + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.DependencyObject")); + userType.StaticInitializer = StaticInitializer_40_Layout; + userType.AddMemberName("IndexBasedLayoutOrientation"); + xamlType = userType; + break; + + case 41: // Microsoft.UI.Xaml.IElementFactory + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 42: // Int32 + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 43: // Microsoft.UI.Xaml.Controls.ItemCollectionTransitionProvider + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Object")); + userType.StaticInitializer = StaticInitializer_43_ItemCollectionTransitionProvider; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 44: // Microsoft.UI.Xaml.Controls.ScrollView + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Control")); + userType.StaticInitializer = StaticInitializer_44_ScrollView; + userType.SetContentPropertyName("Microsoft.UI.Xaml.Controls.ScrollView.Content"); + userType.AddMemberName("Content"); + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 45: // Microsoft.UI.Xaml.UIElement + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 46: // System.Collections.Generic.IReadOnlyList`1 + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, null); + userType.StaticInitializer = StaticInitializer_46_IReadOnlyList; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 47: // Microsoft.UI.Xaml.Controls.Primitives.IScrollController + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, null); + userType.StaticInitializer = StaticInitializer_47_IScrollController; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + + case 48: // Microsoft.UI.Xaml.Controls.UniformGridLayout + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.VirtualizingLayout")); + userType.Activator = Activate_48_UniformGridLayout; + userType.StaticInitializer = StaticInitializer_48_UniformGridLayout; + userType.AddMemberName("MinItemWidth"); + userType.AddMemberName("MinItemHeight"); + userType.AddMemberName("ItemsStretch"); + userType.AddMemberName("MinColumnSpacing"); + userType.AddMemberName("MinRowSpacing"); + userType.AddMemberName("ItemsJustification"); + userType.AddMemberName("MaximumRowsOrColumns"); + userType.AddMemberName("Orientation"); + xamlType = userType; + break; + + case 49: // Microsoft.UI.Xaml.Controls.VirtualizingLayout + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Layout")); + userType.Activator = Activate_49_VirtualizingLayout; + userType.StaticInitializer = StaticInitializer_49_VirtualizingLayout; + xamlType = userType; + break; + + case 50: // Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("System.Enum")); + userType.StaticInitializer = StaticInitializer_50_UniformGridLayoutItemsStretch; + userType.AddEnumValue("None", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch.None); + userType.AddEnumValue("Fill", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch.Fill); + userType.AddEnumValue("Uniform", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch.Uniform); + xamlType = userType; + break; + + case 51: // Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("System.Enum")); + userType.StaticInitializer = StaticInitializer_51_UniformGridLayoutItemsJustification; + userType.AddEnumValue("Start", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification.Start); + userType.AddEnumValue("Center", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification.Center); + userType.AddEnumValue("End", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification.End); + userType.AddEnumValue("SpaceAround", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification.SpaceAround); + userType.AddEnumValue("SpaceBetween", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification.SpaceBetween); + userType.AddEnumValue("SpaceEvenly", global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification.SpaceEvenly); + xamlType = userType; + break; + + case 52: // Microsoft.UI.Xaml.Controls.Orientation + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 53: // Microsoft.UI.Xaml.Controls.IndexBasedLayoutOrientation + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("System.Enum")); + userType.StaticInitializer = StaticInitializer_53_IndexBasedLayoutOrientation; + userType.AddEnumValue("None", global::Microsoft.UI.Xaml.Controls.IndexBasedLayoutOrientation.None); + userType.AddEnumValue("TopToBottom", global::Microsoft.UI.Xaml.Controls.IndexBasedLayoutOrientation.TopToBottom); + userType.AddEnumValue("LeftToRight", global::Microsoft.UI.Xaml.Controls.IndexBasedLayoutOrientation.LeftToRight); + xamlType = userType; + break; + + case 54: // ProxmoxDesktop.App.Views.MainPage + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Page")); + userType.Activator = Activate_54_MainPage; + userType.StaticInitializer = StaticInitializer_54_MainPage; + userType.AddMemberName("ViewModel"); + userType.SetIsLocalType(); + xamlType = userType; + break; + + case 55: // ProxmoxDesktop.App.ViewModels.MainViewModel + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("CommunityToolkit.Mvvm.ComponentModel.ObservableObject")); + userType.StaticInitializer = StaticInitializer_55_MainViewModel; + userType.SetIsReturnTypeStub(); + userType.SetIsLocalType(); + xamlType = userType; + break; + + case 56: // ProxmoxDesktop.App.Views.MainWindow + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.Window")); + userType.Activator = Activate_56_MainWindow; + userType.StaticInitializer = StaticInitializer_56_MainWindow; + userType.SetIsLocalType(); + xamlType = userType; + break; + + case 57: // Microsoft.UI.Xaml.Window + xamlType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType(typeName, type); + break; + + case 58: // Microsoft.UI.Xaml.Controls.TreeViewNode + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, GetXamlTypeByName("Microsoft.UI.Xaml.DependencyObject")); + userType.Activator = Activate_58_TreeViewNode; + userType.StaticInitializer = StaticInitializer_58_TreeViewNode; + userType.AddMemberName("Children"); + userType.AddMemberName("Content"); + userType.AddMemberName("Depth"); + userType.AddMemberName("HasChildren"); + userType.AddMemberName("HasUnrealizedChildren"); + userType.AddMemberName("IsExpanded"); + userType.AddMemberName("Parent"); + userType.SetIsBindable(); + xamlType = userType; + break; + + case 59: // System.Collections.Generic.IList`1 + userType = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType(this, typeName, type, null); + userType.StaticInitializer = StaticInitializer_59_IList; + userType.CollectionAdd = VectorAdd_59_IList; + userType.SetIsReturnTypeStub(); + xamlType = userType; + break; + } + return xamlType; + } + + private global::System.Collections.Generic.List _otherProviders; + private global::System.Collections.Generic.List OtherProviders + { + get + { + if(_otherProviders == null) + { + var otherProviders = new global::System.Collections.Generic.List(); + global::Microsoft.UI.Xaml.Markup.IXamlMetadataProvider provider; + provider = new global::Microsoft.UI.Xaml.XamlTypeInfo.XamlControlsXamlMetaDataProvider() as global::Microsoft.UI.Xaml.Markup.IXamlMetadataProvider; + otherProviders.Add(provider); + provider = new global::WinUIEx.WinUIEx_XamlTypeInfo.XamlMetaDataProvider() as global::Microsoft.UI.Xaml.Markup.IXamlMetadataProvider; + otherProviders.Add(provider); + _otherProviders = otherProviders; + } + return _otherProviders; + } + } + + private global::Microsoft.UI.Xaml.Markup.IXamlType CheckOtherMetadataProvidersForName(string typeName) + { + global::Microsoft.UI.Xaml.Markup.IXamlType xamlType = null; + global::Microsoft.UI.Xaml.Markup.IXamlType foundXamlType = null; + foreach(global::Microsoft.UI.Xaml.Markup.IXamlMetadataProvider xmp in OtherProviders) + { + xamlType = xmp.GetXamlType(typeName); + if(xamlType != null) + { + if(xamlType.IsConstructible) // not Constructible means it might be a Return Type Stub + { + return xamlType; + } + foundXamlType = xamlType; + } + } + return foundXamlType; + } + + private global::Microsoft.UI.Xaml.Markup.IXamlType CheckOtherMetadataProvidersForType(global::System.Type type) + { + global::Microsoft.UI.Xaml.Markup.IXamlType xamlType = null; + global::Microsoft.UI.Xaml.Markup.IXamlType foundXamlType = null; + foreach(global::Microsoft.UI.Xaml.Markup.IXamlMetadataProvider xmp in OtherProviders) + { + xamlType = xmp.GetXamlType(type); + if(xamlType != null) + { + if(xamlType.IsConstructible) // not Constructible means it might be a Return Type Stub + { + return xamlType; + } + foundXamlType = xamlType; + } + } + return foundXamlType; + } + + private object get_0_XamlControlsResources_UseCompactResources(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.XamlControlsResources)instance; + return that.UseCompactResources; + } + private void set_0_XamlControlsResources_UseCompactResources(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.XamlControlsResources)instance; + that.UseCompactResources = (global::System.Boolean)Value; + } + private object get_1_ProgressBar_IsIndeterminate(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressBar)instance; + return that.IsIndeterminate; + } + private void set_1_ProgressBar_IsIndeterminate(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressBar)instance; + that.IsIndeterminate = (global::System.Boolean)Value; + } + private object get_2_ProgressBar_ShowError(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressBar)instance; + return that.ShowError; + } + private void set_2_ProgressBar_ShowError(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressBar)instance; + that.ShowError = (global::System.Boolean)Value; + } + private object get_3_ProgressBar_ShowPaused(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressBar)instance; + return that.ShowPaused; + } + private void set_3_ProgressBar_ShowPaused(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressBar)instance; + that.ShowPaused = (global::System.Boolean)Value; + } + private object get_4_ProgressBar_TemplateSettings(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressBar)instance; + return that.TemplateSettings; + } + private object get_5_MachineCard_Machine(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.Machine; + } + private void set_5_MachineCard_Machine(object instance, object Value) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + that.Machine = (global::ProxmoxDesktop.Core.Api.Models.MachineData)Value; + } + private object get_6_MachineCard_StatusBrush(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.StatusBrush; + } + private object get_7_MachineCard_MachineIcon(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.MachineIcon; + } + private object get_8_MachineCard_CanStart(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.CanStart; + } + private object get_9_MachineCard_CanResume(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.CanResume; + } + private object get_10_MachineCard_CanSuspend(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.CanSuspend; + } + private object get_11_MachineCard_CanReset(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.CanReset; + } + private object get_12_MachineCard_CanOpenXterm(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.CanOpenXterm; + } + private object get_13_MachineCard_OpenNoVncCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.OpenNoVncCommand; + } + private object get_14_MachineCard_OpenXtermCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.OpenXtermCommand; + } + private object get_15_MachineCard_OpenSpiceCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.OpenSpiceCommand; + } + private object get_16_MachineCard_StartCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.StartCommand; + } + private object get_17_MachineCard_ShutdownCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.ShutdownCommand; + } + private object get_18_MachineCard_RebootCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.RebootCommand; + } + private object get_19_MachineCard_SuspendCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.SuspendCommand; + } + private object get_20_MachineCard_ResumeCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.ResumeCommand; + } + private object get_21_MachineCard_HibernateCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.HibernateCommand; + } + private object get_22_MachineCard_StopCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.StopCommand; + } + private object get_23_MachineCard_ResetCommand(object instance) + { + var that = (global::ProxmoxDesktop.App.Controls.MachineCard)instance; + return that.ResetCommand; + } + private object get_24_WebView2_CanGoBack(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + return that.CanGoBack; + } + private void set_24_WebView2_CanGoBack(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + that.CanGoBack = (global::System.Boolean)Value; + } + private object get_25_WebView2_CanGoForward(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + return that.CanGoForward; + } + private void set_25_WebView2_CanGoForward(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + that.CanGoForward = (global::System.Boolean)Value; + } + private object get_26_WebView2_CoreWebView2(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + return that.CoreWebView2; + } + private object get_27_WebView2_DefaultBackgroundColor(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + return that.DefaultBackgroundColor; + } + private void set_27_WebView2_DefaultBackgroundColor(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + that.DefaultBackgroundColor = (global::Windows.UI.Color)Value; + } + private object get_28_WebView2_Source(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + return that.Source; + } + private void set_28_WebView2_Source(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.WebView2)instance; + that.Source = (global::System.Uri)Value; + } + private object get_29_InfoBar_Content(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.Content; + } + private void set_29_InfoBar_Content(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.Content = (global::System.Object)Value; + } + private object get_30_InfoBar_IsOpen(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.IsOpen; + } + private void set_30_InfoBar_IsOpen(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.IsOpen = (global::System.Boolean)Value; + } + private object get_31_InfoBar_Severity(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.Severity; + } + private void set_31_InfoBar_Severity(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.Severity = (global::Microsoft.UI.Xaml.Controls.InfoBarSeverity)Value; + } + private object get_32_InfoBar_Message(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.Message; + } + private void set_32_InfoBar_Message(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.Message = (global::System.String)Value; + } + private object get_33_InfoBar_IsClosable(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.IsClosable; + } + private void set_33_InfoBar_IsClosable(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.IsClosable = (global::System.Boolean)Value; + } + private object get_34_InfoBar_ActionButton(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.ActionButton; + } + private void set_34_InfoBar_ActionButton(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.ActionButton = (global::Microsoft.UI.Xaml.Controls.Primitives.ButtonBase)Value; + } + private object get_35_InfoBar_CloseButtonCommand(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.CloseButtonCommand; + } + private void set_35_InfoBar_CloseButtonCommand(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.CloseButtonCommand = (global::System.Windows.Input.ICommand)Value; + } + private object get_36_InfoBar_CloseButtonCommandParameter(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.CloseButtonCommandParameter; + } + private void set_36_InfoBar_CloseButtonCommandParameter(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.CloseButtonCommandParameter = (global::System.Object)Value; + } + private object get_37_InfoBar_CloseButtonStyle(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.CloseButtonStyle; + } + private void set_37_InfoBar_CloseButtonStyle(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.CloseButtonStyle = (global::Microsoft.UI.Xaml.Style)Value; + } + private object get_38_InfoBar_ContentTemplate(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.ContentTemplate; + } + private void set_38_InfoBar_ContentTemplate(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.ContentTemplate = (global::Microsoft.UI.Xaml.DataTemplate)Value; + } + private object get_39_InfoBar_IconSource(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.IconSource; + } + private void set_39_InfoBar_IconSource(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.IconSource = (global::Microsoft.UI.Xaml.Controls.IconSource)Value; + } + private object get_40_InfoBar_IsIconVisible(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.IsIconVisible; + } + private void set_40_InfoBar_IsIconVisible(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.IsIconVisible = (global::System.Boolean)Value; + } + private object get_41_InfoBar_TemplateSettings(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.TemplateSettings; + } + private object get_42_InfoBar_Title(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + return that.Title; + } + private void set_42_InfoBar_Title(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.InfoBar)instance; + that.Title = (global::System.String)Value; + } + private object get_43_ProgressRing_IsActive(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + return that.IsActive; + } + private void set_43_ProgressRing_IsActive(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + that.IsActive = (global::System.Boolean)Value; + } + private object get_44_ProgressRing_IsIndeterminate(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + return that.IsIndeterminate; + } + private void set_44_ProgressRing_IsIndeterminate(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + that.IsIndeterminate = (global::System.Boolean)Value; + } + private object get_45_ProgressRing_Maximum(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + return that.Maximum; + } + private void set_45_ProgressRing_Maximum(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + that.Maximum = (global::System.Double)Value; + } + private object get_46_ProgressRing_Minimum(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + return that.Minimum; + } + private void set_46_ProgressRing_Minimum(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + that.Minimum = (global::System.Double)Value; + } + private object get_47_ProgressRing_TemplateSettings(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + return that.TemplateSettings; + } + private object get_48_ProgressRing_Value(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + return that.Value; + } + private void set_48_ProgressRing_Value(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ProgressRing)instance; + that.Value = (global::System.Double)Value; + } + private object get_49_LoginPage_ViewModel(object instance) + { + var that = (global::ProxmoxDesktop.App.Views.LoginPage)instance; + return that.ViewModel; + } + private object get_50_ItemsView_ItemsSource(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.ItemsSource; + } + private void set_50_ItemsView_ItemsSource(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + that.ItemsSource = (global::System.Object)Value; + } + private object get_51_ItemsView_SelectionMode(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.SelectionMode; + } + private void set_51_ItemsView_SelectionMode(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + that.SelectionMode = (global::Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode)Value; + } + private object get_52_ItemsView_Layout(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.Layout; + } + private void set_52_ItemsView_Layout(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + that.Layout = (global::Microsoft.UI.Xaml.Controls.Layout)Value; + } + private object get_53_ItemsView_ItemTemplate(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.ItemTemplate; + } + private void set_53_ItemsView_ItemTemplate(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + that.ItemTemplate = (global::Microsoft.UI.Xaml.IElementFactory)Value; + } + private object get_54_ItemsView_CurrentItemIndex(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.CurrentItemIndex; + } + private object get_55_ItemsView_IsItemInvokedEnabled(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.IsItemInvokedEnabled; + } + private void set_55_ItemsView_IsItemInvokedEnabled(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + that.IsItemInvokedEnabled = (global::System.Boolean)Value; + } + private object get_56_ItemsView_ItemTransitionProvider(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.ItemTransitionProvider; + } + private void set_56_ItemsView_ItemTransitionProvider(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + that.ItemTransitionProvider = (global::Microsoft.UI.Xaml.Controls.ItemCollectionTransitionProvider)Value; + } + private object get_57_ItemsView_ScrollView(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.ScrollView; + } + private object get_58_ScrollView_Content(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ScrollView)instance; + return that.Content; + } + private void set_58_ScrollView_Content(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ScrollView)instance; + that.Content = (global::Microsoft.UI.Xaml.UIElement)Value; + } + private object get_59_ItemsView_SelectedItem(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.SelectedItem; + } + private object get_60_ItemsView_SelectedItems(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.SelectedItems; + } + private object get_61_ItemsView_VerticalScrollController(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + return that.VerticalScrollController; + } + private void set_61_ItemsView_VerticalScrollController(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.ItemsView)instance; + that.VerticalScrollController = (global::Microsoft.UI.Xaml.Controls.Primitives.IScrollController)Value; + } + private object get_62_UniformGridLayout_MinItemWidth(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + return that.MinItemWidth; + } + private void set_62_UniformGridLayout_MinItemWidth(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + that.MinItemWidth = (global::System.Double)Value; + } + private object get_63_UniformGridLayout_MinItemHeight(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + return that.MinItemHeight; + } + private void set_63_UniformGridLayout_MinItemHeight(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + that.MinItemHeight = (global::System.Double)Value; + } + private object get_64_UniformGridLayout_ItemsStretch(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + return that.ItemsStretch; + } + private void set_64_UniformGridLayout_ItemsStretch(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + that.ItemsStretch = (global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch)Value; + } + private object get_65_UniformGridLayout_MinColumnSpacing(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + return that.MinColumnSpacing; + } + private void set_65_UniformGridLayout_MinColumnSpacing(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + that.MinColumnSpacing = (global::System.Double)Value; + } + private object get_66_UniformGridLayout_MinRowSpacing(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + return that.MinRowSpacing; + } + private void set_66_UniformGridLayout_MinRowSpacing(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + that.MinRowSpacing = (global::System.Double)Value; + } + private object get_67_UniformGridLayout_ItemsJustification(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + return that.ItemsJustification; + } + private void set_67_UniformGridLayout_ItemsJustification(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + that.ItemsJustification = (global::Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification)Value; + } + private object get_68_UniformGridLayout_MaximumRowsOrColumns(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + return that.MaximumRowsOrColumns; + } + private void set_68_UniformGridLayout_MaximumRowsOrColumns(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + that.MaximumRowsOrColumns = (global::System.Int32)Value; + } + private object get_69_UniformGridLayout_Orientation(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + return that.Orientation; + } + private void set_69_UniformGridLayout_Orientation(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.UniformGridLayout)instance; + that.Orientation = (global::Microsoft.UI.Xaml.Controls.Orientation)Value; + } + private object get_70_Layout_IndexBasedLayoutOrientation(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.Layout)instance; + return that.IndexBasedLayoutOrientation; + } + private object get_71_MainPage_ViewModel(object instance) + { + var that = (global::ProxmoxDesktop.App.Views.MainPage)instance; + return that.ViewModel; + } + private object get_72_TreeViewNode_Children(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + return that.Children; + } + private object get_73_TreeViewNode_Content(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + return that.Content; + } + private void set_73_TreeViewNode_Content(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + that.Content = (global::System.Object)Value; + } + private object get_74_TreeViewNode_Depth(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + return that.Depth; + } + private object get_75_TreeViewNode_HasChildren(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + return that.HasChildren; + } + private object get_76_TreeViewNode_HasUnrealizedChildren(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + return that.HasUnrealizedChildren; + } + private void set_76_TreeViewNode_HasUnrealizedChildren(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + that.HasUnrealizedChildren = (global::System.Boolean)Value; + } + private object get_77_TreeViewNode_IsExpanded(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + return that.IsExpanded; + } + private void set_77_TreeViewNode_IsExpanded(object instance, object Value) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + that.IsExpanded = (global::System.Boolean)Value; + } + private object get_78_TreeViewNode_Parent(object instance) + { + var that = (global::Microsoft.UI.Xaml.Controls.TreeViewNode)instance; + return that.Parent; + } + + private global::Microsoft.UI.Xaml.Markup.IXamlMember CreateXamlMember(string longMemberName) + { + global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember xamlMember = null; + global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType userType; + + switch (longMemberName) + { + case "Microsoft.UI.Xaml.Controls.XamlControlsResources.UseCompactResources": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.XamlControlsResources"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "UseCompactResources", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_0_XamlControlsResources_UseCompactResources; + xamlMember.Setter = set_0_XamlControlsResources_UseCompactResources; + break; + case "Microsoft.UI.Xaml.Controls.ProgressBar.IsIndeterminate": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IsIndeterminate", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_1_ProgressBar_IsIndeterminate; + xamlMember.Setter = set_1_ProgressBar_IsIndeterminate; + break; + case "Microsoft.UI.Xaml.Controls.ProgressBar.ShowError": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ShowError", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_2_ProgressBar_ShowError; + xamlMember.Setter = set_2_ProgressBar_ShowError; + break; + case "Microsoft.UI.Xaml.Controls.ProgressBar.ShowPaused": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ShowPaused", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_3_ProgressBar_ShowPaused; + xamlMember.Setter = set_3_ProgressBar_ShowPaused; + break; + case "Microsoft.UI.Xaml.Controls.ProgressBar.TemplateSettings": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "TemplateSettings", "Microsoft.UI.Xaml.Controls.ProgressBarTemplateSettings"); + xamlMember.Getter = get_4_ProgressBar_TemplateSettings; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.Machine": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Machine", "ProxmoxDesktop.Core.Api.Models.MachineData"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_5_MachineCard_Machine; + xamlMember.Setter = set_5_MachineCard_Machine; + break; + case "ProxmoxDesktop.App.Controls.MachineCard.StatusBrush": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "StatusBrush", "Microsoft.UI.Xaml.Media.SolidColorBrush"); + xamlMember.Getter = get_6_MachineCard_StatusBrush; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.MachineIcon": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "MachineIcon", "String"); + xamlMember.Getter = get_7_MachineCard_MachineIcon; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.CanStart": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CanStart", "Boolean"); + xamlMember.Getter = get_8_MachineCard_CanStart; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.CanResume": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CanResume", "Boolean"); + xamlMember.Getter = get_9_MachineCard_CanResume; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.CanSuspend": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CanSuspend", "Boolean"); + xamlMember.Getter = get_10_MachineCard_CanSuspend; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.CanReset": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CanReset", "Boolean"); + xamlMember.Getter = get_11_MachineCard_CanReset; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.CanOpenXterm": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CanOpenXterm", "Boolean"); + xamlMember.Getter = get_12_MachineCard_CanOpenXterm; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.OpenNoVncCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "OpenNoVncCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_13_MachineCard_OpenNoVncCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.OpenXtermCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "OpenXtermCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_14_MachineCard_OpenXtermCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.OpenSpiceCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "OpenSpiceCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_15_MachineCard_OpenSpiceCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.StartCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "StartCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_16_MachineCard_StartCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.ShutdownCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ShutdownCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_17_MachineCard_ShutdownCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.RebootCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "RebootCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_18_MachineCard_RebootCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.SuspendCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "SuspendCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_19_MachineCard_SuspendCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.ResumeCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ResumeCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_20_MachineCard_ResumeCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.HibernateCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "HibernateCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_21_MachineCard_HibernateCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.StopCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "StopCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_22_MachineCard_StopCommand; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Controls.MachineCard.ResetCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Controls.MachineCard"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ResetCommand", "CommunityToolkit.Mvvm.Input.IRelayCommand"); + xamlMember.Getter = get_23_MachineCard_ResetCommand; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.WebView2.CanGoBack": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.WebView2"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CanGoBack", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_24_WebView2_CanGoBack; + xamlMember.Setter = set_24_WebView2_CanGoBack; + break; + case "Microsoft.UI.Xaml.Controls.WebView2.CanGoForward": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.WebView2"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CanGoForward", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_25_WebView2_CanGoForward; + xamlMember.Setter = set_25_WebView2_CanGoForward; + break; + case "Microsoft.UI.Xaml.Controls.WebView2.CoreWebView2": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.WebView2"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CoreWebView2", "Microsoft.Web.WebView2.Core.CoreWebView2"); + xamlMember.Getter = get_26_WebView2_CoreWebView2; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.WebView2.DefaultBackgroundColor": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.WebView2"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "DefaultBackgroundColor", "Windows.UI.Color"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_27_WebView2_DefaultBackgroundColor; + xamlMember.Setter = set_27_WebView2_DefaultBackgroundColor; + break; + case "Microsoft.UI.Xaml.Controls.WebView2.Source": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.WebView2"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Source", "System.Uri"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_28_WebView2_Source; + xamlMember.Setter = set_28_WebView2_Source; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.Content": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Content", "Object"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_29_InfoBar_Content; + xamlMember.Setter = set_29_InfoBar_Content; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.IsOpen": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IsOpen", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_30_InfoBar_IsOpen; + xamlMember.Setter = set_30_InfoBar_IsOpen; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.Severity": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Severity", "Microsoft.UI.Xaml.Controls.InfoBarSeverity"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_31_InfoBar_Severity; + xamlMember.Setter = set_31_InfoBar_Severity; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.Message": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Message", "String"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_32_InfoBar_Message; + xamlMember.Setter = set_32_InfoBar_Message; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.IsClosable": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IsClosable", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_33_InfoBar_IsClosable; + xamlMember.Setter = set_33_InfoBar_IsClosable; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.ActionButton": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ActionButton", "Microsoft.UI.Xaml.Controls.Primitives.ButtonBase"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_34_InfoBar_ActionButton; + xamlMember.Setter = set_34_InfoBar_ActionButton; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.CloseButtonCommand": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CloseButtonCommand", "System.Windows.Input.ICommand"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_35_InfoBar_CloseButtonCommand; + xamlMember.Setter = set_35_InfoBar_CloseButtonCommand; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.CloseButtonCommandParameter": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CloseButtonCommandParameter", "Object"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_36_InfoBar_CloseButtonCommandParameter; + xamlMember.Setter = set_36_InfoBar_CloseButtonCommandParameter; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.CloseButtonStyle": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CloseButtonStyle", "Microsoft.UI.Xaml.Style"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_37_InfoBar_CloseButtonStyle; + xamlMember.Setter = set_37_InfoBar_CloseButtonStyle; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.ContentTemplate": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ContentTemplate", "Microsoft.UI.Xaml.DataTemplate"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_38_InfoBar_ContentTemplate; + xamlMember.Setter = set_38_InfoBar_ContentTemplate; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.IconSource": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IconSource", "Microsoft.UI.Xaml.Controls.IconSource"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_39_InfoBar_IconSource; + xamlMember.Setter = set_39_InfoBar_IconSource; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.IsIconVisible": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IsIconVisible", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_40_InfoBar_IsIconVisible; + xamlMember.Setter = set_40_InfoBar_IsIconVisible; + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.TemplateSettings": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "TemplateSettings", "Microsoft.UI.Xaml.Controls.InfoBarTemplateSettings"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_41_InfoBar_TemplateSettings; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.InfoBar.Title": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.InfoBar"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Title", "String"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_42_InfoBar_Title; + xamlMember.Setter = set_42_InfoBar_Title; + break; + case "Microsoft.UI.Xaml.Controls.ProgressRing.IsActive": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressRing"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IsActive", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_43_ProgressRing_IsActive; + xamlMember.Setter = set_43_ProgressRing_IsActive; + break; + case "Microsoft.UI.Xaml.Controls.ProgressRing.IsIndeterminate": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressRing"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IsIndeterminate", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_44_ProgressRing_IsIndeterminate; + xamlMember.Setter = set_44_ProgressRing_IsIndeterminate; + break; + case "Microsoft.UI.Xaml.Controls.ProgressRing.Maximum": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressRing"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Maximum", "Double"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_45_ProgressRing_Maximum; + xamlMember.Setter = set_45_ProgressRing_Maximum; + break; + case "Microsoft.UI.Xaml.Controls.ProgressRing.Minimum": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressRing"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Minimum", "Double"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_46_ProgressRing_Minimum; + xamlMember.Setter = set_46_ProgressRing_Minimum; + break; + case "Microsoft.UI.Xaml.Controls.ProgressRing.TemplateSettings": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressRing"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "TemplateSettings", "Microsoft.UI.Xaml.Controls.ProgressRingTemplateSettings"); + xamlMember.Getter = get_47_ProgressRing_TemplateSettings; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.ProgressRing.Value": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ProgressRing"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Value", "Double"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_48_ProgressRing_Value; + xamlMember.Setter = set_48_ProgressRing_Value; + break; + case "ProxmoxDesktop.App.Views.LoginPage.ViewModel": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Views.LoginPage"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ViewModel", "ProxmoxDesktop.App.ViewModels.LoginViewModel"); + xamlMember.Getter = get_49_LoginPage_ViewModel; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.ItemsSource": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ItemsSource", "Object"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_50_ItemsView_ItemsSource; + xamlMember.Setter = set_50_ItemsView_ItemsSource; + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.SelectionMode": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "SelectionMode", "Microsoft.UI.Xaml.Controls.ItemsViewSelectionMode"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_51_ItemsView_SelectionMode; + xamlMember.Setter = set_51_ItemsView_SelectionMode; + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.Layout": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Layout", "Microsoft.UI.Xaml.Controls.Layout"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_52_ItemsView_Layout; + xamlMember.Setter = set_52_ItemsView_Layout; + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.ItemTemplate": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ItemTemplate", "Microsoft.UI.Xaml.IElementFactory"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_53_ItemsView_ItemTemplate; + xamlMember.Setter = set_53_ItemsView_ItemTemplate; + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.CurrentItemIndex": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "CurrentItemIndex", "Int32"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_54_ItemsView_CurrentItemIndex; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.IsItemInvokedEnabled": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IsItemInvokedEnabled", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_55_ItemsView_IsItemInvokedEnabled; + xamlMember.Setter = set_55_ItemsView_IsItemInvokedEnabled; + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.ItemTransitionProvider": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ItemTransitionProvider", "Microsoft.UI.Xaml.Controls.ItemCollectionTransitionProvider"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_56_ItemsView_ItemTransitionProvider; + xamlMember.Setter = set_56_ItemsView_ItemTransitionProvider; + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.ScrollView": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ScrollView", "Microsoft.UI.Xaml.Controls.ScrollView"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_57_ItemsView_ScrollView; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.ScrollView.Content": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ScrollView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Content", "Microsoft.UI.Xaml.UIElement"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_58_ScrollView_Content; + xamlMember.Setter = set_58_ScrollView_Content; + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.SelectedItem": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "SelectedItem", "Object"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_59_ItemsView_SelectedItem; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.SelectedItems": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "SelectedItems", "System.Collections.Generic.IReadOnlyList`1"); + xamlMember.Getter = get_60_ItemsView_SelectedItems; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.ItemsView.VerticalScrollController": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.ItemsView"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "VerticalScrollController", "Microsoft.UI.Xaml.Controls.Primitives.IScrollController"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_61_ItemsView_VerticalScrollController; + xamlMember.Setter = set_61_ItemsView_VerticalScrollController; + break; + case "Microsoft.UI.Xaml.Controls.UniformGridLayout.MinItemWidth": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UniformGridLayout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "MinItemWidth", "Double"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_62_UniformGridLayout_MinItemWidth; + xamlMember.Setter = set_62_UniformGridLayout_MinItemWidth; + break; + case "Microsoft.UI.Xaml.Controls.UniformGridLayout.MinItemHeight": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UniformGridLayout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "MinItemHeight", "Double"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_63_UniformGridLayout_MinItemHeight; + xamlMember.Setter = set_63_UniformGridLayout_MinItemHeight; + break; + case "Microsoft.UI.Xaml.Controls.UniformGridLayout.ItemsStretch": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UniformGridLayout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ItemsStretch", "Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsStretch"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_64_UniformGridLayout_ItemsStretch; + xamlMember.Setter = set_64_UniformGridLayout_ItemsStretch; + break; + case "Microsoft.UI.Xaml.Controls.UniformGridLayout.MinColumnSpacing": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UniformGridLayout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "MinColumnSpacing", "Double"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_65_UniformGridLayout_MinColumnSpacing; + xamlMember.Setter = set_65_UniformGridLayout_MinColumnSpacing; + break; + case "Microsoft.UI.Xaml.Controls.UniformGridLayout.MinRowSpacing": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UniformGridLayout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "MinRowSpacing", "Double"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_66_UniformGridLayout_MinRowSpacing; + xamlMember.Setter = set_66_UniformGridLayout_MinRowSpacing; + break; + case "Microsoft.UI.Xaml.Controls.UniformGridLayout.ItemsJustification": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UniformGridLayout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ItemsJustification", "Microsoft.UI.Xaml.Controls.UniformGridLayoutItemsJustification"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_67_UniformGridLayout_ItemsJustification; + xamlMember.Setter = set_67_UniformGridLayout_ItemsJustification; + break; + case "Microsoft.UI.Xaml.Controls.UniformGridLayout.MaximumRowsOrColumns": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UniformGridLayout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "MaximumRowsOrColumns", "Int32"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_68_UniformGridLayout_MaximumRowsOrColumns; + xamlMember.Setter = set_68_UniformGridLayout_MaximumRowsOrColumns; + break; + case "Microsoft.UI.Xaml.Controls.UniformGridLayout.Orientation": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.UniformGridLayout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Orientation", "Microsoft.UI.Xaml.Controls.Orientation"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_69_UniformGridLayout_Orientation; + xamlMember.Setter = set_69_UniformGridLayout_Orientation; + break; + case "Microsoft.UI.Xaml.Controls.Layout.IndexBasedLayoutOrientation": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.Layout"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IndexBasedLayoutOrientation", "Microsoft.UI.Xaml.Controls.IndexBasedLayoutOrientation"); + xamlMember.Getter = get_70_Layout_IndexBasedLayoutOrientation; + xamlMember.SetIsReadOnly(); + break; + case "ProxmoxDesktop.App.Views.MainPage.ViewModel": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("ProxmoxDesktop.App.Views.MainPage"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "ViewModel", "ProxmoxDesktop.App.ViewModels.MainViewModel"); + xamlMember.Getter = get_71_MainPage_ViewModel; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.TreeViewNode.Children": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.TreeViewNode"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Children", "System.Collections.Generic.IList`1"); + xamlMember.Getter = get_72_TreeViewNode_Children; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.TreeViewNode.Content": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.TreeViewNode"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Content", "Object"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_73_TreeViewNode_Content; + xamlMember.Setter = set_73_TreeViewNode_Content; + break; + case "Microsoft.UI.Xaml.Controls.TreeViewNode.Depth": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.TreeViewNode"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Depth", "Int32"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_74_TreeViewNode_Depth; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.TreeViewNode.HasChildren": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.TreeViewNode"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "HasChildren", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_75_TreeViewNode_HasChildren; + xamlMember.SetIsReadOnly(); + break; + case "Microsoft.UI.Xaml.Controls.TreeViewNode.HasUnrealizedChildren": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.TreeViewNode"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "HasUnrealizedChildren", "Boolean"); + xamlMember.Getter = get_76_TreeViewNode_HasUnrealizedChildren; + xamlMember.Setter = set_76_TreeViewNode_HasUnrealizedChildren; + break; + case "Microsoft.UI.Xaml.Controls.TreeViewNode.IsExpanded": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.TreeViewNode"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "IsExpanded", "Boolean"); + xamlMember.SetIsDependencyProperty(); + xamlMember.Getter = get_77_TreeViewNode_IsExpanded; + xamlMember.Setter = set_77_TreeViewNode_IsExpanded; + break; + case "Microsoft.UI.Xaml.Controls.TreeViewNode.Parent": + userType = (global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlUserType)GetXamlTypeByName("Microsoft.UI.Xaml.Controls.TreeViewNode"); + xamlMember = new global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlMember(this, "Parent", "Microsoft.UI.Xaml.Controls.TreeViewNode"); + xamlMember.Getter = get_78_TreeViewNode_Parent; + xamlMember.SetIsReadOnly(); + break; + } + return xamlMember; + } + } + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + internal partial class XamlSystemBaseType : global::Microsoft.UI.Xaml.Markup.IXamlType + { + string _fullName; + global::System.Type _underlyingType; + + public XamlSystemBaseType(string fullName, + global::System.Type underlyingType) + { + _fullName = fullName; + _underlyingType = underlyingType; + } + + public string FullName { get { return _fullName; } } + + public global::System.Type UnderlyingType + { + get + { + return _underlyingType; + } + } + + virtual public global::Microsoft.UI.Xaml.Markup.IXamlType BaseType { get { throw new global::System.NotImplementedException(); } } + virtual public global::Microsoft.UI.Xaml.Markup.IXamlMember ContentProperty { get { throw new global::System.NotImplementedException(); } } + virtual public global::Microsoft.UI.Xaml.Markup.IXamlMember GetMember(string name) { throw new global::System.NotImplementedException(); } + virtual public bool IsArray { get { throw new global::System.NotImplementedException(); } } + virtual public bool IsCollection { get { throw new global::System.NotImplementedException(); } } + virtual public bool IsConstructible { get { throw new global::System.NotImplementedException(); } } + virtual public bool IsDictionary { get { throw new global::System.NotImplementedException(); } } + virtual public bool IsMarkupExtension { get { throw new global::System.NotImplementedException(); } } + virtual public bool IsBindable { get { throw new global::System.NotImplementedException(); } } + virtual public bool IsReturnTypeStub { get { throw new global::System.NotImplementedException(); } } + virtual public bool IsLocalType { get { throw new global::System.NotImplementedException(); } } + virtual public global::Microsoft.UI.Xaml.Markup.IXamlType ItemType { get { throw new global::System.NotImplementedException(); } } + virtual public global::Microsoft.UI.Xaml.Markup.IXamlType KeyType { get { throw new global::System.NotImplementedException(); } } + virtual public global::Microsoft.UI.Xaml.Markup.IXamlType BoxedType { get { throw new global::System.NotImplementedException(); } } + virtual public object ActivateInstance() { throw new global::System.NotImplementedException(); } + virtual public void AddToMap(object instance, object key, object item) { throw new global::System.NotImplementedException(); } + virtual public void AddToVector(object instance, object item) { throw new global::System.NotImplementedException(); } + virtual public void RunInitializer() { throw new global::System.NotImplementedException(); } + virtual public object CreateFromString(string input) { throw new global::System.NotImplementedException(); } + } + + internal delegate object Activator(); + internal delegate void StaticInitializer(); + internal delegate void AddToCollection(object instance, object item); + internal delegate void AddToDictionary(object instance, object key, object item); + internal delegate object CreateFromStringMethod(string args); + internal delegate object BoxInstanceMethod(object instance); + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + internal partial class XamlUserType : global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlSystemBaseType + , global::Microsoft.UI.Xaml.Markup.IXamlType + { + global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlTypeInfoProvider _provider; + global::Microsoft.UI.Xaml.Markup.IXamlType _baseType; + global::Microsoft.UI.Xaml.Markup.IXamlType _boxedType; + bool _isArray; + bool _isMarkupExtension; + bool _isBindable; + bool _isReturnTypeStub; + bool _isLocalType; + + string _contentPropertyName; + string _itemTypeName; + string _keyTypeName; + global::System.Collections.Generic.Dictionary _memberNames; + global::System.Collections.Generic.Dictionary _enumValues; + + public XamlUserType(global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlTypeInfoProvider provider, string fullName, + global::System.Type fullType, global::Microsoft.UI.Xaml.Markup.IXamlType baseType) + :base(fullName, fullType) + { + _provider = provider; + _baseType = baseType; + } + + // --- Interface methods ---- + + override public global::Microsoft.UI.Xaml.Markup.IXamlType BaseType { get { return _baseType; } } + override public bool IsArray { get { return _isArray; } } + override public bool IsCollection { get { return (CollectionAdd != null); } } + override public bool IsConstructible { get { return (Activator != null); } } + override public bool IsDictionary { get { return (DictionaryAdd != null); } } + override public bool IsMarkupExtension { get { return _isMarkupExtension; } } + override public bool IsBindable { get { return _isBindable; } } + override public bool IsReturnTypeStub { get { return _isReturnTypeStub; } } + override public bool IsLocalType { get { return _isLocalType; } } + override public global::Microsoft.UI.Xaml.Markup.IXamlType BoxedType { get { return _boxedType; } } + + override public global::Microsoft.UI.Xaml.Markup.IXamlMember ContentProperty + { + get { return _provider.GetMemberByLongName(_contentPropertyName); } + } + + override public global::Microsoft.UI.Xaml.Markup.IXamlType ItemType + { + get { return _provider.GetXamlTypeByName(_itemTypeName); } + } + + override public global::Microsoft.UI.Xaml.Markup.IXamlType KeyType + { + get { return _provider.GetXamlTypeByName(_keyTypeName); } + } + + override public global::Microsoft.UI.Xaml.Markup.IXamlMember GetMember(string name) + { + if (_memberNames == null) + { + return null; + } + string longName; + if (_memberNames.TryGetValue(name, out longName)) + { + return _provider.GetMemberByLongName(longName); + } + return null; + } + + override public object ActivateInstance() + { + return Activator(); + } + + override public void AddToMap(object instance, object key, object item) + { + DictionaryAdd(instance, key, item); + } + + override public void AddToVector(object instance, object item) + { + CollectionAdd(instance, item); + } + + override public void RunInitializer() + { + StaticInitializer(); + } + + override public object CreateFromString(string input) + { + if (BoxedType != null) + { + return BoxInstance(BoxedType.CreateFromString(input)); + } + + if (CreateFromStringMethod != null) + { + return this.CreateFromStringMethod(input); + } + else if (_enumValues != null) + { + long value = 0; + + string[] valueParts = input.Split(','); + + foreach (string valuePart in valueParts) + { + object partValue; + long enumFieldValue = 0; + try + { + if (_enumValues.TryGetValue(valuePart.Trim(), out partValue)) + { + enumFieldValue = global::System.Convert.ToInt64(partValue); + } + else + { + try + { + enumFieldValue = global::System.Convert.ToInt64(valuePart.Trim()); + } + catch( global::System.FormatException ) + { + foreach( string key in _enumValues.Keys ) + { + if( string.Compare(valuePart.Trim(), key, global::System.StringComparison.OrdinalIgnoreCase) == 0 ) + { + if( _enumValues.TryGetValue(key.Trim(), out partValue) ) + { + enumFieldValue = global::System.Convert.ToInt64(partValue); + break; + } + } + } + } + } + value |= enumFieldValue; + } + catch( global::System.FormatException ) + { + throw new global::System.ArgumentException(input, FullName); + } + } + + return global::System.Convert.ChangeType(value, global::System.Enum.GetUnderlyingType(this.UnderlyingType)); + } + throw new global::System.ArgumentException(input, FullName); + } + + // --- End of Interface methods + + public Activator Activator { get; set; } + public StaticInitializer StaticInitializer { get; set; } + public AddToCollection CollectionAdd { get; set; } + public AddToDictionary DictionaryAdd { get; set; } + public CreateFromStringMethod CreateFromStringMethod {get; set; } + public BoxInstanceMethod BoxInstance {get; set; } + + public void SetContentPropertyName(string contentPropertyName) + { + _contentPropertyName = contentPropertyName; + } + + public void SetIsArray() + { + _isArray = true; + } + + public void SetIsMarkupExtension() + { + _isMarkupExtension = true; + } + + public void SetIsBindable() + { + _isBindable = true; + } + + public void SetIsReturnTypeStub() + { + _isReturnTypeStub = true; + } + + public void SetIsLocalType() + { + _isLocalType = true; + } + + public void SetItemTypeName(string itemTypeName) + { + _itemTypeName = itemTypeName; + } + + public void SetKeyTypeName(string keyTypeName) + { + _keyTypeName = keyTypeName; + } + + public void SetBoxedType(global::Microsoft.UI.Xaml.Markup.IXamlType boxedType) + { + _boxedType = boxedType; + } + + public object BoxType(object instance) where T: struct + { + T unwrapped = (T)instance; + return new global::System.Nullable(unwrapped); + } + + public void AddMemberName(string shortName) + { + if(_memberNames == null) + { + _memberNames = new global::System.Collections.Generic.Dictionary(); + } + _memberNames.Add(shortName, FullName + "." + shortName); + } + + public void AddEnumValue(string name, object value) + { + if (_enumValues == null) + { + _enumValues = new global::System.Collections.Generic.Dictionary(); + } + _enumValues.Add(name, value); + } + } + + internal delegate object Getter(object instance); + internal delegate void Setter(object instance, object value); + + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.UI.Xaml.Markup.Compiler"," 3.0.0.2605")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + internal partial class XamlMember : global::Microsoft.UI.Xaml.Markup.IXamlMember + { + global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlTypeInfoProvider _provider; + string _name; + bool _isAttachable; + bool _isDependencyProperty; + bool _isReadOnly; + + string _typeName; + string _targetTypeName; + + public XamlMember(global::ProxmoxDesktop.App.ProxmoxDesktop_App_XamlTypeInfo.XamlTypeInfoProvider provider, string name, string typeName) + { + _name = name; + _typeName = typeName; + _provider = provider; + } + + public string Name { get { return _name; } } + + public global::Microsoft.UI.Xaml.Markup.IXamlType Type + { + get { return _provider.GetXamlTypeByName(_typeName); } + } + + public void SetTargetTypeName(string targetTypeName) + { + _targetTypeName = targetTypeName; + } + public global::Microsoft.UI.Xaml.Markup.IXamlType TargetType + { + get { return _provider.GetXamlTypeByName(_targetTypeName); } + } + + public void SetIsAttachable() { _isAttachable = true; } + public bool IsAttachable { get { return _isAttachable; } } + + public void SetIsDependencyProperty() { _isDependencyProperty = true; } + public bool IsDependencyProperty { get { return _isDependencyProperty; } } + + public void SetIsReadOnly() { _isReadOnly = true; } + public bool IsReadOnly { get { return _isReadOnly; } } + + public Getter Getter { get; set; } + public object GetValue(object instance) + { + if (Getter != null) + return Getter(instance); + else + throw new global::System.InvalidOperationException("GetValue"); + } + + public Setter Setter { get; set; } + public void SetValue(object instance, object value) + { + if (Setter != null) + Setter(instance, value); + else + throw new global::System.InvalidOperationException("SetValue"); + } + } +} + diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/apphost.exe b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/apphost.exe new file mode 100644 index 0000000000000000000000000000000000000000..3cabe72f75a5f1011adda58c51d8e166012b68fc GIT binary patch literal 163328 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/priconfig.xml.intermediate b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/priconfig.xml.intermediate new file mode 100644 index 0000000..73f7ff3 --- /dev/null +++ b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/priconfig.xml.intermediate @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/qualifiers.txt b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/qualifiers.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/qualifiers.txt.intermediate b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/qualifiers.txt.intermediate new file mode 100644 index 0000000..e69de29 diff --git a/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/ref/ProxmoxDesktop.dll b/src/ProxmoxDesktop.App/obj/x64/Debug/net10.0-windows10.0.19041.0/ref/ProxmoxDesktop.dll new file mode 100644 index 0000000000000000000000000000000000000000..4714887c7386326f92752f2a1e066bf0840d78f4 GIT binary patch literal 36352 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 literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/bin/Debug/net10.0-windows/ProxmoxDesktop.Core.xml b/src/ProxmoxDesktop.Core/bin/Debug/net10.0-windows/ProxmoxDesktop.Core.xml new file mode 100644 index 0000000..9dffb0e --- /dev/null +++ b/src/ProxmoxDesktop.Core/bin/Debug/net10.0-windows/ProxmoxDesktop.Core.xml @@ -0,0 +1,180 @@ + + + + ProxmoxDesktop.Core + + + + + Client HTTP asynchrone pour l'API Proxmox VE. + Toutes les méthodes sont async/await — aucun .GetAwaiter().GetResult(). + Utilise System.Text.Json (pas de Newtonsoft.Json). + Le mot de passe n'est jamais conservé après l'authentification. + + + + IP ou hostname du serveur Proxmox (sans https://). + Port de l'API PVE, généralement 8006. + Si true, accepte les certificats self-signed sans erreur. + + + + Récupère la liste des realms disponibles sur le serveur. + Appelé avant le login pour peupler le ComboBox de la LoginPage. + + + + + Tente l'authentification username/password (+TOTP optionnel). + Le mot de passe n'est pas conservé après cet appel. + + + + Renouvelle le ticket d'auth existant (appel toutes les ~90 min). + + + Retourne la liste des nœuds du cluster. + + + + Retourne toutes les VMs QEMU + containers LXC de tous les nœuds, + en parallèle (une requête par nœud pour chaque type). + + + + + Exécute une action d'alimentation sur une VM/CT. + : start | shutdown | reboot | stop | reset | suspend. + : true pour suspendre en mode hibernation (QEMU uniquement). + + + + + Génère l'URL d'accès à une console NoVNC ou xTermJS. + : "novnc" ou "xtermjs". + + + + Récupère la configuration SPICE pour une VM (QEMU uniquement). + + + + POST sur /access/ticket (sans auth cookie — utilisé pour login et renew). + + + + Enveloppe générique des réponses PVE : { "data": T } + + + Enveloppe quand data est un tableau. + + + Réponse de /access/ticket + + + + Ticket d'authentification PVE retourné par /access/ticket. + Seul le ticket et le CSRF sont conservés — le mot de passe n'est JAMAIS stocké ici. + + + + + Résultat d'une tentative de connexion. + Utilise un discriminated-union léger via les propriétés booléennes. + + + + + Représente une VM QEMU ou un container LXC retourné par l'API PVE. + Déclaré en tant que record pour autoriser l'expression 'with' dans ApiClient. + + + + Identifiant unique de la VM/CT. + + + Nom de la VM/CT. + + + Statut courant : "running", "stopped", "suspended", etc. + + + Nom du nœud tel que retourné par l'API list (champ "node"). + + + CPU usage (0.0 – 1.0) retourné par l'API. + + + RAM utilisée en octets. + + + RAM totale allouée en octets. + + + + Verrou opérationnel PVE (ex: "suspended", "migrate", "backup", null si aucun). + Utilisé pour déterminer les actions disponibles (Start, Resume, etc.). + + + + + Nombre de ports série configurés (QEMU uniquement). + Vaut 0 si la VM n'a pas de console série, 1 ou plus si elle en a une. + Utilisé pour activer l'accès xTermJS. + + + + Nom du nœud hôte injecté par ApiClient. + + + "qemu" ou "lxc" injecté par ApiClient. + + + True si la VM/CT est en cours d'exécution. + + + True si c'est un container LXC (et non une VM QEMU). + + + CPU en pourcentage (0–100). + + + RAM utilisée en pourcentage (0–100). + + + Résultat d'une action d'alimentation sur une VM/CT. + + + Commande acceptée par Proxmox VE. + + + Refusé : droits insuffisants (HTTP 403). + + + Erreur inattendue (timeout, nœud hors-ligne, etc.). + + + + Service de configuration persisté dans un fichier JSON local. + Remplace l'ancienne classe Configurations qui sauvegardait à chaque SetSetting(). + Sauvegarde uniquement lors d'un appel explicite à Save(). + Le mot de passe n'est JAMAIS stocké. + + + + Lit une valeur de configuration. Retourne la valeur par défaut si absente. + + + Définit une valeur. La sauvegarde n'est effectuée qu'après Save(). + + + Persiste la configuration sur disque (appel explicite uniquement). + + + + Lance une session SPICE via virt-viewer en générant un fichier .vv temporaire. + Logique identique à l'ancienne app WinForms, portée en async. + + + + diff --git a/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.deps.json b/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.deps.json new file mode 100644 index 0000000..cfc9e31 --- /dev/null +++ b/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": { + "ProxmoxDesktop.Core/1.0.0": { + "runtime": { + "ProxmoxDesktop.Core.dll": {} + } + } + } + }, + "libraries": { + "ProxmoxDesktop.Core/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.dll b/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..6f0624feb6483b60290035e3b714c72e47a02032 GIT binary patch literal 45056 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 literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.pdb b/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.pdb new file mode 100644 index 0000000000000000000000000000000000000000..4e62295731b36e8a645e2d0903af9c599f569488 GIT binary patch literal 20472 zcmb_^2Ut_d7w_BaGVu28w@3D~js-mr_Ju8LjP zy6fuNd+%#o%j&LW#dprVxo`#izwdqD%g4EMe{<%{Idi5@GK8ncg;Rtg_z?o7M1;Ez z^%05b2x3A;!HX8iJtaE}R#PKn%dpdao?}za{ zx_fK{gj*XC64M26c)kiV>svN>{<;f=v3qvTy>0*V5}y~vAGSg?$#hv|VP-{Wt1z7# z&=a65Kr?_KTk;MFvLoGigtUebZSM$_2heJCOZ%J8uueS9zr3o;VkkxC3S3BpMklh=aIQUOZ>51JW>wt8x8N<;C(mHA)pgLXMirzJWOjzZqn}* znG`^gnLrDHRt6xC{ZM2B#BHVHD6-oS9yWx()}*CKT41frInH|)c3=8KkvQzWhWF*1 zcl+Sl_$to(sF2$DcAaY9k8|D!b*_!SNxxH2yX@H44VXL*z5yeI5ix@}W~i73d=}%_ z5Dvr#zL9}10Ss*g;+XU}CYf+>CI{pA)fLDT_-FxsaLf{br&)ZLgH7T68jucHv`<1gIfZ2VWhl!K8U#=*$PKEX&ga>d)q21PAI!nX&*xy|7jQ80m7MZme^GJx zn7)vMG5rt@M!uSZk&g>nu0OOKjQk>wJ{${%axnIXVVv}s|8NdQ`Qke1M{xLhwU*_PmfboL?1uHN7@Hy`| zzaq!W3o?RLAj{1ZnZP@G7d=Xm#op!+S^x=YEcZc4YakmS9K|Ve(-%jJCO~#T_CPBk zb{nMH0ejFY(il8tOMB-qSaK9*-4n3(`wb*cgTz_L=>p__8ML^9<^(TS(4FDs0rsBf zdq5k}8+$-I@e+gr_lVa(cxpsCcvgxI!?US3p-jn9c$$$@-mdU|9-abn*E z{`QtoM&vAiAjJIVJrH7y#X5MmfTw^o5wC#vX7Ch{mg2+k-Uglm5(ZB*5-7e0F|qIz zkUsD*>39!f+Q3stx^)b7FeL#&p$-=0GQ11PqmC;eW^T|5h$(`n zkc=u66q19TS3pe1 zE-N6$0iHtArVA8blSP!OY&jXEQ7K8DRGFPG$GHtZ*5}$y+-=)9d_vhUt8w!y>_29u zb~|Bu(RM~UIhNi6knu+$gM2Aq0}-D?nN#(^&MS_~zD* zu44a~1lQSvt*5oiJaD&LPumGArtW#{xZh|{h}}r?;Xltc!u*U~f>@q*`f)LN-{AmT)uqLwDKL&m-t?i^xNr|13*5HMVC#%!bx$x;(Lcdr?+3 zAzIdQ#v!W&Rjxt_Rutve6W2F(Rc#;TcQ?7`wLP7p9pqC(p4{7WedVTo*N<+IKU#LI zM}9A>M5!!Kp_HQyb+zl$T;KdBdhS);KX+14tjES_SKI_G`?Yiv|B{~UDjW0XggL7% zlAs6;%Fc9scDH!W+^$_a>L0ao@zNP>>nLjZo6GuJBZnTi>-hWLxl^rDRKw)zA6S0I z^>)TD8@!x!on@82XZ}3BXMNQj!uxIIr5y)SZ&9xvS;q*|-f37WtvK*P0ku5m(_DxNv!KSd%u9R^&gY} zSex&(e5RAT`BL#O} zsW;kB4LMf%@5|U$+1|EY4y-egsFXR1Tn8p7QcJZ8l@jv~dltG6 z7~d>r+zq>NojyC*-8dZs)#Xkhvl^*mhRm2b^tJoNSA}D4Q`^d_e5T9@pBQ7L${J)eJkZ}bLY`HWYps-P zeZ(TM*D!@LTQyA6x`7@jiiT5QX?}MN9vzEvL1p7w(-)L3DP2*zwse@O2*o{&c31@>Zm;QtEKbki4l8jqt0F#e%|=QAF}>?$f;1NaIt$s z_Osa=YO%icV~4ty6crBnb^Flw>b~+3H;+4p6^3Gwz;ONWVa z723R_tRfgEWhxk|aD-D8cw>H=JnuTv-oAl;(x52g|b)6j^Gix|pa6wTc48 z2)a*@Y;1~Nh51DqQkXB*=BU&Kq-UT%QA3W30(p(qbYltf0%t)Vg4T%U`v!}Ae1ba! z`^%+4zJUS0vg~Ysxi}|C>>rpFkd+;fC6{GogZY6z{z1MnX^r`{nfk+*D9WPzd}&s` zoJ1<=AX}aTBQ42D3zI~8Mnr~pkM@Mti{v97AjVLVoE90DlH!>en-r0pna+kC8E(J; z@qpyC0nv~qBQg!s2iA*$q;=8+)r$$P7lZoih#5@r`7y(%VF}+KN%#)x?sp`d({TkWm)0 zbL$#Z7FFfNcQf7`KI3h)#k41lKh?@)DwKY{q7*eWU9Dm$3{#9?p3q@03f`JBto7s$ zzeG+Mvb(6=Po9_R3Z}_(6&kI&*dXTl@3@C#1#Bj)jaRSPvN3MLkd(-4E1$hC(8yHk zd_|TaS=Uvsj$l#VR6ou+r8Y`fEe^Z$D|O~?7`ioDSTjo1*=&XZV;7Rc6lwBCbFS*% ziKuxSZ>I78%neE})@bDgA{cmK64A!xRnUjRxvLDJxQ|aWrEb z)Oq~3*;vxbBf=wLM-N2mzm%Uk;OTn10a-@i+JI~CvCN4c>a8=Y4km85zH~4uVODGd z01CW=$jmDWcr_MWIwIO4yS6%SY9kb;BDFO;RbN}5^$9+qmy)6|rBbD(hd@ZESl673#aKS~)qxizm%||vg3R|$Ex7$X$|%dPU>Bs<85+ z7mYXfUwxz|2V9C7)?fyaOS__8qs<2v(+*%7Yr%sRj@== zP@qz>rW=oWLRP@H)296j5BB*SH$Hr5K$nX2bzA|IN|$RRhr<#9=XAEs3^iT%7R#U> zE%{8s$HeTX?DltB*{&T|mZ|07(yPzVtalOrj;ngSH*&|*l-@2I`dhIn71CU#N~2ZC z=VI2yvON*lu7)aWiKv<$`;ES5TzHDhH}Ms??ktWvIxiOk`aH! zjGZGJ8T>}QuOYD-?dkN2!jQxAo%T?va6Z?n%RPO+c3C+9HL+eVpvqt z%RHvg_w~0Yqva)TZ>OyeZIU=a9A9XE&cUvM3}CG#lWW)_yQLI<#lE;{bNBJtb~dpG zxBT(=d1{mD1_aZ!QrX}P@E6+vu4c+kpr>aHemd6Z(!H39F(qFVkp~2X;UCyvH`WQvH1S#3JJ)Hg{MN z*XDTSaPa~xN8}%Wm6usOj@q{9*DIgnN=Ti=^#+scjozNZx@(jlI-*PUjhL#}t7KZ6 zQL|V%W=SeaV-}YN^N;RwyobuZw2+OfUgnTEO_i|htDE|PK`08Aq*CY*VH%~6L1O-i zrPWyA-tQjkPLa5%@>T2mr~mFs)se`MventWXzNi_adU`ux24OJ5tSiDEsU%EpBn_2 zU6x@Zj zjlCnO`m6W#0}_{J4T{toSxg;EPNMWQ%dD>x>_bCmFS>KC$aj+7ARU_wvwT6J8oCS& zN1|}GN}I1Rc*b|bvuYG=-r;GFy$`;G&;IzTsq6cJrVWcS#%|vic?7+={OF{q*HL9md;YbB$Ipf@%_;9Eo~AKsSiHBQ5OXk?`_gIC zER@|^{ZDN5ldg#e+Pvb$J&9l!Hc(PVN8%@4DWZ5rb#TlI zli_HB%PqAk-;hC(XUgxG!2pvP@!R&Cj@aMKxAJ-~>6QjFV07BvTu#^F={YxtkgpTs zXT*_`dCR6XZcrpb4Qo=)=x6Hj3qAVT$FyvcHcuTj|J{N|JFnkl7Xwf*j=}Z1QOn0i z_n@^M52;<)v++OO11LrbgfDadr5YAL#YXTvW&6FRyZ?)x6TGRNPxWVZnFuNq`a5lF`51Xj}!Zt<^88CWY z+I>UXBsjKZO1vZF^CGPMZ?^Yse3nR}_YAUK=-oo9<|K@PQyN3+qf0GbW46neW`_i5 z?nEt&^VogA!dhH6bsQYy8$@P^EvI0mzjy0EElZvgS*o&34V^a3zK%$p8UI53khdtc z?yPrUmH*Q48NLh6a z9($|ui*RRVu+3!Fl`mNMJK7$bZV105Pl@|&U0y;pJE)+SfQG5mgK;pyiLX}novd#) z>O4KUX^&AiJR%PXXF7d~nDv^YGo^M4FYX+45H(Fv8|{m1H!f~oVZZf@?oD8uK5D8r z?hN1d;5KSV(R&JSPkR|Te$v6Rced$=I2uxmYIbZRCwEzl9-H5D!0e66sK|xCKi#3b zHno70I!!*LNUo__&9?nBbrUWsAL%!xz1Y4XzSQSo&feD{eK->7a@f8qwCp~;e~-0y zaMfb{-)%>!)+}tx{<)KnnqFM?odg~er^D8W-XF1D#7z`+3(LQ^)8Cq~f9}T4eqGk8 zU6l2jI+Ac8oT5_H?3Uks-f<44&g{SIv~2S?Nu}PpaN^esySP#+{0@Ru(Q-1zI}y$8&}r5DzG>sbZhKSo_&lo>^cu? z21H`y(rmf9c582FKtAt3m!pC17X{_B6HG$a-hJ?_!^ckxzt@MSm#holo7f&giBpR` z)0as2iSxEjS=J_AlK8zux}j9xS-O*#{R%}>=Qdx}MC`gX3wr5S z_qVArnK@zCh~OJE=!ph<$GU8x3)*tn)*wf((FyuFYnob)vO3s+6eFKVFE3c}j9xG1 zqtfZiVy{-dY8x|Uz?eZhN&{=_h*ipLO$|!>>m~H+b;TE}OO5>^V#c3&zW49nlHapR z4cjT)6~Mv_#zOjwE)6VhG}0V)g-3mR_!(8tjqlKQl$~GF{w>~xXF9jN^?%ERIpviY zOyRfdMxWdam*i2}lM~`MTy^>o7IlH$5`4e2OY49C9vNs!8apgn`Lc0-*n|Ydzw2GT zbgZMYUez2knf(z>%{*9=YW#If{JiiE8%||UNUkFn11GSx>(Gv$JJILWr^XrS-;$iT zwL`C;FH~GjkOys+1lmSg>zZS z>=7DUV(>S8WXm0})_i+Q*Vy*ftDEjmCed3(Q`T-8cxXl)h2M)Z#{qC`Q&UvSM)ZWU z+GUwb$dbo#TjI|CcjuStrvEb+&T?_gk(uH7BJp;15kgzdBq{bc1f zz3u-Lja151*|jTd&5$cPRDXDUYO{}jl}D9rJ(D}r@6z`FnMZP=T$!$6t9{^{V^c8; z*;n-@;<7VNcY4B>0l8JJ|7RBU+TIXHt96*mz;<4?FFfx=&klS)>}+#Cc9Gn0E%Xc! z2TR}>Uy%df5#!hXjAM4Re@G7k%8_FpRD38%EZH|s|;UQB9r$G3M-b76Ul z&;i?L#Vjfg{FAa>U0BzCFj*;66iV50pY*JtHz!G3PWkkA>nfSHKlotId8-ybmV>YV z@JA8`D{r~CK8?eypWl`4w`@j6Rh;(tz_ZEgSy!GmSI%6$Gl;HS{trFqRB2OFTb=(k zbnb}7S5A)Ew4+9po;#VvBP_!WQsdJn(Fcf0zsM@jr4}bmIO&p=;SyG>ke2%XAbXE` z`FeEDvv=R*%Yu2Kb6*!Zy!4;5$Dj!hphY!JN&>$SN`Z3-wuJo_Ub~CJx0l==u(^pY zreyZtO}3WpWe4!@g_+85*;KX#MVwwuebQpa;)LlJj4wMhS{T-#zIt=+s}VobUl}}{ zSK4*thz+5;HOW`cIymfaNLqs%6oY3bD|?k=Rm4So-QDWn%VGPLhJQ?4wDT)hjx*Zc z7~;5%=qM6=Z?@Y4qi)HoPGn8sCWr58i}I!F`o|tUJpY6TV^>PtH1`U|Ms(I4tF45(W zx8{BRfy#P~=F^A9_fbB(bCLJ*C-WrJou3%*ZI_3t; zzRjfrGFL~h`qH%VhJs$%88#CeT;Dz$-ni-VBPvDa|8Do#G4%&hDe(1-LGt#gO!^zz z;Um0D)gHN_)ABTXzU7{0&)RCMCIf!?!milI{CVgs8u@M4tmeli$|V~~bxF%*$@5rs zYAGzT4PU-9PMx+(J02zC1QqXJyW1yD+_*jH)8qr})CylW)k-9&;0HPe^CF#Ie8YlW z&Z&OkX?h}N`J|0`cQ5W_o!LX0UnI{cDy%s?x6y2+i*u%H-~S#suTEUMca!C{?Nz4? zmeqFAfZ1NdJO*KWZaB)AH<{9*t6dj)~<8LME|z{%UHQ) z?zUzRD`IxK>ECV{@?2!d6%%p}N7tnsSb{dpI{xO`2L9~i%5Spy_s@(Uz)8()&c53% zZGZF=+{)mQeiCtuo*z_+ON)-(n*5>VMvm0?OG>8NjwQQPqOx(RcEa}-$#Hu}TwUYx*U7f?E?IqQ|mEhCCu_zRA|G+2SlhG+muww*f+kE1L>m!fT9^odLHNKR{wN+$<7Zru;8b1XXEs8FzhBlk zHSDP^-qe;*6JA>iuB!R-!8vWgIpI7(Q?$;SCxGAWgULL&r{9e5;W9682tYK#n(&3d zP?%CdJRz~C?2I9$4+yvB37V5eJc7k7jx&MSAcz(61aNJ^2x6OI6+j7dDbkfEupw#i zZv+@8S{sD8Wu=I27MAl+A7h@7(#?bXcyU(7KBjPavpwrlAD$qEbmGHR5+M(~2Wnz@ zf;N0Uzu1c!0e8wlTd}#Jok9C_sC}iIs)#wQ)wuqst+Bs__h{IMm6=p!7B)C=X5|QI zb|zFJ;pwKCn1J;!DNAUCy7`puwX>76ZkZ|A*NmrIY5}qO*3Np7bIB8Io_a4{$zuT~ zec-Hn0Ujf|=K@Mh>Hc%p8za>7O@N!}>;QE^?5$lWOgov84Y97fQd}S>KwDY-K?Of}pc*iL*YP?q-X5`ZSEx z3!U|io%L7f!ZqUQFI!XgR1&3oNa=%}dpPS}qMhA&x)&|rP7tN<3E8DVtr5641q>t7 z6WbBR8^Yt|InpTxK#C@YW|W0phGq)gX{G|0Ry+YT3v6T19c_3rA+a^IC}=f&zMV0B z$;poR8d=*lSd);9SQs^90uKy?M*g%=2V!nyjS+mab{H6&(YK)Z<_t1tkOhM*M0oQ_ zXclCF?U8<4tpn*K!e9)Hgi^g6YDKW1j#%@c#B;j}M9qRjA`6Va6s3p4v>@Fuj5 z0au!!Kj}wEJiZmvc9`NgLyS$6X(V8ffI(&qGGmZAgUlIZ!5|9;2^l0zrmN4i7hQAo zgHh6nQ4-21=}aR*7>&#rWJaT|mSz|!WUS%~oEQOD40r;%jqptq5E+}MGCT$e7-YsE zGX|M6$eckI46HQSu)6yK~@a1VvuzrtvKzQBjhL%_5{tBy3XqD#(il0l;;z37y746IP~`#K=@(4Di*aD*2C@aF{y zPC|jvM3@$F0g%8GMB@GK-aNPt>Bxh7xlkB$;xC}`O%mG?V-r{i(DN+(ixenLODL5B zLi$oB-lE+Hq}xW91uvpT0JP(T!se76<>m(-(LE;t*nPkZ7%0(_DzGGk_HqH=#Dut! zuCNHgyX3I`@x}kCz;U1+Bv%0Gc6dVW2|&6Xu7IKL@Y!%^Nh=52-1I%5DxDx1XopJI zi$OJAV_mS==#EA(q{H>kP#)=k?hy0vmMHw29Fk=L%QF`tiQ*9t`XWB$2kF17-no$T z4j^4sPhbs4>#DHt;v7PMFtnwu(Sg%=x|?qLbT}f1(xOGMSkwK-S_JDp7g)OxCtQm- z5f}=7Lfy?_DS`j?q5vzYEt)1I{-*HHixTZ&l4Yt*NW`WjnxEQ=_+haELEdx(pOggA z|5(WeTO(a>=)S>dMB`m|>1~}_Z+P)}AE(g*bpq+>pl<|Y18SO-9q$CieFjMHR5s+sJPtYE{1MNXb zlIXfp!PH%&0509uc1LIp@Gk{G!Qp@4X^*ZrOgG{C236dUX+_X@+;qzb>Eptvg*wwW z2fdBxrKu4pg?<^w?<2#eV?p53G}z83PCS7FiQpHDuw8R%j!)9D=3sdWoq=uXbm1v5 z0ZXbo>I#}LBl^=&NIM%Ay*%A`5Y>6JWvHLoPb zt>g*el};stT0$}?1oqX=Y|rS*_EkIB{Xk!J;=x`3mRTY!RVcsMvtGw-!E>Q&K}foq zLMM_yxuIP((1Fi@x|cw@-~xZNnor$PAANm(gU}1;A>n5GJO^dNuUi;;f!OCqYktH#w4~K&|Vx0nc}#jJKY-0 ziA0l5y8?#d;{NxX`^oO)!-Z@_zuk)asZ3 literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.xml b/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.xml new file mode 100644 index 0000000..9dffb0e --- /dev/null +++ b/src/ProxmoxDesktop.Core/bin/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.xml @@ -0,0 +1,180 @@ + + + + ProxmoxDesktop.Core + + + + + Client HTTP asynchrone pour l'API Proxmox VE. + Toutes les méthodes sont async/await — aucun .GetAwaiter().GetResult(). + Utilise System.Text.Json (pas de Newtonsoft.Json). + Le mot de passe n'est jamais conservé après l'authentification. + + + + IP ou hostname du serveur Proxmox (sans https://). + Port de l'API PVE, généralement 8006. + Si true, accepte les certificats self-signed sans erreur. + + + + Récupère la liste des realms disponibles sur le serveur. + Appelé avant le login pour peupler le ComboBox de la LoginPage. + + + + + Tente l'authentification username/password (+TOTP optionnel). + Le mot de passe n'est pas conservé après cet appel. + + + + Renouvelle le ticket d'auth existant (appel toutes les ~90 min). + + + Retourne la liste des nœuds du cluster. + + + + Retourne toutes les VMs QEMU + containers LXC de tous les nœuds, + en parallèle (une requête par nœud pour chaque type). + + + + + Exécute une action d'alimentation sur une VM/CT. + : start | shutdown | reboot | stop | reset | suspend. + : true pour suspendre en mode hibernation (QEMU uniquement). + + + + + Génère l'URL d'accès à une console NoVNC ou xTermJS. + : "novnc" ou "xtermjs". + + + + Récupère la configuration SPICE pour une VM (QEMU uniquement). + + + + POST sur /access/ticket (sans auth cookie — utilisé pour login et renew). + + + + Enveloppe générique des réponses PVE : { "data": T } + + + Enveloppe quand data est un tableau. + + + Réponse de /access/ticket + + + + Ticket d'authentification PVE retourné par /access/ticket. + Seul le ticket et le CSRF sont conservés — le mot de passe n'est JAMAIS stocké ici. + + + + + Résultat d'une tentative de connexion. + Utilise un discriminated-union léger via les propriétés booléennes. + + + + + Représente une VM QEMU ou un container LXC retourné par l'API PVE. + Déclaré en tant que record pour autoriser l'expression 'with' dans ApiClient. + + + + Identifiant unique de la VM/CT. + + + Nom de la VM/CT. + + + Statut courant : "running", "stopped", "suspended", etc. + + + Nom du nœud tel que retourné par l'API list (champ "node"). + + + CPU usage (0.0 – 1.0) retourné par l'API. + + + RAM utilisée en octets. + + + RAM totale allouée en octets. + + + + Verrou opérationnel PVE (ex: "suspended", "migrate", "backup", null si aucun). + Utilisé pour déterminer les actions disponibles (Start, Resume, etc.). + + + + + Nombre de ports série configurés (QEMU uniquement). + Vaut 0 si la VM n'a pas de console série, 1 ou plus si elle en a une. + Utilisé pour activer l'accès xTermJS. + + + + Nom du nœud hôte injecté par ApiClient. + + + "qemu" ou "lxc" injecté par ApiClient. + + + True si la VM/CT est en cours d'exécution. + + + True si c'est un container LXC (et non une VM QEMU). + + + CPU en pourcentage (0–100). + + + RAM utilisée en pourcentage (0–100). + + + Résultat d'une action d'alimentation sur une VM/CT. + + + Commande acceptée par Proxmox VE. + + + Refusé : droits insuffisants (HTTP 403). + + + Erreur inattendue (timeout, nœud hors-ligne, etc.). + + + + Service de configuration persisté dans un fichier JSON local. + Remplace l'ancienne classe Configurations qui sauvegardait à chaque SetSetting(). + Sauvegarde uniquement lors d'un appel explicite à Save(). + Le mot de passe n'est JAMAIS stocké. + + + + Lit une valeur de configuration. Retourne la valeur par défaut si absente. + + + Définit une valeur. La sauvegarde n'est effectuée qu'après Save(). + + + Persiste la configuration sur disque (appel explicite uniquement). + + + + Lance une session SPICE via virt-viewer en générant un fichier .vv temporaire. + Logique identique à l'ancienne app WinForms, portée en async. + + + + diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs new file mode 100644 index 0000000..925b135 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfo.cs b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfo.cs new file mode 100644 index 0000000..9bffa20 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("ProxmoxDesktop.Core")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f9bafedd53e29c36a7062fc9d018a5272c68866b")] +[assembly: System.Reflection.AssemblyProductAttribute("ProxmoxDesktop.Core")] +[assembly: System.Reflection.AssemblyTitleAttribute("ProxmoxDesktop.Core")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfoInputs.cache b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c2414a3 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +138719d4574d694caf387237cce3703f3f5d5fb78d02e026697ac0eeb874eb29 diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.GeneratedMSBuildEditorConfig.editorconfig b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..05bac50 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,19 @@ +is_global = true +build_property.TargetFramework = net10.0-windows +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v10.0 +build_property.TargetPlatformMinVersion = 7.0 +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property.EntryPointFilePath = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = ProxmoxDesktop.Core +build_property.ProjectDir = C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 10.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.GlobalUsings.g.cs b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.assets.cache b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..c10863159a6b2e12ca295b7d7ba8011cfa99e24d GIT binary patch literal 151 zcmWIWc6a1qU|=|~?X839@uq7ZTX)`e4!If=E>yd6R#xrivaNk?<#V2gP6nzW7BB)8 m$~jxbgche36~}nzr&Y%2<&~zVmc$e!CTAz6rxwQ$G710(-yc8# literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.CoreCompileInputs.cache b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..99c3037 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +4cbbb35c7bc42ebe5ad0f4592b7375d25a77fd86027186d6c2747d2b66ae77a4 diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.FileListAbsolute.txt b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..8aac086 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.FileListAbsolute.txt @@ -0,0 +1,14 @@ +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ProxmoxDesktop.Core.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ProxmoxDesktop.Core.AssemblyInfoInputs.cache +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ProxmoxDesktop.Core.AssemblyInfo.cs +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ProxmoxDesktop.Core.csproj.CoreCompileInputs.cache +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ProxmoxDesktop.Core.sourcelink.json +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\bin\Debug\net10.0-windows\ProxmoxDesktop.Core.deps.json +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\bin\Debug\net10.0-windows\ProxmoxDesktop.Core.dll +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\bin\Debug\net10.0-windows\ProxmoxDesktop.Core.pdb +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\bin\Debug\net10.0-windows\ProxmoxDesktop.Core.xml +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ProxmoxDesktop.Core.dll +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\refint\ProxmoxDesktop.Core.dll +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ProxmoxDesktop.Core.xml +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ProxmoxDesktop.Core.pdb +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\Debug\net10.0-windows\ref\ProxmoxDesktop.Core.dll diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.dll b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..cefc2f90daee920f3b4610c32fe383cb6deba540 GIT binary patch literal 45568 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 literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.sourcelink.json b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.sourcelink.json new file mode 100644 index 0000000..cd1aad1 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.sourcelink.json @@ -0,0 +1 @@ +{"documents":{"C:\\Users\\Kofy\\Documents\\GitHub\\Proxmox-Desktop\\*":"https://raw.githubusercontent.com/Kofysh/Proxmox-Desktop/f9bafedd53e29c36a7062fc9d018a5272c68866b/*"}} \ No newline at end of file diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.xml b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.xml new file mode 100644 index 0000000..9dffb0e --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ProxmoxDesktop.Core.xml @@ -0,0 +1,180 @@ + + + + ProxmoxDesktop.Core + + + + + Client HTTP asynchrone pour l'API Proxmox VE. + Toutes les méthodes sont async/await — aucun .GetAwaiter().GetResult(). + Utilise System.Text.Json (pas de Newtonsoft.Json). + Le mot de passe n'est jamais conservé après l'authentification. + + + + IP ou hostname du serveur Proxmox (sans https://). + Port de l'API PVE, généralement 8006. + Si true, accepte les certificats self-signed sans erreur. + + + + Récupère la liste des realms disponibles sur le serveur. + Appelé avant le login pour peupler le ComboBox de la LoginPage. + + + + + Tente l'authentification username/password (+TOTP optionnel). + Le mot de passe n'est pas conservé après cet appel. + + + + Renouvelle le ticket d'auth existant (appel toutes les ~90 min). + + + Retourne la liste des nœuds du cluster. + + + + Retourne toutes les VMs QEMU + containers LXC de tous les nœuds, + en parallèle (une requête par nœud pour chaque type). + + + + + Exécute une action d'alimentation sur une VM/CT. + : start | shutdown | reboot | stop | reset | suspend. + : true pour suspendre en mode hibernation (QEMU uniquement). + + + + + Génère l'URL d'accès à une console NoVNC ou xTermJS. + : "novnc" ou "xtermjs". + + + + Récupère la configuration SPICE pour une VM (QEMU uniquement). + + + + POST sur /access/ticket (sans auth cookie — utilisé pour login et renew). + + + + Enveloppe générique des réponses PVE : { "data": T } + + + Enveloppe quand data est un tableau. + + + Réponse de /access/ticket + + + + Ticket d'authentification PVE retourné par /access/ticket. + Seul le ticket et le CSRF sont conservés — le mot de passe n'est JAMAIS stocké ici. + + + + + Résultat d'une tentative de connexion. + Utilise un discriminated-union léger via les propriétés booléennes. + + + + + Représente une VM QEMU ou un container LXC retourné par l'API PVE. + Déclaré en tant que record pour autoriser l'expression 'with' dans ApiClient. + + + + Identifiant unique de la VM/CT. + + + Nom de la VM/CT. + + + Statut courant : "running", "stopped", "suspended", etc. + + + Nom du nœud tel que retourné par l'API list (champ "node"). + + + CPU usage (0.0 – 1.0) retourné par l'API. + + + RAM utilisée en octets. + + + RAM totale allouée en octets. + + + + Verrou opérationnel PVE (ex: "suspended", "migrate", "backup", null si aucun). + Utilisé pour déterminer les actions disponibles (Start, Resume, etc.). + + + + + Nombre de ports série configurés (QEMU uniquement). + Vaut 0 si la VM n'a pas de console série, 1 ou plus si elle en a une. + Utilisé pour activer l'accès xTermJS. + + + + Nom du nœud hôte injecté par ApiClient. + + + "qemu" ou "lxc" injecté par ApiClient. + + + True si la VM/CT est en cours d'exécution. + + + True si c'est un container LXC (et non une VM QEMU). + + + CPU en pourcentage (0–100). + + + RAM utilisée en pourcentage (0–100). + + + Résultat d'une action d'alimentation sur une VM/CT. + + + Commande acceptée par Proxmox VE. + + + Refusé : droits insuffisants (HTTP 403). + + + Erreur inattendue (timeout, nœud hors-ligne, etc.). + + + + Service de configuration persisté dans un fichier JSON local. + Remplace l'ancienne classe Configurations qui sauvegardait à chaque SetSetting(). + Sauvegarde uniquement lors d'un appel explicite à Save(). + Le mot de passe n'est JAMAIS stocké. + + + + Lit une valeur de configuration. Retourne la valeur par défaut si absente. + + + Définit une valeur. La sauvegarde n'est effectuée qu'après Save(). + + + Persiste la configuration sur disque (appel explicite uniquement). + + + + Lance une session SPICE via virt-viewer en générant un fichier .vv temporaire. + Logique identique à l'ancienne app WinForms, portée en async. + + + + diff --git a/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ref/ProxmoxDesktop.Core.dll b/src/ProxmoxDesktop.Core/obj/Debug/net10.0-windows/ref/ProxmoxDesktop.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..6eccb3b1a7e2e4d41af71da625394923691b0793 GIT binary patch literal 17920 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 +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfo.cs b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfo.cs new file mode 100644 index 0000000..f353ced --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("ProxmoxDesktop.Core")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+263a862a4fa4f25eb576fc6d5d4008e2b16ce7b6")] +[assembly: System.Reflection.AssemblyProductAttribute("ProxmoxDesktop.Core")] +[assembly: System.Reflection.AssemblyTitleAttribute("ProxmoxDesktop.Core")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfoInputs.cache b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfoInputs.cache new file mode 100644 index 0000000..06db6e9 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6598ce5d9002b5cff5cc663c9a7b1b8b468806013ee3e90660ef469695387c09 diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.GeneratedMSBuildEditorConfig.editorconfig b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..05bac50 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,19 @@ +is_global = true +build_property.TargetFramework = net10.0-windows +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v10.0 +build_property.TargetPlatformMinVersion = 7.0 +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property.EntryPointFilePath = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = ProxmoxDesktop.Core +build_property.ProjectDir = C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 10.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.GlobalUsings.g.cs b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.assets.cache b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..576654bfa1a75f27cfc797b52dc2c617cd3f1ef2 GIT binary patch literal 151 zcmWIWc6a1qU|{gv5!@zIaQpDORjZGu|Njsn`f=Hv_wgGTioW!JSs7(EVKPt+v49b% mP|n#ZCbT%Us5r(uKdmxGFRwH`wIrq>F*!RiJ+(N7kWm0-9UvM2 literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.CoreCompileInputs.cache b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..de87430 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +4e92d1899482c8acb508a5c9f48ae00c79850ad42353952db588d81bf3e016bd diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.FileListAbsolute.txt b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..3461375 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.csproj.FileListAbsolute.txt @@ -0,0 +1,14 @@ +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\bin\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.deps.json +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\bin\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.dll +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\bin\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.pdb +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\bin\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.xml +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.AssemblyInfoInputs.cache +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.AssemblyInfo.cs +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.csproj.CoreCompileInputs.cache +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.sourcelink.json +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.dll +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\refint\ProxmoxDesktop.Core.dll +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.xml +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ProxmoxDesktop.Core.pdb +C:\Users\Kofy\Documents\GitHub\Proxmox-Desktop\src\ProxmoxDesktop.Core\obj\x64\Debug\net10.0-windows\ref\ProxmoxDesktop.Core.dll diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.dll b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..6f0624feb6483b60290035e3b714c72e47a02032 GIT binary patch literal 45056 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 literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.pdb b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.pdb new file mode 100644 index 0000000000000000000000000000000000000000..4e62295731b36e8a645e2d0903af9c599f569488 GIT binary patch literal 20472 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 literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.sourcelink.json b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.sourcelink.json new file mode 100644 index 0000000..e55a823 --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.sourcelink.json @@ -0,0 +1 @@ +{"documents":{"C:\\Users\\Kofy\\Documents\\GitHub\\Proxmox-Desktop\\*":"https://raw.githubusercontent.com/Kofysh/Proxmox-Desktop/263a862a4fa4f25eb576fc6d5d4008e2b16ce7b6/*"}} \ No newline at end of file diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.xml b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.xml new file mode 100644 index 0000000..9dffb0e --- /dev/null +++ b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ProxmoxDesktop.Core.xml @@ -0,0 +1,180 @@ + + + + ProxmoxDesktop.Core + + + + + Client HTTP asynchrone pour l'API Proxmox VE. + Toutes les méthodes sont async/await — aucun .GetAwaiter().GetResult(). + Utilise System.Text.Json (pas de Newtonsoft.Json). + Le mot de passe n'est jamais conservé après l'authentification. + + + + IP ou hostname du serveur Proxmox (sans https://). + Port de l'API PVE, généralement 8006. + Si true, accepte les certificats self-signed sans erreur. + + + + Récupère la liste des realms disponibles sur le serveur. + Appelé avant le login pour peupler le ComboBox de la LoginPage. + + + + + Tente l'authentification username/password (+TOTP optionnel). + Le mot de passe n'est pas conservé après cet appel. + + + + Renouvelle le ticket d'auth existant (appel toutes les ~90 min). + + + Retourne la liste des nœuds du cluster. + + + + Retourne toutes les VMs QEMU + containers LXC de tous les nœuds, + en parallèle (une requête par nœud pour chaque type). + + + + + Exécute une action d'alimentation sur une VM/CT. + : start | shutdown | reboot | stop | reset | suspend. + : true pour suspendre en mode hibernation (QEMU uniquement). + + + + + Génère l'URL d'accès à une console NoVNC ou xTermJS. + : "novnc" ou "xtermjs". + + + + Récupère la configuration SPICE pour une VM (QEMU uniquement). + + + + POST sur /access/ticket (sans auth cookie — utilisé pour login et renew). + + + + Enveloppe générique des réponses PVE : { "data": T } + + + Enveloppe quand data est un tableau. + + + Réponse de /access/ticket + + + + Ticket d'authentification PVE retourné par /access/ticket. + Seul le ticket et le CSRF sont conservés — le mot de passe n'est JAMAIS stocké ici. + + + + + Résultat d'une tentative de connexion. + Utilise un discriminated-union léger via les propriétés booléennes. + + + + + Représente une VM QEMU ou un container LXC retourné par l'API PVE. + Déclaré en tant que record pour autoriser l'expression 'with' dans ApiClient. + + + + Identifiant unique de la VM/CT. + + + Nom de la VM/CT. + + + Statut courant : "running", "stopped", "suspended", etc. + + + Nom du nœud tel que retourné par l'API list (champ "node"). + + + CPU usage (0.0 – 1.0) retourné par l'API. + + + RAM utilisée en octets. + + + RAM totale allouée en octets. + + + + Verrou opérationnel PVE (ex: "suspended", "migrate", "backup", null si aucun). + Utilisé pour déterminer les actions disponibles (Start, Resume, etc.). + + + + + Nombre de ports série configurés (QEMU uniquement). + Vaut 0 si la VM n'a pas de console série, 1 ou plus si elle en a une. + Utilisé pour activer l'accès xTermJS. + + + + Nom du nœud hôte injecté par ApiClient. + + + "qemu" ou "lxc" injecté par ApiClient. + + + True si la VM/CT est en cours d'exécution. + + + True si c'est un container LXC (et non une VM QEMU). + + + CPU en pourcentage (0–100). + + + RAM utilisée en pourcentage (0–100). + + + Résultat d'une action d'alimentation sur une VM/CT. + + + Commande acceptée par Proxmox VE. + + + Refusé : droits insuffisants (HTTP 403). + + + Erreur inattendue (timeout, nœud hors-ligne, etc.). + + + + Service de configuration persisté dans un fichier JSON local. + Remplace l'ancienne classe Configurations qui sauvegardait à chaque SetSetting(). + Sauvegarde uniquement lors d'un appel explicite à Save(). + Le mot de passe n'est JAMAIS stocké. + + + + Lit une valeur de configuration. Retourne la valeur par défaut si absente. + + + Définit une valeur. La sauvegarde n'est effectuée qu'après Save(). + + + Persiste la configuration sur disque (appel explicite uniquement). + + + + Lance une session SPICE via virt-viewer en générant un fichier .vv temporaire. + Logique identique à l'ancienne app WinForms, portée en async. + + + + diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ref/ProxmoxDesktop.Core.dll b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/ref/ProxmoxDesktop.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..5962873796af246754b0c91245b2c7a388fdf0d4 GIT binary patch literal 16896 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 Axc~qF literal 0 HcmV?d00001 diff --git a/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/refint/ProxmoxDesktop.Core.dll b/src/ProxmoxDesktop.Core/obj/x64/Debug/net10.0-windows/refint/ProxmoxDesktop.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..5962873796af246754b0c91245b2c7a388fdf0d4 GIT binary patch literal 16896 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 Axc~qF literal 0 HcmV?d00001