104 lines
4.3 KiB
C#
104 lines
4.3 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.IO.Compression;
|
|
using System.Net.Http;
|
|
using System.Runtime.InteropServices;
|
|
using System.Threading.Tasks;
|
|
using Saradomin.Utilities;
|
|
|
|
namespace Saradomin.Infrastructure.Services
|
|
{
|
|
public class JavaUpdateService : IJavaUpdateService
|
|
{
|
|
public event EventHandler<Tuple<float, bool>> JavaDownloadProgressChanged;
|
|
|
|
public async Task DownloadAndSetJava11(ISettingsService settingsService)
|
|
{
|
|
string downloadUrl = CrossPlatform.GetJava11DownloadUrl();
|
|
|
|
string downloadPath = Path.Combine(
|
|
CrossPlatform.Get2009scapeHome(),
|
|
"jre11" + Path.GetExtension(downloadUrl)
|
|
);
|
|
string extractedPath = Path.Combine(
|
|
CrossPlatform.Get2009scapeHome(),
|
|
"jre11"
|
|
);
|
|
|
|
using (HttpClient httpClient = new HttpClient())
|
|
{
|
|
var response = await httpClient.GetAsync(downloadUrl, HttpCompletionOption.ResponseHeadersRead);
|
|
var contentLength = response.Content.Headers.ContentLength ?? 40 * 1024 * 1024L;
|
|
var totalRead = 0L;
|
|
var buffer = new byte[8192];
|
|
|
|
// Create a FileStream to write the downloaded bytes to
|
|
await using (var fileStream = new FileStream(downloadPath, FileMode.Create, FileAccess.Write, FileShare.None))
|
|
{
|
|
await using (var stream = await response.Content.ReadAsStreamAsync())
|
|
{
|
|
int bytesRead;
|
|
do
|
|
{
|
|
bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
|
|
totalRead += bytesRead;
|
|
|
|
// Write the bytes to the FileStream
|
|
await fileStream.WriteAsync(buffer, 0, bytesRead);
|
|
|
|
var progress = (float)totalRead / contentLength;
|
|
JavaDownloadProgressChanged?.Invoke(this, new Tuple<float, bool>(progress, false));
|
|
} while (bytesRead > 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
JavaDownloadProgressChanged?.Invoke(this, new Tuple<float, bool>(1f, false));
|
|
|
|
if (Directory.Exists(extractedPath)) Directory.Delete(extractedPath, true);
|
|
|
|
if (Path.GetExtension(downloadUrl) == ".zip")
|
|
{
|
|
// Don't use /tmp because Directory.Move doesn't work cross-partition
|
|
string tempDir = Path.Combine(CrossPlatform.Get2009scapeHome(), "jre11_temp");
|
|
if (Directory.Exists(tempDir)) Directory.Delete(tempDir, true);
|
|
await Task.Run(() => ZipFile.ExtractToDirectory(downloadPath, tempDir));
|
|
Directory.Move(Directory.GetDirectories(tempDir)[0], extractedPath);
|
|
Directory.Delete(tempDir, true);
|
|
}
|
|
else if (Path.GetExtension(downloadUrl) == ".gz" || Path.GetExtension(downloadUrl) == ".tar.gz")
|
|
{
|
|
Directory.CreateDirectory(extractedPath);
|
|
await Task.Run(() => CrossPlatform.RunCommandAndGetOutput($"tar xf {downloadPath} -C {extractedPath} --strip-components 1"));
|
|
}
|
|
|
|
File.Delete(downloadPath);
|
|
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
{
|
|
settingsService.Launcher.JavaExecutableLocation = Path.Combine(
|
|
extractedPath,
|
|
"Contents",
|
|
"Home",
|
|
"bin",
|
|
"java"
|
|
);
|
|
} else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
|
|
settingsService.Launcher.JavaExecutableLocation = Path.Combine(
|
|
extractedPath,
|
|
"bin",
|
|
"java.exe"
|
|
);
|
|
} else {
|
|
settingsService.Launcher.JavaExecutableLocation = Path.Combine(
|
|
extractedPath,
|
|
"bin",
|
|
"java"
|
|
);
|
|
}
|
|
settingsService.SaveAll();
|
|
JavaDownloadProgressChanged?.Invoke(this, new Tuple<float, bool>(1f, true));
|
|
}
|
|
}
|
|
}
|