private void TorrentManager_TorrentStateChanged(object sender, TorrentStateChangedEventArgs e) { if (e.NewState == TorrentState.Error) { CurrentState = State.Error; Error?.Invoke(this, EventArgs.Empty); return; } if (e.OldState != TorrentState.Metadata) { return; } CurrentState = State.Preparing; OnStreamProgress(0, 0, 0, 0); SetSelectedFile(-1); SlidingPicker = new SlidingWindowPicker(new PriorityPicker(new StandardPicker())) { HighPrioritySetStart = _firstPieceIndex, HighPrioritySetSize = _pieceToPrepare }; TorrentManager.ChangePicker(SlidingPicker); TorrentManager.PieceManager.BlockReceived -= PieceManagerOnBlockReceived; TorrentManager.PieceManager.BlockReceived += PieceManagerOnBlockReceived; var blockCount = _pieceToPrepare * TorrentManager.Torrent.PieceLength / (double)Piece.BlockSize; _progressStep = 100 / blockCount; }
private async Task ChangePicker() { if (!_manager.HasMetadata || _manager.State != TorrentState.Stopped) { throw new InvalidDataException("Torrent Manager is in an invalid state"); } var picker = new SlidingWindowPicker(new StandardPicker()) { HighPrioritySetStart = 0 }; await _manager.ChangePickerAsync(picker); }
private PiecePicker CreateSlidingPicker(TorrentManager torrent) { PiecePicker picker; if (ClientEngine.SupportsEndgameMode) { picker = new EndGameSwitcher(new StandardPicker(), new EndGamePicker(), torrent.Torrent.PieceLength / Piece.BlockSize, torrent); } else { picker = new StandardPicker(); } picker = new RandomisedPicker(picker); picker = new SlidingWindowPicker(picker); picker = new PriorityPicker(picker); return(picker); }
private void FormThread() { while (!_manager.HasMetadata) { // we have created the torrent from the InfoHash, to continue we need to receive torrent file first StatusMessage = "Поиск метаданных..."; if (!UserWaits()) { _torrentProvider.CancelTorrent(_manager); return; } Thread.Sleep(100); } // update priorities foreach (var torrentFile in _manager.Torrent.Files) { if (!string.IsNullOrEmpty(Magnet.FileName) && torrentFile.Path == Magnet.FileName) { torrentFile.Priority = Priority.Immediate; _file = torrentFile; } else { torrentFile.Priority = Priority.DoNotDownload; } } bool updateMagnetFileName = false; if (_file == null) { if (_manager.Torrent.Files.Length == 1) { _file = _manager.Torrent.Files[0]; updateMagnetFileName = true; } else { StatusMessage = "Выбор файла..."; while (_file == null) { Thread.Sleep(100); if (Closed) { _torrentProvider.CancelTorrent(_manager); return; } } updateMagnetFileName = true; } } if (updateMagnetFileName || string.IsNullOrEmpty(Magnet.FileName) || Magnet.Size == 0) { var magnet = Magnet; magnet.FileName = _file.Path; magnet.Size = _file.Length; if (magnet.Trackers == null && _manager.Torrent.AnnounceUrls.Count > 0) { magnet.Trackers = _manager.Torrent.AnnounceUrls.SelectMany(t => t).ToArray(); } Magnet = magnet; } SlidingWindowPicker slidingPicker = null; while (slidingPicker == null) { slidingPicker = _manager.PieceManager.GetPicker <SlidingWindowPicker>(); Thread.Sleep(0); } slidingPicker.HighPrioritySetStart = _file.StartPieceIndex; slidingPicker.HighPrioritySetSize = 3; _torrentProvider.Client.History.AddItem(Magnet); _file.Priority = Priority.Immediate; while (_manager.State == TorrentState.Hashing) { StatusMessage = string.Format("Проверка кеша... "); Thread.Sleep(500); } var sw = Stopwatch.StartNew(); // start when 2% of the file is loaded and we have the first piece of the file while (_file.BytesDownloaded < _file.Length / 50 && sw.Elapsed.TotalSeconds < 120 && UserWaits()) { StatusMessage = string.Format("Загрузка... {0}", _manager.Monitor.DownloadSpeed != 0 ? Utils.FormatBytes(_manager.Monitor.DownloadSpeed) + "/c" : ""); Thread.Sleep(500); } if (_file.BytesDownloaded >= _file.Length / 50) { StartIn5Seconds(); return; } if (_file.BytesDownloaded == 0) { StatusMessage = "Не удается начать загрузку. Источники: " + _manager.Peers.Available; Progress = float.PositiveInfinity; } while (!_cancel && !_started) { if (_file.BytesDownloaded >= _file.Length / 50) { ReadyToStart = true; StatusMessage = string.Format("Файл готов к работе. Загружено: {0} ({1}%)", Utils.FormatBytes(_file.BytesDownloaded), Math.Round(Progress * 100)); Progress = (float)_file.BytesDownloaded / _file.Length; } else if (_file.BytesDownloaded > 0) { Progress = (float)_file.BytesDownloaded / _file.Length; StatusMessage = string.Format("Низкая скорость загрузки. Загружено: {0} ({1}%)", Utils.FormatBytes(_file.BytesDownloaded), Math.Round(Progress * 100)); } Thread.Sleep(100); } if (_cancel && !_addToQueue) { _torrentProvider.Client.History.DeleteItem(Magnet); // warn: this could take long time to finish (minute or so) _torrentProvider.DeleteFile(Magnet); } }