Ejemplo n.º 1
0
    private void DownloadPhoto(string url)
    {
        var www = UnityWebRequestTexture.GetTexture(url);

        www.SendWebRequest()
        .AsAsyncOperationObservable()
        .SubscribeOn(Scheduler.ThreadPool)
        .ObserveOn(Scheduler.MainThread)
        .Subscribe(
            success =>
        {
            var photo = !www.downloadHandler.isDone
                        ? Global.Instance.errorImage.texture
                        : ((DownloadHandlerTexture)www.downloadHandler).texture;
            photos.Add(photo);
            if (photos.Count >= PerPage)
            {
                OnDownloadFinished?.Invoke(photos);
            }
        },
            failure =>
        {
            OnFailure(new Exception($"An exception occurred while downloading photo from {url}.", failure));
        }
            );
    }
        private void ReportEnd()
        {
            FinishedEventArgs e = new FinishedEventArgs();

            e.ResultType = FinishedEventArgs.Result.Success;

            e.File           = File;
            e.File.Completed = true;
            OnDownloadFinished?.Invoke(this, e);
        }
        private static void CheckDownloadFinished()
        {
            if (IsDownloading)
            {
                return;
            }

            VideoDownloadProgress = 0.0f;
            ChatDownloadProgress  = 0.0f;
            OnDownloadFinished?.Invoke();
        }
Ejemplo n.º 4
0
        private void Progress()
        {
            if (!isRunning)
            {
                isRunning = true;
            }

            string url = string.Empty;

            while (_downloadQueue.Count > 0 && _downloadQueue.TryDequeue(out url) && !string.IsNullOrWhiteSpace(url))
            {
                DownloadWithUrl($"http://cstrike.surf.ga/{url}");
            }

            isRunning = false;
            OnDownloadFinished?.Invoke(this, new EventArgs());
        }
        private void ReportEnd()
        {
            FinishedEventArgs e = new FinishedEventArgs();

            if (File.Downloaded == File.Size)
            {
                e.ResultType = FinishedEventArgs.Result.Success;
            }
            else
            {
                e.ResultType = FinishedEventArgs.Result.Unsuccessful;
            }

            e.File = File;
            if (e.File.Downloaded == e.File.Size)
            {
                e.File.Completed = true;
            }
            OnDownloadFinished?.Invoke(this, e);
        }
Ejemplo n.º 6
0
        public void StartDownload(IApplicationVersion version)
        {
            if (isDownloading)
            {
                return;
            }

            _httpClient = new HttpClient();

            Task.Run(() =>
            {
                isDownloading = true;
                DownloadSpeed = new DownloadSpeed();

                OnProgressChanged  += DownloadSpeed.DownloadProgressChanged;
                OnDownloadFinished += DownloadSpeed.webClient_DownloadFileCompleted;

                var downloadFileWithRange = DownloadFileWithRange(version);
                OnDownloadFinished?.Invoke(this, new UpdateProgressChangedEventArgs(downloadFileWithRange, 0, 0, 0));
                isDownloading = false;
            });
        }
Ejemplo n.º 7
0
        public async Task StartDownloadAsync(IApplicationVersion version)
        {
            if (_downloadTask == null)
            {
                _cancellationSource = _cancellationSourceFactory.CreateSource();
                _downloadTask       = Task.Run(() =>
                {
                    _httpClient = new HttpClient();

                    DownloadSpeed = new DownloadSpeed();

                    OnProgressChanged  += DownloadSpeed.DownloadProgressChanged;
                    OnDownloadFinished += DownloadSpeed.webClient_DownloadFileCompleted;

                    var downloadFileWithRange = DownloadFileWithRange(version);
                    OnDownloadFinished?.Invoke(this, new UpdateProgressChangedEventArgs(downloadFileWithRange, 0, 0, 0));
                    _downloadTask = null;
                }, _cancellationSource.Token);
            }

            await _downloadTask;
        }
