repak/src/entry.rs

80 lines
2.4 KiB
Rust
Raw Normal View History

use byteorder::{ReadBytesExt, LE};
2023-01-11 13:52:40 +00:00
use std::io;
use super::{Compression, ReadExt, Version};
2023-01-11 13:52:40 +00:00
#[derive(Debug)]
pub struct Block {
pub offset: u64,
/// size of the compressed block
pub size: u64,
}
impl Block {
pub fn new<R: io::Read>(reader: &mut R) -> Result<Self, super::Error> {
Ok(Self {
offset: reader.read_u64::<LE>()?,
size: reader.read_u64::<LE>()?,
})
}
}
#[derive(Debug)]
pub struct Entry {
pub offset: u64,
pub compressed: u64,
pub uncompressed: u64,
pub compression: Compression,
pub timestamp: Option<u64>,
pub hash: [u8; 20],
pub compression_blocks: Option<Vec<Block>>,
2023-01-10 22:29:20 +00:00
pub encrypted: bool,
pub block_uncompressed: Option<u32>,
}
impl Entry {
2023-01-11 13:52:40 +00:00
pub fn new<R: io::Read>(reader: &mut R, version: super::Version) -> Result<Self, super::Error> {
2023-01-13 12:38:30 +00:00
// since i need the compression flags, i have to store these as variables which is mildly annoying
let offset = reader.read_u64::<LE>()?;
let compressed = reader.read_u64::<LE>()?;
let uncompressed = reader.read_u64::<LE>()?;
let compression = match reader.read_u32::<LE>()? {
2023-01-10 22:29:20 +00:00
0x01 | 0x10 | 0x20 => Compression::Zlib,
_ => Compression::None,
};
Ok(Self {
offset,
compressed,
uncompressed,
compression,
2023-01-10 22:29:20 +00:00
timestamp: match version == Version::Initial {
true => Some(reader.read_u64::<LE>()?),
false => None,
},
hash: reader.read_guid()?,
2023-01-10 22:29:20 +00:00
compression_blocks: match version >= Version::CompressionEncryption
&& compression != Compression::None
2023-01-10 22:29:20 +00:00
{
true => Some(reader.read_array(Block::new)?),
false => None,
},
encrypted: version >= Version::CompressionEncryption && reader.read_bool()?,
block_uncompressed: match version >= Version::CompressionEncryption {
true => Some(reader.read_u32::<LE>()?),
false => None,
},
})
}
2023-01-11 13:52:40 +00:00
pub fn read<R: io::Read + io::Seek>(
2023-01-13 12:38:30 +00:00
&self,
2023-01-11 13:52:40 +00:00
reader: &mut R,
version: super::Version,
2023-01-13 12:38:30 +00:00
key: Option<&aes::Aes256Dec>,
2023-01-11 13:52:40 +00:00
) -> Result<Vec<u8>, super::Error> {
let buf = io::BufWriter::new(Vec::new());
todo!("read the stuff");
Ok(buf.into_inner()?)
}
}