void Initialise(string savePath, string baseDirectory, IList <RawTrackerTier> announces)
        {
            this.bitfield            = new BitField(HasMetadata ? torrent.Pieces.Count : 1);
            this.savePath            = Path.Combine(savePath, baseDirectory);
            this.finishedPieces      = new Queue <int>();
            this.monitor             = new ConnectionMonitor();
            this.inactivePeerManager = new InactivePeerManager(this);
            this.peers          = new PeerManager();
            this.pieceManager   = new PieceManager();
            this.trackerManager = new TrackerManager(this, InfoHash, announces);

            Mode = new StoppedMode(this);
            CreateRateLimiters();

            PieceHashed += delegate(object o, PieceHashedEventArgs e) {
                PieceManager.UnhashedPieces[e.PieceIndex] = false;
            };

            if (HasMetadata)
            {
                foreach (TorrentFile file in torrent.Files)
                {
                    file.FullPath = Path.Combine(SavePath, file.Path);
                }
            }
        }
        /// <summary>
        /// Stops the TorrentManager
        /// </summary>
        public void Stop()
        {
            if (State == TorrentState.Error)
            {
                error = null;
                Mode  = new StoppedMode(this);
                return;
            }

            if (Mode is StoppingMode)
            {
                return;
            }

            ClientEngine.MainLoop.QueueWait(delegate {
                if (State != TorrentState.Stopped)
                {
#if !DISABLE_DHT
                    engine.DhtEngine.PeersFound -= DhtPeersFound;
#endif
                    Mode = new StoppingMode(this);
                }
            });
        }