Ejemplo n.º 8
0
        /// <summary>
        /// </summary>
        private void UpdateDownloads(bool bHasConnection)
        {
            List <Guid> ActiveManifestIds = new List <Guid>();

            foreach (DownloadState State in StateCollection.States)
            {
                bool UpdateManifestId = true;

                // If not set to auto update and we already have a completed download, do nothing else.
                if (!State.UpdateAutomatically && State.ActiveManifestId != Guid.Empty)
                {
                    ManifestDownloadState OldVersionDownloader = ManifestDownloader.GetDownload(State.ActiveManifestId);
                    if (OldVersionDownloader != null && OldVersionDownloader.State == ManifestDownloadProgressState.Complete)
                    {
                        UpdateManifestId = false;
                    }
                }

                if (bHasConnection && UpdateManifestId)
                {
                    Guid NewManifestId = GetTargetManifestForState(State);
                    if (NewManifestId != Guid.Empty)
                    {
                        if (State.ActiveManifestId != NewManifestId && !State.Paused)
                        {
                            OnDownloadStarted?.Invoke(State);
                        }

                        State.ActiveManifestId = NewManifestId;
                    }
                }

                if (State.ActiveManifestId == Guid.Empty)
                {
                    continue;
                }

                ActiveManifestIds.Add(State.ActiveManifestId);

                ManifestDownloadState Downloader = ManifestDownloader.GetDownload(State.ActiveManifestId);
                if (Downloader != null)
                {
                    // If state is downloading but we've paused it, pause it and ignore.
                    if (State.Paused)
                    {
                        if (!Downloader.Paused)
                        {
                            ManifestDownloader.PauseDownload(State.ActiveManifestId);
                            continue;
                        }
                    }
                    else
                    {
                        if (Downloader.Paused)
                        {
                            ManifestDownloader.ResumeDownload(State.ActiveManifestId);
                        }
                    }

                    // Hackily change the priority - should change this to a SetDownloadPriority method.
                    Downloader.Priority          = State.Priority;
                    Downloader.InstallOnComplete = State.InstallAutomatically;
                    Downloader.InstallDeviceName = State.InstallDeviceName;
                    Downloader.InstallLocation   = State.InstallLocation;

                    // Have we finished this download?
                    if (Downloader.State == ManifestDownloadProgressState.Complete &&
                        State.PreviousDownloaderState != Downloader.State &&
                        State.PreviousDownloaderState != ManifestDownloadProgressState.Unknown)
                    {
                        OnDownloadFinished?.Invoke(State);
                    }

                    State.PreviousDownloaderState = Downloader.State;

                    // Store the amount of time the download is in each state to make
                    // time estimates a bit better.
                    if (Downloader.State != ManifestDownloadProgressState.Complete && !State.Paused && Downloader.Manifest != null && (bHasConnection || Downloader.State != ManifestDownloadProgressState.Downloading))
                    {
                        if (State.PendingDurationHistory == null)
                        {
                            State.PendingDurationHistory           = new DownloadStateDuration();
                            State.PendingDurationHistory.TotalSize = Downloader.Manifest.GetTotalSize();
                        }

                        ulong CurrentTime = TimeUtils.Ticks;
                        if (State.PendingDurationTimer > 0)
                        {
                            ulong Elapsed   = TimeUtils.Ticks - State.PendingDurationTimer;
                            ulong StartTime = State.PendingDurationHistory.GetDuration(Downloader.State);
                            ulong NewTime   = StartTime + Elapsed;
                            State.PendingDurationHistory.SetDuration(Downloader.State, NewTime);
                            //Console.WriteLine("State:{0} Time:{1}", Downloader.State.ToString(), StringUtils.FormatAsDuration((long)State.PendingDurationHistory.StateDurations[Downloader.State] / 1000));
                        }
                        State.PendingDurationTimer = CurrentTime;
                    }
                    else if (Downloader.State == ManifestDownloadProgressState.Complete)
                    {
                        if (State.PendingDurationHistory != null)
                        {
                            State.DurationHistory.Add(State.PendingDurationHistory);
                            State.PendingDurationHistory = null;

                            // Only keep a few history entries.
                            while (State.DurationHistory.Count > 15)
                            {
                                State.DurationHistory.RemoveAt(0);
                            }
                        }
                    }
                }
                else
                {
                    // Start downloading this manifest.
                    ManifestDownloader.StartDownload(State.ActiveManifestId, State.Priority);
                }
            }

            // Go through each manifest download and pause any that are no longer relevant.
            foreach (ManifestDownloadState Downloader in ManifestDownloader.States.States)
            {
                if (!ActiveManifestIds.Contains(Downloader.ManifestId))
                {
                    if (!Downloader.Paused)
                    {
                        ManifestDownloader.PauseDownload(Downloader.ManifestId);
                    }

                    Downloader.Active = false;
                }
                else
                {
                    Downloader.Active     = true;
                    Downloader.LastActive = DateTime.Now;
                }
            }

            // Only download a single auto-replication download at a time, more efficient than dozens downloading at the same time.
            Guid UnpausedAutoDownload = Guid.Empty;

            // Remove auto replication downloads as required.
            for (int i = 0; i < StateCollection.States.Count; i++)
            {
                DownloadState State = StateCollection.States[i];

                if (State.ActiveManifestId == Guid.Empty)
                {
                    continue;
                }

                if (!State.IsAutomaticReplication)
                {
                    continue;
                }

                ManifestDownloadState Downloader = ManifestDownloader.GetDownload(State.ActiveManifestId);
                if (Downloader != null)
                {
                    bool ShouldRemove = false;

                    // Always remove downloads that have completed.
                    if (Downloader.State == ManifestDownloadProgressState.Complete)
                    {
                        ShouldRemove = true;
                    }

                    // Download has not recieved any blocks in a long time, remove.
                    TimeSpan Elapsed = DateTime.UtcNow - Downloader.LastRecievedData;
                    if (Elapsed.TotalHours > ReplicationMaxIdleHours)
                    {
                        ShouldRemove = true;
                    }

                    // Automatically resume replication downloads if they are in an error state.
                    if (UnpausedAutoDownload == Guid.Empty)
                    {
                        UnpausedAutoDownload = State.ActiveManifestId;
                    }

                    State.Paused = (UnpausedAutoDownload != State.ActiveManifestId);

                    if (ShouldRemove)
                    {
                        StateCollection.States.RemoveAt(i);
                        AreStatesDirty = false;
                        i--;
                    }
                }
            }
        }
