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) => {
|
Layout::Directory(dir) => {
|
||||||
let dir = dir.borrow_mut();
|
let dir = dir.borrow_mut();
|
||||||
let mut properties = dir.properties.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;
|
cd_desc.vol_sector_count += sector_count;
|
||||||
if properties.is_hidden {
|
if properties.is_hidden {
|
||||||
|
@ -64,7 +64,7 @@ pub fn calculate_psx_lbas(cd_desc: &mut CDDesc) {
|
||||||
Layout::File(file) => {
|
Layout::File(file) => {
|
||||||
let sector_count = {
|
let sector_count = {
|
||||||
let file = file.borrow();
|
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)
|
sector_count_mode2_form1(fake_size)
|
||||||
};
|
};
|
||||||
|
@ -270,7 +270,12 @@ fn process_directory_record(dir: &Directory, sec_writer: &mut dyn SectorWriter)
|
||||||
return Ok(());
|
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 dir_length = dir_record.len();
|
||||||
let mut raw_data = &mut dir_record[0..dir_length];
|
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)?;
|
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 {
|
for _ in 0..extended_sector_count {
|
||||||
sec_writer.write_cd_xa_data(builder::create_xa_data_zero())?;
|
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> {
|
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 = {
|
let content_sectors = {
|
||||||
match &file.content {
|
match &file.content {
|
||||||
FileType::Regular(raw) => builder::create_xa_data_for_vec(None, raw),
|
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)?;
|
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 {
|
for _ in 0..extended_sector_count {
|
||||||
sec_writer.write_cd_xa_data(builder::create_xa_data_zero())?;
|
sec_writer.write_cd_xa_data(builder::create_xa_data_zero())?;
|
||||||
}
|
}
|
||||||
|
@ -430,3 +439,7 @@ fn write_dir_record(dir_record: &mut [u8], dir_member: &DirectoryRecordMember, h
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
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>{
|
pub(super) fn collect_member(&self) -> Vec<helper::DirectoryRecordMember>{
|
||||||
|
@ -196,7 +196,7 @@ impl File {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_extended_size(&self) -> usize {
|
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 struct Properties {
|
||||||
pub(super) track_rel_lba: usize,
|
pub(super) track_rel_lba: usize,
|
||||||
pub(super) size_bytes: usize,
|
pub(super) size_bytes: usize,
|
||||||
pub(super) overwrite_size_bytes: Option<usize>,
|
pub(super) padded_size_bytes: Option<usize>,
|
||||||
pub(super) is_hidden: bool
|
pub(super) is_hidden: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Properties {
|
impl Properties {
|
||||||
pub(super) fn get_extended_size(&self) -> usize {
|
pub(super) fn get_padded_size(&self) -> usize {
|
||||||
if let Some(forced_bytes) = self.overwrite_size_bytes {
|
if let Some(forced_bytes) = self.padded_size_bytes {
|
||||||
forced_bytes
|
forced_bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,11 +294,15 @@ impl Properties {
|
||||||
pub(super) fn get_real_size(&self) -> usize {
|
pub(super) fn get_real_size(&self) -> usize {
|
||||||
self.size_bytes
|
self.size_bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_size_valid(&self) -> bool {
|
||||||
|
self.get_padded_size() >= self.size_bytes
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Properties {
|
impl Default for Properties {
|
||||||
fn default() -> Self {
|
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