use std::io::Read;
use super::{PcapParser, RawPcapPacket};
use crate::errors::*;
use crate::pcap::{PcapHeader, PcapPacket};
use crate::read_buffer::ReadBuffer;
#[derive(Debug)]
pub struct PcapReader<R: Read> {
parser: PcapParser,
reader: ReadBuffer<R>,
}
impl<R: Read> PcapReader<R> {
pub fn new(reader: R) -> Result<PcapReader<R>, PcapError> {
let mut reader = ReadBuffer::new(reader);
let parser = reader.parse_with(PcapParser::new)?;
Ok(PcapReader { parser, reader })
}
pub fn into_reader(self) -> R {
self.reader.into_inner()
}
pub fn next_packet(&mut self) -> Option<Result<PcapPacket, PcapError>> {
match self.reader.has_data_left() {
Ok(has_data) => {
if has_data {
Some(self.reader.parse_with(|src| self.parser.next_packet(src)))
}
else {
None
}
},
Err(e) => Some(Err(PcapError::IoError(e))),
}
}
pub fn next_raw_packet(&mut self) -> Option<Result<RawPcapPacket, PcapError>> {
match self.reader.has_data_left() {
Ok(has_data) => {
if has_data {
Some(self.reader.parse_with(|src| self.parser.next_raw_packet(src)))
}
else {
None
}
},
Err(e) => Some(Err(PcapError::IoError(e))),
}
}
pub fn header(&self) -> PcapHeader {
self.parser.header()
}
}