Author: alanmc
Date: 2008-02-16 21:03:26 -0500 (Sat, 16 Feb 2008)
New Revision: 95956

Modified:
   
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/LibtorrentMessages/LibtorrentMessage.cs
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/PeerMessage.cs
Log:
Passing the TorrentManger in the delegate to allow for more advanced messages

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/LibtorrentMessages/LibtorrentMessage.cs
===================================================================
--- 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/LibtorrentMessages/LibtorrentMessage.cs
  2008-02-17 01:56:37 UTC (rev 95955)
+++ 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/LibtorrentMessages/LibtorrentMessage.cs
  2008-02-17 02:03:26 UTC (rev 95956)
@@ -7,7 +7,7 @@
 {
     public abstract class LibtorrentMessage : PeerMessage
     {
-               private static Dictionary<byte, CreateMessage> messageDict;
+        private static Dictionary<byte, CreateMessage> messageDict;
 
         internal static readonly List<LTSupport> SupportedMessages = new 
List<LTSupport>();
 
@@ -16,30 +16,30 @@
 
         static LibtorrentMessage()
         {
-                       messageDict = new Dictionary<byte, CreateMessage>();
-                       nextId = 1;
+            messageDict = new Dictionary<byte, CreateMessage>();
+            nextId = 1;
 
-                       Register(ExtendedHandshakeMessage.MessageId, delegate { 
return new ExtendedHandshakeMessage(); });
+            Register(ExtendedHandshakeMessage.MessageId, delegate { return new 
ExtendedHandshakeMessage(); });
 
-                       Register(nextId, delegate { return new LTChat(); });
+            Register(nextId, delegate { return new LTChat(); });
             SupportedMessages.Add(new LTSupport("LT_chat", nextId++));
 
-                       Register(nextId, delegate { return new LTMetadata(); });
-                       SupportedMessages.Add(new LTSupport("LT_metadata", 
nextId++));
+            Register(nextId, delegate { return new LTMetadata(); });
+            SupportedMessages.Add(new LTSupport("LT_metadata", nextId++));
         }
 
-               public new static void Register(byte identifier, CreateMessage 
creator)
-               {
-                       if (creator == null || creator() == null)
-                               throw new ArgumentNullException("creator");
+        public new static void Register(byte identifier, CreateMessage creator)
+        {
+            if (creator == null)
+                throw new ArgumentNullException("creator");
 
-                       lock (messageDict)
-                               messageDict.Add(identifier, creator);
-               }
+            lock (messageDict)
+                messageDict.Add(identifier, creator);
+        }
 
         protected static LTSupport CreateSupport(string name)
         {
-                       return SupportedMessages.Find(delegate(LTSupport s) { 
return s.Name == name; });
+            return SupportedMessages.Find(delegate(LTSupport s) { return 
s.Name == name; });
         }
 
         public new static PeerMessage DecodeMessage(ArraySegment<byte> buffer, 
int offset, int count, TorrentManager manager)
@@ -49,14 +49,14 @@
 
         public new static PeerMessage DecodeMessage(byte[] buffer, int offset, 
int count, TorrentManager manager)
         {
-                       CreateMessage creator;
+            CreateMessage creator;
             PeerMessage message;
 
             byte id = buffer[offset];
-                       if (!messageDict.TryGetValue(buffer[offset], out 
creator))
-                               message = new UnknownMessage();
-                       else
-                               message = creator();
+            if (messageDict.TryGetValue(buffer[offset], out creator))
+                message = creator(manager);
+            else
+                message = new UnknownMessage();
 
             message.Decode(buffer, offset + 1, count);
             return message;

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/PeerMessage.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/PeerMessage.cs   
2008-02-17 01:56:37 UTC (rev 95955)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/PeerMessage.cs   
2008-02-17 02:03:26 UTC (rev 95956)
@@ -8,7 +8,7 @@
 
 namespace MonoTorrent.Client.Messages
 {
-    public delegate PeerMessage CreateMessage();
+    public delegate PeerMessage CreateMessage(TorrentManager manager);
     public abstract class PeerMessage : Message
     {
         private static Dictionary<byte, CreateMessage> messageDict;
@@ -17,26 +17,26 @@
         {
             messageDict = new Dictionary<byte, CreateMessage>();
 
-            Register(AllowedFastMessage.MessageId,        delegate { return 
new AllowedFastMessage(); });
-            //Register(BitfieldMessage.MessageId,        delegate { return new 
BitfieldMessage(); });
-            Register(CancelMessage.MessageId,            delegate { return new 
CancelMessage(); });
-            Register(ChokeMessage.MessageId,            delegate { return new 
ChokeMessage(); });
-            Register(HaveAllMessage.MessageId,            delegate { return 
new HaveAllMessage(); });
-            Register(HaveMessage.MessageId,                delegate { return 
new HaveMessage(); });
-            Register(HaveNoneMessage.MessageId,            delegate { return 
new HaveNoneMessage(); });
-            Register(InterestedMessage.MessageId,        delegate { return new 
InterestedMessage(); });
-            Register(NotInterestedMessage.MessageId,    delegate { return new 
NotInterestedMessage(); });
-            //Register(PieceMessage.MessageId,            delegate { return 
new PieceMessage(); });
-            Register(PortMessage.MessageId,                delegate { return 
new PortMessage(); });
-            Register(RejectRequestMessage.MessageId,    delegate { return new 
RejectRequestMessage(); });
-            Register(RequestMessage.MessageId,            delegate { return 
new RequestMessage(); });
-            Register(SuggestPieceMessage.MessageId,        delegate { return 
new SuggestPieceMessage(); });
-            Register(UnchokeMessage.MessageId,            delegate { return 
new UnchokeMessage(); });
+            Register(AllowedFastMessage.MessageId,   delegate (TorrentManager 
manager) { return new AllowedFastMessage(); });
+            Register(BitfieldMessage.MessageId,      delegate (TorrentManager 
manager) { return new BitfieldMessage(manager.Torrent.Pieces.Count); });
+            Register(CancelMessage.MessageId,        delegate (TorrentManager 
manager) { return new CancelMessage(); });
+            Register(ChokeMessage.MessageId,         delegate (TorrentManager 
manager) { return new ChokeMessage(); });
+            Register(HaveAllMessage.MessageId,       delegate (TorrentManager 
manager) { return new HaveAllMessage(); });
+            Register(HaveMessage.MessageId,          delegate (TorrentManager 
manager) { return new HaveMessage(); });
+            Register(HaveNoneMessage.MessageId,      delegate (TorrentManager 
manager) { return new HaveNoneMessage(); });
+            Register(InterestedMessage.MessageId,    delegate (TorrentManager 
manager) { return new InterestedMessage(); });
+            Register(NotInterestedMessage.MessageId, delegate (TorrentManager 
manager) { return new NotInterestedMessage(); });
+            Register(PieceMessage.MessageId,         delegate (TorrentManager 
manager) { return new PieceMessage(manager); });
+            Register(PortMessage.MessageId,          delegate (TorrentManager 
manager) { return new PortMessage(); });
+            Register(RejectRequestMessage.MessageId, delegate (TorrentManager 
manager) { return new RejectRequestMessage(); });
+            Register(RequestMessage.MessageId,       delegate (TorrentManager 
manager) { return new RequestMessage(); });
+            Register(SuggestPieceMessage.MessageId,  delegate (TorrentManager 
manager) { return new SuggestPieceMessage(); });
+            Register(UnchokeMessage.MessageId,       delegate (TorrentManager 
manager) { return new UnchokeMessage(); });
         }
 
         public static void Register(byte identifier, CreateMessage creator)
         {
-            if (creator == null || creator() == null)
+            if (creator == null)
                 throw new ArgumentNullException("creator");
 
             lock (messageDict)
@@ -52,28 +52,15 @@
         {
             PeerMessage message;
             CreateMessage creator;
+            if (buffer[offset] == LibtorrentMessage.MessageId)
+                return LibtorrentMessage.DecodeMessage(buffer, offset + 1, 
count, manager);
 
-            switch (buffer[offset])
-            {
-                case LibtorrentMessage.MessageId:
-                    return LibtorrentMessage.DecodeMessage(buffer, offset + 1, 
count, manager);
 
-                case BitfieldMessage.MessageId:
-                    message = new 
BitfieldMessage(manager.Torrent.Pieces.Count);
-                    break;
+            if (messageDict.TryGetValue(buffer[offset], out creator))
+                message = creator(manager);
+            else
+                message = new UnknownMessage();
 
-                case PieceMessage.MessageId:
-                    message = new PieceMessage(manager);
-                    break;
-
-                default:
-                    if (!messageDict.TryGetValue(buffer[offset], out creator))
-                        message = new UnknownMessage();
-                    else
-                        message = creator();
-                    break;
-            }
-
             // The message length is given in the second byte and the message 
body follows directly after that
             // We decode up to the number of bytes Received. If the message 
isn't complete, throw an exception
             message.Decode(buffer, offset + 1, count);

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to