diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-10 17:38:55 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-10 17:38:55 +0100 |
commit | d8d00eb146241978ef21ed4d6c35ac9c68b1a86e (patch) | |
tree | c075bd4f9aa17e30aa05aa74db23377c72cf6823 /src/main.rs | |
parent | 3dade4b3815db7bfa1baf3fbb4fb332b29aba363 (diff) | |
download | unity-tools-d8d00eb146241978ef21ed4d6c35ac9c68b1a86e.tar unity-tools-d8d00eb146241978ef21ed4d6c35ac9c68b1a86e.tar.bz2 unity-tools-d8d00eb146241978ef21ed4d6c35ac9c68b1a86e.tar.zst |
read serialized file tables
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 138 |
1 files changed, 5 insertions, 133 deletions
diff --git a/src/main.rs b/src/main.rs index a0b35c3..4d91578 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,5 @@ -use log::debug; -use std::{ - env::args, - fs::File, - io::{BufReader, Cursor, Read}, -}; -use unity_tools::{ - common_strings::COMMON_STRINGS, - helper::{Endianness, ReadExt}, - unityfs::UnityFS, -}; +use std::{env::args, fs::File, io::BufReader}; +use unity_tools::{serialized_file::read_serialized_file, unityfs::UnityFS}; fn main() -> anyhow::Result<()> { env_logger::init_from_env("LOG"); @@ -19,134 +10,15 @@ fn main() -> anyhow::Result<()> { if node.name.ends_with(".resource") || node.name.ends_with("resS") { continue; } - let mut cab = fs.read(&node)?; + let cab = fs.read(&node)?; // let mut writer = File::create(format!("/tmp/{}", node.name))?; // std::io::copy(&mut cab, &mut writer)?; // continue; - let mut metadata_size = cab.read_u32_be()?; - let mut file_size = cab.read_u32_be()? as u64; - let format = cab.read_u32_be()?; - let mut data_offset = cab.read_u32_be()? as u64; + let file = read_serialized_file(cab)?; + eprintln!("{file:#?}"); - debug!("format={format}"); - - assert!(format >= 9); - let e = match cab.read_u32_be()? { - 0 => Endianness::Little, - _ => Endianness::Big, - }; - debug!("endianess={e:?}"); - - if format >= 22 { - metadata_size = cab.read_u32(e)?; - file_size = cab.read_u64(e)?; - data_offset = cab.read_u64(e)?; - cab.read_u64(e)?; - } - debug!("metadata_size={metadata_size}"); - debug!("file_size={file_size}"); - debug!("data_offset={data_offset}"); - - let generator_version = cab.read_cstr()?; - let target_platform = cab.read_u32_le()?; - debug!("generator_version={generator_version:?}"); - debug!("target_platform={target_platform}"); - - let has_type_trees = cab.read_u8()? != 0; - let num_types = cab.read_u32(e)?; - debug!("has_type_trees={has_type_trees:?}"); - debug!("num_types={num_types}"); - - for _ in 0..num_types { - let class_id = cab.read_i32(e)?; - let stripped_type = cab.read_u8()? != 0; - let script_index = cab.read_i16(e)?; - let mut script_id = 0; - // TODO reftype - if class_id == 114 { - script_id = cab.read_u128_be()?; - } - let _old_hash = cab.read_u128_be()?; - - eprintln!("class_id={class_id}"); - eprintln!("stripped_type={stripped_type}"); - eprintln!("script_index={script_index}"); - eprintln!("script_id={script_id}"); - - if has_type_trees { - let num_nodes = cab.read_u32(e)?; - let size = cab.read_u32(e)?; - eprintln!("tree:num_nodes={num_nodes}"); - eprintln!("tree:size={size}"); - - let mut node_data = vec![0u8; num_nodes as usize * 32]; - cab.read_exact(&mut node_data)?; - let mut node_data = Cursor::new(node_data); - let mut string_data = vec![0u8; size as usize]; - cab.read_exact(&mut string_data)?; - - let get_string = |off: u32| { - let data = if off & 0x80000000 != 0 { - let off = off & 0x7fffffff; - &COMMON_STRINGS[(off & 0x7fffffff) as usize..] - } else { - &string_data[off as usize..] - }; - String::from_utf8( - data.iter() - .copied() - .take_while(|e| *e != 0) - .collect::<Vec<u8>>(), - ) - }; - - let mut nodes = Vec::new(); - for _ in 0..num_nodes { - nodes.push(TypeTreeNode { - version: node_data.read_u16(e)?, - level: node_data.read_u8()?, - type_flags: node_data.read_u8()?, - type_string: get_string(node_data.read_u32(e)?)?, - name_string: get_string(node_data.read_u32(e)?)?, - byte_size: node_data.read_i32(e)?, - index: node_data.read_i32(e)?, - flags: node_data.read_i32(e)?, - ref_type_hash: node_data.read_u64(e)?, - }); - } - eprintln!("{nodes:#?}"); - - if format >= 21 { - let num_deps = cab.read_u32(e)?; - for _ in 0..num_deps { - cab.read_u32(e)?; - } - } - } - - if format > 21 { - cab.read_u32_be()?; - } - } - - // let num_objects = cab.read_u32_le()?; - // debug!("num_objects={num_objects}"); - // for _ in 0..num_objects {} } Ok(()) } - -#[derive(Debug)] -struct TypeTreeNode { - version: u16, - level: u8, - type_flags: u8, - type_string: String, - name_string: String, - byte_size: i32, - index: i32, - flags: i32, - ref_type_hash: u64, -} |