using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace Tango.Transport.Web { public class StandardFileDownloader : IWebFileDownloader { private WebClient _client; private TaskCompletionSource _completionSource; public String Address { get; private set; } public String FileName { get; private set; } public event EventHandler Progress; public StandardFileDownloader(String address, String fileName) { Address = address; FileName = fileName; _client = new WebClient(); _client.Proxy = null; _client.DownloadProgressChanged += _client_DownloadProgressChanged; _client.DownloadFileCompleted += _client_DownloadFileCompleted; _completionSource = new TaskCompletionSource(); } private void _client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { if (e.Error != null) { _completionSource.SetException(e.Error); } else { _completionSource.SetResult(true); } } public Task Download() { _client.DownloadFileAsync(new Uri(Address), FileName); return _completionSource.Task; } private void _client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { Progress?.Invoke(this, new WebFileDownloaderProgressEventArgs() { Current = e.BytesReceived, Total = e.TotalBytesToReceive, }); } public Task GetFileSize() { return Task.Factory.StartNew(() => { using (var client = new WebClient()) { client.OpenRead(Address); Int64 bytes_total = Convert.ToInt64(client.ResponseHeaders["Content-Length"]); return bytes_total; } }); } public void Dispose() { _client.Dispose(); } } }