public void Save(byte[] buffer) { if (!HasError) { try { writer.Write(buffer); WritenBytesCount += buffer.Length; OnDownloadUpdateProgress?.Invoke(Convert.ToInt32((WritenBytesCount / (double)FileLength) * 100f)); if (WritenBytesCount >= FileLength) { IsOpen = false; Completed = true; Close(); OnDownloadCompleted?.Invoke(Folder, FileName); } } catch { HasError = true; IsOpen = false; OnDownloadFailed?.Invoke(Folder, FileName); } } }
public void QueueDownload(UriString url, string targetDirectory, string filename = null, int retryCount = 0) { var download = new DownloadTask(TaskManager, url, targetDirectory, filename, retryCount, Token); download.OnStart += t => OnDownloadStart?.Invoke(((DownloadTask)t).Url); download.OnEnd += (t, res, s, ex) => { if (s) { OnDownloadComplete?.Invoke(((DownloadTask)t).Url, res); } else { OnDownloadFailed?.Invoke(((DownloadTask)t).Url, ex); } }; // queue after hooking up events so OnDownload* gets called first Queue(download); }
public void QueueDownload(UriString url, NPath targetDirectory) { var download = new DownloadTask(Token, fileSystem, url, targetDirectory); download.OnStart += t => OnDownloadStart?.Invoke(((DownloadTask)t).Url); download.OnEnd += (t, res, s, ex) => { if (s) { OnDownloadComplete?.Invoke(((DownloadTask)t).Url, res); } else { OnDownloadFailed?.Invoke(((DownloadTask)t).Url, ex); } }; // queue after hooking up events so OnDownload* gets called first Queue(download); }
private async Task Download(FSItem item, Stream result, Downloader downloader) { try { Log.Trace($"Started download: {item.Name} - {item.Id}"); var start = Stopwatch.StartNew(); var buf = new byte[64 << 10]; var uncommitedSize = 0; const int commitSize = 512 << 10; using (result) using (var writer = new BufferedStream(result)) { OnDownloadStarted?.Invoke(item); while (writer.Length < item.Length) { var stream = await cloud.Files.Download(item.Id); stream.Position = writer.Length; int red; do { red = await stream.ReadAsync(buf, 0, buf.Length); if (writer.Length == 0) { Log.Trace($"Got first part: {item.Name} - {item.Id} in {start.ElapsedMilliseconds}"); } await writer.WriteAsync(buf, 0, red); uncommitedSize += red; if (uncommitedSize <= commitSize) { continue; } uncommitedSize = 0; await writer.FlushAsync(); downloader.Downloaded = writer.Length; }while (red > 0); } await writer.FlushAsync(); downloader.Downloaded = writer.Length; } Log.Trace($"Finished download: {item.Name} - {item.Id}"); OnDownloaded?.Invoke(item); if (access.TryAdd( item.Id, new CacheEntry { Id = item.Id, AccessTime = DateTime.UtcNow, Length = item.Length })) { TotalSizeIncrease(item.Length); } if (TotalSize > CacheSize) { var task = cleanSizeWorker.Run(TotalSize - CacheSize); } if (start.ElapsedMilliseconds > 29000) { Log.Warn($"Downloading {item.Path} took: {start.ElapsedMilliseconds}"); } } catch (Exception ex) { Log.ErrorTrace($"Download failed: {item.Name} - {item.Id}\r\n{ex}"); await downloader.Failed(); OnDownloadFailed?.Invoke(item); } finally { lock (DownloadersLock) { Downloaders.Remove(item.Path); } } }
private async Task Download(FSItem item, Stream writer, Downloader downloader) { Log.Trace("Started download: " + item.Id); var start = Stopwatch.StartNew(); var buf = new byte[4096]; using (writer) try { OnDownloadStarted?.Invoke(item.Id); while (writer.Length < item.Length) { await amazon.Files.Download(item.Id, fileOffset : writer.Length, streammer : async(response) => { var partial = response.StatusCode == System.Net.HttpStatusCode.PartialContent; ContentRangeHeaderValue contentRange = null; if (partial) { contentRange = response.Headers.GetContentRange(); if (contentRange.From != writer.Length) { throw new InvalidOperationException("Content range does not match request"); } } using (var stream = response.GetResponseStream()) { int red = 0; do { red = await stream.ReadAsync(buf, 0, buf.Length); if (writer.Length == 0) { Log.Trace("Got first part: " + item.Id + " in " + start.ElapsedMilliseconds); } writer.Write(buf, 0, red); downloader.Downloaded = writer.Length; }while (red > 0); } }); if (writer.Length < item.Length) { await Task.Delay(500); } } Log.Trace("Finished download: " + item.Id); OnDownloaded?.Invoke(item.Id); access.TryAdd(item.Id, new CacheEntry { Id = item.Id, AccessTime = DateTime.UtcNow, Length = item.Length }); TotalSize += item.Length; if (TotalSize > CacheSize) { StartClear(TotalSize - CacheSize); } } catch (Exception ex) { OnDownloadFailed?.Invoke(item.Id); Log.Error($"Download failed: {item.Id}\r\n{ex}"); } finally { Downloader remove; downloaders.TryRemove(item.Path, out remove); } }
public void OnFailure(Exception e) { OnDownloadFailed?.Invoke(e); }