use std::ptr::NonNull;
use crate::enums::DiskFormatFlags;
use crate::error::Result;
use crate::functions::check;
use crate::sys;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DiskSize {
pub sectors: u64,
pub bytes_per_sector: u64,
}
pub struct DiskDetails {
ptr: NonNull<sys::icsneoc2_disk_details_t>,
}
unsafe impl Send for DiskDetails {}
impl Drop for DiskDetails {
fn drop(&mut self) {
unsafe { sys::icsneoc2_disk_details_free(self.ptr.as_ptr()) };
}
}
impl DiskDetails {
pub(crate) fn new(ptr: NonNull<sys::icsneoc2_disk_details_t>) -> Self {
Self { ptr }
}
pub(crate) fn as_ptr(&self) -> *mut sys::icsneoc2_disk_details_t {
self.ptr.as_ptr()
}
pub fn count(&self) -> Result<usize> {
let mut value: usize = 0;
check(unsafe { sys::icsneoc2_disk_details_count_get(self.ptr.as_ptr(), &raw mut value) })?;
Ok(value)
}
pub fn layout(&self) -> Result<sys::DiskLayout> {
let mut raw: sys::icsneoc2_disk_layout_t = 0;
check(unsafe { sys::icsneoc2_disk_details_layout_get(self.ptr.as_ptr(), &raw mut raw) })?;
Ok(sys::DiskLayout::try_from(raw)?)
}
pub fn set_layout(&self, layout: sys::DiskLayout) -> Result<()> {
check(unsafe {
sys::icsneoc2_disk_details_layout_set(
self.ptr.as_ptr(),
sys::icsneoc2_disk_layout_t::from(layout),
)
})
}
pub fn flags(&self, index: usize) -> Result<DiskFormatFlags> {
let mut value: sys::icsneoc2_disk_format_flags_t = 0;
check(unsafe {
sys::icsneoc2_disk_details_flags_get(self.ptr.as_ptr(), index, &raw mut value)
})?;
Ok(DiskFormatFlags::from(value))
}
pub fn set_flags(&self, index: usize, flags: DiskFormatFlags) -> Result<()> {
check(unsafe {
sys::icsneoc2_disk_details_flags_set(
self.ptr.as_ptr(),
index,
sys::icsneoc2_disk_format_flags_t::from(flags),
)
})
}
pub fn size(&self, index: usize) -> Result<DiskSize> {
let mut sectors: u64 = 0;
let mut bytes_per_sector: u64 = 0;
check(unsafe {
sys::icsneoc2_disk_details_size_get(
self.ptr.as_ptr(),
index,
&raw mut sectors,
&raw mut bytes_per_sector,
)
})?;
Ok(DiskSize {
sectors,
bytes_per_sector,
})
}
pub fn is_full_format(&self) -> Result<bool> {
let mut value = false;
check(unsafe {
sys::icsneoc2_disk_details_full_format_get(self.ptr.as_ptr(), &raw mut value)
})?;
Ok(value)
}
pub fn set_full_format(&self, value: bool) -> Result<()> {
check(unsafe { sys::icsneoc2_disk_details_full_format_set(self.ptr.as_ptr(), value) })
}
}