From 05acd1a5190936c8482ff28c85dc36f3c44850d7 Mon Sep 17 00:00:00 2001 From: Jaby Date: Thu, 8 Dec 2022 02:02:07 +0100 Subject: [PATCH] Find files --- src/Tools/Tests/ISO_Planschbecken.xml | 2 ++ src/Tools/psxcdgen_ex/src/encoder/psx.rs | 4 +-- src/Tools/psxcdgen_ex/src/lib.rs | 17 ++++++++++++- src/Tools/psxcdgen_ex/src/main.rs | 12 +++------ src/Tools/psxcdgen_ex/src/types/file_map.rs | 11 +++++--- src/Tools/psxcdgen_ex/src/types/mod.rs | 12 ++++++--- .../psxcdgen_ex/src/types/overlay/mod.rs | 25 ++++++++++++++++--- 7 files changed, 60 insertions(+), 23 deletions(-) diff --git a/src/Tools/Tests/ISO_Planschbecken.xml b/src/Tools/Tests/ISO_Planschbecken.xml index 22151d38..3f9e3fdb 100644 --- a/src/Tools/Tests/ISO_Planschbecken.xml +++ b/src/Tools/Tests/ISO_Planschbecken.xml @@ -6,6 +6,8 @@ ../Tests/Test.mk ../Tests/Test.mk + ../Tests/Test.mk + ../Tests/Test.mk ../Tests/ISO_Planschbecken.xml ../Tests/ISO_Planschbecken.xml diff --git a/src/Tools/psxcdgen_ex/src/encoder/psx.rs b/src/Tools/psxcdgen_ex/src/encoder/psx.rs index bc05e949..e5b66ebd 100644 --- a/src/Tools/psxcdgen_ex/src/encoder/psx.rs +++ b/src/Tools/psxcdgen_ex/src/encoder/psx.rs @@ -313,8 +313,8 @@ fn process_file(file: &File, sec_writer: &mut dyn SectorWriter) -> Result<(), Er let content_sectors = { match &file.content { FileType::Regular(raw) => builder::create_xa_data_for_vec(None, raw), - FileType::Overlay(_) => { - return Err(Error::not_implemented("process_file for Overlay in psx.rs")); + FileType::Overlay(_, _) => { + return Err(Error::from_str("Trying to encode an unprocessed overlay file")); } } }; diff --git a/src/Tools/psxcdgen_ex/src/lib.rs b/src/Tools/psxcdgen_ex/src/lib.rs index 6d9b6c2f..cf1f1989 100644 --- a/src/Tools/psxcdgen_ex/src/lib.rs +++ b/src/Tools/psxcdgen_ex/src/lib.rs @@ -6,7 +6,7 @@ pub mod file_writer; pub mod types; use tool_helper::{format_if_error, Output, read_file}; -use types::{CDDesc, Directory, File, Properties, SharedPtr}; +use types::{CDDesc, Directory, File, FileType, FileSystemMap, Properties, SharedPtr}; pub type CalculateLBAFunction = fn(&mut types::CDDesc); pub type LBAEmbeddedFiles = Vec>; @@ -27,6 +27,21 @@ pub fn process(config: config_reader::Configuration, calculate_lba: CalculateLBA Ok((cd_desc, lba_embedded_files)) } +pub fn process_files(file_map: FileSystemMap, lba_embedded_files: LBAEmbeddedFiles) -> Result<(), Error> { + for lba_embedded_file in lba_embedded_files { + let mut lba_embedded_file = lba_embedded_file.borrow_mut(); + + match &mut lba_embedded_file.content { + FileType::Overlay(content, lba_names) => { + let _new_content = types::overlay::update_content(std::mem::take(content), std::mem::take(lba_names), &file_map)?; + }, + _ =>() + } + } + + Err(Error::not_implemented("process_files")) +} + pub fn dump_content(cd_desc: &CDDesc, mut out: Output) -> Result<(), Error> { const NO_NAME:&'static str = ""; const ARROW:&'static str = "|==>"; diff --git a/src/Tools/psxcdgen_ex/src/main.rs b/src/Tools/psxcdgen_ex/src/main.rs index b4f6bf8c..5b1bd25c 100644 --- a/src/Tools/psxcdgen_ex/src/main.rs +++ b/src/Tools/psxcdgen_ex/src/main.rs @@ -37,16 +37,10 @@ impl SystemType { fn run_main(cmd_line: CommandLine) -> Result<(), Error> { let encoding_functions = cmd_line.system_type.get_encoding_functions(); - let (desc, _lba_embbeded_files) = psxcdgen_ex::process(config_reader::parse_xml(std::fs::read_to_string(cmd_line.input_file)?)?, encoding_functions.lba_calculator)?; - - /* - // Describes how to use the the file_map - println!("\n<== Planschbecken ==>"); - for rand_item in desc.create_file_map() { - println!("{}", rand_item.0); - } - println!("\n<== Planschbecken ==>");*/ + let (desc, lba_embedded_files) = psxcdgen_ex::process(config_reader::parse_xml(std::fs::read_to_string(cmd_line.input_file)?)?, encoding_functions.lba_calculator)?; + let file_map = desc.create_file_map(); + psxcdgen_ex::process_files(file_map, lba_embedded_files)?; write_image(&desc, encoding_functions.encoder, cmd_line.output_type, cmd_line.output_file)?; if let Some(list_content_option) = cmd_line.list_content { diff --git a/src/Tools/psxcdgen_ex/src/types/file_map.rs b/src/Tools/psxcdgen_ex/src/types/file_map.rs index 949eee7a..edec9528 100644 --- a/src/Tools/psxcdgen_ex/src/types/file_map.rs +++ b/src/Tools/psxcdgen_ex/src/types/file_map.rs @@ -5,10 +5,12 @@ pub type FileSystemMap = HashMap>; pub fn new_file_map(root: &Directory) -> FileSystemMap { fn add_files(file_system: &mut FileSystemMap, dir: &Directory, mut parent: String) { - if let Some(dir_name) = dir.name.as_string() { - if !dir_name.is_empty() { - parent.push_str(dir_name.as_ref()); - parent.push('/'); + if !dir.name.is_root() { + if let Some(dir_name) = dir.name.as_string() { + if !dir_name.is_empty() { + parent.push_str(dir_name.as_ref()); + parent.push('/'); + } } } @@ -21,6 +23,7 @@ pub fn new_file_map(root: &Directory) -> FileSystemMap { path }; + println!("Adding: {}", path); file_system.insert(path, file.clone()); } } diff --git a/src/Tools/psxcdgen_ex/src/types/mod.rs b/src/Tools/psxcdgen_ex/src/types/mod.rs index 8087b4a8..439425e1 100644 --- a/src/Tools/psxcdgen_ex/src/types/mod.rs +++ b/src/Tools/psxcdgen_ex/src/types/mod.rs @@ -4,9 +4,9 @@ pub mod file_map; pub mod overlay; use cdtypes::types::{cdstring::DString, dir_record::DirectoryRecord, path_table::PathTableL}; -use file_map::FileSystemMap; use std::{cell::RefCell, path::PathBuf, rc::Rc}; +pub use file_map::FileSystemMap; pub use tool_helper::Error; pub type SharedPtr = Rc>; @@ -177,7 +177,7 @@ impl std::fmt::Display for Directory { pub(super) enum FileType { Regular(Vec), - Overlay(Vec), + Overlay(Vec, overlay::LBANameVec), } pub struct File { @@ -194,8 +194,8 @@ impl File { Self::new_from_content(file_name, FileType::Regular(content), content_size) } - pub fn new_overlay(file_name: &str, content: Vec, content_size: usize) -> Result { - Self::new_from_content(file_name, FileType::Overlay(content), content_size) + pub fn new_overlay(file_name: &str, content: Vec, lba_names: overlay::LBANameVec, content_size: usize) -> Result { + Self::new_from_content(file_name, FileType::Overlay(content, lba_names), content_size) } pub fn get_track_rel_lba(&self) -> usize { @@ -238,6 +238,10 @@ impl DirectoryName { pub fn as_str(&self) -> Option<&str> { dstring_as_str(&self.name, self.len) } + + pub fn is_root(&self) -> bool { + self.name.as_raw()[0] == 0 + } } impl std::fmt::Display for DirectoryName { diff --git a/src/Tools/psxcdgen_ex/src/types/overlay/mod.rs b/src/Tools/psxcdgen_ex/src/types/overlay/mod.rs index 9e1c9e6d..27ff3c11 100644 --- a/src/Tools/psxcdgen_ex/src/types/overlay/mod.rs +++ b/src/Tools/psxcdgen_ex/src/types/overlay/mod.rs @@ -1,4 +1,4 @@ -use super::File; +use super::{File, FileSystemMap}; use std::path::PathBuf; use byteorder::{ByteOrder, LittleEndian}; use no_comment::{IntoWithoutComments as _, languages}; @@ -21,10 +21,29 @@ impl OverlayHeader { pub fn load_from(file_name: &str, file_path: PathBuf, lba_source: PathBuf) -> Result { let content = load_content(&file_path)?; - let _ = load_lba_names(lba_source)?; + let lba_names = load_lba_names(lba_source)?; let content_size = format_if_error!(tool_helper::compress::lz4(&content, 16), "Compressing {} failed with \"{error_text}\"", file_path.to_string_lossy())?.len(); - Ok(File::new_overlay(file_name, content, content_size)?) + Ok(File::new_overlay(file_name, content, lba_names, content_size)?) +} + +pub fn update_content(_content: Vec, lba_names: LBANameVec, file_map: &FileSystemMap) -> Result, Error> { + for mut lba_name in lba_names { + if lba_name.find(';').is_none() { + lba_name.push_str(";1"); + } + + print!("Searching {}... ", lba_name); + if let Some(info) = file_map.get(&lba_name) { + println!("found @ {}", info.borrow().get_track_rel_lba()) + } + + else { + println!("Not found..."); + } + } + + Err(Error::not_implemented("update_overlay")) } fn load_content(file_path: &PathBuf) -> Result, Error> {