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