use windows::Win32::Foundation::{CLASS_E_NOAGGREGATION, E_POINTER};
use windows::Win32::System::Com::IClassFactory_Impl;
use windows_core::{BOOL, IUnknown, Interface, Ref, implement};
use crate::control::DenisePanel;
use crate::server::{lock_server, unlock_server};
#[implement(windows::Win32::System::Com::IClassFactory)]
pub struct PanelFactory;
impl IClassFactory_Impl for PanelFactory_Impl {
fn CreateInstance(
&self,
outer: Ref<'_, IUnknown>,
riid: *const windows_core::GUID,
object: *mut *mut core::ffi::c_void,
) -> windows_core::Result<()> {
if object.is_null() || riid.is_null() {
return Err(E_POINTER.into());
}
unsafe { object.write(core::ptr::null_mut()) };
if outer.is_some() {
return Err(CLASS_E_NOAGGREGATION.into());
}
let panel: IUnknown = DenisePanel::new().into();
unsafe { panel.query(riid, object).ok() }
}
fn LockServer(&self, lock: BOOL) -> windows_core::Result<()> {
if lock.as_bool() {
lock_server();
} else {
unlock_server();
}
Ok(())
}
}