mirror of
https://github.com/velopack/velopack.git
synced 2025-10-25 15:19:22 +00:00
Refactor FullInstall code into an inner class
This commit is contained in:
103
src/Squirrel/UpdateManager.InstallHelpers.cs
Normal file
103
src/Squirrel/UpdateManager.InstallHelpers.cs
Normal file
@@ -0,0 +1,103 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Win32;
|
||||
using NuGet;
|
||||
using Splat;
|
||||
|
||||
namespace Squirrel
|
||||
{
|
||||
public sealed partial class UpdateManager
|
||||
{
|
||||
internal class InstallHelperImpl : IEnableLogger
|
||||
{
|
||||
readonly string applicationName;
|
||||
readonly string rootAppDirectory;
|
||||
|
||||
public InstallHelperImpl(string applicationName, string rootAppDirectory)
|
||||
{
|
||||
this.applicationName = applicationName;
|
||||
this.rootAppDirectory = rootAppDirectory;
|
||||
}
|
||||
|
||||
const string uninstallRegSubKey = @"Software\Microsoft\Windows\CurrentVersion\Uninstall";
|
||||
public async Task<RegistryKey> CreateUninstallerRegistryEntry(string uninstallCmd, string quietSwitch)
|
||||
{
|
||||
var releaseContent = File.ReadAllText(Path.Combine(rootAppDirectory, "packages", "RELEASES"), Encoding.UTF8);
|
||||
var releases = ReleaseEntry.ParseReleaseFile(releaseContent);
|
||||
var latest = releases.OrderByDescending(x => x.Version).First();
|
||||
|
||||
// Download the icon and PNG => ICO it. If this doesn't work, who cares
|
||||
var pkgPath = Path.Combine(rootAppDirectory, "packages", latest.Filename);
|
||||
var zp = new ZipPackage(pkgPath);
|
||||
|
||||
var targetPng = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".png");
|
||||
var targetIco = Path.Combine(rootAppDirectory, "app.ico");
|
||||
|
||||
var key = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default)
|
||||
.CreateSubKey(uninstallRegSubKey + "\\" + applicationName, RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
|
||||
try {
|
||||
var wc = new WebClient();
|
||||
|
||||
await wc.DownloadFileTaskAsync(zp.IconUrl, targetPng);
|
||||
using (var fs = new FileStream(targetIco, FileMode.Create)) {
|
||||
if (zp.IconUrl.AbsolutePath.EndsWith("ico")) {
|
||||
var bytes = File.ReadAllBytes(targetPng);
|
||||
fs.Write(bytes, 0, bytes.Length);
|
||||
} else {
|
||||
using (var bmp = (Bitmap)Image.FromFile(targetPng))
|
||||
using (var ico = Icon.FromHandle(bmp.GetHicon())) {
|
||||
ico.Save(fs);
|
||||
}
|
||||
}
|
||||
|
||||
key.SetValue("DisplayIcon", targetIco, RegistryValueKind.String);
|
||||
}
|
||||
} catch(Exception ex) {
|
||||
this.Log().InfoException("Couldn't write uninstall icon, don't care", ex);
|
||||
} finally {
|
||||
File.Delete(targetPng);
|
||||
}
|
||||
|
||||
var stringsToWrite = new[] {
|
||||
new { Key = "DisplayName", Value = zp.Description ?? zp.Summary },
|
||||
new { Key = "DisplayVersion", Value = zp.Version.ToString() },
|
||||
new { Key = "InstallDate", Value = DateTime.Now.ToString("yyyymmdd") },
|
||||
new { Key = "InstallLocation", Value = rootAppDirectory },
|
||||
new { Key = "Publisher", Value = zp.Authors.First() },
|
||||
new { Key = "QuietUninstallString", Value = String.Format("{0} {1}", uninstallCmd, quietSwitch) },
|
||||
new { Key = "UninstallString", Value = uninstallCmd },
|
||||
};
|
||||
|
||||
var dwordsToWrite = new[] {
|
||||
new { Key = "EstimatedSize", Value = (int)((new FileInfo(pkgPath)).Length / 1024) },
|
||||
new { Key = "NoModify", Value = 1 },
|
||||
new { Key = "NoRepair", Value = 1 },
|
||||
new { Key = "Language", Value = 0x0409 },
|
||||
};
|
||||
|
||||
foreach (var kvp in stringsToWrite) {
|
||||
key.SetValue(kvp.Key, kvp.Value, RegistryValueKind.String);
|
||||
}
|
||||
foreach (var kvp in dwordsToWrite) {
|
||||
key.SetValue(kvp.Key, kvp.Value, RegistryValueKind.DWord);
|
||||
}
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
public void RemoveUninstallerRegistryEntry()
|
||||
{
|
||||
var key = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default)
|
||||
.OpenSubKey(uninstallRegSubKey, true);
|
||||
key.DeleteSubKeyTree(applicationName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -89,78 +89,16 @@ namespace Squirrel
|
||||
await applyReleases.FullUninstall();
|
||||
}
|
||||
|
||||
const string uninstallRegSubKey = @"Software\Microsoft\Windows\CurrentVersion\Uninstall";
|
||||
public async Task<RegistryKey> CreateUninstallerRegistryEntry(string uninstallCmd, string quietSwitch)
|
||||
public Task<RegistryKey> CreateUninstallerRegistryEntry(string uninstallCmd, string quietSwitch)
|
||||
{
|
||||
var releaseContent = File.ReadAllText(Path.Combine(rootAppDirectory, "packages", "RELEASES"), Encoding.UTF8);
|
||||
var releases = ReleaseEntry.ParseReleaseFile(releaseContent);
|
||||
var latest = releases.OrderByDescending(x => x.Version).First();
|
||||
|
||||
// Download the icon and PNG => ICO it. If this doesn't work, who cares
|
||||
var pkgPath = Path.Combine(rootAppDirectory, "packages", latest.Filename);
|
||||
var zp = new ZipPackage(pkgPath);
|
||||
|
||||
var targetPng = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".png");
|
||||
var targetIco = Path.Combine(rootAppDirectory, "app.ico");
|
||||
|
||||
var key = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default)
|
||||
.CreateSubKey(uninstallRegSubKey + "\\" + applicationName, RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
|
||||
try {
|
||||
var wc = new WebClient();
|
||||
|
||||
await wc.DownloadFileTaskAsync(zp.IconUrl, targetPng);
|
||||
using (var fs = new FileStream(targetIco, FileMode.Create)) {
|
||||
if (zp.IconUrl.AbsolutePath.EndsWith("ico")) {
|
||||
var bytes = File.ReadAllBytes(targetPng);
|
||||
fs.Write(bytes, 0, bytes.Length);
|
||||
} else {
|
||||
using (var bmp = (Bitmap)Image.FromFile(targetPng))
|
||||
using (var ico = Icon.FromHandle(bmp.GetHicon())) {
|
||||
ico.Save(fs);
|
||||
}
|
||||
}
|
||||
|
||||
key.SetValue("DisplayIcon", targetIco, RegistryValueKind.String);
|
||||
}
|
||||
} catch(Exception ex) {
|
||||
this.Log().InfoException("Couldn't write uninstall icon, don't care", ex);
|
||||
} finally {
|
||||
File.Delete(targetPng);
|
||||
}
|
||||
|
||||
var stringsToWrite = new[] {
|
||||
new { Key = "DisplayName", Value = zp.Description ?? zp.Summary },
|
||||
new { Key = "DisplayVersion", Value = zp.Version.ToString() },
|
||||
new { Key = "InstallDate", Value = DateTime.Now.ToString("yyyymmdd") },
|
||||
new { Key = "InstallLocation", Value = rootAppDirectory },
|
||||
new { Key = "Publisher", Value = zp.Authors.First() },
|
||||
new { Key = "QuietUninstallString", Value = String.Format("{0} {1}", uninstallCmd, quietSwitch) },
|
||||
new { Key = "UninstallString", Value = uninstallCmd },
|
||||
};
|
||||
|
||||
var dwordsToWrite = new[] {
|
||||
new { Key = "EstimatedSize", Value = (int)((new FileInfo(pkgPath)).Length / 1024) },
|
||||
new { Key = "NoModify", Value = 1 },
|
||||
new { Key = "NoRepair", Value = 1 },
|
||||
new { Key = "Language", Value = 0x0409 },
|
||||
};
|
||||
|
||||
foreach (var kvp in stringsToWrite) {
|
||||
key.SetValue(kvp.Key, kvp.Value, RegistryValueKind.String);
|
||||
}
|
||||
foreach (var kvp in dwordsToWrite) {
|
||||
key.SetValue(kvp.Key, kvp.Value, RegistryValueKind.DWord);
|
||||
}
|
||||
|
||||
return key;
|
||||
var installHelpers = new InstallHelperImpl(applicationName, rootAppDirectory);
|
||||
return installHelpers.CreateUninstallerRegistryEntry(uninstallCmd, quietSwitch);
|
||||
}
|
||||
|
||||
public void RemoveUninstallerRegistryEntry()
|
||||
{
|
||||
var key = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default)
|
||||
.OpenSubKey(uninstallRegSubKey, true);
|
||||
key.DeleteSubKeyTree(applicationName);
|
||||
var installHelpers = new InstallHelperImpl(applicationName, rootAppDirectory);
|
||||
installHelpers.RemoveUninstallerRegistryEntry();
|
||||
}
|
||||
|
||||
public Version CurrentlyInstalledVersion(string executable = null)
|
||||
|
||||
Reference in New Issue
Block a user