[EnvVar][Hosts][RegPrev]Decouple and refactor to make it "packable" as nuget package (#32604)

* WIP Hosts - remove deps

* Add consumer app

* Move App and MainWindow to Consumer app. Make Hosts dll

* Try consume it

* Fix errors

* Make it work with custom build targets

* Dependency injection
Refactor
Explicit page creation
Wire missing dependencies

* Fix installer

* Remove unneeded stuff

* Fix build again

* Extract UI and logic from MainWindow to RegistryPreviewMainPage

* Convert to lib
Change namespace to RegistryPreviewUILib
Remove PT deps

* Add exe app and move App.xaml and MainWindow.xaml

* Consume the lib

* Update Hosts package creation

* Fix RegistryPreview package creation

* Rename RegistryPreviewUI back to RegistryPreview

* Back to consuming lib

* Ship icons and assets in nuget packages

* Rename to EnvironmentVariablesUILib and convert to lib

* Add app and consume

* Telemetry

* GPO

* nuget

* Rename HostsPackageConsumer to Hosts and Hosts lib to HostsUILib

* Assets cleanup

* nuget struct

* v0

* assets

* [Hosts] Re-add AppList to Lib Assets, [RegPrev] Copy lib assets to out dir

* Sign UI dlls

* Revert WinUIEx bump

* Cleanup

* Align deps

* version exception dll

* Fix RegistryPreview crashes

* XAML format

* XAML format 2

* Pack .pri files in lib/ dir

---------

Co-authored-by: Darshak Bhatti <dabhatti@microsoft.com>
This commit is contained in:
Stefan Markovic
2024-04-26 19:41:44 +02:00
committed by GitHub
parent 28ba2bd301
commit 41a0114efe
125 changed files with 2097 additions and 1212 deletions

View File

@@ -0,0 +1,188 @@
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Net;
using System.Text;
using CommunityToolkit.Mvvm.ComponentModel;
using HostsUILib.Helpers;
namespace HostsUILib.Models
{
public partial class Entry : ObservableObject
{
private static readonly char[] _spaceCharacters = new char[] { ' ', '\t' };
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(Valid))]
[NotifyPropertyChangedFor(nameof(IsAddressValid))]
private string _address;
partial void OnAddressChanged(string value)
{
if (ValidationHelper.ValidIPv4(value))
{
Type = AddressType.IPv4;
}
else if (ValidationHelper.ValidIPv6(value))
{
Type = AddressType.IPv6;
}
else
{
Type = AddressType.Invalid;
}
}
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(Valid))]
[NotifyPropertyChangedFor(nameof(IsHostsValid))]
private string _hosts;
partial void OnHostsChanged(string value)
{
SplittedHosts = value.Split(' ');
}
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(Valid))]
private string _comment;
[ObservableProperty]
private bool _active;
[ObservableProperty]
private bool? _ping;
[ObservableProperty]
private bool _pinging;
[ObservableProperty]
private bool _duplicate;
public bool Valid => Validate(true);
public bool IsAddressValid => ValidateAddressField();
public bool IsHostsValid => ValidateHostsField(true);
public string Line { get; private set; }
public AddressType Type { get; private set; }
public string[] SplittedHosts { get; private set; }
public int Id { get; set; }
public Entry()
{
}
public Entry(int id, string line)
{
Id = id;
Line = line.Trim();
Parse();
}
public Entry(int id, string address, string hosts, string comment, bool active)
{
Id = id;
Address = address.Trim();
Hosts = hosts.Trim();
Comment = comment.Trim();
Active = active;
}
public void Parse()
{
Active = !Line.StartsWith("#", StringComparison.InvariantCultureIgnoreCase);
var lineSplit = Line.TrimStart(' ', '#').Split('#');
if (lineSplit.Length == 0)
{
return;
}
var addressHost = lineSplit[0];
var addressHostSplit = addressHost.Split(_spaceCharacters, StringSplitOptions.RemoveEmptyEntries);
var hostsBuilder = new StringBuilder();
var commentBuilder = new StringBuilder();
for (var i = 0; i < addressHostSplit.Length; i++)
{
var element = addressHostSplit[i].Trim();
if (i == 0 && IPAddress.TryParse(element, out var _) && (element.Contains(':') || element.Contains('.')))
{
Address = element;
}
else
{
if (hostsBuilder.Length > 0)
{
hostsBuilder.Append(' ');
}
hostsBuilder.Append(element);
}
}
Hosts = hostsBuilder.ToString();
for (var i = 1; i < lineSplit.Length; i++)
{
if (commentBuilder.Length > 0)
{
commentBuilder.Append('#');
}
commentBuilder.Append(lineSplit[i]);
}
Comment = commentBuilder.ToString().Trim();
}
public Entry Clone()
{
return new Entry
{
Line = Line,
Address = Address,
Hosts = Hosts,
Comment = Comment,
Active = Active,
};
}
private bool ValidateAddressField()
{
return Type != AddressType.Invalid;
}
private bool ValidateHostsField(bool validateHostsLength)
{
return ValidationHelper.ValidHosts(Hosts, validateHostsLength);
}
public bool Validate(bool validateHostsLength)
{
if (Equals("102.54.94.97", "rhino.acme.com", "source server") || Equals("38.25.63.10", "x.acme.com", "x client host"))
{
return false;
}
return ValidateAddressField() && ValidateHostsField(validateHostsLength);
}
private bool Equals(string address, string hosts, string comment)
{
return string.Equals(Address, address, StringComparison.Ordinal)
&& string.Equals(Hosts, hosts, StringComparison.Ordinal)
&& string.Equals(Comment, comment, StringComparison.Ordinal);
}
}
}