From 00b4ed00666244ef7978c1fd869312d288e4ec2c Mon Sep 17 00:00:00 2001 From: AmauryBrodu <60550980+AmauryBrodu@users.noreply.github.com> Date: Wed, 5 Apr 2023 10:51:18 +0200 Subject: [PATCH] latest version of directory --- src/filesys/directory.rs | 53 +++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/src/filesys/directory.rs b/src/filesys/directory.rs index 189e348..e812184 100644 --- a/src/filesys/directory.rs +++ b/src/filesys/directory.rs @@ -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 { + 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) -> Vec { + 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, + 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 = 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::() 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::() as i32, 0); } - pub fn write_back(&self, OpenFile file) { - file.write_at(self.table,self.table_size * mem::size_of::() 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::() 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 {