using System.IO; using System.Threading; using System.Windows; using Wabbajack.Common; using Wabbajack.Lib; using Wabbajack.Lib.Downloaders; namespace Wabbajack { /// /// Interaction logic for DownloadWindow.xaml /// 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) { InitializeComponent(); DataContext = new DownloadWindowViewModel(this, url, name, size, destination); } } public class DownloadWindowViewModel : ViewModel { private readonly string _destination; private readonly DownloadWindow _parent; private long _size; public DownloadWindowViewModel(DownloadWindow parent, string url, string name, long size, string destination) { _parent = parent; _url = url; _downloadName = name; _destination = destination; _size = size; Start(); } private void Start() { _downloadThread = new Thread(() => { var state = DownloadDispatcher.ResolveArchive(_url); state.Download(new Archive {Name = _downloadName, Size = _size}, _destination); _destination.FileHash(); _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); } } }