use crate::sys::{E_NOINTERFACE, E_POINTER, FAILED};
use crate::sys::{GUID, HRESULT};
use crate::{interfaces, Interface, IID};
use core::ffi::c_void;
interfaces! {
#[uuid("00000000-0000-0000-C000-000000000046")]
pub unsafe interface IUnknown {
pub unsafe fn QueryInterface(&self, riid: *const GUID, ppv: *mut *mut c_void) -> HRESULT;
pub unsafe fn AddRef(&self) -> u32;
pub unsafe fn Release(&self) -> u32;
}
}
impl IUnknown {
pub fn query_interface<I: Interface>(&self) -> Option<I> {
let mut ppv = None;
let hr = unsafe {
self.QueryInterface(
&I::IID as *const IID,
&mut ppv as *mut _ as *mut *mut c_void,
)
};
if FAILED(hr) {
assert!(
hr == E_NOINTERFACE || hr == E_POINTER,
"QueryInterface returned non-standard error"
);
return None;
}
debug_assert!(ppv.is_some());
ppv
}
}