Much work
This commit is contained in:
		| @@ -1,16 +1,22 @@ | ||||
| use ConnectionError; | ||||
| use frame::{self, Frame}; | ||||
| use proto::ReadySink; | ||||
|  | ||||
| use futures::*; | ||||
|  | ||||
| pub struct Settings<T> { | ||||
|     // Upstream transport | ||||
|     inner: T, | ||||
|  | ||||
|     // Our settings | ||||
|     local: frame::SettingSet, | ||||
|  | ||||
|     // Peer settings | ||||
|     remote: frame::SettingSet, | ||||
|  | ||||
|     // Number of acks remaining to send to the peer | ||||
|     remaining_acks: usize, | ||||
|  | ||||
|     // True when the local settings must be flushed to the remote | ||||
|     is_dirty: bool, | ||||
| } | ||||
| @@ -30,17 +36,13 @@ impl<T> Settings<T> | ||||
|             local: local, | ||||
|             remote: frame::SettingSet::default(), | ||||
|             remaining_acks: 0, | ||||
|             is_dirty: false, | ||||
|             is_dirty: true, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn has_pending_sends(&self) -> bool { | ||||
|         self.is_dirty || self.remaining_acks > 0 | ||||
|     } | ||||
|  | ||||
|     fn try_send_pending(&mut self) -> Poll<(), ConnectionError> { | ||||
|         if self.is_dirty { | ||||
|             let frame = frame::Settings::new(self.local.clone()).into(); | ||||
|             let frame = frame::Settings::new(self.local.clone()); | ||||
|             try_ready!(self.try_send(frame)); | ||||
|  | ||||
|             self.is_dirty = false; | ||||
| @@ -56,8 +58,8 @@ impl<T> Settings<T> | ||||
|         Ok(Async::Ready(())) | ||||
|     } | ||||
|  | ||||
|     fn try_send(&mut self, item: frame::Frame) -> Poll<(), ConnectionError> { | ||||
|         if let AsyncSink::NotReady(_) = try!(self.inner.start_send(item)) { | ||||
|     fn try_send(&mut self, item: frame::Settings) -> Poll<(), ConnectionError> { | ||||
|         if let AsyncSink::NotReady(_) = try!(self.inner.start_send(item.into())) { | ||||
|             // Ensure that call to `poll_complete` guarantee is called to satisfied | ||||
|             try!(self.inner.poll_complete()); | ||||
|  | ||||
| @@ -110,3 +112,17 @@ impl<T> Sink for Settings<T> | ||||
|         self.inner.close() | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl<T> ReadySink for Settings<T> | ||||
|     where T: Stream<Item = Frame, Error = ConnectionError>, | ||||
|           T: Sink<SinkItem = Frame, SinkError = ConnectionError>, | ||||
|           T: ReadySink, | ||||
| { | ||||
|     fn poll_ready(&mut self) -> Poll<(), ConnectionError> { | ||||
|         if try!(self.try_send_pending()).is_ready() { | ||||
|             return self.inner.poll_ready(); | ||||
|         } | ||||
|  | ||||
|         Ok(Async::NotReady) | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user