Rename extended size to padded size and implement validation

This commit is contained in:
jaby 2022-11-24 03:36:56 +01:00
parent 28c17ffa7e
commit d5c9d16bb5
2 changed files with 31 additions and 14 deletions

View File

@ -49,7 +49,7 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) {
Layout::Directory(dir) => {
let dir = dir.borrow_mut();
let mut properties = dir.properties.borrow_mut();
let sector_count = sector_count_mode2_form1(properties.get_extended_size());
let sector_count = sector_count_mode2_form1(properties.get_padded_size());
cd_desc.vol_sector_count += sector_count;
if properties.is_hidden {
@ -64,7 +64,7 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) {
Layout::File(file) => {
let sector_count = {
let file = file.borrow();
let fake_size = file.properties.get_extended_size();
let fake_size = file.properties.get_padded_size();
sector_count_mode2_form1(fake_size)
};
@ -270,7 +270,12 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter)
return Ok(());
}
let mut dir_record = vec![0u8; dir.properties.borrow().get_real_size()];
let properties = dir.properties.borrow();
if !properties.is_size_valid() {
return Err(create_wrong_padding_error("Dir", dir.name.to_string(), properties.get_padded_size(), properties.get_real_size()));
}
let mut dir_record = vec![0u8; properties.get_real_size()];
let dir_length = dir_record.len();
let mut raw_data = &mut dir_record[0..dir_length];
@ -293,7 +298,7 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter)
sec_writer.write_cd_xa_data(sector)?;
}
let extended_sector_count = sector_count_mode2_form1(dir.properties.borrow().get_extended_size()) - dir_record_sector_count;
let extended_sector_count = sector_count_mode2_form1(dir.properties.borrow().get_padded_size()) - dir_record_sector_count;
for _ in 0..extended_sector_count {
sec_writer.write_cd_xa_data(builder::create_xa_data_zero())?;
}
@ -302,6 +307,10 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter)
}
fn process_file(file: &File, sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
if !file.properties.is_size_valid() {
return Err(create_wrong_padding_error("File", file.name.to_string(), file.properties.get_padded_size(), file.properties.get_real_size()));
}
let content_sectors = {
match &file.content {
FileType::Regular(raw) => builder::create_xa_data_for_vec(None, raw),
@ -313,7 +322,7 @@ fn process_file(file: &File, sec_writer: &mut dyn SectorWriter) -> Result<(), Er
sec_writer.write_cd_xa_data(sector)?;
}
let extended_sector_count = sector_count_mode2_form1(file.properties.get_extended_size()) - content_sector_count;
let extended_sector_count = sector_count_mode2_form1(file.properties.get_padded_size()) - content_sector_count;
for _ in 0..extended_sector_count {
sec_writer.write_cd_xa_data(builder::create_xa_data_zero())?;
}
@ -429,4 +438,8 @@ fn write_dir_record(dir_record: &mut [u8], dir_member: &DirectoryRecordMember, h
return Ok(dir_record.length[0] as usize);
}
}
}
fn create_wrong_padding_error(for_who: &str, name: String, padded_size: usize, real_size: usize) -> Error {
Error::from_text(format!("Encoding-Error for {} {}: Padded size ({}) is smaller then the original size ({}).", for_who, name, padded_size, real_size))
}

View File

@ -139,7 +139,7 @@ impl Directory {
}
pub fn get_extended_size(&self) -> usize {
self.properties.borrow().get_extended_size()
self.properties.borrow().get_padded_size()
}
pub(super) fn collect_member(&self) -> Vec<helper::DirectoryRecordMember>{
@ -196,7 +196,7 @@ impl File {
}
pub fn get_extended_size(&self) -> usize {
self.properties.get_extended_size()
self.properties.get_padded_size()
}
}
@ -274,15 +274,15 @@ impl std::fmt::Display for FileName {
}
pub struct Properties {
pub(super) track_rel_lba: usize,
pub(super) size_bytes: usize,
pub(super) overwrite_size_bytes: Option<usize>,
pub(super) is_hidden: bool
pub(super) track_rel_lba: usize,
pub(super) size_bytes: usize,
pub(super) padded_size_bytes: Option<usize>,
pub(super) is_hidden: bool
}
impl Properties {
pub(super) fn get_extended_size(&self) -> usize {
if let Some(forced_bytes) = self.overwrite_size_bytes {
pub(super) fn get_padded_size(&self) -> usize {
if let Some(forced_bytes) = self.padded_size_bytes {
forced_bytes
}
@ -294,11 +294,15 @@ impl Properties {
pub(super) fn get_real_size(&self) -> usize {
self.size_bytes
}
pub fn is_size_valid(&self) -> bool {
self.get_padded_size() >= self.size_bytes
}
}
impl Default for Properties {
fn default() -> Self {
Properties{track_rel_lba: 0, size_bytes: 0, overwrite_size_bytes: None, is_hidden: false}
Properties{track_rel_lba: 0, size_bytes: 0, padded_size_bytes: None, is_hidden: false}
}
}