openfile adapté aux slices

This commit is contained in:
Moysan Gabriel 2023-04-19 12:04:13 +02:00
parent d6eef6fe08
commit 88d8d9cd58

View File

@ -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<u8>, num_bytes_to_write : i32, position : i32) -> i32 {
pub fn write_at(driver_disk : &mut DrvDisk, file : &mut OpenFile, from : &Vec<u8>, 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<u8>, 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<u8>, num_bytes : i32) -> i32 {
pub fn write(driver_disk : &mut DrvDisk, file : &mut OpenFile, from : & Vec<u8>, 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();
}