use super::*;
pub(crate) unsafe fn take_result(value: Result<*mut u16>) -> String {
value
.map(|value| unsafe { take(value) })
.unwrap_or_default()
}
pub(crate) unsafe fn take(value: *mut u16) -> String {
if value.is_null() {
return String::new();
}
let result = unsafe { PCWSTR::from_raw(value).to_string().unwrap_or_default() };
unsafe { CoTaskMemFree(value as *mut _) };
result
}
pub(crate) unsafe fn allocate(value: &str) -> Result<*mut u16> {
let encoded: Vec<u16> = value.encode_utf16().chain(std::iter::once(0)).collect();
let bytes = encoded.len() * size_of::<u16>();
let buffer = unsafe { CoTaskMemAlloc(bytes) } as *mut u16;
if buffer.is_null() {
return Err(Error::from_hresult(E_OUTOFMEMORY));
}
unsafe { std::ptr::copy_nonoverlapping(encoded.as_ptr(), buffer, encoded.len()) };
Ok(buffer)
}