Ejemplo n.º 9
0
 private void SinglePartUnknownDownloader_OnDownloadFinished(object sender, FinishedEventArgs e)
 {
     DownloadStatus = Status.NotDownloading;
     OnDownloadFinished?.Invoke(this, e);
 }
Ejemplo n.º 10
0
        /// <summary>
        /// Http方式下载文件
        /// </summary>
        /// <param name="url">http地址</param>
        /// <param name="localfile">本地文件</param>
        /// <returns></returns>
        public bool Download(string url, string localfile)
        {
            Url          = url;
            SaveFilePath = localfile;

            long       startPosition = 0;    // 上次下载的文件起始位置
            FileStream writeStream   = null; // 写入本地文件流对象

            try
            {
                // 判断要下载的文件夹是否存在
                if (File.Exists(localfile))
                {
                    writeStream   = File.OpenWrite(localfile);           // 存在则打开要下载的文件
                    startPosition = writeStream.Length;                  // 获取已经下载的长度
                    writeStream.Seek(startPosition, SeekOrigin.Current); // 本地文件写入位置定位
                }
                else
                {
                    writeStream   = new FileStream(localfile, FileMode.Create);// 文件不保存创建一个文件
                    startPosition = 0;
                }


                HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接

                if (startPosition > 0)
                {
                    myRequest.AddRange((int)startPosition);// 设置Range值,与上面的writeStream.Seek用意相同,是为了定义远程文件读取位置
                }

                var myResponse = (HttpWebResponse)myRequest.GetResponse();
                FileTotalBytes = myResponse.ContentLength;

                FileDownloadedBytes = startPosition;

                Stream readStream = myRequest.GetResponse().GetResponseStream();  // 向服务器请求,获得服务器的回应数据流

                byte[] btArray     = new byte[512];                               // 定义一个字节数据,用来向readStream读取内容和向writeStream写入内容
                int    contentSize = readStream.Read(btArray, 0, btArray.Length); // 向远程文件读第一次

                IsRunning = true;

                while (contentSize > 0)// 如果读取长度大于零则继续读
                {
                    if (_isStop)
                    {
                        break;
                    }

                    writeStream.Write(btArray, 0, contentSize);// 写入本地文件
                    FileDownloadedBytes += contentSize;
                    OnDownloading?.Invoke(this);

                    contentSize = readStream.Read(btArray, 0, btArray.Length);// 继续向远程文件读取
                }

                //关闭流
                writeStream.Close();
                readStream.Close();

                IsDownloadSuccess = true;        //返回true下载成功
            }
            catch (Exception e)
            {
                Logger.Error(e, logger);

                if (writeStream != null)
                {
                    writeStream.Close();
                }

                IsDownloadSuccess = false;       //返回false下载失败
            }

            IsRunning = false;

            OnDownloadFinished?.Invoke(this);

            return(IsDownloadSuccess);
        }