diff options
Diffstat (limited to 'src/serialized_file.rs')
-rw-r--r-- | src/serialized_file.rs | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/src/serialized_file.rs b/src/serialized_file.rs index a37ff46..3ca32aa 100644 --- a/src/serialized_file.rs +++ b/src/serialized_file.rs @@ -6,7 +6,10 @@ use crate::{ }; use anyhow::{Result, anyhow, bail}; use log::{debug, info, trace, warn}; -use std::io::{Cursor, Read, Seek, SeekFrom}; +use std::{ + io::{Cursor, Read, Seek, SeekFrom}, + sync::Arc, +}; #[derive(Debug, Clone)] pub struct TypeTreeNode { @@ -58,10 +61,9 @@ pub struct External { pub struct SerializedFile<T> { pub file: T, - pub file_source_id: usize, pub header: SerializedFileHeader, pub types: Vec<SeralizedType>, - pub externals: Vec<External>, + pub ecx: Arc<ExternalsContext>, pub scripts: Vec<Script>, pub objects: Vec<ObjectInfo>, pub user_string: String, @@ -73,7 +75,7 @@ impl<T> std::fmt::Debug for SerializedFile<T> { f.debug_struct("SerializedFile") .field("header", &self.header) .field("types", &self.types) - .field("externals", &self.externals) + .field("externals", &self.ecx) .field("scripts", &self.scripts) .field("objects", &self.objects) .field("user_string", &self.user_string) @@ -82,6 +84,12 @@ impl<T> std::fmt::Debug for SerializedFile<T> { } } +#[derive(Debug, Default)] +pub struct ExternalsContext { + pub name: String, + pub externals: Vec<External>, +} + #[derive(Debug)] pub struct SerializedFileHeader { _metadata_size: u32, @@ -139,7 +147,7 @@ impl SerializedFileHeader { } impl<T: Read + Seek> SerializedFile<T> { - pub fn read(mut file: T, file_source_id: usize) -> Result<SerializedFile<T>> { + pub fn read(mut file: T, name: String) -> Result<SerializedFile<T>> { let h = SerializedFileHeader::read(&mut file)?; let e = h.endianness; @@ -291,6 +299,7 @@ impl<T: Read + Seek> SerializedFile<T> { let guid = file.read_u128_be()?; let r#type = file.read_i32(e)?; let path_name = file.read_cstr()?; + debug!("external {path_name:?}"); externals.push(External { guid, path_name, @@ -299,6 +308,8 @@ impl<T: Read + Seek> SerializedFile<T> { }) } + let externals = Arc::new(ExternalsContext { name, externals }); + if h.format >= 20 { let num_ref_types = file.read_i32(e)?; debug!("num_ref_types={num_ref_types}"); @@ -314,17 +325,17 @@ impl<T: Read + Seek> SerializedFile<T> { file, header: h, types, - externals, + ecx: externals, endianness: e, objects, scripts, user_string, - file_source_id, }) } pub fn find_fs_shared_assets(&self, fs: &UnityFS<impl Read + Seek>) -> Option<NodeInfo> { let s = self + .ecx .externals .iter() .find(|e| e.path_name.starts_with("archive:"))?; @@ -358,12 +369,7 @@ impl<T: Read + Seek> SerializedFile<T> { .type_tree .as_ref() .ok_or(anyhow!("type tree missing"))?; - Value::read( - typetree, - self.endianness, - self.file_source_id, - &mut self.file, - ) + Value::read(typetree, self.endianness, &self.ecx, &mut self.file) } pub fn all_objects_of_class(&self, class_name: &str) -> impl Iterator<Item = &ObjectInfo> { |