2025-03-10 21:31:21 -04:00
|
|
|
use std::fs::write;
|
2025-03-09 12:00:58 -04:00
|
|
|
use std::io::Cursor;
|
|
|
|
|
|
|
|
use binrw::{BinRead, BinResult};
|
|
|
|
|
|
|
|
use crate::{
|
2025-03-10 22:19:31 -04:00
|
|
|
oodle::{FFXIVOodle},
|
2025-03-09 12:00:58 -04:00
|
|
|
packet::{PacketHeader, PacketSegment},
|
|
|
|
};
|
|
|
|
|
|
|
|
#[binrw::parser(reader, endian)]
|
|
|
|
pub(crate) fn decompress(
|
2025-03-10 21:31:21 -04:00
|
|
|
oodle: &mut FFXIVOodle,
|
2025-03-09 12:00:58 -04:00
|
|
|
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>();
|
|
|
|
|
2025-03-10 21:31:21 -04:00
|
|
|
println!(
|
|
|
|
"known packet size: {} but decompressing {} bytes",
|
|
|
|
header.size, size
|
|
|
|
);
|
|
|
|
|
2025-03-09 12:00:58 -04:00
|
|
|
let mut data = vec![0; size];
|
2025-03-10 21:31:21 -04:00
|
|
|
reader.read_exact(&mut data).unwrap();
|
|
|
|
|
|
|
|
write("compressed.bin", &data).unwrap();
|
2025-03-09 12:00:58 -04:00
|
|
|
|
|
|
|
let data = match header.compressed {
|
|
|
|
crate::packet::CompressionType::Uncompressed => data,
|
2025-03-10 21:31:21 -04:00
|
|
|
crate::packet::CompressionType::Oodle => oodle.decode(data, header.oodle_decompressed_size),
|
2025-03-09 12:00:58 -04:00
|
|
|
};
|
|
|
|
|
2025-03-10 21:31:21 -04:00
|
|
|
write("decompressed.bin", &data).unwrap();
|
|
|
|
|
2025-03-09 12:00:58 -04:00
|
|
|
let mut cursor = Cursor::new(&data);
|
|
|
|
|
|
|
|
for _ in 0..header.segment_count {
|
|
|
|
segments.push(PacketSegment::read_options(
|
|
|
|
&mut cursor,
|
|
|
|
endian,
|
|
|
|
(encryption_key,),
|
|
|
|
)?);
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(segments)
|
|
|
|
}
|