pub(crate) use file_handle::FileHandle;
pub(crate) use mapping_handle::MappingHandle;
use slab::Slab;
pub mod file_handle;
mod hive_parser;
pub mod mapping_handle;
mod registry_handle;
mod windows_path;
enum HandleType {
FileHandle(FileHandle),
MappingHandle(MappingHandle),
}
pub struct HandleManagement {
number_of_handle: usize,
handle_types: Slab<HandleType>,
}
impl HandleManagement {
pub fn new() -> Self {
Self {
handle_types: Slab::with_capacity(200),
number_of_handle: 0,
}
}
pub fn insert_file_handle(&mut self, file_handle: FileHandle) -> u32 {
let key = self
.handle_types
.insert(HandleType::FileHandle(file_handle));
self.number_of_handle += 1;
key as u32 }
pub fn insert_mapping_handle(&mut self, mapping_handle: MappingHandle) -> u32 {
let key = self
.handle_types
.insert(HandleType::MappingHandle(mapping_handle));
self.number_of_handle += 1;
key as u32
}
pub fn get_mut_file_handle(&mut self, key: u32) -> Option<&mut FileHandle> {
if let Some(handle_type) = self.handle_types.get_mut(key as usize) {
match handle_type {
HandleType::FileHandle(fh) => Some(fh),
_ => None, }
} else {
None }
}
pub fn get_mut_mapping_handle(&mut self, key: u32) -> Option<&mut MappingHandle> {
if let Some(handle_type) = self.handle_types.get_mut(key as usize) {
match handle_type {
HandleType::MappingHandle(mh) => Some(mh),
_ => None,
}
} else {
None
}
}
pub fn remove_file_handle(&mut self, key: u32) -> Option<FileHandle> {
let file_handle = self.get_mut_file_handle(key)?;
file_handle.close();
if let Some(handle_type) = self.handle_types.try_remove(key as usize) {
match handle_type {
HandleType::FileHandle(fh) => {
self.number_of_handle -= 1;
Some(fh)
}
_ => {
self.handle_types.insert(handle_type);
None
}
}
} else {
None
}
}
pub fn remove_mapping_handle(&mut self, key: u32) -> Option<MappingHandle> {
if let Some(handle_type) = self.handle_types.try_remove(key as usize) {
match handle_type {
HandleType::MappingHandle(mh) => {
self.number_of_handle -= 1;
Some(mh)
}
_ => {
self.handle_types.insert(handle_type);
None
}
}
} else {
None
}
}
}