public void Handle(FileResponse message) { DownloadInfo downloadInfo; lock (this.downloadInfos) { if (!this.downloadInfos.TryGetValue(message.DownloadId, out downloadInfo)) // Unknown, ignore return; if (message.Size == 0) { // Doesn't exist this.downloadInfos.Remove(message.DownloadId); downloadInfo.Cleanup(); return; } downloadInfo.FileSize = message.Size; downloadInfo.SignatureSha1 = message.SignatureSha1; // Prep temp folder Directory.CreateDirectory(downloadInfo.TempFolder); // Request chunks downloadInfo.Chunks = (int)(message.Size / ChunkSize) + 1; for (int chunkId = 0; chunkId < downloadInfo.Chunks && chunkId < BufferedChunks; chunkId++) { this.log.Trace("Requesting chunk {0} of file {1}", chunkId, downloadInfo.FileName); SendMessage(new FileChunkRequest { DownloadId = message.DownloadId, FileName = downloadInfo.FileName, Type = downloadInfo.FileType, ChunkSize = ChunkSize, ChunkStart = downloadInfo.RequestedChunks * ChunkSize }); downloadInfo.RequestedChunks++; } } }