#![allow(clippy::unused_io_amount)]
use std::path::Path;
use std::time::Instant;
use tokio::io::AsyncWriteExt;
pub struct File {
file: tokio::fs::File,
start_time: Instant,
}
pub enum Direction {
Rx,
Tx,
}
impl File {
pub async fn create<P: AsRef<Path>>(path: P) -> std::io::Result<File> {
let mut file = tokio::fs::File::create(path).await?;
file.write(&u32::to_le_bytes(0x0A0D0D0A)).await?; file.write(&u32::to_le_bytes(28)).await?; file.write(&u32::to_le_bytes(0x1A2B3C4D)).await?; file.write(&u16::to_le_bytes(1)).await?; file.write(&u16::to_le_bytes(0)).await?; file.write(&u64::to_le_bytes(0xFFFFFFFFFFFFFFFF)).await?; file.write(&u32::to_le_bytes(28)).await?;
file.write(&u32::to_le_bytes(0x00000001)).await?; file.write(&u32::to_le_bytes(20)).await?; file.write(&u16::to_le_bytes(293)).await?; file.write(&u16::to_le_bytes(0)).await?; file.write(&u32::to_le_bytes(0)).await?; file.write(&u32::to_le_bytes(20)).await?;
Ok(File {
file,
start_time: Instant::now(),
})
}
pub async fn write(&mut self, packet: &[u8], _dir: Direction) -> std::io::Result<()> {
let packet_data_padding: usize = 4 - packet.len() % 4;
let block_total_length: u32 = packet.len() as u32 + packet_data_padding as u32 + 32;
let timestamp = self.start_time.elapsed().as_micros();
let file = &mut self.file;
file.write(&u32::to_le_bytes(0x00000006)).await?; file.write(&u32::to_le_bytes(block_total_length)).await?;
file.write(&u32::to_le_bytes(0)).await?; file.write(&u32::to_le_bytes((timestamp >> 32) as u32))
.await?; file.write(&u32::to_le_bytes(timestamp as u32)).await?; file.write(&u32::to_le_bytes(packet.len() as u32)).await?; file.write(&u32::to_le_bytes(packet.len() as u32)).await?; file.write(packet).await?;
file.write(&vec![0; packet_data_padding]).await?;
file.write(&u32::to_le_bytes(block_total_length)).await?; Ok(())
}
}