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 - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches