wabbajack/Wabbajack/Views/DownloadWindow.xaml.cs

103 lines
2.6 KiB
C#
Raw Normal View History

2019-11-21 14:25:40 +00:00
using System.IO;
2019-10-20 11:26:42 +00:00
using System.Threading;
using System.Windows;
using Wabbajack.Common;
using Wabbajack.Lib;
using Wabbajack.Lib.Downloaders;
namespace Wabbajack.UI
{
/// <summary>
/// Interaction logic for DownloadWindow.xaml
/// </summary>
public partial class DownloadWindow : Window
{
public enum WindowResult
{
Undefined,
Completed,
Canceled
}
public WindowResult Result { get; internal set; } = WindowResult.Undefined;
public DownloadWindow(string url, string name, long size, string destination)
2019-10-20 11:26:42 +00:00
{
InitializeComponent();
DataContext = new DownloadWindowViewModel(this, url, name, size, destination);
2019-10-20 11:26:42 +00:00
}
}
public class DownloadWindowViewModel : ViewModel
{
private readonly string _destination;
private readonly DownloadWindow _parent;
private long _size;
2019-10-20 11:26:42 +00:00
public DownloadWindowViewModel(DownloadWindow parent, string url, string name, long size, string destination)
2019-10-20 11:26:42 +00:00
{
_parent = parent;
_url = url;
_downloadName = name;
_destination = destination;
_size = size;
2019-10-20 11:26:42 +00:00
Start();
}
private void Start()
{
_downloadThread = new Thread(() =>
{
var state = DownloadDispatcher.ResolveArchive(_url);
state.Download(new Archive {Name = _downloadName, Size = _size}, _destination);
2019-10-31 03:40:33 +00:00
_destination.FileHash();
2019-10-22 20:16:21 +00:00
2019-10-20 11:26:42 +00:00
_parent.Result = DownloadWindow.WindowResult.Completed;
_parent.Dispatcher.Invoke(() => _parent.Close());
});
_downloadThread.Start();
}
public void Cancel()
{
if (_downloadThread != null && _downloadThread.IsAlive)
{
_downloadThread.Abort();
}
File.Delete(_destination);
_parent.Result = DownloadWindow.WindowResult.Canceled;
}
private int _downloadProgress;
public int DownloadProgress
{
get => _downloadProgress;
set => RaiseAndSetIfChanged(ref _downloadProgress, value);
}
private string _url;
public string Url
{
get => _url;
set => RaiseAndSetIfChanged(ref _url, value);
}
private string _downloadName;
private Thread _downloadThread;
public string DownloadName
{
get => _downloadName;
set => RaiseAndSetIfChanged(ref _downloadName, value);
}
}
}