Use std::function to simplify code

This commit is contained in:
Baptiste Wicht 2014-03-12 21:46:35 +01:00
parent f5b1165e28
commit bef1a4b193
2 changed files with 11 additions and 58 deletions

View File

@ -11,6 +11,7 @@
#include <vector.hpp>
#include <string.hpp>
#include <pair.hpp>
#include <function.hpp>
#include "disks.hpp"
#include "vfs/file_system.hpp"
@ -48,8 +49,7 @@ private:
size_t rm_dir(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number);
size_t rm_file(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number);
size_t set_file_size(uint32_t parent_cluster_number, size_t position, uint32_t file_size);
size_t set_cluster_number(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number);
size_t change_directory_entry(uint32_t parent_cluster_number, size_t position, const std::function<void(cluster_entry&)>& functor);
cluster_entry* find_free_entry(std::unique_heap_array<cluster_entry>& directory_cluster, size_t entries, uint32_t& cluster_number);
cluster_entry* extend_directory(std::unique_heap_array<cluster_entry>& directory_cluster, size_t entries, uint32_t& cluster_number);

View File

@ -427,7 +427,11 @@ size_t fat32::fat32_file_system::truncate(const std::vector<std::string>& file_p
++capacity;
set_cluster_number(parent_cluster_number_search.second, position, cluster);
change_directory_entry(parent_cluster_number_search.second, position,
[cluster](cluster_entry& entry){
entry.cluster_low = cluster;
entry.cluster_high = cluster >> 16;
});
}
//Extend the clusters if necessary
@ -457,7 +461,8 @@ size_t fat32::fat32_file_system::truncate(const std::vector<std::string>& file_p
}
//Set the new file size in the directory entry
set_file_size(parent_cluster_number_search.second, position, file_size);
change_directory_entry(parent_cluster_number_search.second, position,
[file_size](cluster_entry& entry){ entry.file_size = file_size; });
return 0;
}
@ -710,58 +715,7 @@ size_t fat32::fat32_file_system::rm_dir(uint32_t parent_cluster_number, size_t p
return rm_file(parent_cluster_number, position, cluster_number);
}
size_t fat32::fat32_file_system::set_file_size(uint32_t parent_cluster_number, size_t position, uint32_t file_size){
std::unique_heap_array<cluster_entry> directory_cluster(16 * fat_bs->sectors_per_cluster);
if(!read_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
return std::ERROR_FAILED;
}
//1. Mark the entries in directory as unused
bool found = false;
size_t cluster_position = 0;
while(!found){
bool end_reached = false;
//Verify if is the correct cluster
if(position >= cluster_position * directory_cluster.size() && position < (cluster_position + 1) * directory_cluster.size()){
found = true;
auto j = position % directory_cluster.size();
directory_cluster[j].file_size = file_size;
if(!write_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
return std::ERROR_FAILED;
}
}
//Jump to next cluser
if(!found && !end_reached){
parent_cluster_number = next_cluster(parent_cluster_number);
if(!parent_cluster_number){
break;
}
//The block is corrupted
if(parent_cluster_number == CLUSTER_CORRUPTED){
break;
}
if(!read_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
break;
}
}
}
if(!found){
return std::ERROR_NOT_EXISTS;
}
return 0;
}
size_t fat32::fat32_file_system::set_cluster_number(uint32_t parent_cluster_number, size_t position, uint32_t cluster_number){
size_t fat32::fat32_file_system::change_directory_entry(uint32_t parent_cluster_number, size_t position, const std::function<void(cluster_entry&)>& functor){
std::unique_heap_array<cluster_entry> directory_cluster(16 * fat_bs->sectors_per_cluster);
if(!read_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
return std::ERROR_FAILED;
@ -780,8 +734,7 @@ size_t fat32::fat32_file_system::set_cluster_number(uint32_t parent_cluster_numb
auto j = position % directory_cluster.size();
directory_cluster[j].cluster_low = cluster_number;
directory_cluster[j].cluster_high = cluster_number >> 16;
functor(directory_cluster[j]);
if(!write_sectors(cluster_lba(parent_cluster_number), fat_bs->sectors_per_cluster, directory_cluster.get())){
return std::ERROR_FAILED;