示例#1
0
        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++;
                }
            }
        }