From 2f4a11ddda04604d5d756231d258ef60fa9f7bd8 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sat, 15 Feb 2025 13:21:25 +0100 Subject: can read objects --- src/unityfs.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'src/unityfs.rs') diff --git a/src/unityfs.rs b/src/unityfs.rs index bd0c7bb..677a135 100644 --- a/src/unityfs.rs +++ b/src/unityfs.rs @@ -6,6 +6,9 @@ use std::io::{Cursor, Error, ErrorKind, Read, Seek, SeekFrom}; pub struct UnityFS { nodes: Vec, reader: BlocksReader, + pub file_version: u32, + pub player_version: String, + pub unity_version: String, } #[derive(Debug, Clone)] @@ -32,6 +35,10 @@ pub struct NodeReader<'a, T> { impl UnityFS { pub fn open(mut file: T) -> Result { let signature = file.read_cstr()?; + if signature.as_str() != "UnityFS" { + bail!("unknown signature {signature:?}") + } + let file_version = file.read_u32_be()?; let player_version = file.read_cstr()?; let unity_version = file.read_cstr()?; @@ -40,15 +47,14 @@ impl UnityFS { let blockindex_decomp_size = file.read_u32_be()?; let flags = file.read_u32_be()?; - let meta_comp_scheme = CompressionScheme::from_flag_num((flags & 0x3f) as u8) - .ok_or(anyhow!("unknown block compression"))?; + let meta_comp_scheme = CompressionScheme::from_flag_num(flags as u8).ok_or(anyhow!( + "unknown block compression 0x{:02x}", + (flags & 0x3f) as u8 + ))?; let blockindex_eof = flags & 0x80 != 0; let blockindex_has_directory = flags & 0x40 != 0; let blockindex_need_padding = flags & 0x200 != 0; - if signature.as_str() != "UnityFS" { - bail!("unknown signature {signature:?}") - } info!("File Version: {file_version:?}"); info!("Player Version: {player_version:?}"); info!("Unity Version: {unity_version:?}"); @@ -92,8 +98,8 @@ impl UnityFS { let decomp_size = blockindex.read_u32_be()?; let comp_size = blockindex.read_u32_be()?; let flags = blockindex.read_u16_be()?; - let comp_scheme = CompressionScheme::from_flag_num((flags & 0x3f) as u8) - .ok_or(anyhow!("unknown block compression"))?; + let comp_scheme = CompressionScheme::from_flag_num(flags as u8) + .ok_or(anyhow!("unknown block compression 0x{:02x}", flags & 0x3f))?; blocks.push(BlockInfo { comp_size, decomp_size, @@ -121,6 +127,9 @@ impl UnityFS { let position = file.stream_position()?; Ok(Self { + file_version, + player_version, + unity_version, nodes, reader: BlocksReader::new(blocks, file, position), }) -- cgit v1.2.3-70-g09d2