Complete new property implementation
This commit is contained in:
parent
74e7760d0b
commit
9f9b491481
|
@ -3,6 +3,7 @@ use super::super::types::{helper::{DirectoryRecordMember, PathTableMember}, layo
|
||||||
use builder::SubModeBuilder;
|
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};
|
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 SYSTEM_AREA_SECTOR_COUNT:usize = 16;
|
||||||
const PVD_SECTOR_COUNT:usize = 2;
|
const PVD_SECTOR_COUNT:usize = 2;
|
||||||
|
|
||||||
|
@ -126,7 +127,7 @@ fn process_pvd(pvd: &PrimaryVolumeDescriptor, path_table: SharedPtr<PathTable>,
|
||||||
cd_pvd.path_table_4.write(path_table.get_track_rel_lba_for(4, sector_count_mode2_form1) as u32);
|
cd_pvd.path_table_4.write(path_table.get_track_rel_lba_for(4, sector_count_mode2_form1) as u32);
|
||||||
|
|
||||||
//Set Root Directory Record
|
//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
|
//Set other stuff
|
||||||
cd_pvd.publisher_id = AString::from_str(pvd.publisher.as_str())?;
|
cd_pvd.publisher_id = AString::from_str(pvd.publisher.as_str())?;
|
||||||
|
@ -176,22 +177,6 @@ fn process_path_table(path_table: &PathTable, root_dir: SharedPtr<Directory>, se
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_directory_record(dir: &Directory, _sec_writer: &mut dyn SectorWriter) -> Result<(), Error> {
|
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 mut dir_record = vec![0u8; dir.properties.borrow().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];
|
||||||
|
@ -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())
|
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<CDXASystemUse>) -> Result<&'a mut DirectoryRecord, Error> {
|
fn create_dir_record_raw<'a>(dst: &'a mut [u8], name: &str, track_rel_lba: u32, size_bytes: u32, system_use: Option<CDXASystemUse>) -> Result<&'a mut DirectoryRecord, Error> {
|
||||||
let name = name.unwrap_or("\x00");
|
|
||||||
let bytes_needed = DirectoryRecord::calculate_size_for(name, system_use.is_some());
|
let bytes_needed = DirectoryRecord::calculate_size_for(name, system_use.is_some());
|
||||||
|
|
||||||
if dst.len() < bytes_needed {
|
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<CDXASystemUse>) -> Result<usize, Error> {
|
fn write_dir_record(dir_record: &mut [u8], dir_member: &DirectoryRecordMember, has_system_use: bool) -> Result<usize, Error> {
|
||||||
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 create_file_system_use() -> CDXASystemUse {
|
||||||
|
let mut system_use = CDXASystemUse::default();
|
||||||
|
|
||||||
dir_record.set_directory();
|
system_use.file_attribute.set_mode2();
|
||||||
Ok(dir_record.length[0] as usize)
|
system_use
|
||||||
}
|
}
|
||||||
|
|
||||||
fn _update_dir_record_with_file(_dir_record: &mut [u8], _file: &File, _system_use: Option<CDXASystemUse>) -> Result<usize, Error> {
|
match dir_member {
|
||||||
Err(Error::not_implemented("update_dir_record_with_file"))
|
DirectoryRecordMember::Directory{name, track_rel_lba, real_size} => {
|
||||||
/*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)?;
|
let system_use = {
|
||||||
|
if has_system_use {
|
||||||
|
let mut system_use = CDXASystemUse::default();
|
||||||
|
|
||||||
|
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();
|
dir_record.set_file();
|
||||||
Ok(dir_record.length[0] as usize)*/
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -10,15 +10,23 @@ pub struct PathTableMember {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum DirectoryRecordMember {
|
pub enum DirectoryRecordMember {
|
||||||
Directory{name: String},
|
Directory{name: String, track_rel_lba: u32, real_size: u32},
|
||||||
File{name: String},
|
File{name: String, track_rel_lba: u32, real_size: u32},
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DirectoryRecordMember {
|
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 {
|
pub fn get_name(&self) -> &String {
|
||||||
match self {
|
match self {
|
||||||
DirectoryRecordMember::Directory{name} => name,
|
DirectoryRecordMember::Directory{name, track_rel_lba: _, real_size: _} => name,
|
||||||
DirectoryRecordMember::File{name} => name,
|
DirectoryRecordMember::File{name, track_rel_lba: _, real_size: _} => name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,24 +60,36 @@ pub fn collect_path_table_member(root: SharedPtr<Directory>) -> Vec<PathTableMem
|
||||||
collection
|
collection
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn collect_directory_record_member(files: &Vec<SharedPtr<File>>, dirs: &Vec<SharedPtr<Directory>>) -> Vec<DirectoryRecordMember> {
|
pub fn collect_directory_record_member(dir: &Directory) -> Vec<DirectoryRecordMember> {
|
||||||
|
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();
|
let mut collection = Vec::new();
|
||||||
|
|
||||||
collection.push(DirectoryRecordMember::Directory{name: CURRENT_DIR_NAME.to_owned()});
|
collection.push(DirectoryRecordMember::new_dir(CURRENT_DIR_NAME.to_owned(), &properties));
|
||||||
collection.push(DirectoryRecordMember::Directory{name: PARENT_DIR_NAME.to_owned()});
|
collection.push(DirectoryRecordMember::new_dir(PARENT_DIR_NAME.to_owned(), &parent_properties.borrow()));
|
||||||
for file in files {
|
for file in &dir.files {
|
||||||
let file = file.borrow();
|
let file = file.borrow();
|
||||||
if !file.properties.is_hidden {
|
if !file.properties.is_hidden {
|
||||||
if let Some(name) = file.name.as_string() {
|
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 {
|
for dir in &dir.dirs {
|
||||||
if !dir.borrow().properties.borrow().is_hidden {
|
let dir = dir.borrow();
|
||||||
if let Some(name) = dir.borrow().name.as_string() {
|
if !dir.properties.borrow().is_hidden {
|
||||||
collection.push(DirectoryRecordMember::Directory{name});
|
if let Some(name) = dir.name.as_string() {
|
||||||
|
let properties = dir.properties.borrow();
|
||||||
|
collection.push(DirectoryRecordMember::new_dir(name, &properties));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@ impl Directory {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn collect_member(&self) -> Vec<helper::DirectoryRecordMember>{
|
pub(super) fn collect_member(&self) -> Vec<helper::DirectoryRecordMember>{
|
||||||
helper::collect_directory_record_member(&self.files, &self.dirs)
|
helper::collect_directory_record_member(&self)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn update_content_size(&mut self) {
|
pub(super) fn update_content_size(&mut self) {
|
||||||
|
|
Loading…
Reference in New Issue