コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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;
                }
            }
        }