refactor: rename PrinterInfo to PrinterDevice

This commit is contained in:
ArcticLampyrid committed 2024-03-14 01:36:35 +08:00
1 parent 769a28d7c8
commit b751858cec
9 files changed
+73 -71

No files matched your search

+4 -4
View File
@@ -6,7 +6,7 @@ pub mod ticket;
mod utils;
#[cfg(test)]
mod tests {
use crate::printer::PrinterInfo;
use crate::printer::PrinterDevice;
use ctor::{ctor, dtor};
const TEST_PRINTER_NAME: &str = "winprint-rs-null-printer";
@@ -63,9 +63,9 @@ mod tests {
.unwrap();
}
pub fn get_test_printer() -> PrinterInfo {
let printers = PrinterInfo::all().unwrap();
printers
pub fn get_test_device() -> PrinterDevice {
let devices = PrinterDevice::all().unwrap();
devices
.into_iter()
.find(|x| x.name() == TEST_PRINTER_NAME)
.unwrap()
+21 -21
View File
@@ -7,7 +7,7 @@ use thiserror::Error;
use windows::core::PCWSTR;
use windows::Win32::Graphics::Printing::*;
#[derive(Clone, Debug)]
pub struct PrinterInfo {
pub struct PrinterDevice {
name: String,
os_server: OsString,
os_name: OsString,
@@ -15,13 +15,13 @@ pub struct PrinterInfo {
}
#[derive(Error, Debug)]
pub enum EnumPrinterError {
#[error("Failed to enum printer: {0}")]
FailedToEnumPrinter(windows::core::Error),
pub enum EnumDeviceError {
#[error("Failed to enum printer device: {0}")]
FailedToEnumPrinterDevice(windows::core::Error),
}
impl PrinterInfo {
pub fn all() -> Result<Vec<Self>, EnumPrinterError> {
impl PrinterDevice {
pub fn all() -> Result<Vec<Self>, EnumDeviceError> {
let mut bytes_needed = 0;
let mut count_returned = 0;
let flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS;
@@ -55,8 +55,8 @@ impl PrinterInfo {
&mut bytes_needed,
&mut count_returned,
)
.map_err(EnumPrinterError::FailedToEnumPrinter)?;
let mut result = Vec::<PrinterInfo>::with_capacity(count_returned as usize);
.map_err(EnumDeviceError::FailedToEnumPrinterDevice)?;
let mut result = Vec::<PrinterDevice>::with_capacity(count_returned as usize);
for i in 0..count_returned {
let info = &*(buffer as *const PRINTER_INFO_4W).offset(i as isize);
let os_name = wchar::from_wide_ptr(info.pPrinterName.0);
@@ -71,22 +71,22 @@ impl PrinterInfo {
}
}
/// Get a reference to the printer info's name.
/// Get a reference to the printer device's name.
pub fn name(&self) -> &str {
self.name.as_str()
}
/// Get the printer info's os attributes.
/// Get the printer device's os attributes.
pub fn os_attributes(&self) -> u32 {
self.os_attributes
}
/// Get a reference to the printer info's os server.
/// Get a reference to the printer device's os server.
pub fn os_server(&self) -> &OsStr {
self.os_server.as_ref()
}
/// Get a reference to the printer info's os name.
/// Get a reference to the printer device's os name.
pub fn os_name(&self) -> &OsStr {
self.os_name.as_ref()
}
@@ -102,21 +102,21 @@ impl PrinterInfo {
#[cfg(test)]
mod tests {
use super::PrinterInfo;
use crate::tests::get_test_printer;
use super::PrinterDevice;
use crate::tests::get_test_device;
#[test]
fn fetch_printer_info() {
let _infos = PrinterInfo::all().unwrap();
fn fetch_printer_device() {
let _devices = PrinterDevice::all().unwrap();
}
#[test]
fn test_printer_should_be_local() {
let printer = get_test_printer();
assert!(printer.is_local());
assert_eq!(printer.is_remote(), false);
assert_eq!(printer.os_server(), "");
let device = get_test_device();
assert!(device.is_local());
assert_eq!(device.is_remote(), false);
assert_eq!(device.os_server(), "");
// PRINTER_ATTRIBUTE_LOCAL == 0x00000040
assert!(printer.os_attributes() & 0x00000040 != 0);
assert!(device.os_attributes() & 0x00000040 != 0);
}
}
+2 -2
View File
@@ -1,5 +1,5 @@
mod info;
pub use info::PrinterInfo;
mod device;
pub use device::PrinterDevice;
mod file;
pub use file::FilePrinter;
mod xps;
+6 -6
View File
@@ -1,6 +1,6 @@
use crate::bindings::pdfium::*;
use crate::printer::FilePrinter;
use crate::printer::PrinterInfo;
use crate::printer::PrinterDevice;
use crate::ticket::PrintTicket;
use crate::ticket::ToDevModeError;
use crate::utils::pdfium::PdfiumCustomDocument;
@@ -31,11 +31,11 @@ pub enum PdfiumPrinterError {
}
pub struct PdfiumPrinter {
printer: PrinterInfo,
printer: PrinterDevice,
}
impl PdfiumPrinter {
pub fn new(printer: PrinterInfo) -> Self {
pub fn new(printer: PrinterDevice) -> Self {
Self { printer }
}
}
@@ -117,13 +117,13 @@ impl FilePrinter for PdfiumPrinter {
#[cfg(test)]
mod tests {
use super::PdfiumPrinter;
use crate::{printer::FilePrinter, tests::get_test_printer};
use crate::{printer::FilePrinter, tests::get_test_device};
use std::path::Path;
#[test]
fn print_simple_pdf_document() {
let test_printer = get_test_printer();
let pdf = PdfiumPrinter::new(test_printer);
let device = get_test_device();
let pdf = PdfiumPrinter::new(device);
let path = Path::new(env!("CARGO_MANIFEST_DIR")).join("test_data/test_document.pdf");
pdf.print(path.as_path(), Default::default()).unwrap();
}
+6 -6
View File
@@ -1,5 +1,5 @@
use crate::printer::FilePrinter;
use crate::printer::PrinterInfo;
use crate::printer::PrinterDevice;
use crate::ticket::PrintTicket;
use crate::utils::wchar;
use scopeguard::defer;
@@ -33,11 +33,11 @@ pub enum XpsPrinterError {
}
pub struct XpsPrinter {
printer: PrinterInfo,
printer: PrinterDevice,
}
impl XpsPrinter {
pub fn new(printer: PrinterInfo) -> Self {
pub fn new(printer: PrinterDevice) -> Self {
Self { printer }
}
}
@@ -107,13 +107,13 @@ impl FilePrinter for XpsPrinter {
#[cfg(test)]
mod tests {
use super::XpsPrinter;
use crate::{printer::FilePrinter, tests::get_test_printer};
use crate::{printer::FilePrinter, tests::get_test_device};
use std::path::Path;
#[test]
fn print_simple_xps_document() {
let test_printer = get_test_printer();
let xps = XpsPrinter::new(test_printer);
let device = get_test_device();
let xps = XpsPrinter::new(device);
let path = Path::new(env!("CARGO_MANIFEST_DIR")).join("test_data/test_document.xps");
xps.print(path.as_path(), Default::default()).unwrap();
}
+8 -8
View File
@@ -1,6 +1,6 @@
use super::{PrintTicket, DEFAULT_PRINT_TICKET_XML};
use crate::{
printer::PrinterInfo,
printer::PrinterDevice,
utils::{stream::copy_com_stream_to_vec, wchar},
};
use thiserror::Error;
@@ -33,9 +33,9 @@ pub enum PrintTicketBuilderError {
}
impl PrintTicketBuilder {
pub fn new(info: &PrinterInfo) -> Result<Self, PrintTicketBuilderError> {
pub fn new(device: &PrinterDevice) -> Result<Self, PrintTicketBuilderError> {
let provider = unsafe {
PTOpenProvider(PCWSTR(wchar::to_wide_chars(info.os_name()).as_ptr()), 1)
PTOpenProvider(PCWSTR(wchar::to_wide_chars(device.os_name()).as_ptr()), 1)
.map_err(PrintTicketBuilderError::OpenProviderFailed)?
};
Ok(Self {
@@ -91,14 +91,14 @@ impl Drop for PrintTicketBuilder {
mod tests {
use super::PrintTicketBuilder;
use crate::{
tests::get_test_printer,
tests::get_test_device,
ticket::{PrintTicket, PrintTicketBuilderError},
};
#[test]
fn merge_simple_ticket() {
let test_printer = get_test_printer();
let mut builder = PrintTicketBuilder::new(&test_printer).unwrap();
let device = get_test_device();
let mut builder = PrintTicketBuilder::new(&device).unwrap();
let delta = r#"<psf:PrintTicket xmlns:psf="http://schemas.microsoft.com/windows/2003/08/printing/printschemaframework" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1" xmlns:psk="http://schemas.microsoft.com/windows/2003/08/printing/printschemakeywords">
<psf:Feature name="psk:PageMediaSize">
<psf:Option name="psk:NorthAmericaTabloid">
@@ -120,8 +120,8 @@ mod tests {
#[test]
fn merge_invalid_ticket() {
let test_printer = get_test_printer();
let mut builder = PrintTicketBuilder::new(&test_printer).unwrap();
let device = get_test_device();
let mut builder = PrintTicketBuilder::new(&device).unwrap();
let delta = r#"This is not a valid print ticket"#;
let result = builder.merge(PrintTicket::from_xml(delta));
assert!(matches!(
+8 -8
View File
@@ -58,24 +58,24 @@ impl From<PageMediaSize> for PrintTicket {
#[cfg(test)]
mod tests {
use crate::{
tests::get_test_printer,
tests::get_test_device,
ticket::{PredefinedMediaName, PrintCapabilities, PrintTicketBuilder},
};
#[test]
fn use_page_media_size() {
let test_printer = get_test_printer();
let capabilities = PrintCapabilities::fetch(&test_printer).unwrap();
let device = get_test_device();
let capabilities = PrintCapabilities::fetch(&device).unwrap();
for media in capabilities.page_media_size() {
let mut builder = PrintTicketBuilder::new(&test_printer).unwrap();
let mut builder = PrintTicketBuilder::new(&device).unwrap();
builder.merge(media).unwrap();
}
}
#[test]
fn get_size() {
let test_printer = get_test_printer();
let capabilities = PrintCapabilities::fetch(&test_printer).unwrap();
let device = get_test_device();
let capabilities = PrintCapabilities::fetch(&device).unwrap();
for media in capabilities.page_media_size() {
let size = media.size();
assert!(
@@ -88,8 +88,8 @@ mod tests {
#[test]
fn a4_should_be_found() {
let test_printer = get_test_printer();
let capabilities = PrintCapabilities::fetch(&test_printer).unwrap();
let device = get_test_device();
let capabilities = PrintCapabilities::fetch(&device).unwrap();
capabilities
.page_media_size()
.find(|x| x.as_predefined_name() == Some(PredefinedMediaName::ISOA4))
+12 -11
View File
@@ -3,7 +3,7 @@ use super::{
PrintFeatureOption, PrintSchemaDocument, NS_PSK,
};
use crate::{
printer::PrinterInfo,
printer::PrinterDevice,
utils::{stream::read_com_stream, wchar},
};
use scopeguard::defer;
@@ -40,10 +40,11 @@ pub struct PrintCapabilities {
}
impl PrintCapabilities {
pub fn fetch_xml(info: &PrinterInfo) -> Result<Vec<u8>, FetchPrintCapabilitiesError> {
pub fn fetch_xml(device: &PrinterDevice) -> Result<Vec<u8>, FetchPrintCapabilitiesError> {
unsafe {
let provider = PTOpenProvider(PCWSTR(wchar::to_wide_chars(info.os_name()).as_ptr()), 1)
.map_err(FetchPrintCapabilitiesError::OpenProviderFailed)?;
let provider =
PTOpenProvider(PCWSTR(wchar::to_wide_chars(device.os_name()).as_ptr()), 1)
.map_err(FetchPrintCapabilitiesError::OpenProviderFailed)?;
defer! {
let _ = PTCloseProvider(provider);
}
@@ -67,8 +68,8 @@ impl PrintCapabilities {
}
}
pub fn fetch(info: &PrinterInfo) -> Result<PrintCapabilities, FetchPrintCapabilitiesError> {
let xml = Self::fetch_xml(info)?;
pub fn fetch(device: &PrinterDevice) -> Result<PrintCapabilities, FetchPrintCapabilitiesError> {
let xml = Self::fetch_xml(device)?;
let document = PrintSchemaDocument::parse_as_capabilities(xml)
.map_err(FetchPrintCapabilitiesError::ParseError)?;
Ok(PrintCapabilities { document })
@@ -148,16 +149,16 @@ impl PrintCapabilities {
#[cfg(test)]
mod tests {
use super::PrintCapabilities;
use crate::tests::get_test_printer;
use crate::tests::get_test_device;
#[test]
fn test_fetch_xml() {
let test_printer = get_test_printer();
PrintCapabilities::fetch_xml(&test_printer).unwrap();
let device = get_test_device();
PrintCapabilities::fetch_xml(&device).unwrap();
}
#[test]
fn test_fetch_xml_and_parse() {
let test_printer = get_test_printer();
PrintCapabilities::fetch(&test_printer).unwrap();
let device = get_test_device();
PrintCapabilities::fetch(&device).unwrap();
}
}
+6 -5
View File
@@ -1,5 +1,5 @@
use super::{PrintTicketDocument, XmlDocumentRoot, DEFAULT_PRINT_TICKET_XML};
use crate::{printer::PrinterInfo, utils::wchar};
use crate::{printer::PrinterDevice, utils::wchar};
use scopeguard::defer;
use std::ptr;
use thiserror::Error;
@@ -61,10 +61,11 @@ impl PrintTicket {
&self.xml
}
pub fn to_dev_mode(&self, info: &PrinterInfo) -> Result<Vec<u8>, ToDevModeError> {
pub fn to_dev_mode(&self, device: &PrinterDevice) -> Result<Vec<u8>, ToDevModeError> {
unsafe {
let provider = PTOpenProvider(PCWSTR(wchar::to_wide_chars(info.os_name()).as_ptr()), 1)
.map_err(ToDevModeError::OpenProviderFailed)?;
let provider =
PTOpenProvider(PCWSTR(wchar::to_wide_chars(device.os_name()).as_ptr()), 1)
.map_err(ToDevModeError::OpenProviderFailed)?;
defer! {
let _ = PTCloseProvider(provider);
}
@@ -94,7 +95,7 @@ impl PrintTicket {
let _ = PTReleaseMemory(dev_mode_data as *mut _);
}
let printer_name = wchar::to_wide_chars(info.os_name());
let printer_name = wchar::to_wide_chars(device.os_name());
let printer_handle = {
let mut printer_handle = HANDLE::default();
OpenPrinterW(