2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.hpprinter.internal.api;
15 import org.eclipse.jdt.annotation.NonNullByDefault;
16 import org.w3c.dom.Document;
17 import org.w3c.dom.Element;
18 import org.w3c.dom.NodeList;
21 * The {@link HPProductUsageFeatures} is responsible for determining what type of printer usage
22 * data the Web Interface supports including any features.
24 * @author Stewart Cossey - Initial contribution
27 public class HPProductUsageFeatures {
28 public static final String ENDPOINT = "/DevMgmt/ProductUsageDyn.xml";
30 private PrinterType printerType = PrinterType.UNKNOWN;
31 private boolean jamEvents;
32 private boolean mispickEvents;
33 private boolean subscriptionImpressions;
34 private boolean frontPanelCancel;
35 private boolean cumuMarking;
36 private boolean pagesRemaining;
38 private boolean scanAdf;
39 private boolean scanFlatbed;
40 private boolean scanToHost;
41 private boolean scanToEmail;
42 private boolean scanToFolder;
44 private boolean printApplication;
45 private boolean printApplicationChrome;
47 private boolean scannerEngine;
48 private boolean copyApplication;
50 private boolean cloudPrint;
52 public enum PrinterType {
59 public HPProductUsageFeatures(final Document document) {
60 // Check what Ink/Toner colours are present
61 final NodeList consumableInk = document.getDocumentElement().getElementsByTagName("pudyn:Consumable");
63 for (int i = 0; i < consumableInk.getLength(); i++) {
64 final Element currInk = (Element) consumableInk.item(i);
65 final String inkName = currInk.getElementsByTagName("dd:MarkerColor").item(0).getTextContent();
66 final String consumeType = currInk.getElementsByTagName("dd:ConsumableTypeEnum").item(0).getTextContent();
68 if ("printhead".equalsIgnoreCase(consumeType)) {
72 cumuMarking = (currInk.getElementsByTagName("dd2:CumulativeMarkingAgentUsed").getLength() > 0);
74 switch (inkName.toLowerCase()) {
78 printerType = PrinterType.MULTICOLOR; // Is multicolor if it has this ink
81 case "cyanmagentayellow":
82 printerType = PrinterType.SINGLECOLOR; // Is singlecolor if it has this ink
86 if (printerType == PrinterType.UNKNOWN) {
87 printerType = PrinterType.MONOCHROME; // Is Monochrome
93 pagesRemaining = (((Element) consumableInk.item(0)).getElementsByTagName("dd:EstimatedPagesRemaining")
96 final NodeList printerSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:PrinterSubunit");
97 if (printerSubUnit.getLength() > 0) {
98 final Element currPrinterSubUnit = (Element) printerSubUnit.item(0);
100 jamEvents = (currPrinterSubUnit.getElementsByTagName("dd:JamEvents").getLength() > 0);
101 mispickEvents = (currPrinterSubUnit.getElementsByTagName("dd:MispickEvents").getLength() > 0);
102 subscriptionImpressions = (currPrinterSubUnit.getElementsByTagName("pudyn:SubscriptionImpressions")
104 frontPanelCancel = (currPrinterSubUnit.getElementsByTagName("dd:TotalFrontPanelCancelPresses")
108 final NodeList scannerSubUnit = document.getDocumentElement()
109 .getElementsByTagName("pudyn:ScanApplicationSubunit");
110 if (scannerSubUnit.getLength() > 0) {
111 final Element currScannerSubUnit = (Element) scannerSubUnit.item(0);
113 scanAdf = (currScannerSubUnit.getElementsByTagName("dd:AdfImages").getLength() > 0);
114 scanFlatbed = (currScannerSubUnit.getElementsByTagName("dd:FlatbedImages").getLength() > 0);
115 scanToEmail = (currScannerSubUnit.getElementsByTagName("dd:ImagesSentToEmail").getLength() > 0);
116 scanToFolder = (currScannerSubUnit.getElementsByTagName("dd:ImagesSentToFolder").getLength() > 0);
117 scanToHost = (currScannerSubUnit.getElementsByTagName("dd:ScanToHostImages").getLength() > 0);
120 final NodeList scanAppSubUnit = document.getDocumentElement()
121 .getElementsByTagName("pudyn:ScanApplicationSubunit");
122 if (scanAppSubUnit.getLength() > 0) {
123 printApplication = true;
125 final Element currAppSubUnit = (Element) scanAppSubUnit.item(0);
127 printApplicationChrome = (currAppSubUnit.getElementsByTagName("pudyn:RemoteDeviceType").getLength() > 0);
130 final NodeList printAppSubUnit = document.getDocumentElement()
131 .getElementsByTagName("pudyn:PrintApplicationSubunit");
132 if (printAppSubUnit.getLength() > 0) {
133 final Element currPrintAppSubUnit = (Element) printAppSubUnit.item(0);
135 cloudPrint = (currPrintAppSubUnit.getElementsByTagName("dd:CloudPrintImpressions").getLength() > 0);
138 final NodeList scannerEngineSubUnit = document.getDocumentElement()
139 .getElementsByTagName("pudyn:ScannerEngineSubunit");
140 scannerEngine = (scannerEngineSubUnit.getLength() > 0);
142 final NodeList copyAppSubUnit = document.getDocumentElement()
143 .getElementsByTagName("pudyn:CopyApplicationSubunit");
144 copyApplication = (copyAppSubUnit.getLength() > 0);
147 public PrinterType getType() {
152 * Printer data contains Scanner Engine.
154 * pudyn:ProductUsageDyn -> pudyn:ScannerEngineSubunit
156 * return {boolean} True is supported.
158 public boolean hasScannerEngine() {
159 return scannerEngine;
163 * Printer data contains Copy Application.
165 * pudyn:ProductUsageDyn -> pudyn:ScannerEngineSubunit
167 * return {boolean} True is supported.
169 public boolean hasCopyApplication() {
170 return copyApplication;
174 * Printer data contains Estimated Pages Remaining.
176 * pudyn:ProductUsageDyn -> pudyn:ConsumableSubunit -> pudyn:Consumable -> dd:EstimatedPagesRemaining
178 * return {boolean} True is supported.
180 public boolean hasPagesRemaining() {
181 return pagesRemaining;
185 * Printer data contains Scan to Email.
187 * pudyn:ProductUsageDyn -> pudyn:ScanApplicationSubunit -> dd:ImagesSentToEmail
189 * @return {boolean} True if supported.
191 public boolean hasScanToEmail() {
196 * Printer data contains Scan to Folder.
198 * pudyn:ProductUsageDyn -> pudyn:ScanApplicationSubunit -> dd:ImagesSentToFolder
200 * @return {boolean} True if supported.
202 public boolean hasScanToFolder() {
207 * Printer data contains Scan to Host.
209 * pudyn:ProductUsageDyn -> pudyn:ScanApplicationSubunit -> dd:ScanToHostImages
211 * @return {boolean} True if supported.
213 public boolean hasScanToHost() {
218 * Printer data contains Scanner Automatic Document Feeder.
220 * pudyn:ProductUsageDyn -> pudyn:ScanApplicationSubunit -> dd:AdfImages
222 * @return {boolean} True if supported.
224 public boolean hasScanADF() {
229 * Printer data contains Scanner Flatbed.
231 * pudyn:ProductUsageDyn -> pudyn:ScanApplicationSubunit -> dd:FlatbedImages
233 * @return {boolean} True if supported.
235 public boolean hasScanFlatbed() {
240 * Printer data has Google Cloud Print impressions.
242 * pudyn:ProductUsageDyn -> pudyn:PrintApplicationSubunit -> dd:CloudPrintImpressions
244 * @return {boolean} True if supported.
246 public boolean hasCloudPrint() {
251 * Printer data contains Print Application Usage Information.
253 * pudyn:ProductUsageDyn -> pudyn:MobileApplicationSubunit
255 * @return {boolean} True if supported.
257 public boolean hasPrintApplication() {
258 return printApplication;
262 * Printer data contains Chrome Print Application Usage Information.
264 * pudyn:ProductUsageDyn -> pudyn:MobileApplicationSubunit
266 * @return {boolean} True if supported.
268 public boolean hasPrintApplicationChrome() {
269 return printApplicationChrome;
273 * Printer data contains Cumulative Marking Agent Used.
275 * pudyn:ProductUsageDyn -> pudyn:ConsumableSubunit -> pudyn:Consumable -> dd2:CumulativeMarkingAgentUsed
277 * @return {boolean} True if supported.
279 public boolean hasCumulativeMarking() {
284 * Printer data contains Jam Events.
286 * pudyn:ProductUsageDyn -> pudyn:PrinterSubunit -> dd:JamEvents
288 * @return {boolean} True if supported.
290 public boolean hasJamEvents() {
295 * Printer data contains Mispick Events.
297 * pudyn:ProductUsageDyn -> pudyn:PrinterSubunit -> dd:MispickEvents
299 * @return {boolean} True if supported.
301 public boolean hasMispickEvents() {
302 return mispickEvents;
306 * Printer data contains Subscription Impressions count.
308 * pudyn:ProductUsageDyn -> pudyn:PrinterSubunit ->
309 * pudyn:SubscriptionImpressions
311 * @return {boolean} True if supported.
313 public boolean hasSubscriptionCount() {
314 return subscriptionImpressions;
318 * Printer data contains Front panel cancel presses count.
320 * pudyn:ProductUsageDyn -> pudyn:PrinterSubunit ->
321 * dd:TotalFrontPanelCancelPresses
323 * @return {boolean} True if supported.
325 public boolean hasTotalFrontPanelCancelPresses() {
326 return frontPanelCancel;