blob: 1d3d88cb4cd6e9a1432665d5dddb433de962e0e5 [file] [log] [blame]
// Copyright 2023, Igor Shaula
// Licensed under the MIT License <LICENSE or
// http://opensource.org/licenses/MIT>. This file
// may not be copied, modified, or distributed
// except according to those terms.
use std::fmt;
use std::ops::Deref;
use windows_sys::Win32::Foundation::FILETIME;
use windows_sys::Win32::Foundation::SYSTEMTIME;
use windows_sys::Win32::System::Time::FileTimeToSystemTime;
pub struct FileTime(pub(crate) FILETIME);
impl Default for FileTime {
fn default() -> Self {
Self(FILETIME {
dwLowDateTime: 0,
dwHighDateTime: 0,
})
}
}
impl fmt::Debug for FileTime {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("FILETIME")
.field("dwLowDateTime", &self.dwLowDateTime)
.field("dwHighDateTime", &self.dwHighDateTime)
.finish()
}
}
impl Deref for FileTime {
type Target = FILETIME;
fn deref(&self) -> &Self::Target {
&self.0
}
}
/// Metadata returned by `RegKey::query_info`
#[derive(Debug, Default)]
pub struct RegKeyMetadata {
// pub Class: winapi::LPWSTR,
// pub ClassLen: u32,
pub sub_keys: u32,
pub max_sub_key_len: u32,
pub max_class_len: u32,
pub values: u32,
pub max_value_name_len: u32,
pub max_value_len: u32,
// pub SecurityDescriptor: u32,
pub last_write_time: FileTime,
}
impl RegKeyMetadata {
/// Returns `last_write_time` field as `windows_sys::Win32::Foundation::SYSTEMTIME`
pub fn get_last_write_time_system(&self) -> SYSTEMTIME {
let mut st: SYSTEMTIME = unsafe { ::std::mem::zeroed() };
unsafe {
FileTimeToSystemTime(&self.last_write_time.0, &mut st);
}
st
}
/// Returns `last_write_time` field as `chrono::NaiveDateTime`.
/// Part of `chrono` feature.
#[cfg(feature = "chrono")]
pub fn get_last_write_time_chrono(&self) -> chrono::NaiveDateTime {
let st = self.get_last_write_time_system();
chrono::NaiveDate::from_ymd_opt(st.wYear.into(), st.wMonth.into(), st.wDay.into())
.expect("out-of-range date, invalid month and/or day")
.and_hms_opt(st.wHour.into(), st.wMinute.into(), st.wSecond.into())
.expect("invalid hour, minute and/or second")
}
}