using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace Entries { public class Entry { public string Target { get; set; } public string TargetExpanded { get { return Expand(Target); } } public string Arguments { get; set; } private static bool setWSLName = false; private string Expand(string input) { if (!setWSLName) { using (Process wslconf = new Process()) { wslconf.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%systemroot%\Sysnative\wslconfig.exe"); wslconf.StartInfo.StandardOutputEncoding = new UnicodeEncoding(); wslconf.StartInfo.Arguments = "/l"; wslconf.StartInfo.UseShellExecute = false; wslconf.StartInfo.RedirectStandardOutput = true; string defaultDist = "Ubuntu-18.04"; try { wslconf.Start(); string all = wslconf.StandardOutput.ReadToEnd(); List<string> lines = all.Split('\n').Select(s => s.Trim()).Where(s => s.Length > 0).Skip(1).ToList(); wslconf.WaitForExit(); if (lines.Count > 0) { defaultDist = lines.FirstOrDefault(s => s.Contains("Default")); if (defaultDist == null) defaultDist = lines[0]; defaultDist = defaultDist.Replace("(Default)", "").Trim(); } setWSLName = true; Environment.SetEnvironmentVariable("WSLNAME", defaultDist); } catch (Exception) { } } } return Environment.ExpandEnvironmentVariables(input); } public string ArgumentsExpanded { get { return Expand(Arguments); } } public string Icon { get; set; } public int IconIndex { get; set; } public string Name { get; set; } public string Description { get; set; } } public class EntryList { public string FilePath = null; public List<Entry> Entries; public static EntryList FromString(string contents) { Entry[] entries = (Entry[])JsonSerializer.Deserialize(contents, typeof(Entry[]), new JsonSerializerOptions() { PropertyNameCaseInsensitive = true, ReadCommentHandling = JsonCommentHandling.Skip, AllowTrailingCommas = true }); return new EntryList { Entries = new List<Entry>(entries) }; } public static EntryList FromFile(string path) { string contents = ""; using (FileStream input = File.OpenRead(path)) { contents = new StreamReader(input).ReadToEnd(); } EntryList entryList = FromString(contents); if (entryList != null) entryList.FilePath = Path.GetFullPath(path); return entryList; } public override string ToString() { return JsonSerializer.Serialize(Entries.ToArray(), typeof(Entry[]), new JsonSerializerOptions() { WriteIndented = true }); } public void WriteToFile(string path) { using (FileStream output = File.Create(path)) { new StreamWriter(output).Write(ToString()); } } } }