public static List <Package> GetPackages()
        {
            packages = new List <Package>();
            if (!Directory.Exists("packages\\"))
            {
                Directory.CreateDirectory("packages");
            }

            foreach (string st in Directory.GetFiles("packages\\", "*.zip", SearchOption.AllDirectories))
            {
                Console.WriteLine("Found package:" + st);
                // Open the package for reading
                using (ZipArchive archive = ZipFile.OpenRead(st))
                {
                    var p = PackageDetails(archive);
                    p.Container = st;

                    var v = RegistryKeeper.GetValue(p.Container);
                    if (v == p.Product.Version)
                    {
                        p.Enabled = true;
                    }


                    if (p.Product.Name != null)
                    {
                        packages.Add(p);
                    }

                    if (!p.Enabled)
                    {
                        InstallPackage(p);
                    }
                }
            }

            return(packages);
        }
        public static bool InstallPackage(Package p)
        {
            var message = MessageBox.Show("Would you like to install the package " + p.Product.Name + "?", "Chroma Sync: " + p.Product.Name,
                                          MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (message == DialogResult.No)
            {
                return(false);
            }
            foreach (var step in p.Installation)
            {
                using (ZipArchive archive = ZipFile.OpenRead(p.Container))
                {
                    if (p.Product.Name != null)
                    {
                        foreach (ZipArchiveEntry entry in archive.Entries)
                        {
                            if (step.Folder != null)
                            {
                                if (entry.FullName.StartsWith(step.Folder, StringComparison.OrdinalIgnoreCase) && entry.Name.Length > 0)
                                {
                                    switch (step.Action)
                                    {
                                    case "extract":
                                        var path = step.Destination.Folder;
                                        path = Environment.ExpandEnvironmentVariables(path);
                                        Console.WriteLine(entry.FullName);
                                        if (step.Destination.Type == "steamapp")
                                        {
                                            var steamFolder = GameLocator.InstallFolder(step.Destination.Folder);
                                            if (steamFolder == null)
                                            {
                                                Console.WriteLine("Could not find steam folder: " + steamFolder);
                                                return(false);
                                            }
                                            path = steamFolder;
                                        }
                                        var sp = entry.FullName.Remove(0, step.Folder.Length + 1);
                                        var pa = Path.Combine(path, sp);
                                        if (!Directory.Exists(path))
                                        {
                                            Directory.CreateDirectory(path);
                                        }

                                        try
                                        {
                                            entry.ExtractToFile(pa, true);
                                        }
                                        catch (Exception e)
                                        {
                                            Console.WriteLine(e.Message);
                                        }
                                        break;

                                    case "execute":
                                        if (!entry.Name.Equals(step.File))
                                        {
                                            continue;
                                        }

                                        // TODO: Copy the file to a temp directory
                                        Directory.CreateDirectory("tmp");
                                        var tmp = Path.Combine("tmp", entry.Name);
                                        try
                                        {
                                            entry.ExtractToFile(tmp);
                                        }
                                        catch (Exception e)
                                        {
                                            Console.WriteLine(e.Message);
                                        }

                                        System.Diagnostics.Process          process   = new System.Diagnostics.Process();
                                        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                                        //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                                        startInfo.FileName = entry.Name;
                                        // temp folder in the Chroma Sync directory
                                        startInfo.WorkingDirectory = "tmp";
                                        startInfo.Arguments        = step.Cmd;
                                        process.StartInfo          = startInfo;
                                        process.Start();
                                        process.WaitForExit();
                                        break;
                                    }
                                }
                            }
                        }
                        RegistryKeeper.UpdateReg(p.Container, p.Product.Version);
                    }
                    else
                    {
                        // No product thingy
                    }
                }
            }
            return(false);
        }