public override IWriteFuture Flush() { IQueue <Object> bufferQueue = MessageQueue; IWriteFuture future = null; while (!bufferQueue.IsEmpty) { Object encodedMessage = bufferQueue.Dequeue(); if (encodedMessage == null) { break; } // Flush only when the buffer has remaining. IoBuffer buf = encodedMessage as IoBuffer; if (buf == null || buf.HasRemaining) { future = new DefaultWriteFuture(_session); _nextFilter.FilterWrite(_session, new EncodedWriteRequest(encodedMessage, future, _destination)); } } if (future == null) { // Creates an empty writeRequest containing the destination IWriteRequest writeRequest = new DefaultWriteRequest(DefaultWriteRequest.EmptyMessage, null, _destination); future = DefaultWriteFuture.NewNotWrittenFuture(_session, new NothingWrittenException(writeRequest)); } return(future); }
/// <inheritdoc/> public IWriteFuture Write(Object message, EndPoint remoteEP) { if (message == null) { return(null); } if (!TransportMetadata.Connectionless && remoteEP != null) { throw new InvalidOperationException(); } // If the session has been closed or is closing, we can't either // send a message to the remote side. We generate a future // containing an exception. if (Closing || !Connected) { IWriteFuture future = new DefaultWriteFuture(this); IWriteRequest request = new DefaultWriteRequest(message, future, remoteEP); future.Exception = new WriteToClosedSessionException(request); return(future); } IoBuffer buf = message as IoBuffer; if (buf == null) { System.IO.FileInfo fi = message as System.IO.FileInfo; if (fi != null) { message = new FileInfoFileRegion(fi); } } else if (!buf.HasRemaining) { return(DefaultWriteFuture.NewNotWrittenFuture(this, new ArgumentException("message is empty. Forgot to call flip()?", "message"))); } // Now, we can write the message. First, create a future IWriteFuture writeFuture = new DefaultWriteFuture(this); IWriteRequest writeRequest = new DefaultWriteRequest(message, writeFuture, remoteEP); // Then, get the chain and inject the WriteRequest into it IoFilterChain filterChain = this.FilterChain; filterChain.FireFilterWrite(writeRequest); return(writeFuture); }
private void WriteBuffer(IoBuffer buf) { IWriteRequest writeRequest; if (_authenticated) { writeRequest = new SslFilter.EncryptedWriteRequest(_currentWriteRequest, buf); } else { writeRequest = new DefaultWriteRequest(buf); } _currentNextFilter.FilterWrite(_session, writeRequest); }
/// <inheritdoc/> public override void FilterWrite(INextFilter nextFilter, IoSession session, IWriteRequest writeRequest) { if (_manipulateWrites) { // manipulate bytes IoBuffer buf = writeRequest.Message as IoBuffer; if (buf != null) { ManipulateIoBuffer(session, buf); IoBuffer buffer = InsertBytesToNewIoBuffer(session, buf); if (buffer != null) { writeRequest = new DefaultWriteRequest(buffer, writeRequest.Future); } // manipulate PDU } else { if (_duplicatePduProbability > _rng.Next()) { nextFilter.FilterWrite(session, writeRequest); } if (_resendPduLasterProbability > _rng.Next()) { // store it somewhere and trigger a write execution for // later // TODO } if (_removePduProbability > _rng.Next()) { return; } } } base.FilterWrite(nextFilter, session, writeRequest); }