use std::ffi::OsString;
use std::os::windows::ffi::OsStringExt;
use std::path::PathBuf;
use windows_sys::core::GUID;
use windows_sys::core::PWSTR;
use windows_sys::Win32::Foundation::S_OK;
use windows_sys::Win32::System::Com::CoTaskMemFree;
use windows_sys::Win32::UI::Shell::{
FOLDERID_Documents, FOLDERID_Downloads, FOLDERID_LocalAppData, FOLDERID_Profile,
FOLDERID_RoamingAppData, SHGetKnownFolderPath,
};
fn get_windows_path(folder: GUID) -> Option<PathBuf> {
unsafe {
let mut str: PWSTR = std::ptr::null_mut();
let res = SHGetKnownFolderPath(&folder, 0, std::ptr::null_mut(), &mut str as _);
if res != S_OK {
return None;
}
debug_assert_eq!(str.align_offset(2), 0);
let mut count: usize = 0;
while std::ptr::read(str.add(count)) != 0 {
count += 1;
}
let slice = std::slice::from_raw_parts(str, count);
let str1 = OsString::from_wide(&slice);
CoTaskMemFree(str as _);
Some(str1.into())
}
}
pub fn get_app_cache() -> Option<PathBuf> {
get_windows_path(FOLDERID_LocalAppData)
}
pub fn get_app_config() -> Option<PathBuf> {
None }
pub fn get_app_data() -> Option<PathBuf> {
get_windows_path(FOLDERID_RoamingAppData)
}
pub fn get_app_logs() -> Option<PathBuf> {
None }
pub fn get_app_documents() -> Option<PathBuf> {
None }
pub fn get_user_home() -> Option<PathBuf> {
get_windows_path(FOLDERID_Profile)
}
pub fn get_user_documents() -> Option<PathBuf> {
get_windows_path(FOLDERID_Documents)
}
pub fn get_user_downloads() -> Option<PathBuf> {
get_windows_path(FOLDERID_Downloads)
}