internal void RaisePeerMessageTransferred(PeerMessageEventArgs e) { if (PeerMessageTransferred == null) { return; } ThreadPool.QueueUserWorkItem(delegate { EventHandler <PeerMessageEventArgs> h = PeerMessageTransferred; if (h == null) { return; } if (!(e.Message is MessageBundle)) { h(e.TorrentManager, e); } else { // Message bundles are only a convience for internal usage! MessageBundle b = (MessageBundle)e.Message; foreach (PeerMessage message in b.Messages) { PeerMessageEventArgs args = new PeerMessageEventArgs(e.TorrentManager, message, e.Direction, e.ID); h(args.TorrentManager, args); } } }); }
private void MessageReceived(bool successful, PeerMessage message, object state) { PeerId id = (PeerId)state; if (!successful) { id.ConnectionManager.CleanupSocket(id, "Could not receive a message"); return; } try { PeerMessageEventArgs e = new PeerMessageEventArgs(id.TorrentManager, (PeerMessage)message, Direction.Incoming, id); id.ConnectionManager.RaisePeerMessageTransferred(e); message.Handle(id); id.LastMessageReceived = DateTime.Now; PeerIO.EnqueueReceiveMessage(id.Connection, id.Decryptor, id.TorrentManager.DownloadLimiter, id.Monitor, id.TorrentManager, messageReceivedCallback, id); } catch (TorrentException ex) { id.ConnectionManager.CleanupSocket(id, ex.Message); } }