diff --git a/SophiApp/SophiApp/Controls/MsCppPackageButtonGroup.xaml b/SophiApp/SophiApp/Controls/MsCppPackageButtonGroup.xaml
index a532251b..0b8b44d5 100644
--- a/SophiApp/SophiApp/Controls/MsCppPackageButtonGroup.xaml
+++ b/SophiApp/SophiApp/Controls/MsCppPackageButtonGroup.xaml
@@ -41,6 +41,12 @@
Margin="0, 10, 5, 10"
VerticalAlignment="Center"
HorizontalAlignment="Left" />
+
+
+
+
+
+
diff --git a/SophiApp/SophiApp/Controls/MsCppPackageButtonGroup.xaml.cs b/SophiApp/SophiApp/Controls/MsCppPackageButtonGroup.xaml.cs
index c6a395bc..02c0ca53 100644
--- a/SophiApp/SophiApp/Controls/MsCppPackageButtonGroup.xaml.cs
+++ b/SophiApp/SophiApp/Controls/MsCppPackageButtonGroup.xaml.cs
@@ -1,4 +1,5 @@
-using System.Windows;
+using SophiApp.Helpers;
+using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
@@ -70,6 +71,10 @@ public uint Id
set { SetValue(IdProperty, value); }
}
+ private void ContextMenu_DescriptionCopyClick(object sender, RoutedEventArgs e) => ClipboardHelper.CopyText(Description);
+
+ private void ContextMenu_HeaderCopyClick(object sender, RoutedEventArgs e) => ClipboardHelper.CopyText(Header);
+
private void Panel_MouseEnter(object sender, MouseEventArgs e) => RaiseEvent(new RoutedEventArgs(MouseEnterEvent) { Source = Description });
private void Panel_MouseLeave(object sender, MouseEventArgs e) => RaiseEvent(new RoutedEventArgs(MouseLeaveEvent));
diff --git a/SophiApp/SophiApp/Controls/OneDriveButtonGroup.xaml b/SophiApp/SophiApp/Controls/OneDriveButtonGroup.xaml
index 4939551b..e4e26a99 100644
--- a/SophiApp/SophiApp/Controls/OneDriveButtonGroup.xaml
+++ b/SophiApp/SophiApp/Controls/OneDriveButtonGroup.xaml
@@ -33,6 +33,12 @@
+
+
+
+
+
+
ClipboardHelper.CopyText(Description);
+
+ private void ContextMenu_HeaderCopyClick(object sender, RoutedEventArgs e) => ClipboardHelper.CopyText(Header);
+
private void Panel_MouseEnter(object sender, MouseEventArgs e) => RaiseEvent(new RoutedEventArgs(MouseEnterEvent) { Source = Description });
private void Panel_MouseLeave(object sender, MouseEventArgs e) => RaiseEvent(new RoutedEventArgs(MouseLeaveEvent));
diff --git a/SophiApp/SophiApp/Customisations/CustomisationOs.cs b/SophiApp/SophiApp/Customisations/CustomisationOs.cs
index 1dd90d0e..4d892e86 100644
--- a/SophiApp/SophiApp/Customisations/CustomisationOs.cs
+++ b/SophiApp/SophiApp/Customisations/CustomisationOs.cs
@@ -877,44 +877,40 @@ public static void _348(bool _)
RegHelper.SetValue(RegistryHive.LocalMachine, _348_PCHC_PATH, _348_PCHC_PREVIOUS_UNINSTALL, ENABLED_VALUE, RegistryValueKind.DWord);
}
- //TODO: Del it!
- //public static void _349(bool IsChecked)
- //{
- // var temp = Environment.GetEnvironmentVariable(TEMP);
-
- // if (IsChecked)
- // {
- // var installer = $"{temp}\\{_349_VC_REDISTRX64_EXE}";
- // WebHelper.Download(_349_DOWNLOAD_URL, installer);
- // ProcessHelper.StartWait(installer, _349_VC_REDISTRX64_INSTALL_ARGS);
- // FileHelper.TryDeleteFile(installer);
- // Directory.EnumerateFileSystemEntries(temp, _349_VC_REDISTRX64_LOG_PATTERN)
- // .ToList()
- // .ForEach(log => FileHelper.TryDeleteFile(log));
- // return;
- // }
-
- // var registryPathRedistrLib = RegHelper.GetSubKeyNames(RegistryHive.ClassesRoot, _349_VC_REDISTRX64_REGISTRY_PATH).First(key => key.Contains(_349_REDISTRX64_REGISTRY_NAME_PATTERN));
- // var registryGuidRedistrLib = RegHelper.GetValue(RegistryHive.ClassesRoot, registryPathRedistrLib, null);
-
- // var localRedistrLibPath = $@"{ENVIRONMENT_PROGRAM_DATA}\{_349_PACKAGE_CACHE_NAME}\{registryGuidRedistrLib}\{_349_VC_REDISTRX64_EXE}";
- // var localRedistrLib = FileVersionInfo.GetVersionInfo(localRedistrLibPath);
-
- // if (localRedistrLib.ProductName.Contains(_349_VC_REDISTRX64_NAME_PATTERN))
- // {
- // ProcessHelper.StartWait(localRedistrLibPath, _349_VC_REDISTRX64_UNINSTALL_ARGS);
-
- // foreach (var log in Directory.EnumerateFileSystemEntries(temp, _349_VC_REDISTRX64_LOG_PATTERN))
- // {
- // FileHelper.TryDeleteFile(log);
- // }
- // }
- //}
-
public static void _351(bool _) => OneDriveHelper.Install();
public static void _352(bool _) => OneDriveHelper.Uninstall();
+ public static void _354(bool _)
+ {
+ var temp = Environment.GetEnvironmentVariable(TEMP);
+ var installer = $"{temp}\\{_349_VC_REDISTRX64_EXE}";
+ WebHelper.Download(_349_DOWNLOAD_URL, installer);
+ ProcessHelper.StartWait(installer, _349_VC_REDISTRX64_INSTALL_ARGS);
+ FileHelper.TryDeleteFile(installer);
+ Directory.EnumerateFileSystemEntries(temp, _349_VC_REDISTRX64_LOG_PATTERN)
+ .ToList()
+ .ForEach(log => FileHelper.TryDeleteFile(log));
+ }
+
+ public static void _355(bool _)
+ {
+ var temp = Environment.GetEnvironmentVariable(TEMP);
+ var registryPathRedistrLib = RegHelper.GetSubKeyNames(RegistryHive.ClassesRoot, _349_VC_REDISTRX64_REGISTRY_PATH).First(key => key.Contains(_349_REDISTRX64_REGISTRY_NAME_PATTERN));
+ var registryGuidRedistrLib = RegHelper.GetValue(RegistryHive.ClassesRoot, registryPathRedistrLib, null);
+ var localRedistrLibPath = $@"{ENVIRONMENT_PROGRAM_DATA}\{_349_PACKAGE_CACHE_NAME}\{registryGuidRedistrLib}\{_349_VC_REDISTRX64_EXE}";
+ var localRedistrLib = FileVersionInfo.GetVersionInfo(localRedistrLibPath);
+
+ if (localRedistrLib.ProductName.Contains(_349_VC_REDISTRX64_NAME_PATTERN))
+ {
+ ProcessHelper.StartWait(localRedistrLibPath, _349_VC_REDISTRX64_UNINSTALL_ARGS);
+
+ Directory.EnumerateFileSystemEntries(temp, _349_VC_REDISTRX64_LOG_PATTERN)
+ .ToList()
+ .ForEach(log => FileHelper.TryDeleteFile(log));
+ }
+ }
+
public static void _400(bool IsChecked)
{
if (IsChecked)
diff --git a/SophiApp/SophiApp/Customisations/CustomisationStatus.cs b/SophiApp/SophiApp/Customisations/CustomisationStatus.cs
index 3abf5926..93c11def 100644
--- a/SophiApp/SophiApp/Customisations/CustomisationStatus.cs
+++ b/SophiApp/SophiApp/Customisations/CustomisationStatus.cs
@@ -414,31 +414,6 @@ public static bool _348() => MsiHelper.GetProperties(Directory.GetFiles(_348_INS
? throw new UpdateNotInstalledException(KB5005463_UPD)
: false;
- //TODO: Del it!
- //public static bool _349()
- //{
- // if (HttpHelper.IsOnline)
- // {
- // var cloudRedistrLibs = WebHelper.GetJsonResponse(_349_VC_VERSION_URL);
- // var cloudCPPRedistrLib = cloudRedistrLibs.Supported.First(libs => libs.Name == _349_VC_REDISTR_FOR_VS_2022 && libs.Architecture == X64);
-
- // try
- // {
- // var registryPathRedistrLib = RegHelper.GetSubKeyNames(RegistryHive.ClassesRoot, _349_VC_REDISTRX64_REGISTRY_PATH).FirstOrDefault(key => key.Contains(_349_REDISTRX64_REGISTRY_NAME_PATTERN));
- // var registryCPPRedistrLibVersion = Version.Parse(RegHelper.GetValue(RegistryHive.ClassesRoot, registryPathRedistrLib, _349_VERSION_NAME) as string ?? "0.0.0.0");
-
- // return RegHelper.GetStringValue(RegistryHive.ClassesRoot, registryPathRedistrLib, _349_DISPLAY_NAME).Contains(_349_VC_REDISTRX64_NAME_PATTERN)
- // || registryCPPRedistrLibVersion > cloudCPPRedistrLib.Version;
- // }
- // catch (Exception)
- // {
- // return false;
- // }
- // }
-
- // throw new NoInternetConnectionException();
- //}
-
public static bool _351() => OneDriveHelper.IsInstalled()
? throw new OneDriveIsInstalledException()
: OneDriveHelper.HasSetupExe() || HttpHelper.IsOnline
@@ -447,6 +422,16 @@ public static bool _351() => OneDriveHelper.IsInstalled()
public static bool _352() => OneDriveHelper.IsInstalled() ? false : throw new OneDriveNotInstalledException();
+ public static bool _354() => HttpHelper.IsOnline
+ ? VisualRedistrLibsHelper.GetCloudLatestVersion() > VisualRedistrLibsHelper.GetInstalledVersion()
+ ? false
+ : throw new VisualRedistrLibsLastVersionException()
+ : throw new NoInternetConnectionException();
+
+ public static bool _355() => VisualRedistrLibsHelper.IsInstalled()
+ ? false
+ : throw new VisualRedistrLibsNotInstalled();
+
public static bool _400() => RegHelper.GetNullableIntValue(RegistryHive.LocalMachine, POLICIES_EXPLORER_PATH, _400_HIDE_ADDED_APPS) != _400_DISABLED_VALUE;
public static bool _401() => RegHelper.GetNullableIntValue(RegistryHive.CurrentUser, CONTENT_DELIVERY_MANAGER_PATH, _401_APP_SUGGESTIONS) == ENABLED_VALUE;
diff --git a/SophiApp/SophiApp/Helpers/ExceptionsHelper.cs b/SophiApp/SophiApp/Helpers/ExceptionsHelper.cs
index 10d7c1e5..c4b6f58d 100644
--- a/SophiApp/SophiApp/Helpers/ExceptionsHelper.cs
+++ b/SophiApp/SophiApp/Helpers/ExceptionsHelper.cs
@@ -128,6 +128,20 @@ public UwpNotSupportedVersion(string packageFullName) : base($"This UWP package
}
}
+ internal class VisualRedistrLibsLastVersionException : Exception
+ {
+ public VisualRedistrLibsLastVersionException() : base("The latest version of Visual C++ Redistributable 2015–2022 x64 is installed")
+ {
+ }
+ }
+
+ internal class VisualRedistrLibsNotInstalled : Exception
+ {
+ public VisualRedistrLibsNotInstalled() : base("The Visual C++ Redistributable 2015–2022 x64 is not installed on this PC")
+ {
+ }
+ }
+
internal class VitualizationNotSupportedException : Exception
{
public VitualizationNotSupportedException() : base("The virtualization (VT-x/SVM) isn't enabled in UEFI (BIOS)")
diff --git a/SophiApp/SophiApp/Helpers/VisualRedistrLibsHelper.cs b/SophiApp/SophiApp/Helpers/VisualRedistrLibsHelper.cs
new file mode 100644
index 00000000..65bd87e6
--- /dev/null
+++ b/SophiApp/SophiApp/Helpers/VisualRedistrLibsHelper.cs
@@ -0,0 +1,49 @@
+using Microsoft.Win32;
+using SophiApp.Dto;
+using System;
+using System.Linq;
+
+namespace SophiApp.Helpers
+{
+ internal class VisualRedistrLibsHelper
+ {
+ private const string CLOUD_VC_VERSION_URL = "https://raw.githubusercontent.com/aaronparker/vcredist/main/VcRedist/VisualCRedistributables.json";
+ private const string REDISTR_LIB_VS_2022_NAME = "Visual C++ Redistributable for Visual Studio 2022";
+ private const string MSREDISTR_LIB_VS_2022_NAME = "Microsoft Visual C++ 2015-2022 Redistributable (x64)";
+ private const string REDISTRX64_REGISTRY_NAME_PATTERN = "VC,redist.x64,amd64";
+ private const string REDISTRX64_REGISTRY_PATH = @"Installer\Dependencies";
+ private const string VERSION_NAME = "Version";
+ private const string DISPLAY_NAME = "DisplayName";
+ private const string X64 = "x64";
+
+ internal static Version GetCloudLatestVersion()
+ {
+ var cloudLibsData = WebHelper.GetJsonResponse(CLOUD_VC_VERSION_URL);
+ return cloudLibsData.Supported.First(libs => libs.Name == REDISTR_LIB_VS_2022_NAME && libs.Architecture == X64).Version;
+ }
+
+ internal static Version GetInstalledVersion()
+ {
+ var version = IsInstalled() ? GetRegistryPropertyValue(VERSION_NAME) : "0.0.0.0";
+ return Version.Parse(version);
+ }
+
+ private static string GetRegistryPropertyValue(string propertyName)
+ {
+ var registryData = RegHelper.GetSubKeyNames(RegistryHive.ClassesRoot, REDISTRX64_REGISTRY_PATH)
+ .FirstOrDefault(key => key.Contains(REDISTRX64_REGISTRY_NAME_PATTERN));
+
+ return RegHelper.GetValue(RegistryHive.ClassesRoot, registryData, propertyName) as string;
+
+ }
+
+ internal static bool IsInstalled()
+ {
+ var vcRegistryPath = RegHelper.GetSubKeyNames(RegistryHive.ClassesRoot, REDISTRX64_REGISTRY_PATH)
+ .FirstOrDefault(key => key.Contains(REDISTRX64_REGISTRY_NAME_PATTERN));
+
+ return vcRegistryPath != null && RegHelper.GetStringValue(RegistryHive.ClassesRoot, vcRegistryPath, DISPLAY_NAME)
+ .Contains(MSREDISTR_LIB_VS_2022_NAME);
+ }
+ }
+}
\ No newline at end of file
diff --git a/SophiApp/SophiApp/SophiApp.csproj b/SophiApp/SophiApp/SophiApp.csproj
index 69010116..5ffbe276 100644
--- a/SophiApp/SophiApp/SophiApp.csproj
+++ b/SophiApp/SophiApp/SophiApp.csproj
@@ -120,6 +120,7 @@
OneDriveButtonGroup.xaml
+
diff --git a/SophiApp/SophiApp/ViewModels/Methods.cs b/SophiApp/SophiApp/ViewModels/Methods.cs
index 917e3d13..e23b87a6 100644
--- a/SophiApp/SophiApp/ViewModels/Methods.cs
+++ b/SophiApp/SophiApp/ViewModels/Methods.cs
@@ -241,8 +241,8 @@ private void InitializeProperties()
}
private async Task InitializeTextedElements(string tag) => await Task.Run(() => TextedElements.Where(element => element.Tag == tag)
- .ToList()
- .ForEach(element => element.Initialize()));
+ .ToList()
+ .ForEach(element => element.Initialize()));
private async Task InitializeTextedElementsAsync()
{