1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-04-20 14:47:45 +00:00
kawari/src/compression.rs

41 lines
973 B
Rust
Raw Normal View History

use std::io::Cursor;
use binrw::{BinRead, BinResult};
use crate::{
oodle::FFXIVOodle,
packet::{PacketHeader, PacketSegment},
};
#[binrw::parser(reader, endian)]
pub(crate) fn decompress(
header: &PacketHeader,
encryption_key: Option<&[u8]>,
) -> BinResult<Vec<PacketSegment>> {
let mut segments = Vec::new();
let size = header.size as usize - std::mem::size_of::<PacketHeader>();
let mut data = vec![0; size];
reader.read_exact(&mut data)?;
let data = match header.compressed {
crate::packet::CompressionType::Uncompressed => data,
crate::packet::CompressionType::Oodle => {
FFXIVOodle::new().decode(data, header.oodle_decompressed_size)
}
};
let mut cursor = Cursor::new(&data);
for _ in 0..header.segment_count {
segments.push(PacketSegment::read_options(
&mut cursor,
endian,
(encryption_key,),
)?);
}
Ok(segments)
}