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