private async Task <Uri> HandleDownload(DownloadOperation download, bool alreadyStarted)
        {
            var bindableDownload = new BindableDownloadOperation(download);

            try {
                ActiveDownloads.Add(bindableDownload);
                var callback = new Progress <DownloadOperation>(OnDownloadStatusUpdate);
                IAsyncOperationWithProgress <DownloadOperation, DownloadOperation> op = null;
                if (alreadyStarted)
                {
                    var d = download.AttachAsync();
                    op = download.AttachAsync();
                }
                else
                {
                    op = download.StartAsync();
                }
                op.Progress = (a, p) => {
                    OnBindableStatusUpdate(bindableDownload);
                };
                // awaits completion of download
                DownloadOperation completedDownload = await op.AsTask(Cts.Token, callback);

                return(FileUtils.UriFor(completedDownload.ResultFile));
            } finally {
                // download complete
                ActiveDownloads.Remove(bindableDownload);
            }
        }
        /// <summary>
        ///     Hanbdles a single BackgroundDownload for a song.
        /// </summary>
        /// <param name="song">
        ///     The song to be downloaded
        /// </param>
        /// <param name="download">
        ///     The download operation
        /// </param>
        /// <param name="start">
        ///     Either the download is started or just handled
        /// </param>
        private async void HandleDownload(Song song, DownloadOperation download, bool start)
        {
            if (song == null || download == null)
            {
                return;
            }

            song.Download = new BackgroundDownload(download);
            ActiveDownloads.Add(song);

            try
            {
                var progressCallback = new Progress <DownloadOperation>(DownloadProgress);
                if (start)
                {
                    // Start the BackgroundDownload and attach a progress handler.
                    await download.StartAsync().AsTask(song.Download.CancellationTokenSrc.Token, progressCallback);
                }
                else
                {
                    // The BackgroundDownload was already running when the application started, re-attach the progress handler.
                    await download.AttachAsync().AsTask(song.Download.CancellationTokenSrc.Token, progressCallback);
                }

                // Download Completed
                var response = download.GetResponseInformation();

                // Make sure it is success
                if (response.StatusCode < 400)
                {
                    await DownloadFinishedForAsync(song);
                }
                else
                {
                    song.SongState = SongState.None;
                    sqlService.UpdateItem(song);
                    download.ResultFile.DeleteAsync();
                }
            }
            catch
            {
                song.SongState = SongState.None;
                sqlService.UpdateItem(song);
                download.ResultFile.DeleteAsync();
            }
            finally
            {
                ActiveDownloads.Remove(song);
            }
        }
Beispiel #3
0
    public Texture2D GetTexture(string url)
    {
        if (string.IsNullOrEmpty(url))
        {
            return(null);
        }
        if (Images.ContainsKey(url))
        {
            return(Images[url]);
        }

        if (ImageDownloads.ContainsKey(url))
        {
            // waiting for download
            return(null);
        }

        var download = new ImageDownload(this, url);

        ImageDownloads.Add(url, download);
        ActiveDownloads.Add(download);
        return(null);
    }