Compare commits

...

2 commits

Author SHA1 Message Date
db7790ec5b
refactor: Properly handle unknown field 2023-01-06 18:55:55 +01:00
0441a0d932
feat: Recognize bundle properties
Ref: #3.
2023-01-06 18:54:33 +01:00

View file

@ -88,11 +88,10 @@ impl EntryHeader {
pub struct Bundle {
format: BundleFormat,
properties: Vec<Murmur64>,
_headers: Vec<EntryHeader>,
files: Vec<BundleFile>,
name: String,
unknown_1: u32,
unknown_header: [u8; 256],
}
impl Bundle {
@ -122,19 +121,14 @@ impl Bundle {
return Err(eyre::eyre!("Unknown bundle format: {:?}", format));
}
let unknown_1 = r.read_u32()?;
if unknown_1 != 0x3 {
tracing::warn!(
"Unexpected value for unknown header. Expected {:#08X}, got {:#08X}",
0x3,
unknown_1
);
}
r.skip_u32(0x3)?;
let num_entries = r.read_u32()? as usize;
let mut unknown_header = [0; 256];
r.read_exact(&mut unknown_header)?;
let mut properties = Vec::with_capacity(32);
for prop in properties.iter_mut().take(32) {
*prop = Murmur64::from(r.read_u64()?);
}
let mut meta = Vec::with_capacity(num_entries);
for _ in 0..num_entries {
@ -222,8 +216,7 @@ impl Bundle {
format,
_headers: meta,
files,
unknown_1,
unknown_header,
properties,
})
}
@ -231,9 +224,13 @@ impl Bundle {
pub fn to_binary(&self, ctx: &crate::Context) -> Result<Vec<u8>> {
let mut w = Cursor::new(Vec::new());
w.write_u32(self.format.into())?;
w.write_u32(self.unknown_1)?;
// TODO: Find out what this is.
w.write_u32(0x3)?;
w.write_u32(self.files.len() as u32)?;
w.write_all(&self.unknown_header)?;
for prop in self.properties.iter() {
w.write_u64(**prop)?;
}
for meta in self._headers.iter() {
meta.to_writer(&mut w)?;
@ -326,7 +323,7 @@ where
}
// Skip unknown 4 bytes
r.seek(SeekFrom::Current(4))?;
r.skip_u32(0x3)?;
let num_entries = r.read_u32()? as i64;
tracing::debug!(num_entries);