use crate::co;
use crate::decl::*;
use crate::guard::*;
pub struct FileMapped {
hview: UnmapViewOfFileGuard, _hmap: CloseHandleGuard<HFILEMAP>,
file: File,
size: u64,
}
impl FileMapped {
#[must_use]
pub fn open(file_path: &str, access: FileAccess) -> SysResult<Self> {
let file = File::open(file_path, access)?;
let hmap = file.hfile().CreateFileMapping(
None,
match access {
FileAccess::ExistingReadOnly => co::PAGE::READONLY,
FileAccess::ExistingRW | FileAccess::OpenOrCreateRW | FileAccess::CreateRW => {
co::PAGE::READWRITE
},
},
None,
None,
None,
)?;
let hview = hmap.MapViewOfFile(
match access {
FileAccess::ExistingReadOnly => co::FILE_MAP::READ,
FileAccess::ExistingRW | FileAccess::OpenOrCreateRW | FileAccess::CreateRW => {
co::FILE_MAP::READ | co::FILE_MAP::WRITE
},
},
0,
None,
)?;
let size = file.hfile().GetFileSizeEx()?; Ok(Self { file, _hmap: hmap, hview, size })
}
#[must_use]
pub fn as_mut_slice(&mut self) -> &mut [u8] {
self.hview.as_mut_slice(self.size as _)
}
#[must_use]
pub fn as_slice(&self) -> &[u8] {
self.hview.as_slice(self.size as _)
}
#[must_use]
pub fn hfile(&self) -> &HFILE {
self.file.hfile()
}
#[must_use]
pub const fn size(&self) -> u64 {
self.size
}
#[must_use]
pub fn times(&self) -> SysResult<(SYSTEMTIME, SYSTEMTIME, SYSTEMTIME)> {
self.file.times()
}
}