Author: alanmc
Date: 2008-02-16 20:24:37 -0500 (Sat, 16 Feb 2008)
New Revision: 95949
Modified:
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/ClientEngine.cs
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/StandardMessages/HandshakeMessage.cs
trunk/bitsharp/src/SampleClient/TestManualConnection.cs
Log:
Added ability to specify a custom PieceWriter in ClientEngine constructor.
Added extra boolean to show whether ExtendedMessaging is supported or not.
HandshakeMessage uses this new boolean.
Modified: trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/ClientEngine.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/ClientEngine.cs
2008-02-17 01:21:31 UTC (rev 95948)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/ClientEngine.cs
2008-02-17 01:24:37 UTC (rev 95949)
@@ -53,6 +53,7 @@
private static Random random = new Random();
#region Global Constants
+ public static readonly bool SupportsExtended = true;
public static readonly bool SupportsFastPeer = true;
public static readonly bool SupportsEncryption = true;
public static readonly bool SupportsEndgameMode = false;
@@ -166,53 +167,80 @@
/// <param name="engineSettings">The engine settings to use</param>
/// <param name="defaultTorrentSettings">The default settings for new
torrents</param>
public ClientEngine(EngineSettings engineSettings)
- : this(engineSettings, null, true)
{
+ Initialise(engineSettings, null, null);
+ this.peerId = GeneratePeerId();
}
+ public ClientEngine(EngineSettings settings, PieceWriter writer)
+ {
+ if (writer == null)
+ throw new ArgumentNullException("writer");
+
+ Initialise(settings, null, writer);
+ this.peerId = GeneratePeerId();
+ }
+
/// <summary>
/// Creates a new ClientEngine
/// </summary>
/// <param name="engineSettings">The engine settings to use</param>
/// <param name="defaultTorrentSettings">The default settings for new
torrents</param>
public ClientEngine(EngineSettings engineSettings,
ConnectionListenerBase listener)
- : this(engineSettings, listener, false)
{
+ if (listener == null)
+ throw new ArgumentNullException("listener");
+
+ Initialise(engineSettings, listener, null);
+ this.peerId = GeneratePeerId();
}
- private ClientEngine(EngineSettings engineSettings,
ConnectionListenerBase listener, bool createListener)
+ public ClientEngine(EngineSettings engineSettings,
ConnectionListenerBase listener, PieceWriter writer)
{
+ if (listener == null)
+ throw new ArgumentNullException("listener");
+ if (writer == null)
+ throw new ArgumentNullException("writer");
+
+ Initialise(engineSettings, listener, writer);
+ this.peerId = GeneratePeerId();
+ }
+
+ private void Initialise(EngineSettings engineSettings,
ConnectionListenerBase listener, PieceWriter writer)
+ {
if (engineSettings == null)
throw new ArgumentNullException("engineSettings");
- if (listener == null && !createListener)
- throw new ArgumentNullException("listener");
+ this.settings = engineSettings;
// Wrap a memory buffer around the disk writer
- PieceWriter writer = new DiskWriter(engineSettings.MaxOpenFiles);
- writer = new MemoryWriter(writer);
+ if (writer == null)
+ {
+ writer = new DiskWriter(engineSettings.MaxOpenFiles);
+ writer = new MemoryWriter(writer);
+ }
- this.settings = engineSettings;
this.asyncCompletionLock = new object();
this.connectionManager = new ConnectionManager(this);
this.diskManager = new DiskManager(this, writer);
this.listenManager = new ListenManager(this);
- this.peerId = GeneratePeerId();
this.timer = new System.Timers.Timer(TickLength);
this.torrents = new MonoTorrentCollection<TorrentManager>();
this.torrentsLock = new ReaderWriterLock();
this.timer.Elapsed += new ElapsedEventHandler(LogicTick);
- if (createListener)
+ if (listener == null)
+ {
listener = new SocketListener(new IPEndPoint(IPAddress.Any,
engineSettings.ListenPort));
-
- listenManager.Register(listener);
-
- if (createListener)
+ listenManager.Register(listener);
listener.Start();
+ }
+ else
+ {
+ listenManager.Register(listener);
+ }
}
-
#endregion
Modified:
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/StandardMessages/HandshakeMessage.cs
===================================================================
---
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/StandardMessages/HandshakeMessage.cs
2008-02-17 01:21:31 UTC (rev 95948)
+++
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/StandardMessages/HandshakeMessage.cs
2008-02-17 01:24:37 UTC (rev 95949)
@@ -117,22 +117,31 @@
}
public HandshakeMessage(byte[] infoHash, string peerId, string
protocolString)
- : this(infoHash, peerId, protocolString,
ClientEngine.SupportsFastPeer)
+ : this(infoHash, peerId, protocolString,
ClientEngine.SupportsFastPeer, ClientEngine.SupportsExtended)
{
}
public HandshakeMessage(byte[] infoHash, string peerId, string
protocolString, bool enableFastPeer)
+ : this(infoHash, peerId, protocolString, enableFastPeer,
ClientEngine.SupportsExtended)
{
+
+ }
+
+ public HandshakeMessage(byte[] infoHash, string peerId, string
protocolString, bool enableFastPeer, bool enableExtended)
+ {
if (!ClientEngine.SupportsFastPeer && enableFastPeer)
throw new ProtocolException("The engine does not support fast
peer, but fast peer was requested");
+ if (!ClientEngine.SupportsExtended && enableExtended)
+ throw new ProtocolException("The engine does not support
extended, but extended was requested");
+
this.infoHash = infoHash;
this.peerId = peerId;
this.protocolString = protocolString;
this.protocolStringLength = protocolString.Length;
this.supportsFastPeer = enableFastPeer;
- this.extended = true;
+ this.extended = enableExtended;
}
#endregion
Modified: trunk/bitsharp/src/SampleClient/TestManualConnection.cs
===================================================================
--- trunk/bitsharp/src/SampleClient/TestManualConnection.cs 2008-02-17
01:21:31 UTC (rev 95948)
+++ trunk/bitsharp/src/SampleClient/TestManualConnection.cs 2008-02-17
01:24:37 UTC (rev 95949)
@@ -8,9 +8,30 @@
using MonoTorrent.BEncoding;
using MonoTorrent.Client.Encryption;
using MonoTorrent.Client.Connections;
+using MonoTorrent.Client.PieceWriters;
namespace SampleClient
{
+ public class NullWriter : PieceWriter
+ {
+ public override int Read(FileManager manager, byte[] buffer, int
bufferOffset, long offset, int count)
+ {
+ return count;
+ }
+
+ public override void Write(PieceData data)
+ {
+ }
+
+ public override void CloseFileStreams(TorrentManager manager)
+ {
+ }
+
+ public override void Flush(TorrentManager manager)
+ {
+ }
+ }
+
public class CustomConnection : IConnection
{
private string name;
@@ -148,8 +169,9 @@
public EngineTestRig(string savePath, int piecelength)
{
+ PieceWriter writer = new MemoryWriter(new NullWriter());
listener = new CustomListener();
- engine = new ClientEngine(new EngineSettings(), listener);
+ engine = new ClientEngine(new EngineSettings(), listener, writer);
torrent = Torrent.Load(CreateTorrent(piecelength));
manager = new TorrentManager(torrent, savePath, new
TorrentSettings());
engine.Register(manager);
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches