/// <summary> /// Used to transmit or retransmit the current buffer /// </summary> internal async Task RetransmitAsync() { if (TransmitBufferLength == 0) { int bytesRead = await TransferStream.ReadAsync(TransmitBuffer, 4, 512); Position += bytesRead; TransmitBufferLength = bytesRead + 4; CurrentBlock++; BlockTransmitCount = 0; TransmitBuffer.Write16BE(0, (int)ETftpPacketType.Data); TransmitBuffer.Write16BE(2, (int)(CurrentBlock & 0xFFFF)); } else { BlockTransmitCount++; if (BlockTransmitCount > MaximumRetries) { TransmitError(ETftpErrorType.NotDefined, "Maximum rety count exceeded"); LogError("Maximum retry count exceeded"); Parent.UnregisterSession(this); return; } } Parent.Transmit(RemoteHost, TransmitBuffer, TransmitBufferLength); }
internal override void HandleObsWebServiceRequest(ObsWebServiceRequest req) { GetObjectRequest request = req as GetObjectRequest; if (request != null && request.DownloadProgress != null && this.OutputStream != null && this.ContentLength > 0) { TransferStream stream = new TransferStream(this.OutputStream); TransferStreamManager mgr; if (request.ProgressType == ProgressTypeEnum.ByBytes) { mgr = new TransferStreamByBytes(request.Sender, request.DownloadProgress, this.ContentLength, 0, request.ProgressInterval); } else { mgr = new ThreadSafeTransferStreamBySeconds(request.Sender, request.DownloadProgress, this.ContentLength, 0, request.ProgressInterval); stream.CloseStream += mgr.TransferEnd; } stream.BytesReaded += mgr.BytesTransfered; stream.StartRead += mgr.TransferStart; stream.BytesReset += mgr.TransferReset; this.OutputStream = stream; } }
private async Task OnDataReceivedAsync(byte[] messageData) { if (messageData.Length < 4) { LogDebug("Packet ended prematurely on receive"); TransmitError(ETftpErrorType.IllegalOperation, "Packet ended prematurely"); Parent.UnregisterSession(this); return; } var blockNumber = messageData.Get16BE(2); if (blockNumber != ((CurrentBlock + 1) & 0xFFFF)) { LogDebug("Block received out of sequence"); TransmitError(ETftpErrorType.IllegalOperation, "Block received out of sequence"); Parent.UnregisterSession(this); } BytesReceived += messageData.Length - 4; CurrentBlock++; TransmitAck(blockNumber); if (TransferStream == null) { if (CurrentBlock != 1) { LogDebug("ReceiveStream not created yet but not on first packet. Ending transfer"); TransmitError(ETftpErrorType.NotDefined, "Server error"); Parent.UnregisterSession(this); } TransferStream = new MemoryStream(); } TransferStream.Write(messageData, 4, messageData.Length - 4); if (messageData.Length != 516) { LogDebug("Last block received, transfer complete"); await Parent.TransferCompleteAsync(this); } else { if (IdleSince.Subtract(LastMessageTime) > TimeSpan.FromSeconds(1)) { LogDebug("Received " + BytesReceived.ToString() + " bytes so far"); LastMessageTime = IdleSince; } } }