diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/NativeMethods.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/NativeMethods.cs index 50ff3461037c..f4b60892295b 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/NativeMethods.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/NativeMethods.cs @@ -17,7 +17,7 @@ internal struct INPUT internal INPUTTYPE type; internal InputUnion data; - internal static int Size => Marshal.SizeOf(typeof(INPUT)); + internal static int Size => Marshal.SizeOf(); } [StructLayout(LayoutKind.Explicit)] diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Microsoft.CmdPal.Ext.ClipboardHistory.csproj b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Microsoft.CmdPal.Ext.ClipboardHistory.csproj index 1d583e279b1c..774753f31d96 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Microsoft.CmdPal.Ext.ClipboardHistory.csproj +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Microsoft.CmdPal.Ext.ClipboardHistory.csproj @@ -1,5 +1,6 @@  + Microsoft.CmdPal.Ext.ClipboardHistory $(SolutionDir)$(Platform)\$(Configuration)\WinUI3Apps\CmdPal diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.System/Helpers/NetworkConnectionProperties.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.System/Helpers/NetworkConnectionProperties.cs index 9afb39b6f133..486eeaa8b5cd 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.System/Helpers/NetworkConnectionProperties.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.System/Helpers/NetworkConnectionProperties.cs @@ -311,14 +311,14 @@ private static string CreateIpInfoForDetailsText(string title, dynamic property) { switch (property) { - case string: - return string.IsNullOrWhiteSpace(property) ? string.Empty : $"\n\n{title}{property}"; + case string str: + return string.IsNullOrWhiteSpace(str) ? string.Empty : $"\n\n{title}{str}"; case List listString: - return listString.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", property)}"; + return listString.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", listString)}"; case List listIP: - return listIP.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", property)}"; + return listIP.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", listIP)}"; case IPAddressCollection collectionIP: - return collectionIP.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", property)}"; + return collectionIP.Count == 0 ? string.Empty : $"\n\n{title}{string.Join("\n\n* ", collectionIP)}"; case null: return string.Empty; default: diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.System/Microsoft.CmdPal.Ext.System.csproj b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.System/Microsoft.CmdPal.Ext.System.csproj index 4c619bc5e58f..48e9d6ba8273 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.System/Microsoft.CmdPal.Ext.System.csproj +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.System/Microsoft.CmdPal.Ext.System.csproj @@ -1,5 +1,6 @@  + enable Microsoft.CmdPal.Ext.System diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/HistoryItem.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/HistoryItem.cs index 84a1c249baed..d381c1e4ccc1 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/HistoryItem.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/HistoryItem.cs @@ -13,5 +13,5 @@ public class HistoryItem(string searchString, DateTime timestamp) public DateTime Timestamp { get; private set; } = timestamp; - public string ToJson() => JsonSerializer.Serialize(this); + public string ToJson() => JsonSerializer.Serialize(this, WebSearchJsonSerializationContext.Default.HistoryItem); } diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/SettingsManager.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/SettingsManager.cs index b83ba47a73d5..8a39bca35b79 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/SettingsManager.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/SettingsManager.cs @@ -80,7 +80,7 @@ public void SaveHistory(HistoryItem historyItem) if (File.Exists(_historyPath)) { var existingContent = File.ReadAllText(_historyPath); - historyItems = JsonSerializer.Deserialize>(existingContent) ?? []; + historyItems = JsonSerializer.Deserialize>(existingContent, WebSearchJsonSerializationContext.Default.ListHistoryItem) ?? []; } else { @@ -101,7 +101,7 @@ public void SaveHistory(HistoryItem historyItem) } // Serialize the updated list back to JSON and save it - var historyJson = JsonSerializer.Serialize(historyItems); + var historyJson = JsonSerializer.Serialize(historyItems, WebSearchJsonSerializationContext.Default.ListHistoryItem); File.WriteAllText(_historyPath, historyJson); } catch (Exception ex) @@ -121,7 +121,7 @@ public List LoadHistory() // Read and deserialize JSON into a list of HistoryItem objects var fileContent = File.ReadAllText(_historyPath); - var historyItems = JsonSerializer.Deserialize>(fileContent) ?? []; + var historyItems = JsonSerializer.Deserialize>(fileContent, WebSearchJsonSerializationContext.Default.ListHistoryItem) ?? []; // Convert each HistoryItem to a ListItem var listItems = new List(); @@ -198,7 +198,7 @@ public override void SaveSettings() if (File.Exists(_historyPath)) { var existingContent = File.ReadAllText(_historyPath); - var historyItems = JsonSerializer.Deserialize>(existingContent) ?? []; + var historyItems = JsonSerializer.Deserialize>(existingContent, WebSearchJsonSerializationContext.Default.ListHistoryItem) ?? []; // Check if trimming is needed if (historyItems.Count > maxHistoryItems) @@ -207,7 +207,7 @@ public override void SaveSettings() historyItems = historyItems.Skip(historyItems.Count - maxHistoryItems).ToList(); // Save the trimmed history back to the file - var trimmedHistoryJson = JsonSerializer.Serialize(historyItems); + var trimmedHistoryJson = JsonSerializer.Serialize(historyItems, WebSearchJsonSerializationContext.Default.ListHistoryItem); File.WriteAllText(_historyPath, trimmedHistoryJson); } } diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/WebSearchJsonSerializationContext.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/WebSearchJsonSerializationContext.cs new file mode 100644 index 000000000000..443c9cdf40f9 --- /dev/null +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Helpers/WebSearchJsonSerializationContext.cs @@ -0,0 +1,20 @@ +// 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.Collections.Generic; +using System.Text.Json.Serialization; +using Microsoft.CmdPal.Ext.WebSearch.Helpers; + +namespace Microsoft.CmdPal.Ext.WebSearch; + +[JsonSerializable(typeof(float))] +[JsonSerializable(typeof(int))] +[JsonSerializable(typeof(string))] +[JsonSerializable(typeof(bool))] +[JsonSerializable(typeof(HistoryItem))] +[JsonSerializable(typeof(List))] +[JsonSourceGenerationOptions(UseStringEnumConverter = true, WriteIndented = true, IncludeFields = true, PropertyNameCaseInsensitive = true, AllowTrailingCommas = true)] +internal sealed partial class WebSearchJsonSerializationContext : JsonSerializerContext +{ +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Microsoft.CmdPal.Ext.WebSearch.csproj b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Microsoft.CmdPal.Ext.WebSearch.csproj index 3ddedfcd7196..3fbaeb30a7ec 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Microsoft.CmdPal.Ext.WebSearch.csproj +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WebSearch/Microsoft.CmdPal.Ext.WebSearch.csproj @@ -1,5 +1,6 @@  + Microsoft.CmdPal.Ext.WebSearch enable diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/Helpers/JsonSettingsListHelper.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/Helpers/JsonSettingsListHelper.cs index f99f0ce3b35f..18b2548ce28b 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/Helpers/JsonSettingsListHelper.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/Helpers/JsonSettingsListHelper.cs @@ -4,10 +4,8 @@ using System; using System.IO; -using System.Linq; using System.Reflection; using System.Text.Json; -using System.Text.Json.Serialization; namespace Microsoft.CmdPal.Ext.WindowsSettings.Helpers; @@ -21,6 +19,8 @@ internal static class JsonSettingsListHelper /// private const string _settingsFile = "WindowsSettings.json"; + private const string _extTypeNamespace = "Microsoft.CmdPal.Ext.WindowsSettings"; + private static readonly JsonSerializerOptions _serializerOptions = new() { }; @@ -32,7 +32,6 @@ internal static class JsonSettingsListHelper internal static Classes.WindowsSettings ReadAllPossibleSettings() { var assembly = Assembly.GetExecutingAssembly(); - var type = assembly.GetTypes().FirstOrDefault(x => x.Name == nameof(WindowsSettingsCommandsProvider)); #pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Classes.WindowsSettings? settings = null; @@ -40,7 +39,7 @@ internal static Classes.WindowsSettings ReadAllPossibleSettings() try { - var resourceName = $"{type?.Namespace}.{_settingsFile}"; + var resourceName = $"{_extTypeNamespace}.{_settingsFile}"; using var stream = assembly.GetManifestResourceStream(resourceName); if (stream is null) { @@ -48,12 +47,13 @@ internal static Classes.WindowsSettings ReadAllPossibleSettings() } var options = _serializerOptions; - options.Converters.Add(new JsonStringEnumConverter()); + // Why we need it? I don't see any enum usage in WindowsSettings + // options.Converters.Add(new JsonStringEnumConverter()); using var reader = new StreamReader(stream); var text = reader.ReadToEnd(); - settings = JsonSerializer.Deserialize(text, options); + settings = JsonSerializer.Deserialize(text, WindowsSettingsJsonSerializationContext.Default.WindowsSettings); } #pragma warning disable CS0168 catch (Exception exception) diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/JsonSerializationContext.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/JsonSerializationContext.cs new file mode 100644 index 000000000000..e267e8f52e1b --- /dev/null +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/JsonSerializationContext.cs @@ -0,0 +1,22 @@ +// 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.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace Microsoft.CmdPal.Ext.WindowsSettings; + +[JsonSerializable(typeof(float))] +[JsonSerializable(typeof(int))] +[JsonSerializable(typeof(string))] +[JsonSerializable(typeof(bool))] +[JsonSerializable(typeof(Classes.WindowsSettings))] +[JsonSourceGenerationOptions(UseStringEnumConverter = true, WriteIndented = true, IncludeFields = true, PropertyNameCaseInsensitive = true, AllowTrailingCommas = true)] +internal sealed partial class WindowsSettingsJsonSerializationContext : JsonSerializerContext +{ +} diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/Microsoft.CmdPal.Ext.WindowsSettings.csproj b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/Microsoft.CmdPal.Ext.WindowsSettings.csproj index d44e907606f8..9f2d72bc8adc 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/Microsoft.CmdPal.Ext.WindowsSettings.csproj +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsSettings/Microsoft.CmdPal.Ext.WindowsSettings.csproj @@ -1,5 +1,6 @@  + Microsoft.CmdPal.Ext.WindowsSettings $(SolutionDir)$(Platform)\$(Configuration)\WinUI3Apps\CmdPal