Redo update task in launcher to reuse AsyncDownloader, instead of spinning up own async thread

This commit is contained in:
UnknownShadow200 2018-01-16 15:32:15 +11:00
parent 2245cc6178
commit 877b84aee3
6 changed files with 38 additions and 41 deletions

View File

@ -31,7 +31,8 @@ namespace ClassicalSharp.Network {
public Request CurrentItem;
public int CurrentItemProgress = -3;
public IDrawer2D Drawer;
public IDrawer2D Drawer;
public CookieContainer Cookies;
public AsyncDownloader(IDrawer2D drawer) { this.drawer = drawer; }
#if !LAUNCHER
@ -283,6 +284,7 @@ namespace ClassicalSharp.Network {
req.Timeout = 90 * 1000;
req.Proxy = null;
req.UserAgent = Program.AppName;
req.CookieContainer = Cookies;
if (request.LastModified != DateTime.MinValue)
req.IfModifiedSince = request.LastModified;

View File

@ -11,7 +11,7 @@ namespace Launcher.Gui.Screens {
public override void Tick() {
base.Tick();
if (game.checkTask != null && game.checkTask.Done && !updateDone) {
if (game.checkTask != null && game.checkTask.Completed && !updateDone) {
bool success = game.checkTask.Success;
if (success) SuccessfulUpdateCheck(game.checkTask);
else FailedUpdateCheck(game.checkTask);

View File

@ -74,10 +74,6 @@ namespace Launcher.Gui.Screens {
}
void DownloadResources(int mouseX, int mouseY) {
if (game.Downloader == null) {
game.Downloader = new AsyncDownloader(drawer);
game.Downloader.Init("");
}
if (fetcher != null) return;
fetcher = game.fetcher;

View File

@ -30,20 +30,22 @@ namespace Launcher.Gui.Screens {
widgets[view.backIndex].OnClick = SwitchToSettings;
Resize();
if (game.checkTask != null && game.checkTask.Done && game.checkTask.Success) {
if (game.checkTask.Completed && game.checkTask.Success) {
SuccessfulUpdateCheck(game.checkTask);
}
checkTask = new UpdateCheckTask();
checkTask.CheckForUpdatesAsync();
checkTask.Init(game);
}
Build dev, stable;
public override void Tick() {
if (checkTask != null && checkTask.Done) {
if (checkTask.Success) SuccessfulUpdateCheck(checkTask);
else FailedUpdateCheck(checkTask);
checkTask = null;
}
if (checkTask == null) return;
checkTask.Tick();
if (!checkTask.Completed) return;
if (checkTask.Success) SuccessfulUpdateCheck(checkTask);
else FailedUpdateCheck(checkTask);
checkTask = null;
}
void SuccessfulUpdateCheck(UpdateCheckTask task) {
@ -57,7 +59,6 @@ namespace Launcher.Gui.Screens {
void FailedUpdateCheck(UpdateCheckTask task) {
view.LastStable = DateTime.MaxValue;
view.LastDev = DateTime.MaxValue;
task.Exception = null;
Widget w = widgets[view.devIndex - 1];
game.ResetArea(w.X, w.Y, w.Width, w.Height);

View File

@ -167,8 +167,10 @@ namespace Launcher {
fetcher = new ResourceFetcher();
fetcher.CheckResourceExistence();
Downloader = new AsyncDownloader(Drawer);
Downloader.Init("");
checkTask = new UpdateCheckTask();
checkTask.CheckForUpdatesAsync();
checkTask.Init(this);
if (!fetcher.AllResourcesExist) {
SetScreen(new ResourcesScreen(this));
@ -187,6 +189,7 @@ namespace Launcher {
break;
}
checkTask.Tick();
Screen.Tick();
if (Dirty) Display();
Thread.Sleep(10);

View File

@ -1,10 +1,9 @@
// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
using ClassicalSharp;
using ClassicalSharp.Network;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Net;
using System.Threading;
using JsonObject = System.Collections.Generic.Dictionary<string, object>;
namespace Launcher.Web {
@ -16,38 +15,34 @@ namespace Launcher.Web {
public string Version;
}
public sealed class UpdateCheckTask : IWebTask {
public sealed class UpdateCheckTask {
public const string UpdatesIdentifier = "cc-update";
public const string UpdatesUri = "http://cs.classicube.net/";
public const string BuildsUri = "http://cs.classicube.net/builds.json";
public Build LatestDev, LatestStable;
public LauncherWindow Game;
public bool Completed = false, Success = false;
public void CheckForUpdatesAsync() {
Working = true;
Done = false;
Exception = null;
LatestDev = null;
LatestStable = null;
public void Init(LauncherWindow game) {
Game = game;
Completed = false;
Success = false;
Game.Downloader.DownloadPage(BuildsUri, false, UpdatesIdentifier);
}
public void Tick() {
if (Completed) return;
Request req;
if (!Game.Downloader.TryGetItem(UpdatesIdentifier, out req)) return;
Thread thread = new Thread(UpdateWorker, 256 * 1024);
thread.Name = "Launcher.UpdateCheck";
thread.Start();
Completed = true;
Success = req != null && req.Data != null;
if (!Success) return;
ProcessUpdate((string)req.Data);
}
void UpdateWorker() {
try {
CheckUpdates();
} catch (WebException ex) {
Finish(false, ex, null); return;
} catch (Exception ex) {
ErrorHandler.LogError("UpdateCheckTask.CheckUpdates", ex);
Finish(false, null, "&cUpdate check failed"); return;
}
Finish(true, null, null);
}
void CheckUpdates() {
string response = Get(BuildsUri, UpdatesUri);
void ProcessUpdate(string response) {
int index = 0; bool success = true;
JsonObject data = (JsonObject)Json.ParseValue(response, ref index, ref success);