public void CanHandlerDownloadChunk()
        {
            var guid    = CorrelationId.GenerateCorrelationId();
            var request = new TransferFileBytesRequest
            {
                ChunkBytes          = ByteString.Empty,
                ChunkId             = 1,
                CorrelationFileName = CorrelationId.GenerateCorrelationId().Id.ToByteString()
            }.ToProtocolMessage(PeerIdHelper.GetPeerId("Test"), guid);

            _downloadFileTransferFactory.DownloadChunk(Arg.Any <TransferFileBytesRequest>())
            .Returns(FileTransferResponseCodeTypes.Successful);

            request.SendToHandler(_context, _observer);
            _downloadFileTransferFactory.Received(1).DownloadChunk(Arg.Any <TransferFileBytesRequest>());
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public FileTransferResponseCodeTypes DownloadChunk(TransferFileBytesRequest transferFileBytesRequest)
        {
            FileTransferResponseCodeTypes responseCodeType;

            try
            {
                var fileTransferCorrelationId = new CorrelationId(transferFileBytesRequest.CorrelationFileName.ToByteArray());
                responseCodeType = DownloadChunkResponse(fileTransferCorrelationId, transferFileBytesRequest.ChunkId, transferFileBytesRequest.ChunkBytes.ToByteArray());
            }
            catch (Exception e)
            {
                Logger.Error(e,
                             "Failed to handle TransferFileBytesRequestHandler after receiving message {0}", transferFileBytesRequest);
                responseCodeType = FileTransferResponseCodeTypes.Error;
            }

            return(responseCodeType);
        }
        /// <inheritdoc />
        public IMessageDto <ProtocolMessage> GetUploadMessageDto(uint index)
        {
            var chunkId  = index + 1;
            var startPos = index * Constants.FileTransferChunkSize;
            var endPos   = chunkId * Constants.FileTransferChunkSize;
            var fileLen  = RandomAccessStream.Length;

            if (endPos > fileLen)
            {
                endPos = (uint)fileLen;
            }

            var bufferSize = (int)(endPos - startPos);
            var chunk      = new byte[bufferSize];

            RandomAccessStream.Seek(startPos, SeekOrigin.Begin);

            var readTries = 0;
            var bytesRead = 0;

            while ((bytesRead += RandomAccessStream.Read(chunk, 0, bufferSize - bytesRead)) < bufferSize)
            {
                readTries++;
                if (readTries >= Constants.FileTransferMaxChunkReadTries)
                {
                    return(null);
                }
            }

            var transferMessage = new TransferFileBytesRequest
            {
                ChunkBytes          = ByteString.CopyFrom(chunk),
                ChunkId             = chunkId,
                CorrelationFileName = CorrelationId.Id.ToByteString()
            }.ToProtocolMessage(PeerId);

            return(new MessageDto(transferMessage,
                                  RecipientId
                                  ));
        }