using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; using System.Resources; using System.Threading.Tasks; using System.Xml.Linq; namespace WelsonJS.Launcher.ResourceTools { public class Settings : IResourceTool { private readonly ResourceServer Server; private readonly HttpClient _httpClient; private const string Prefix = "settings"; public Settings(ResourceServer server, HttpClient httpClient) { Server = server; _httpClient = httpClient; } public bool CanHandle(string path) { return path.Equals(Prefix, StringComparison.OrdinalIgnoreCase); } public async Task HandleAsync(HttpListenerContext context, string path) { await Task.Delay(0); // Get current namespace (e.g., WelsonJS.Launcher) string ns = typeof(Program).Namespace; // Build resource base name (e.g., WelsonJS.Launcher.Properties.Resources) string resourceBaseName = ns + ".Properties.Resources"; // Load resource strings using ResourceManager var resourceManager = new ResourceManager(resourceBaseName, Assembly.GetExecutingAssembly()); var resourceSet = resourceManager.GetResourceSet( System.Globalization.CultureInfo.CurrentCulture, true, true ); var resourceStrings = new Dictionary(); foreach (System.Collections.DictionaryEntry entry in resourceSet) { if (entry.Value is string strValue) { resourceStrings[(string)entry.Key] = strValue; } } // Load settings from app.config var appConfig = ConfigurationManager.AppSettings.AllKeys .ToDictionary(k => k, k => ConfigurationManager.AppSettings[k]); // Merge by starting with resourceStrings and letting app.config override var finalConfig = new Dictionary(resourceStrings); foreach (var kv in appConfig) { finalConfig[kv.Key] = kv.Value; } // Generate XML using XElement XElement xml = new XElement("settings", finalConfig.Select(kv => new XElement(kv.Key, kv.Value)) ); Server.ServeResource(context, xml.ToString(), "application/xml"); } } }