public async void DownloadItem(ResourceItem item) { var client = new HttpClient(); var cancellationTokenSource = new CancellationTokenSource(); var cancellationToken = cancellationTokenSource.Token; CancellationTokens[item.id] = cancellationTokenSource; try { Progress <double> progress = new Progress <double>(); progress.ProgressChanged += (sender, value) => { ReportProgress(item, value); }; var tempFolder = Windows.Storage.ApplicationData.Current.TemporaryFolder; var tempFile = await tempFolder.CreateFileAsync(GuidHelper.CreateNewGuid().ToString() + ".zip"); var response = await client.GetAsync(item.item, HttpCompletionOption.ResponseHeadersRead, cancellationToken); response.EnsureSuccessStatusCode(); var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; var canReportProgress = total != -1 && progress != null; using (var stream = await response.Content.ReadAsStreamAsync()) using (var outputStream = await tempFile.OpenStreamForWriteAsync()) { var totalRead = 0L; var buffer = new byte[4096]; var isMoreToRead = true; do { cancellationToken.ThrowIfCancellationRequested(); var read = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); if (read == 0) { isMoreToRead = false; } else { var data = new byte[read]; buffer.ToList().CopyTo(0, data, 0, read); totalRead += read; await outputStream.WriteAsync(data, 0, read); if (canReportProgress) { ((IProgress <double>)progress).Report((totalRead * 1d) / (total * 1d)); } } } while (isMoreToRead); } var destinationPath = ItemPath(item); ZipFile.ExtractToDirectory(tempFile.Path, destinationPath); File.WriteAllText(destinationPath + "\\description.json", JsonConvert.SerializeObject(item)); CancellationTokens.Remove(item.id); DownloadSuccess(item); } catch { CancellationTokens.Remove(item.id); DownloadFailure(item); } }
public string ItemPath(ResourceItem item) { return(AddonFolderPath + "\\" + item.id); }
private void ShowItem(ResourceItem item) { Nav.IsBackEnabled = true; Container.Navigate(typeof(ResourceItemPage), new ItemParameter(item)); }
private void ReportProgress(ResourceItem item, double progress) { ProgressUpdate(item, progress); }
public ItemParameter(ResourceItem item) { this.Item = item; }