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 - Mono-patches@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-patches