mirror of
https://github.com/storytold/winprint.rs.git
synced 2026-10-13 23:17:45 +00:00
refactor: rename PrinterInfo to PrinterDevice
This commit is contained in:
9 files changed
+73
-71
No files matched your search
+4
-4
@@ -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()
|
||||
|
||||
@@ -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
@@ -1,5 +1,5 @@
|
||||
mod info;
|
||||
pub use info::PrinterInfo;
|
||||
mod device;
|
||||
pub use device::PrinterDevice;
|
||||
mod file;
|
||||
pub use file::FilePrinter;
|
||||
mod xps;
|
||||
|
||||
@@ -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
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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!(
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
Reference in new issue
Block a user