diff --git a/src/utility/bitmap.rs b/src/utility/bitmap.rs index 4af76a1..0892b31 100644 --- a/src/utility/bitmap.rs +++ b/src/utility/bitmap.rs @@ -4,6 +4,8 @@ pub const BITS_IN_WORD: usize = 32; use std::fs::File; use std::io::{Cursor, Write, Read}; +use crate::drivers::drv_disk::{self, DrvDisk}; +use crate::filesys::openfile::OpenFile; use crate::simulator::disk::SECTOR_SIZE; pub struct BitMap { @@ -21,11 +23,10 @@ impl BitMap { /// - **nitems** is the number of bits in the bitmap. ///---------------------------------------------------------------------- pub fn init_bitmap(n_items: usize) -> BitMap { - let mut tmp: Vec; BitMap{ num_bits: n_items, num_words: (n_items + SECTOR_SIZE as usize -1) / SECTOR_SIZE as usize, - map: tmp, + map: vec![0,n_items as u32], } } @@ -100,13 +101,11 @@ impl BitMap { /// /// ### Parameters /// - **file** is the place to read the bitmap from - pub fn fetch_from(&mut self, file_path: &str) -> std::io::Result<&Vec> { - // Ouvre le fichier en mode lecture seule - let mut file = File::open(file_path)?; + pub fn fetch_from(&mut self, file: &mut OpenFile, drv_disk: &mut DrvDisk) -> std::io::Result<&Vec> { + let mut num_bytes = self.num_words * std::mem::size_of::(); - // Lit les octets du fichier dans un buffer let mut buffer = vec![0; self.num_words * std::mem::size_of::()]; - file.read_exact(&mut buffer)?; + OpenFile::read(drv_disk, file, &mut buffer, num_bytes as i32); // Convertit les octets en vecteur de u32 self.map = vec![0; self.num_words]; @@ -125,19 +124,17 @@ impl BitMap { /// /// ### Paramenters /// - **file** is the place to write the bitmap to - pub fn write_back(&mut self, file_path: &str) -> std::io::Result<()> { + pub fn write_back(&mut self, file: &mut OpenFile, drv_disk: &mut DrvDisk) -> std::io::Result<()> { + let mut num_bytes = self.num_words * std::mem::size_of::(); + // Encapsule le vecteur dans un std::io::Cursor pour l'utiliser comme un std::io::Write let mut cursor = Cursor::new(Vec::::new()); for u32_val in self.map.as_mut_slice() { cursor.write_all(&u32_val.to_le_bytes())?; } - // Ouvre le fichier en mode écriture - let mut file = File::create(file_path)?; - + OpenFile::read_at(drv_disk, file, &mut cursor.into_inner(), num_bytes as i32, 0); // Écrit les données dans le fichier - file.write_all(&cursor.into_inner())?; - Ok(()) } } \ No newline at end of file