latest version of directory

This commit is contained in:
AmauryBrodu 2023-04-05 10:51:18 +02:00
parent 6ad3b36201
commit 00b4ed0066

View File

@ -1,18 +1,41 @@
const FILE_NAME_MAX_LEN: i32 = 80;
const NUM_DIR_ENTRIES: i32 = 30;
use crate::drivers::drv_disk::DrvDisk;
use crate::kernel::mgerror::ErrorCode;
use crate::kernel::mgerror::ErrorCode::{AlreadyInDirectory, NospaceInDirectory, InexistDirectoryError};
use std::mem;
use super::openfile::OpenFile;
pub struct DirectoryEntry {
in_use: bool,
sector: i32,
name: [char; FILE_NAME_MAX_LEN as usize],
}
impl DirectoryEntry {
fn to_bytes(&self) -> Vec<u8> {
let mut bytes = Vec::new();
bytes.push(self.in_use as u8);
bytes.extend_from_slice(&self.sector.to_le_bytes());
for ch in &self.name {
bytes.extend_from_slice(&ch.encode_utf8(&mut [0; 4]).as_bytes());
}
bytes
}
}
fn entries_to_bytes(entries: &Vec<DirectoryEntry>) -> Vec<u8> {
let mut bytes = Vec::new();
for entry in entries {
bytes.extend_from_slice(&entry.to_bytes());
}
bytes
}
pub struct Directory {
table_size: i32,
table: Vec<DirectoryEntry>,
drv_disk: DrvDisk,
}
impl Directory {
@ -23,7 +46,7 @@ impl Directory {
///
/// ### Parameters
/// - **size** is the number of entries in the directory
pub fn init_directory(size: i32) -> Directory {
pub fn init_directory(size: i32, drv_disk_: DrvDisk) -> Directory {
let tmp:Vec<DirectoryEntry> = Vec::new();
for i in 0..size {
tmp[i as usize].in_use = false;
@ -31,16 +54,17 @@ impl Directory {
Directory {
table_size: size,
table: tmp,
drv_disk: drv_disk_,
}
}
pub fn fetch_from(&self, OpenFile file) {
file.read_at(self.table,self.table_size * mem::size_of::<DirectoryEntry>() as i32);
pub fn fetch_from(&self,mut file: OpenFile) {
OpenFile::read_at(&mut self.drv_disk, &mut file, &mut entries_to_bytes(&self.table), self.table_size * mem::size_of::<DirectoryEntry>() as i32, 0);
}
pub fn write_back(&self, OpenFile file) {
file.write_at(self.table,self.table_size * mem::size_of::<DirectoryEntry>() as i32);
pub fn write_back(&self,mut file: OpenFile) {
OpenFile::write_at(&mut self.drv_disk,&mut file,&mut entries_to_bytes(&self.table),self.table_size * mem::size_of::<DirectoryEntry>() as i32,0);
}
/// Look up file name in directory.
@ -85,19 +109,20 @@ impl Directory {
/// - **new_sector** the disk sector containing the added file's header
///
/// return NO_ERROR, ALREADY_IN_DIRECTORY or NOSPACE_IN_DIRECTORY.
pub fn add(&self, name: char, new_sector: i32) -> ErrorCode {
pub fn add(&self, name: char, new_sector: i32) -> Result<(), ErrorCode> {
if self.find_index(name) != -1 {
return AlreadyInDirectory;
return Err(ErrorCode::AlreadyInDirectory);
}
for i in 0..self.table_size {
if !self.table[i as usize].in_use {
self.table[i as usize].in_use = true;
self.table[i as usize].name.starts_with(&self.table[i as usize].name);
self.table[i as usize].sector = new_sector;
return NoError;
return Ok(());
}
}
return NospaceInDirectory;
return Err(ErrorCode::NospaceInDirectory);
}
/// Remove a file name from the directory.
@ -106,13 +131,13 @@ impl Directory {
/// - **name** the file name to be removed
/// return NO_ERROR, or INEXIST_DIRECTORY_ERROR
pub fn remove(&self, name: char) -> ErrorCode{
pub fn remove(&self, name: char) -> Result<(), ErrorCode> {
let i = self.find_index(name);
if i == -1 {
return InexistDirectoryError;
return Err(ErrorCode::InexistDirectoryError);
}
self.table[i as usize].in_use = false;
return NoError;
Ok(())
}
/// List all the file names in the directory.(recursive function)
@ -121,7 +146,7 @@ impl Directory {
/// - **name** the name of the Dir to print
/// - **depth** the depth in the recursion (to print a nice hierarchy with spaces)
pub fn list(&self, name: char, depth: i32) {
let dir = Directory::init_directory(NUM_DIR_ENTRIES);
let dir = Directory::init_directory(NUM_DIR_ENTRIES, self.drv_disk);
for i in 0..self.table_size {
if self.table[i as usize].in_use {