aboutsummaryrefslogtreecommitdiff
path: root/src/unityfs.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-02-15 13:21:25 +0100
committermetamuffin <metamuffin@disroot.org>2025-02-15 13:21:25 +0100
commit2f4a11ddda04604d5d756231d258ef60fa9f7bd8 (patch)
tree891c99da0038eb513ed6de4c8a892d3f421d9b92 /src/unityfs.rs
parentd116a1df8fe14edc8de157bf8088244261fca30f (diff)
downloadunity-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.rs23
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),
})