/// <summary>
/// Starts the TorrentManager
/// </summary>
public void Start()
{
ClientEngine.MainLoop.QueueWait((MainLoopTask) delegate {
CheckRegisteredAndDisposed();
this._engine.Start();
// If the torrent was "paused", then just update the state to Downloading and forcefully
// make sure the peers begin sending/receiving again
if (this.State == TorrentState.Paused)
{
Mode = new DownloadMode(this);
return;
}
if (!HasMetadata)
{
Mode = new MetadataMode(this, _torrentSave);
#if !DISABLE_DHT
StartDHT();
#endif
return;
}
VerifyHashState();
// If the torrent has not been hashed, we start the hashing process then we wait for it to finish
// before attempting to start again
if (!_hashChecked)
{
if (State != TorrentState.Hashing)
{
HashCheck(true);
}
return;
}
if (State == TorrentState.Seeding || State == TorrentState.Downloading)
{
return;
}
if (TrackerManager.CurrentTracker != null)
{
if (this._trackerManager.CurrentTracker.CanScrape)
{
this.TrackerManager.Scrape();
}
this._trackerManager.Announce(TorrentEvent.Started); // Tell server we're starting
}
if (this.Complete && this._settings.InitialSeedingEnabled && ClientEngine.SupportsInitialSeed)
{
Mode = new InitialSeedingMode(this);
}
else
{
Mode = new DownloadMode(this);
}
_engine.Broadcast(this);
#if !DISABLE_DHT
StartDHT();
#endif
this._startTime = DateTime.Now;
this._pieceManager.Reset();
ClientEngine.MainLoop.QueueTimeout(TimeSpan.FromSeconds(2), delegate {
if (State != TorrentState.Downloading && State != TorrentState.Seeding)
{
return(false);
}
_pieceManager.Picker.CancelTimedOutRequests();
return(true);
});
});
}