Newer
Older
JumpListUtil / EntryList.cs
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());
            }
        }
    }
}