/// <param name="id"> The peer whose message queue you want to start processing </param>
internal void ProcessQueue(PeerId id)
{
if (id.QueueLength == 0)
{
id.ProcessingQueue = false;
return;
}
var message = id.Dequeue();
var pieceMessage = message as PieceMessage;
if (pieceMessage != null)
{
using (var handle = new ManualResetEvent(false))
{
pieceMessage.Data = BufferManager.EmptyBuffer;
ClientEngine.BufferManager.GetBuffer(ref pieceMessage.Data, pieceMessage.ByteLength);
_engine.DiskManager.QueueRead(id.TorrentManager,
pieceMessage.StartOffset +
((long)pieceMessage.PieceIndex * id.TorrentManager.Torrent.PieceLength), pieceMessage.Data,
pieceMessage.RequestLength, successful => handle.Set());
handle.WaitOne();
id.PiecesSent++;
}
}
try
{
SendMessage(id, message, _messageSentCallback);
}
catch (Exception e)
{
CleanupSocket(id, "Exception calling SendMessage: " + e.Message);
}
}