use ConnectionError; use proto::*; /// Exposes stream states to "upper" layers of the transport (i.e. from StreamTracker up /// to Connection). pub trait ControlStreams { /// Determines whether the given stream could theoretically be opened by the local /// side of this connection. fn local_valid_id(id: StreamId) -> bool; /// Determines whether the given stream could theoretically be opened by the remote /// side of this connection. fn remote_valid_id(id: StreamId) -> bool; /// Indicates whether this local endpoint may open streams (with HEADERS). /// /// Implies that this endpoint is a client. fn local_can_open() -> bool; /// Indicates whether this remote endpoint may open streams (with HEADERS). /// /// Implies that this endpoint is a server. fn remote_can_open() -> bool { !Self::local_can_open() } // TODO push promise // fn local_can_reserve(&mut self, id: StreamId) -> Result<(), ConnectionError>; // fn remote_can_reserve(&mut self, id: StreamId) -> Result<(), ConnectionError>; /// Creates a new stream in the OPEN state from the local side (i.e. as a Client). /// /// Must only be called when local_can_open returns true. fn local_open(&mut self, id: StreamId, sz: WindowSize) -> Result<(), ConnectionError>; /// Create a new stream in the OPEN state from the remote side (i.e. as a Server). /// /// Must only be called when remote_can_open returns true. fn remote_open(&mut self, id: StreamId, sz: WindowSize) -> Result<(), ConnectionError>; /// Prepare the receive side of a local stream to receive data from the remote. /// /// Typically called when a client receives a response header. fn local_open_recv_half(&mut self, id: StreamId, sz: WindowSize) -> Result<(), ConnectionError>; /// Prepare the send side of a remote stream to receive data from the local endpoint. /// /// Typically called when a server sends a response header. fn remote_open_send_half(&mut self, id: StreamId, sz: WindowSize) -> Result<(), ConnectionError>; // TODO push promise // fn local_reserve(&mut self, id: StreamId) -> Result<(), ConnectionError>; // fn remote_reserve(&mut self, id: StreamId) -> Result<(), ConnectionError>; /// Closes the send half of a stream. /// /// Fails with a ProtocolError if send half of the stream was not open. fn close_send_half(&mut self, id: StreamId) -> Result<(), ConnectionError>; /// Closes the recv half of a stream. /// /// Fails with a ProtocolError if recv half of the stream was not open. fn close_recv_half(&mut self, id: StreamId) -> Result<(), ConnectionError>; /// Resets the given stream. /// /// If the stream was already reset, the stored cause is updated. fn reset_stream(&mut self, id: StreamId, cause: Reason); /// Get the reason the stream was reset, if it was reset. fn get_reset(&self, id: StreamId) -> Option; /// Returns true if the given stream was opened by the local peer and is not yet /// closed. fn is_local_active(&self, id: StreamId) -> bool; /// Returns true if the given stream was opened by the remote peer and is not yet /// closed. fn is_remote_active(&self, id: StreamId) -> bool; /// Returns true if the given stream was opened and is not yet closed. fn is_active(&self, id: StreamId) -> bool { if Self::local_valid_id(id) { self.is_local_active(id) } else { self.is_remote_active(id) } } /// Returns the number of open streams initiated by the local peer. fn local_active_len(&self) -> usize; /// Returns the number of open streams initiated by the remote peer. fn remote_active_len(&self) -> usize; /// Returns true iff the recv half of the given stream is open. fn is_recv_open(&mut self, id: StreamId) -> bool; /// Returns true iff the send half of the given stream is open. fn is_send_open(&mut self, id: StreamId) -> bool; /// If the given stream ID is active and able to recv data, get its mutable recv flow /// control state. fn recv_flow_controller(&mut self, id: StreamId) -> Option<&mut FlowControlState>; /// If the given stream ID is active and able to send data, get its mutable send flow /// control state. fn send_flow_controller(&mut self, id: StreamId) -> Option<&mut FlowControlState>; /// Updates the initial window size for the local peer. fn update_inital_recv_window_size(&mut self, old_sz: WindowSize, new_sz: WindowSize); /// Updates the initial window size for the remote peer. fn update_inital_send_window_size(&mut self, old_sz: WindowSize, new_sz: WindowSize); } macro_rules! proxy_control_streams { ($outer:ident) => ( impl ControlStreams for $outer { fn local_valid_id(id: StreamId) -> bool { T::local_valid_id(id) } fn remote_valid_id(id: StreamId) -> bool { T::remote_valid_id(id) } fn local_can_open() -> bool { T::local_can_open() } fn local_open(&mut self, id: StreamId, sz: WindowSize) -> Result<(), ConnectionError> { self.inner.local_open(id, sz) } fn remote_open(&mut self, id: StreamId, sz: WindowSize) -> Result<(), ConnectionError> { self.inner.remote_open(id, sz) } fn local_open_recv_half(&mut self, id: StreamId, sz: WindowSize) -> Result<(), ConnectionError> { self.inner.local_open_recv_half(id, sz) } fn remote_open_send_half(&mut self, id: StreamId, sz: WindowSize) -> Result<(), ConnectionError> { self.inner.remote_open_send_half(id, sz) } fn close_send_half(&mut self, id: StreamId) -> Result<(), ConnectionError> { self.inner.close_send_half(id) } fn close_recv_half(&mut self, id: StreamId) -> Result<(), ConnectionError> { self.inner.close_recv_half(id) } fn reset_stream(&mut self, id: StreamId, cause: Reason) { self.inner.reset_stream(id, cause) } fn get_reset(&self, id: StreamId) -> Option { self.inner.get_reset(id) } fn is_local_active(&self, id: StreamId) -> bool { self.inner.is_local_active(id) } fn is_remote_active(&self, id: StreamId) -> bool { self.inner.is_remote_active(id) } fn local_active_len(&self) -> usize { self.inner.local_active_len() } fn remote_active_len(&self) -> usize { self.inner.remote_active_len() } fn update_inital_recv_window_size(&mut self, old_sz: WindowSize, new_sz: WindowSize) { self.inner.update_inital_recv_window_size(old_sz, new_sz) } fn update_inital_send_window_size(&mut self, old_sz: WindowSize, new_sz: WindowSize) { self.inner.update_inital_send_window_size(old_sz, new_sz) } fn recv_flow_controller(&mut self, id: StreamId) -> Option<&mut FlowControlState> { self.inner.recv_flow_controller(id) } fn send_flow_controller(&mut self, id: StreamId) -> Option<&mut FlowControlState> { self.inner.send_flow_controller(id) } fn is_send_open(&mut self, id: StreamId) -> bool { self.inner.is_send_open(id) } fn is_recv_open(&mut self, id: StreamId) -> bool { self.inner.is_recv_open(id) } } ) }