From 9f9b491481f2a9855dc0fee1c3ec45221afcd386 Mon Sep 17 00:00:00 2001 From: Jaby Date: Wed, 26 Oct 2022 20:58:18 +0200 Subject: [PATCH] Complete new property implementation --- src/Tools/psxcdgen_ex/src/encoder/psx.rs | 82 ++++++++++++++--------- src/Tools/psxcdgen_ex/src/types/helper.rs | 46 +++++++++---- src/Tools/psxcdgen_ex/src/types/mod.rs | 2 +- 3 files changed, 86 insertions(+), 44 deletions(-) diff --git a/src/Tools/psxcdgen_ex/src/encoder/psx.rs b/src/Tools/psxcdgen_ex/src/encoder/psx.rs index f054635a..09ee0c53 100644 --- a/src/Tools/psxcdgen_ex/src/encoder/psx.rs +++ b/src/Tools/psxcdgen_ex/src/encoder/psx.rs @@ -3,6 +3,7 @@ use super::super::types::{helper::{DirectoryRecordMember, PathTableMember}, layo use builder::SubModeBuilder; use cdtypes::types::{cdstring::{AString, DString}, date::*, dir_record::*, helper::sector_count_mode2_form1, path_table::*, pvd as cd_pvd, lsb_msb::*, sector::Mode2Form1}; +const ROOT_DIR_NAME:&'static str = "\x00"; const SYSTEM_AREA_SECTOR_COUNT:usize = 16; const PVD_SECTOR_COUNT:usize = 2; @@ -126,8 +127,8 @@ fn process_pvd(pvd: &PrimaryVolumeDescriptor, path_table: SharedPtr, cd_pvd.path_table_4.write(path_table.get_track_rel_lba_for(4, sector_count_mode2_form1) as u32); //Set Root Directory Record - update_dir_record_with_dir(&mut cd_pvd.root_dir_record, &root_dir, None)?; - + write_dir_record(&mut cd_pvd.root_dir_record, &DirectoryRecordMember::new_dir(ROOT_DIR_NAME.to_owned(), &root_dir.properties.borrow()), false)?; + //Set other stuff cd_pvd.publisher_id = AString::from_str(pvd.publisher.as_str())?; cd_pvd.data_preparer = AString::from_str("JABYENGINE PSXCDGEN_EX")?; @@ -176,22 +177,6 @@ fn process_path_table(path_table: &PathTable, root_dir: SharedPtr, se } fn process_directory_record(dir: &Directory, _sec_writer: &mut dyn SectorWriter) -> Result<(), Error> { - fn _create_dir_system_use() -> CDXASystemUse { - let mut system_use = CDXASystemUse::default(); - - system_use.file_attribute.set_mode2(); - system_use.file_attribute.set_directory(); - - system_use - } - - fn _create_file_system_use() -> CDXASystemUse { - let mut system_use = CDXASystemUse::default(); - - system_use.file_attribute.set_mode2(); - system_use - } - let mut dir_record = vec![0u8; dir.properties.borrow().get_real_size()]; let dir_length = dir_record.len(); let mut raw_data = &mut dir_record[0..dir_length]; @@ -246,8 +231,7 @@ fn update_path_table_entry(path_table_l: &mut PathTableL, path_table_b: &mut Pat Ok(path_table_l.get_size()) } -fn create_dir_record_raw<'a>(dst: &'a mut [u8], name: Option<&str>, track_rel_lba: u32, size_bytes: u32, system_use: Option) -> Result<&'a mut DirectoryRecord, Error> { - let name = name.unwrap_or("\x00"); +fn create_dir_record_raw<'a>(dst: &'a mut [u8], name: &str, track_rel_lba: u32, size_bytes: u32, system_use: Option) -> Result<&'a mut DirectoryRecord, Error> { let bytes_needed = DirectoryRecord::calculate_size_for(name, system_use.is_some()); if dst.len() < bytes_needed { @@ -272,17 +256,55 @@ fn create_dir_record_raw<'a>(dst: &'a mut [u8], name: Option<&str>, track_rel_lb } } -fn update_dir_record_with_dir(dir_record: &mut [u8], dir: &Directory, system_use: Option) -> Result { - let dir_record = create_dir_record_raw(dir_record, dir.name.as_str(), dir.properties.borrow().track_rel_lba as u32, dir.properties.borrow().get_real_size() as u32, system_use)?; +fn write_dir_record(dir_record: &mut [u8], dir_member: &DirectoryRecordMember, has_system_use: bool) -> Result { + fn create_file_system_use() -> CDXASystemUse { + let mut system_use = CDXASystemUse::default(); - dir_record.set_directory(); - Ok(dir_record.length[0] as usize) -} + system_use.file_attribute.set_mode2(); + system_use + } -fn _update_dir_record_with_file(_dir_record: &mut [u8], _file: &File, _system_use: Option) -> Result { - Err(Error::not_implemented("update_dir_record_with_file")) - /*let dir_record = create_dir_record_raw(dir_record, dir.name.as_str(), dir.properties.track_rel_lba as u32, dir.get_size() as u32, system_use)?; + match dir_member { + DirectoryRecordMember::Directory{name, track_rel_lba, real_size} => { + let system_use = { + if has_system_use { + let mut system_use = CDXASystemUse::default(); - dir_record.set_file(); - Ok(dir_record.length[0] as usize)*/ + system_use.file_attribute.set_mode2(); + system_use.file_attribute.set_directory(); + + Some(system_use) + } + + else { + None + } + }; + + let dir_record = create_dir_record_raw(dir_record, name.as_str(), *track_rel_lba, *real_size, system_use)?; + + dir_record.set_file(); + return Ok(dir_record.length[0] as usize); + }, + + DirectoryRecordMember::File{name, track_rel_lba, real_size} => { + let system_use = { + if has_system_use { + let mut system_use = CDXASystemUse::default(); + + system_use.file_attribute.set_mode2(); + Some(system_use) + } + + else { + None + } + }; + + let dir_record = create_dir_record_raw(dir_record, name.as_str(), *track_rel_lba, *real_size, system_use)?; + + dir_record.set_file(); + return Ok(dir_record.length[0] as usize); + } + } } \ No newline at end of file diff --git a/src/Tools/psxcdgen_ex/src/types/helper.rs b/src/Tools/psxcdgen_ex/src/types/helper.rs index d1c1d4e4..7f940558 100644 --- a/src/Tools/psxcdgen_ex/src/types/helper.rs +++ b/src/Tools/psxcdgen_ex/src/types/helper.rs @@ -10,15 +10,23 @@ pub struct PathTableMember { } pub enum DirectoryRecordMember { - Directory{name: String}, - File{name: String}, + Directory{name: String, track_rel_lba: u32, real_size: u32}, + File{name: String, track_rel_lba: u32, real_size: u32}, } impl DirectoryRecordMember { + pub fn new_dir(name: String, properties: &Properties) -> DirectoryRecordMember { + DirectoryRecordMember::Directory{name, track_rel_lba: properties.track_rel_lba as u32, real_size: properties.get_real_size() as u32} + } + + pub fn new_file(name: String, properties: &Properties) -> DirectoryRecordMember { + DirectoryRecordMember::File{name, track_rel_lba: properties.track_rel_lba as u32, real_size: properties.get_real_size() as u32} + } + pub fn get_name(&self) -> &String { match self { - DirectoryRecordMember::Directory{name} => name, - DirectoryRecordMember::File{name} => name, + DirectoryRecordMember::Directory{name, track_rel_lba: _, real_size: _} => name, + DirectoryRecordMember::File{name, track_rel_lba: _, real_size: _} => name, } } } @@ -52,24 +60,36 @@ pub fn collect_path_table_member(root: SharedPtr) -> Vec>, dirs: &Vec>) -> Vec { +pub fn collect_directory_record_member(dir: &Directory) -> Vec { + let properties = dir.properties.borrow(); + let parent_properties = { + if let Some(parent_properties) = &dir.parent_properties { + parent_properties.clone() + } + + else { + dir.properties.clone() + } + }; let mut collection = Vec::new(); - collection.push(DirectoryRecordMember::Directory{name: CURRENT_DIR_NAME.to_owned()}); - collection.push(DirectoryRecordMember::Directory{name: PARENT_DIR_NAME.to_owned()}); - for file in files { + collection.push(DirectoryRecordMember::new_dir(CURRENT_DIR_NAME.to_owned(), &properties)); + collection.push(DirectoryRecordMember::new_dir(PARENT_DIR_NAME.to_owned(), &parent_properties.borrow())); + for file in &dir.files { let file = file.borrow(); if !file.properties.is_hidden { if let Some(name) = file.name.as_string() { - collection.push(DirectoryRecordMember::File{name}); + collection.push(DirectoryRecordMember::new_file(name, &file.properties)); } } } - for dir in dirs { - if !dir.borrow().properties.borrow().is_hidden { - if let Some(name) = dir.borrow().name.as_string() { - collection.push(DirectoryRecordMember::Directory{name}); + for dir in &dir.dirs { + let dir = dir.borrow(); + if !dir.properties.borrow().is_hidden { + if let Some(name) = dir.name.as_string() { + let properties = dir.properties.borrow(); + collection.push(DirectoryRecordMember::new_dir(name, &properties)); } } } diff --git a/src/Tools/psxcdgen_ex/src/types/mod.rs b/src/Tools/psxcdgen_ex/src/types/mod.rs index 7769866f..4ffff14f 100644 --- a/src/Tools/psxcdgen_ex/src/types/mod.rs +++ b/src/Tools/psxcdgen_ex/src/types/mod.rs @@ -139,7 +139,7 @@ impl Directory { } pub(super) fn collect_member(&self) -> Vec{ - helper::collect_directory_record_member(&self.files, &self.dirs) + helper::collect_directory_record_member(&self) } pub(super) fn update_content_size(&mut self) {