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

Reply via email to