Package org.apache.sshd.common.channel
Class ChannelAsyncOutputStream
- java.lang.Object
-
- org.apache.sshd.common.util.logging.AbstractLoggingBean
-
- org.apache.sshd.common.util.closeable.IoBaseCloseable
-
- org.apache.sshd.common.util.closeable.AbstractCloseable
-
- org.apache.sshd.common.channel.ChannelAsyncOutputStream
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
,java.nio.channels.Channel
,ChannelHolder
,Closeable
,IoOutputStream
public class ChannelAsyncOutputStream extends AbstractCloseable implements IoOutputStream, ChannelHolder
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static class
ChannelAsyncOutputStream.BufferedFuture
Marker type to avoid repeated buffering inwritePacket(IoWriteFutureImpl, boolean)
.protected static class
ChannelAsyncOutputStream.WriteState
Collects state variables; access is always synchronized on the single instance per stream.-
Nested classes/interfaces inherited from class org.apache.sshd.common.util.closeable.AbstractCloseable
AbstractCloseable.State
-
-
Field Summary
Fields Modifier and Type Field Description private Channel
channelInstance
private byte
cmd
private java.lang.Object
packetWriteId
private ChannelStreamWriter
packetWriter
protected ChannelAsyncOutputStream.WriteState
writeState
Encapsulates the state of the current write operation.-
Fields inherited from class org.apache.sshd.common.util.closeable.AbstractCloseable
closeFuture, futureLock, state
-
Fields inherited from class org.apache.sshd.common.util.logging.AbstractLoggingBean
log
-
-
Constructor Summary
Constructors Constructor Description ChannelAsyncOutputStream(Channel channel, byte cmd)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private boolean
abortWrite(AbstractCloseable.State openState)
protected Buffer
createSendBuffer(Buffer buffer, Channel channel, int length)
protected CloseFuture
doCloseGracefully()
protected void
doCloseImmediately()
doCloseImmediately is called once and only once with state == Immediateprotected void
doWriteIfPossible(boolean resume)
Channel
getChannel()
byte
getCommandType()
void
onWindowExpanded()
protected void
onWritten(IoWriteFutureImpl future, int total, int length, IoWriteFuture f)
protected void
preClose()
preClose is guaranteed to be called before doCloseGracefully or doCloseImmediately.protected void
shutdown()
protected void
terminateFuture(IoWriteFutureImpl future)
java.lang.String
toString()
IoWriteFuture
writeBuffer(Buffer buffer)
Write the given buffer.protected IoWriteFutureImpl
writePacket(IoWriteFutureImpl future, boolean resume)
Try to write as much of the current buffer as possible.-
Methods inherited from class org.apache.sshd.common.util.closeable.AbstractCloseable
addCloseFutureListener, builder, close, getFutureLock, isClosed, isClosing, removeCloseFutureListener
-
Methods inherited from class org.apache.sshd.common.util.logging.AbstractLoggingBean
debug, debug, debug, debug, debug, error, error, error, error, error, getSimplifiedLogger, info, info, warn, warn, warn, warn, warn, warn, warn, warn
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.apache.sshd.common.Closeable
addCloseFutureListener, close, close, isClosed, isClosing, isOpen, removeCloseFutureListener
-
-
-
-
Field Detail
-
writeState
protected final ChannelAsyncOutputStream.WriteState writeState
Encapsulates the state of the current write operation. Access is always under lock (on writeState's monitor), the lock is held only shortly and never while writing.
-
channelInstance
private final Channel channelInstance
-
packetWriter
private final ChannelStreamWriter packetWriter
-
cmd
private final byte cmd
-
packetWriteId
private final java.lang.Object packetWriteId
-
-
Constructor Detail
-
ChannelAsyncOutputStream
public ChannelAsyncOutputStream(Channel channel, byte cmd)
- Parameters:
channel
- TheChannel
through which the stream is communicatingcmd
- EitherSSH_MSG_CHANNEL_DATA
orSSH_MSG_CHANNEL_EXTENDED_DATA
indicating the output stream type
-
-
Method Detail
-
getChannel
public Channel getChannel()
- Specified by:
getChannel
in interfaceChannelHolder
- Returns:
- The associated
Channel
instance
-
getCommandType
public byte getCommandType()
- Returns:
- Either
SSH_MSG_CHANNEL_DATA
orSSH_MSG_CHANNEL_EXTENDED_DATA
indicating the output stream type
-
writeBuffer
public IoWriteFuture writeBuffer(Buffer buffer) throws java.io.IOException
Write the given buffer. This write operation is asynchronous: if there is not enough window space, it may keep the write pending or write only part of the buffer and keep the rest pending. Concurrent writes are not allowed and will throw aWritePendingException
. Any subsequent write must occur only once the returned future is fulfilled; for instance triggered via a listener on the returned future. Try to avoid doing a subsequent write directly in a future listener, though; doing so may lead to deep chains of nested listener calls with deep stack traces, and may ultimately lead to a stack overflow.- Specified by:
writeBuffer
in interfaceIoOutputStream
- Parameters:
buffer
- the data to write. NOTE: the buffer must not be touched until the returned write future is completed.- Returns:
- An
IoWriteFuture
that can be used to check when the data has actually been written. - Throws:
WritePendingException
- if a concurrent write is attemptedjava.io.IOException
- if an error occurred when writing the data
-
preClose
protected void preClose()
Description copied from class:AbstractCloseable
preClose is guaranteed to be called before doCloseGracefully or doCloseImmediately. When preClose() is called, isClosing() == true- Overrides:
preClose
in classAbstractCloseable
-
doCloseImmediately
protected void doCloseImmediately()
Description copied from class:AbstractCloseable
doCloseImmediately is called once and only once with state == Immediate
Overriding methods should always call the base implementation. It may be called concurrently while preClose() or doCloseGracefully is executing
- Overrides:
doCloseImmediately
in classAbstractCloseable
-
shutdown
protected void shutdown()
-
terminateFuture
protected void terminateFuture(IoWriteFutureImpl future)
-
doCloseGracefully
protected CloseFuture doCloseGracefully()
- Overrides:
doCloseGracefully
in classAbstractCloseable
-
onWindowExpanded
public void onWindowExpanded() throws java.io.IOException
- Throws:
java.io.IOException
-
doWriteIfPossible
protected void doWriteIfPossible(boolean resume)
-
abortWrite
private boolean abortWrite(AbstractCloseable.State openState)
-
writePacket
protected IoWriteFutureImpl writePacket(IoWriteFutureImpl future, boolean resume)
Try to write as much of the current buffer as possible. If the buffer is larger than the packet size split it in packets, writing one after the other by chaining futures. If there is not enough window space, stop writing. Writing will be resumed once the window has been enlarged again.- Parameters:
future
-IoWriteFutureImpl
for the current writeresume
- whether being called in response to a remote window adjustment- Returns:
null
if all written, or if the rest will be written via a future listener. Otherwise a future for the remaining writes.
-
onWritten
protected void onWritten(IoWriteFutureImpl future, int total, int length, IoWriteFuture f)
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
-