#![allow(non_camel_case_types, non_snake_case)]
use crate::decl::*;
use crate::guard::*;
use crate::kernel::privs::*;
use crate::prelude::*;
use crate::winspool::ffi;
handle! { HPRINTER;
}
impl HPRINTER {
pub fn AbortPrinter(&self) -> SysResult<()> {
BoolRet(unsafe { ffi::AbortPrinter(self.ptr()) }).to_invalidparm()
}
pub fn AddForm1(&self, form: &FORM_INFO_1) -> SysResult<()> {
BoolRet(unsafe { ffi::AddFormW(self.ptr(), 1, pcvoid(form)) }).to_invalidparm()
}
pub fn AddForm2(&self, form: &FORM_INFO_2) -> SysResult<()> {
BoolRet(unsafe { ffi::AddFormW(self.ptr(), 2, pcvoid(form)) }).to_invalidparm()
}
pub fn AddJob(&self) -> SysResult<(String, u32)> {
let mut sz = 0u32;
BoolRet(unsafe { ffi::AddJobW(self.ptr(), 1, std::ptr::null_mut(), 0, &mut sz) })
.to_invalidparm()?;
let mut buf = vec![0u8; sz as _];
BoolRet(unsafe {
ffi::AddJobW(self.ptr(), 1, buf.as_mut_ptr() as _, buf.len() as _, &mut sz)
})
.to_invalidparm()
.map(|_| {
let refjob_info = unsafe {
let pjob_info = std::mem::transmute::<_, *const ADDJOB_INFO_1>(buf.as_ptr());
&*pjob_info
};
(WString::from_opt_str(refjob_info.pPath()).to_string(), refjob_info.JobId)
})
}
#[must_use]
pub fn AddPrinter(
name: Option<&str>,
printer: &PRINTER_INFO_2,
) -> SysResult<ClosePrinterGuard> {
unsafe {
PtrRet(ffi::AddPrinterW(WString::from_opt_str(name).as_ptr(), 2, pcvoid(printer)))
.to_sysresult_handle()
.map(|h| ClosePrinterGuard::new(h))
}
}
pub fn DeleteForm(&self, form_name: &str) -> SysResult<()> {
BoolRet(unsafe { ffi::DeleteFormW(self.ptr(), WString::from_str(form_name).as_mut_ptr()) })
.to_invalidparm()
}
pub fn DeletePrinter(&self) -> SysResult<()> {
BoolRet(unsafe { ffi::DeletePrinter(self.ptr()) }).to_invalidparm()
}
pub fn DeletePrinterData(&self, value_name: &str) -> SysResult<()> {
ErrorRet(unsafe {
ffi::DeletePrinterDataW(self.ptr(), WString::from_str(value_name).as_mut_ptr())
})
.to_sysresult()
}
pub fn DeletePrinterDataEx(&self, key_name: &str, value_name: &str) -> SysResult<()> {
ErrorRet(unsafe {
ffi::DeletePrinterDataExW(
self.ptr(),
WString::from_str(key_name).as_ptr(),
WString::from_str(value_name).as_ptr(),
)
})
.to_sysresult()
}
pub fn DeletePrinterKey(&self, key_name: &str) -> SysResult<()> {
ErrorRet(unsafe {
ffi::DeletePrinterKeyW(self.ptr(), WString::from_str(key_name).as_ptr())
})
.to_sysresult()
}
#[must_use]
pub fn GetPrinter2(
&self,
) -> SysResult<PRINTER_INFO_2<'_, '_, '_, '_, '_, '_, '_, '_, '_, '_, '_, '_, '_>> {
let mut nfo = PRINTER_INFO_2::default();
let mut needed = 0u32;
BoolRet(unsafe {
ffi::GetPrinterW(
self.ptr(),
2,
pvoid(&mut nfo),
std::mem::size_of::<PRINTER_INFO_2>() as _,
&mut needed,
)
})
.to_invalidparm()
.map(|_| nfo)
}
#[must_use]
pub fn GetPrinter3(&self) -> SysResult<PRINTER_INFO_3<'_>> {
let mut nfo = PRINTER_INFO_3::default();
let mut needed = 0u32;
BoolRet(unsafe {
ffi::GetPrinterW(
self.ptr(),
3,
pvoid(&mut nfo),
std::mem::size_of::<PRINTER_INFO_3>() as _,
&mut needed,
)
})
.to_invalidparm()
.map(|_| nfo)
}
#[must_use]
pub fn GetPrinter4(&self) -> SysResult<PRINTER_INFO_4<'_, '_>> {
let mut nfo = PRINTER_INFO_4::default();
let mut needed = 0u32;
BoolRet(unsafe {
ffi::GetPrinterW(
self.ptr(),
4,
pvoid(&mut nfo),
std::mem::size_of::<PRINTER_INFO_4>() as _,
&mut needed,
)
})
.to_invalidparm()
.map(|_| nfo)
}
#[must_use]
pub fn OpenPrinter(
printer_name: Option<&str>,
default: Option<&PRINTER_DEFAULTS>,
) -> SysResult<ClosePrinterGuard> {
let mut hprinter = HPRINTER::NULL;
unsafe {
BoolRet(ffi::OpenPrinterW(
WString::from_opt_str(printer_name).as_mut_ptr(),
hprinter.as_mut(),
pcvoid_or_null(default),
))
.to_invalidparm()
.map(|_| ClosePrinterGuard::new(hprinter))
}
}
#[must_use]
pub fn OpenPrinter2(
printer_name: Option<&str>,
default: Option<&PRINTER_DEFAULTS>,
options: Option<&PRINTER_OPTIONS>,
) -> SysResult<ClosePrinterGuard> {
let mut hprinter = HPRINTER::NULL;
unsafe {
BoolRet(ffi::OpenPrinter2W(
WString::from_opt_str(printer_name).as_mut_ptr(),
hprinter.as_mut(),
pcvoid_or_null(default),
pcvoid_or_null(options),
))
.to_invalidparm()
.map(|_| ClosePrinterGuard::new(hprinter))
}
}
pub fn ResetPrinter(&self, default: &PRINTER_DEFAULTS) -> SysResult<()> {
BoolRet(unsafe { ffi::ResetPrinterW(self.ptr(), pcvoid(default)) }).to_invalidparm()
}
pub fn ScheduleJob(&self, job_id: u32) -> SysResult<()> {
BoolRet(unsafe { ffi::ScheduleJob(self.ptr(), job_id) }).to_invalidparm()
}
}