pub struct ReadEnd<R, Buffer, Q, Auxiliary = ()> { /* private fields */ }
Expand description

The ReadEnd for the lowlevel API.

Implementations§

source§

impl<R, Buffer, Q, Auxiliary> ReadEnd<R, Buffer, Q, Auxiliary>where R: AsyncRead, Buffer: ToBuffer + 'static + Send + Sync,

source

pub fn new( reader: R, reader_buffer_len: NonZeroUsize, shared_data: SharedData<Buffer, Q, Auxiliary> ) -> Self

source

pub async fn receive_server_hello_pinned( self: Pin<&mut Self> ) -> Result<Extensions, Error>

Must be called once right after ReadEnd::new to receive the hello message from the server.

source

pub async fn read_in_one_packet_pinned( self: Pin<&mut Self> ) -> Result<(), Error>

Restart on Error

Only when the returned error is Error::InvalidResponseId or Error::AwaitableError, can the function be restarted.

Upon other errors Error::IOError, Error::FormatError and Error::RecursiveErrors, the sftp session has to be discarded.

Example
let readend = ...;
loop {
    let new_requests_submit = readend.wait_for_new_request().await;
    if new_requests_submit == 0 {
        break;
    }

    // If attempt to read in more than new_requests_submit, then
    // `read_in_one_packet` might block forever.
    for _ in 0..new_requests_submit {
        readend.read_in_one_packet().await.unwrap();
    }
}
Cancel Safety

This function is not cancel safe.

Dropping the future might cause the response packet to be partially read, and the next read would treat the partial response as a new response.

source

pub async fn ready_for_read_pinned(self: Pin<&mut Self>) -> Result<(), Error>

Wait for next packet to be readable.

Return Ok(()) if next packet is ready and readable, Error::IOError(io_error) where io_error.kind() == ErrorKind::UnexpectedEof if EOF is met.

Cancel Safety

This function is cancel safe.

source§

impl<R, Buffer, Q, Auxiliary> ReadEnd<R, Buffer, Q, Auxiliary>where Self: Unpin, R: AsyncRead, Buffer: ToBuffer + 'static + Send + Sync,

source

pub async fn receive_server_hello(&mut self) -> Result<Extensions, Error>

Must be called once right after super::connect to receive the hello message from the server.

source

pub async fn read_in_one_packet(&mut self) -> Result<(), Error>

Restart on Error

Only when the returned error is Error::InvalidResponseId or Error::AwaitableError, can the function be restarted.

Upon other errors Error::IOError, Error::FormatError and Error::RecursiveErrors, the sftp session has to be discarded.

Cancel Safety

This function is not cancel safe.

Dropping the future might cause the response packet to be partially read, and the next read would treat the partial response as a new response.

source

pub async fn ready_for_read(&mut self) -> Result<(), Error>

Wait for next packet to be readable.

Return Ok(()) if next packet is ready and readable, Error::IOError(io_error) where io_error.kind() == ErrorKind::UnexpectedEof if EOF is met.

Cancel Safety

This function is cancel safe.

source§

impl<R, Buffer, Q, Auxiliary> ReadEnd<R, Buffer, Q, Auxiliary>

source

pub fn get_shared_data(&self) -> &SharedData<Buffer, Q, Auxiliary>

Return the SharedData held by ReadEnd.

Trait Implementations§

source§

impl<R: Debug, Buffer: Debug, Q: Debug, Auxiliary: Debug> Debug for ReadEnd<R, Buffer, Q, Auxiliary>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'pin, R, Buffer, Q, Auxiliary> Unpin for ReadEnd<R, Buffer, Q, Auxiliary>where __ReadEnd<'pin, R, Buffer, Q, Auxiliary>: Unpin,

Auto Trait Implementations§

§

impl<R, Buffer, Q, Auxiliary = ()> !RefUnwindSafe for ReadEnd<R, Buffer, Q, Auxiliary>

§

impl<R, Buffer, Q, Auxiliary> Send for ReadEnd<R, Buffer, Q, Auxiliary>where Auxiliary: Send + Sync, Buffer: Send, Q: Send + Sync, R: Send,

§

impl<R, Buffer, Q, Auxiliary> Sync for ReadEnd<R, Buffer, Q, Auxiliary>where Auxiliary: Send + Sync, Buffer: Send, Q: Send + Sync, R: Sync,

§

impl<R, Buffer, Q, Auxiliary = ()> !UnwindSafe for ReadEnd<R, Buffer, Q, Auxiliary>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.