Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
            }
        }