84 lines
2.8 KiB
C#

// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Threading;
using ClassicalSharp;
using ClassicalSharp.Textures;
using Launcher.Web;
namespace Launcher.Updater {
public static class Applier {
public static DateTime PatchTime;
public static void FetchUpdate(string dir) {
WebRequest.DefaultWebProxy = null;
using (WebClient client = new WebClient()) {
byte[] zipData = client.DownloadData(UpdateCheckTask.UpdatesUri + dir);
MakeUpdatesFolder(zipData);
}
}
public static void ApplyUpdate() {
ProcessStartInfo info = new ProcessStartInfo();
info.CreateNoWindow = false;
info.UseShellExecute = true;
info.WorkingDirectory = Program.AppDirectory;
if (OpenTK.Configuration.RunningOnWindows) {
string path = Path.Combine(Program.AppDirectory, "update.bat");
File.WriteAllText(path, Scripts.BatchFile);
info.FileName = "cmd"; info.Arguments = "/C start cmd /C update.bat";
Process.Start(info);
} else {
string path = Path.Combine(Program.AppDirectory, "update.sh");
File.WriteAllText(path, Scripts.BashFile.Replace("\r\n", "\n"));
const int flags = 0x7;// read | write | executable
int code = chmod(path, (flags << 6) | (flags << 3) | 4);
if (code != 0)
throw new InvalidOperationException("chmod returned : " + code);
//if (OpenTK.Configuration.RunningOnMacOS)
// info = new ProcessStartInfo("open -a Terminal ",
// '"' + path + '"');
//else
info.FileName = "xterm"; info.Arguments = '"' + path + '"';
Process.Start(info);
}
}
[DllImport("libc", SetLastError = true)]
internal static extern int chmod(string path, int mode);
static void MakeUpdatesFolder(byte[] zipData) {
using (MemoryStream stream = new MemoryStream(zipData)) {
ZipReader reader = new ZipReader();
string path = Path.Combine(Program.AppDirectory, "CS_Update");
Directory.CreateDirectory(path);
reader.ShouldProcessZipEntry = (f) => true;
reader.ProcessZipEntry = ProcessZipEntry;
reader.Extract(stream);
}
}
static void ProcessZipEntry(string filename, byte[] data, ZipEntry entry) {
string path = Path.Combine(Program.AppDirectory, "CS_Update");
path = Path.Combine(path, Path.GetFileName(filename));
File.WriteAllBytes(path, data);
try {
File.SetLastWriteTimeUtc(path, PatchTime);
} catch (IOException ex) {
ErrorHandler2.LogError("I/O exception when trying to set modified time for: " + filename, ex);
} catch (UnauthorizedAccessException ex) {
ErrorHandler2.LogError("Permissions exception when trying to set modified time for: " + filename, ex);
}
}
}
}