diff --git a/src/filesys/openfile.rs b/src/filesys/openfile.rs index 17ff6d6..f77885d 100644 --- a/src/filesys/openfile.rs +++ b/src/filesys/openfile.rs @@ -61,11 +61,8 @@ impl OpenFile { let mut nbr_octet_lu = num_bytes; let file_length = file.hdr.file_length(); - let mut first_sector : i32; - let mut last_sector : i32; - let mut num_sectors : i32; - let mut start : i32; - let mut end : i32; + //on transforme position (position en octets) en un numéro de secteur + let sector_position = position/disk::SECTOR_SIZE; if ( num_bytes <= 0)||( position < 0)||( position >= file_length) { return 0; @@ -74,24 +71,8 @@ impl OpenFile { if (position + num_bytes > file_length) { nbr_octet_lu = file_length - position; } - - first_sector = div_round_down(position,disk::SECTOR_SIZE); - last_sector = div_round_down(position + num_bytes - 1, disk::SECTOR_SIZE); - num_sectors = last_sector - first_sector + 1; - - let mut buffer = vec![0_u8; (num_sectors * disk::SECTOR_SIZE) as usize]; - - for i in first_sector..(last_sector + 1){ - - DrvDisk::read_sector(driver_disk, i, &mut buffer); - } - - start = position%disk::SECTOR_SIZE; - end = start + nbr_octet_lu - 1; - - for i in start..(end + 1){ - into.push(buffer[i as usize]); - } + + DrvDisk::read_multiple_sector(driver_disk, sector_position, &mut into[..]); nbr_octet_lu } @@ -102,18 +83,12 @@ impl OpenFile { num_bytes : nombre d'octets à écrire depuis from position : position du premier octet à écrire dans le fichier(header compté??) */ - pub fn write_at(driver_disk : &mut DrvDisk, file : &mut OpenFile, from : &mut Vec, num_bytes_to_write : i32, position : i32) -> i32 { + pub fn write_at(driver_disk : &mut DrvDisk, file : &mut OpenFile, from : &Vec, num_bytes_to_write : i32, position : i32) -> i32 { let mut file_length = file.hdr.file_length(); let mut max_file_length = file.hdr.max_file_length(); - - let mut first_sector : i32; - let mut last_sector : i32; - let mut nbr_sectors : i32; - - let mut first_aligned : bool; - let mut last_aligned : bool; - + //on transforme position (position en octets) en un numéro de secteur + let sector_position = position/disk::SECTOR_SIZE; let mut num_bytes = num_bytes_to_write; //le nombre d'octets que l'on va réellement écrire, on ne pourra pas forcément ecrire la taille demandée en paramètre if (num_bytes <= 0)||(position < 0) ||(position > file_length){ @@ -140,48 +115,14 @@ impl OpenFile { else if position + num_bytes > file_length{ file.hdr.change_file_length(position + num_bytes); } - - first_sector = div_round_down(position, disk::SECTOR_SIZE); - last_sector = div_round_down(position + num_bytes - 1, disk::SECTOR_SIZE); - nbr_sectors = last_sector + first_sector + 1; - - let mut buffer = vec![0_u8; (nbr_sectors * disk::SECTOR_SIZE) as usize]; - let mut sector_buffer = vec![0_u8; disk::SECTOR_SIZE as usize]; - - first_aligned = position == first_sector*disk::SECTOR_SIZE;//to use - last_aligned = position + num_bytes == (last_sector + 1)*disk::SECTOR_SIZE;//to use - - /* - A CHANGER - les read & write de disk prenant en param des vec, on ne peut pour l'instant pas copier premier et dernier secteur si mauvais alignement - par defaut, on reconpie tout les secteur du disk de premier a dernier dans buffer, puis on ecrase avec les données dans from - */ - - //on recopie tous les secteurs dans buffer - for i in first_sector..(last_sector + 1){ - driver_disk.read_sector(i, &mut buffer) - } - - //on ecrase dans buffer avec les données de from - let start = position%disk::SECTOR_SIZE; - let end = start + num_bytes - 1; - - for i in start..(end + 1){ - buffer[i as usize] = from[(i-start) as usize]; - } - - //on ecrit, secteur par secteur, en segmentant buffer en secteurs - for i in 0..(nbr_sectors + 1){ - - let j = i*disk::SECTOR_SIZE; - let k = i + disk::SECTOR_SIZE - 1; - //driver_disk.write_sector(i + first_sector, &buffer[i..=k]); - //BESOIN DE CHANGER VEC U8 EN SLICE DANS les fonctions read & write de drv_disk & disk - } + + DrvDisk::write_multiple_sector(driver_disk, sector_position, &from[..]); num_bytes } + + pub fn read(driver_disk : &mut DrvDisk, file : &mut OpenFile, into : &mut Vec, num_bytes : i32) -> i32 { let result = OpenFile::read_at(driver_disk, file, into, num_bytes, file.seekPosition); @@ -189,7 +130,9 @@ impl OpenFile { result } - pub fn write(driver_disk : &mut DrvDisk, file : &mut OpenFile, from : &mut Vec, num_bytes : i32) -> i32 { + + + pub fn write(driver_disk : &mut DrvDisk, file : &mut OpenFile, from : & Vec, num_bytes : i32) -> i32 { let result = OpenFile::write_at(driver_disk, file, from, num_bytes, file.seekPosition); file.seekPosition += result; @@ -197,6 +140,7 @@ impl OpenFile { } + pub fn get_name(&self) -> String { return self.name.clone(); }