use win_shared_os_owned_handle::SharedHandle;
use super::opened_disk::OpenedDisk;
use super::opened_file::{Buffering, OpenedFile};
use super::opened_volume::OpenedVolume;
use durable_ioring::FlushDomain;
use durable_ioring::{Capabilities, Geometry, IoTarget, WarrantyClass};
#[derive(Clone, Debug)]
pub struct Win32FileTarget {
handle: SharedHandle,
found: Vec<FlushDomain>,
declared: Vec<FlushDomain>,
domains: Vec<FlushDomain>,
warranty: WarrantyClass,
geometry: Geometry,
capabilities: Capabilities,
}
impl Win32FileTarget {
#[must_use]
pub fn new<B: Buffering>(file: OpenedFile<B>) -> Self {
Self {
geometry: file.geometry(),
handle: file.handle().clone(),
found: Vec::new(),
declared: Vec::new(),
domains: Vec::new(),
warranty: B::WARRANTY,
capabilities: B::CAPABILITIES,
}
}
#[must_use]
pub fn from_volume<B: Buffering>(volume: OpenedVolume<B>) -> Self {
let found = volume.flush_domains();
Self {
geometry: volume.geometry(),
handle: volume.handle().clone(),
domains: found.clone(),
found,
declared: Vec::new(),
warranty: B::WARRANTY,
capabilities: B::CAPABILITIES,
}
}
#[must_use]
pub fn from_disk<B: Buffering>(disk: OpenedDisk<B>) -> Self {
let found = vec![disk.flush_domain()];
Self {
geometry: disk.geometry(),
handle: disk.handle().clone(),
domains: found.clone(),
found,
declared: Vec::new(),
warranty: B::WARRANTY,
capabilities: B::CAPABILITIES,
}
}
#[must_use]
pub fn with_domains(mut self, domains: impl IntoIterator<Item = FlushDomain>) -> Self {
self.declared = domains.into_iter().collect();
self.domains = self.found.clone();
for domain in &self.declared {
if !self.domains.contains(domain) {
self.domains.push(domain.clone());
}
}
self
}
#[must_use]
pub fn handle(&self) -> &SharedHandle {
&self.handle
}
#[cfg(test)]
#[must_use]
pub(crate) fn declared(
mut self,
warranty: WarrantyClass,
geometry: Geometry,
capabilities: Capabilities,
) -> Self {
self.warranty = warranty;
self.geometry = geometry;
self.capabilities = capabilities;
self
}
}
impl IoTarget for Win32FileTarget {
fn flush_domains(&self) -> &[FlushDomain] {
&self.domains
}
fn warranty(&self) -> WarrantyClass {
self.warranty
}
fn geometry(&self) -> Geometry {
self.geometry
}
fn capabilities(&self) -> Capabilities {
self.capabilities
}
}