Author: alanmc
Date: 2008-02-16 20:27:58 -0500 (Sat, 16 Feb 2008)
New Revision: 95951

Modified:
   trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/PeerMessage.cs
Log:
Updated the message code to allow decoding of user-created messages.

Modified: 
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/PeerMessage.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/PeerMessage.cs   
2008-02-17 01:25:58 UTC (rev 95950)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Client/Messages/PeerMessage.cs   
2008-02-17 01:27:58 UTC (rev 95951)
@@ -8,10 +8,38 @@
 
 namespace MonoTorrent.Client.Messages
 {
+    public delegate PeerMessage CreateMessage();
     public abstract class PeerMessage : Message
     {
-        internal abstract void Handle(PeerIdInternal id);
+        private static Dictionary<byte, CreateMessage> messageDict;
 
+        static PeerMessage()
+        {
+            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(); });
+        }
+
+        public static void Register(byte identifier, CreateMessage creator)
+        {
+            lock (messageDict)
+                messageDict.Add(identifier, creator);
+        }
+
         public static PeerMessage DecodeMessage(ArraySegment<byte> buffer, int 
offset, int count, TorrentManager manager)
         {
             return DecodeMessage(buffer.Array, buffer.Offset + offset, count, 
manager);
@@ -20,75 +48,26 @@
         public static PeerMessage DecodeMessage(byte[] buffer, int offset, int 
count, TorrentManager manager)
         {
             PeerMessage message;
+            CreateMessage creator;
 
-            // The first byte tells us what kind of message it is
             switch (buffer[offset])
             {
-                case AllowedFastMessage.MessageId:
-                    message = new AllowedFastMessage();
-                    break;
+                case LibtorrentMessage.MessageId:
+                    return LibtorrentMessage.DecodeMessage(buffer, offset + 1, 
count, manager);
 
                 case BitfieldMessage.MessageId:
                     message = new 
BitfieldMessage(manager.Torrent.Pieces.Count);
                     break;
 
-                case CancelMessage.MessageId:
-                    message = new CancelMessage();
-                    break;
-
-                case ChokeMessage.MessageId:
-                    message = new ChokeMessage();
-                    break;
-
-                case HaveAllMessage.MessageId:
-                    message = new HaveAllMessage();
-                    break;
-
-                case HaveMessage.MessageId:
-                    message = new HaveMessage();
-                    break;
-
-                case HaveNoneMessage.MessageId:
-                    message = new HaveNoneMessage();
-                    break;
-
-                case InterestedMessage.MessageId:
-                    message = new InterestedMessage();
-                    break;
-
-                case NotInterestedMessage.MessageId:
-                    message = new NotInterestedMessage();
-                    break;
-
                 case PieceMessage.MessageId:
                     message = new PieceMessage(manager);
                     break;
 
-                case PortMessage.MessageId:
-                    message = new PortMessage();
-                    break;
-
-                case RejectRequestMessage.MessageId:
-                    message = new RejectRequestMessage();
-                    break;
-
-                case RequestMessage.MessageId:
-                    message = new RequestMessage();
-                    break;
-
-                case SuggestPieceMessage.MessageId:
-                    message = new SuggestPieceMessage();
-                    break;
-
-                case UnchokeMessage.MessageId:
-                    message = new UnchokeMessage();
-                    break;
-
-                case LibtorrentMessage.MessageId:
-                    return LibtorrentMessage.DecodeMessage(buffer, offset + 1, 
count, manager);
-
                 default:
-                    message = new UnknownMessage();
+                    if (!messageDict.TryGetValue(buffer[offset], out creator))
+                        message = new UnknownMessage();
+                    else
+                        message = creator();
                     break;
             }
 
@@ -97,5 +76,7 @@
             message.Decode(buffer, offset + 1, count);
             return message;
         }
+
+        internal abstract void Handle(PeerIdInternal id);
     }
 }

_______________________________________________
Mono-patches maillist  -  Mono-patches@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to