use std::io::prelude::*;
use std::io;
#[cfg(feature = "tokio")]
use futures::Poll;
#[cfg(feature = "tokio")]
use tokio_io::{AsyncRead, AsyncWrite};
use zio;
use {Compress, Decompress};
#[derive(Debug)]
pub struct DeflateEncoder<W: Write> {
inner: zio::Writer<W, Compress>,
}
impl<W: Write> DeflateEncoder<W> {
pub fn new(w: W, level: ::Compression) -> DeflateEncoder<W> {
DeflateEncoder {
inner: zio::Writer::new(w, Compress::new(level, false)),
}
}
pub fn get_ref(&self) -> &W {
self.inner.get_ref()
}
pub fn get_mut(&mut self) -> &mut W {
self.inner.get_mut()
}
pub fn reset(&mut self, w: W) -> io::Result<W> {
try!(self.inner.finish());
self.inner.data.reset();
Ok(self.inner.replace(w))
}
pub fn try_finish(&mut self) -> io::Result<()> {
self.inner.finish()
}
pub fn finish(mut self) -> io::Result<W> {
try!(self.inner.finish());
Ok(self.inner.take_inner())
}
pub fn flush_finish(mut self) -> io::Result<W> {
try!(self.inner.flush());
Ok(self.inner.take_inner())
}
pub fn total_in(&self) -> u64 {
self.inner.data.total_in()
}
pub fn total_out(&self) -> u64 {
self.inner.data.total_out()
}
}
impl<W: Write> Write for DeflateEncoder<W> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.inner.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
}
#[cfg(feature = "tokio")]
impl<W: AsyncWrite> AsyncWrite for DeflateEncoder<W> {
fn shutdown(&mut self) -> Poll<(), io::Error> {
try_nb!(self.inner.finish());
self.inner.get_mut().shutdown()
}
}
impl<W: Read + Write> Read for DeflateEncoder<W> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.inner.get_mut().read(buf)
}
}
#[cfg(feature = "tokio")]
impl<W: AsyncRead + AsyncWrite> AsyncRead for DeflateEncoder<W> {}
#[derive(Debug)]
pub struct DeflateDecoder<W: Write> {
inner: zio::Writer<W, Decompress>,
}
impl<W: Write> DeflateDecoder<W> {
pub fn new(w: W) -> DeflateDecoder<W> {
DeflateDecoder {
inner: zio::Writer::new(w, Decompress::new(false)),
}
}
pub fn get_ref(&self) -> &W {
self.inner.get_ref()
}
pub fn get_mut(&mut self) -> &mut W {
self.inner.get_mut()
}
pub fn reset(&mut self, w: W) -> io::Result<W> {
try!(self.inner.finish());
self.inner.data = Decompress::new(false);
Ok(self.inner.replace(w))
}
pub fn try_finish(&mut self) -> io::Result<()> {
self.inner.finish()
}
pub fn finish(mut self) -> io::Result<W> {
try!(self.inner.finish());
Ok(self.inner.take_inner())
}
pub fn total_in(&self) -> u64 {
self.inner.data.total_in()
}
pub fn total_out(&self) -> u64 {
self.inner.data.total_out()
}
}
impl<W: Write> Write for DeflateDecoder<W> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.inner.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.inner.flush()
}
}
#[cfg(feature = "tokio")]
impl<W: AsyncWrite> AsyncWrite for DeflateDecoder<W> {
fn shutdown(&mut self) -> Poll<(), io::Error> {
try_nb!(self.inner.finish());
self.inner.get_mut().shutdown()
}
}
impl<W: Read + Write> Read for DeflateDecoder<W> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.inner.get_mut().read(buf)
}
}
#[cfg(feature = "tokio")]
impl<W: AsyncRead + AsyncWrite> AsyncRead for DeflateDecoder<W> {}