diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-15 13:21:25 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-15 13:21:25 +0100 |
commit | 2f4a11ddda04604d5d756231d258ef60fa9f7bd8 (patch) | |
tree | 891c99da0038eb513ed6de4c8a892d3f421d9b92 /src/unityfs.rs | |
parent | d116a1df8fe14edc8de157bf8088244261fca30f (diff) | |
download | unity-tools-2f4a11ddda04604d5d756231d258ef60fa9f7bd8.tar unity-tools-2f4a11ddda04604d5d756231d258ef60fa9f7bd8.tar.bz2 unity-tools-2f4a11ddda04604d5d756231d258ef60fa9f7bd8.tar.zst |
can read objects
Diffstat (limited to 'src/unityfs.rs')
-rw-r--r-- | src/unityfs.rs | 23 |
1 files changed, 16 insertions, 7 deletions
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<T> { nodes: Vec<NodeInfo>, reader: BlocksReader<T>, + 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<T: Read + Seek> UnityFS<T> { pub fn open(mut file: T) -> Result<Self> { 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<T: Read + Seek> UnityFS<T> { 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<T: Read + Seek> UnityFS<T> { 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<T: Read + Seek> UnityFS<T> { let position = file.stream_position()?; Ok(Self { + file_version, + player_version, + unity_version, nodes, reader: BlocksReader::new(blocks, file, position), }) |