use std::io::Write;
use super::*;
use std::num::Wrapping;
#[derive(Debug)]
pub struct SSHBuffer {
pub buffer: CryptoVec,
pub len: usize, pub bytes: usize,
pub len_bytes: [u8;4],
pub read_len_bytes: usize,
pub seqn: Wrapping<u32>,
}
impl SSHBuffer {
pub fn new() -> Self {
SSHBuffer {
buffer: CryptoVec::new(),
len: 0,
bytes: 0,
len_bytes: [0;4],
read_len_bytes: 0,
seqn: Wrapping(0),
}
}
pub fn len(&self) -> usize {
self.buffer.len() - self.len
}
pub fn send_ssh_id(&mut self, id: &[u8]) {
self.buffer.extend(id);
self.buffer.push(b'\r');
self.buffer.push(b'\n');
}
pub fn write_all<W:Write>(&mut self, mut stream: W) -> Result<(), Error> {
while self.len < self.buffer.len() {
let s = try!(self.buffer.write_all_from(self.len, &mut stream));
debug!("write_all: written {} bytes", s);
self.len += s;
self.bytes += s;
}
self.buffer.clear();
self.len = 0;
Ok(())
}
}