parity-zcash/p2p/src/net/channel.rs

43 lines
1.2 KiB
Rust
Raw Normal View History

2016-10-17 01:52:15 -07:00
use std::{io, net};
2016-10-14 01:55:28 -07:00
use futures::Poll;
use futures::stream::Stream;
use parking_lot::Mutex;
use bytes::Bytes;
2016-10-17 01:52:15 -07:00
use message::{MessageResult, Payload, Command, Magic, Message};
2016-10-14 01:55:28 -07:00
use net::Connection;
2016-10-17 01:52:15 -07:00
use io::{read_message_stream, ReadMessageStream, SharedTcpStream, WriteMessage, write_message};
2016-10-14 01:55:28 -07:00
pub struct Channel {
2016-10-17 01:52:15 -07:00
write_stream: SharedTcpStream,
version: u32,
magic: Magic,
address: net::SocketAddr,
read_stream: Mutex<ReadMessageStream<SharedTcpStream>>,
2016-10-14 01:55:28 -07:00
}
impl Channel {
pub fn new(connection: Connection) -> Self {
let stream = read_message_stream(connection.stream.clone(), connection.magic);
Channel {
2016-10-17 01:52:15 -07:00
write_stream: connection.stream,
version: connection.version,
magic: connection.magic,
address: connection.address,
read_stream: Mutex::new(stream),
2016-10-14 01:55:28 -07:00
}
}
pub fn write_message<T>(&self, payload: &T) -> WriteMessage<T, SharedTcpStream> where T: Payload {
2016-10-17 01:52:15 -07:00
let message = Message::new(self.magic, self.version, payload).expect("failed to create outgoing message");
write_message(self.write_stream.clone(), message)
2016-10-14 01:55:28 -07:00
}
pub fn poll_message(&self) -> Poll<Option<(MessageResult<(Command, Bytes)>)>, io::Error> {
2016-10-17 01:52:15 -07:00
self.read_stream.lock().poll()
2016-10-14 01:55:28 -07:00
}
pub fn version(&self) -> u32 {
2016-10-17 01:52:15 -07:00
self.version
2016-10-14 01:55:28 -07:00
}
}