137 lines
5.2 KiB
C#
137 lines
5.2 KiB
C#
///
|
|
/// Copyright (c) 2023 Sensus Slovensko a.s.
|
|
///
|
|
using System;
|
|
using System.Management;
|
|
|
|
namespace TBF.Rig.Output.Printers
|
|
{
|
|
public static class PrinterStatus
|
|
{
|
|
///
|
|
/// See also https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-printer
|
|
///
|
|
|
|
public enum DetectedErrorState : UInt16
|
|
{
|
|
Unknown = 0,
|
|
Other = 1,
|
|
No_Error = 2,
|
|
Low_Paper = 3,
|
|
No_Paper = 4,
|
|
Low_Toner = 5,
|
|
No_Toner = 6,
|
|
Door_Open = 7,
|
|
Jammed = 8,
|
|
Offline = 9,
|
|
Service_Requested = 10,
|
|
Output_Bin_Full = 11,
|
|
}
|
|
|
|
public enum ExtendedPrinterStatus : UInt16
|
|
{
|
|
Other = 1,
|
|
Unknown = 2,
|
|
Idle = 3,
|
|
Printing = 4,
|
|
Warming_Up = 5,
|
|
Stopped_Printing = 6,
|
|
Offline = 7,
|
|
Paused = 8,
|
|
Error = 9,
|
|
Busy = 10,
|
|
Not_Aavailable = 11,
|
|
Waiting = 12,
|
|
Processing = 13,
|
|
Initialization = 14,
|
|
Power_Save = 15,
|
|
Pending_Deletion = 16,
|
|
IO_Active = 17,
|
|
Manual_Feed = 18,
|
|
}
|
|
|
|
public static void GetStatus(string printerName)
|
|
{
|
|
/// Perform the search for printers and return the listing as a collection
|
|
var mgmtSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");
|
|
var mgmtCollection = mgmtSearcher.Get();
|
|
|
|
foreach (ManagementObject wmiObj in mgmtCollection)
|
|
{
|
|
if (wmiObj["Name"].ToString().ToLower() == printerName.ToLower())
|
|
{
|
|
/// Management object name fits the printer name
|
|
|
|
var state = (ExtendedPrinterStatus)int.Parse(wmiObj["ExtendedPrinterStatus"].ToString());
|
|
if (state == ExtendedPrinterStatus.Other ||
|
|
state == ExtendedPrinterStatus.Unknown ||
|
|
state == ExtendedPrinterStatus.Offline ||
|
|
state == ExtendedPrinterStatus.Error ||
|
|
state == ExtendedPrinterStatus.Not_Aavailable)
|
|
{
|
|
var message = string.Format("Printer '{0}' state is '{1}'", printerName, state.ToString().Replace('_', ' '));
|
|
throw new ApplicationException(message);
|
|
}
|
|
|
|
var error = (DetectedErrorState)int.Parse(wmiObj["DetectedErrorState"].ToString());
|
|
if (error != DetectedErrorState.No_Error)
|
|
{
|
|
var message = string.Format("Printer '{0}' error state is '{1}'", printerName, error.ToString().Replace('_', ' '));
|
|
throw new ApplicationException(message);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns true when printer is online, without errors.
|
|
/// </summary>
|
|
/// <param name="printerName">Printer name</param>
|
|
/// <param name="message">Error message when printer is not online</param>
|
|
/// <returns>true when online, false when there are any errors or printer is not online</returns>
|
|
public static bool IsOnline(string printerName, out string message)
|
|
{
|
|
// TODO: Uncomment the following line and resolve problems : Unknown status/error always returned
|
|
// if (string.IsNullOrEmpty(printerName))
|
|
{
|
|
/// Default printer
|
|
message = string.Empty;
|
|
return true;
|
|
}
|
|
|
|
/// Perform the search for printers and return the listing as a collection
|
|
var mgmtSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");
|
|
var mgmtCollection = mgmtSearcher.Get();
|
|
|
|
foreach (ManagementObject wmiObj in mgmtCollection)
|
|
{
|
|
if (wmiObj["Name"].ToString().ToLower() == printerName.ToLower())
|
|
{
|
|
/// Management object name fits the printer name
|
|
|
|
var state = (ExtendedPrinterStatus)int.Parse(wmiObj["ExtendedPrinterStatus"].ToString());
|
|
if (state == ExtendedPrinterStatus.Other ||
|
|
state == ExtendedPrinterStatus.Unknown ||
|
|
state == ExtendedPrinterStatus.Offline ||
|
|
state == ExtendedPrinterStatus.Error ||
|
|
state == ExtendedPrinterStatus.Not_Aavailable)
|
|
{
|
|
message = string.Format("Printer '{0}' state is '{1}'", printerName, state.ToString().Replace('_', ' '));
|
|
return false;
|
|
}
|
|
|
|
var error = (DetectedErrorState)int.Parse(wmiObj["DetectedErrorState"].ToString());
|
|
if (error != DetectedErrorState.No_Error)
|
|
{
|
|
message = string.Format("Printer '{0}' error state is '{1}'", printerName, error.ToString().Replace('_', ' '));
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
message = string.Empty;
|
|
return true;
|
|
}
|
|
}
|
|
}
|