Rename extended size to padded size and implement validation
This commit is contained in:
parent
28c17ffa7e
commit
d5c9d16bb5
|
@ -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))
|
||||
}
|
|
@ -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}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue