]> git.basschouten.com Git - openhab-addons.git/blob
2e3215e6a90539c78228c23ee1d6a1d0db957607
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.hpprinter.internal.api;
14
15 import org.eclipse.jdt.annotation.NonNullByDefault;
16 import org.w3c.dom.Document;
17 import org.w3c.dom.Element;
18 import org.w3c.dom.Node;
19 import org.w3c.dom.NodeList;
20
21 /**
22  * The {@link HPUsage} is responsible for handling reading of usage data.
23  *
24  * @author Stewart Cossey - Initial contribution
25  */
26 @NonNullByDefault
27 public class HPUsage {
28     public static final String ENDPOINT = "/DevMgmt/ProductUsageDyn.xml";
29
30     private int totalSubscriptionImpressions;
31     private int mispickEvents;
32     private int totalMonochromeImpressions;
33     private int totalColorImpressions;
34     private int frontpanelCancelCount;
35     private int totalImpressions;
36
37     private int jamEvents;
38     private int inkBlack;
39     private int inkCyan;
40     private int inkMagenta;
41     private int inkYellow;
42     private int inkColor;
43     private float inkBlackMarking;
44     private float inkCyanMarking;
45     private float inkMagentaMarking;
46     private float inkYellowMarking;
47     private float inkColorMarking;
48
49     private int inkBlackPagesRemaining;
50     private int inkColorPagesRemaining;
51     private int inkCyanPagesRemaining;
52     private int inkMagentaPagesRemaining;
53     private int inkYellowPagesRemaining;
54
55     // Scan
56     private int scanAdfCount;
57     private int scanFlatbedCount;
58     private int scanToEmailCount;
59     private int scanToFolderCount;
60     private int scanToHostCount;
61
62     // Scanner
63     private int scannerAdfCount;
64     private int scannerFlatbedCount;
65     private int scannerJamEvents;
66     private int scannerMispickEvents;
67
68     // Copy
69     private int copyAdfCount;
70     private int copyFlatbedCount;
71     private int copyTotalImpressions;
72     private int copyTotalMonochromeImpressions;
73     private int copyTotalColorImpressions;
74
75     // App
76     private int appWindowsCount;
77     private int appOsxCount;
78     private int appIosCount;
79     private int appAndroidCount;
80     private int appSamsungCount;
81     private int appChromeCount;
82
83     // Other
84     private int cloudPrintImpressions;
85
86     public HPUsage() {
87     }
88
89     public HPUsage(Document document) {
90         // Get Ink Levels
91         NodeList consumableInk = document.getDocumentElement().getElementsByTagName("pudyn:Consumable");
92
93         for (int i = 0; i < consumableInk.getLength(); i++) {
94             Element currInk = (Element) consumableInk.item(i);
95
96             String inkName = currInk.getElementsByTagName("dd:MarkerColor").item(0).getTextContent();
97
98             String consumeType = currInk.getElementsByTagName("dd:ConsumableTypeEnum").item(0).getTextContent();
99
100             if ("printhead".equalsIgnoreCase(consumeType)) {
101                 continue;
102             }
103
104             String inkRemaining = currInk.getElementsByTagName("dd:ConsumableRawPercentageLevelRemaining").item(0)
105                     .getTextContent();
106
107             int markAgentLength = currInk.getElementsByTagName("dd2:CumulativeMarkingAgentUsed").getLength();
108             Boolean hasPagesRemaining = currInk.getElementsByTagName("dd:EstimatedPagesRemaining").getLength() > 0;
109             float totalMarking = 0;
110             int pagesRemaining = 0;
111             if (markAgentLength > 0) { // Check to make sure Cumulative Marking Agent exists
112                 for (int ai = 0; ai < markAgentLength; ai++) {
113                     Element currMarking = (Element) currInk.getElementsByTagName("dd2:CumulativeMarkingAgentUsed")
114                             .item(ai);
115
116                     float marking = Integer
117                             .parseInt(currMarking.getElementsByTagName("dd:ValueFloat").item(0).getTextContent());
118
119                     switch (currMarking.getElementsByTagName("dd:Unit").item(0).getTextContent().toLowerCase()) {
120                         case "microliters":
121                             marking = marking / 1000; // Convert from microlitres to millilitres
122                             break;
123                         case "liters":
124                             marking = marking * 1000; // Convert to litres to millilitres
125                     }
126
127                     totalMarking = totalMarking + marking; // Sum the marking counts together
128                 }
129             }
130
131             if (hasPagesRemaining) {
132                 pagesRemaining = Integer.parseInt(((Element) currInk).getElementsByTagName("dd:EstimatedPagesRemaining")
133                         .item(0).getTextContent());
134             }
135
136             switch (inkName.toLowerCase()) {
137                 case "black":
138                     inkBlack = Integer.parseInt(inkRemaining);
139                     inkBlackMarking = totalMarking;
140                     inkBlackPagesRemaining = pagesRemaining;
141                     break;
142
143                 case "yellow":
144                     inkYellow = Integer.parseInt(inkRemaining);
145                     inkYellowMarking = totalMarking;
146                     inkYellowPagesRemaining = pagesRemaining;
147                     break;
148
149                 case "magenta":
150                     inkMagenta = Integer.parseInt(inkRemaining);
151                     inkMagentaMarking = totalMarking;
152                     inkMagentaPagesRemaining = pagesRemaining;
153                     break;
154
155                 case "cyan":
156                     inkCyan = Integer.parseInt(inkRemaining);
157                     inkCyanMarking = totalMarking;
158                     inkCyanPagesRemaining = pagesRemaining;
159                     break;
160
161                 case "cyanmagentayellow":
162                     inkColor = Integer.parseInt(inkRemaining);
163                     inkColorMarking = totalMarking;
164                     inkColorPagesRemaining = pagesRemaining;
165                     break;
166             }
167         }
168
169         // Get other usage info
170         NodeList jamEvents = document.getDocumentElement().getElementsByTagName("dd:JamEvents");
171         if (jamEvents.getLength() > 0) {
172             this.jamEvents = Integer.parseInt(jamEvents.item(0).getTextContent());
173         }
174
175         NodeList totalImpressions = document.getDocumentElement().getElementsByTagName("dd:TotalImpressions");
176         if (totalImpressions.getLength() > 0) {
177             this.totalImpressions = Integer.parseInt(totalImpressions.item(0).getTextContent());
178         }
179
180         NodeList totalColorImpressions = document.getDocumentElement().getElementsByTagName("dd:ColorImpressions");
181         if (totalColorImpressions.getLength() > 0) {
182             this.totalColorImpressions = Integer.parseInt(totalColorImpressions.item(0).getTextContent());
183         }
184
185         NodeList totalMonochromeImpressions = document.getDocumentElement()
186                 .getElementsByTagName("dd:MonochromeImpressions");
187         if (totalMonochromeImpressions.getLength() > 0) {
188             this.totalMonochromeImpressions = Integer.parseInt(totalMonochromeImpressions.item(0).getTextContent());
189         }
190
191         NodeList totalSubscriptionImpressions = document.getDocumentElement()
192                 .getElementsByTagName("pudyn:SubscriptionImpressions");
193         if (totalSubscriptionImpressions.getLength() > 0) {
194             this.totalSubscriptionImpressions = Integer.parseInt(totalSubscriptionImpressions.item(0).getTextContent());
195         }
196
197         NodeList mispickEvents = document.getDocumentElement().getElementsByTagName("dd:MispickEvents");
198         if (mispickEvents.getLength() > 0) {
199             this.mispickEvents = Integer.parseInt(mispickEvents.item(0).getTextContent());
200         }
201
202         NodeList frontpanelCancelCount = document.getDocumentElement()
203                 .getElementsByTagName("dd:TotalFrontPanelCancelPresses");
204         if (frontpanelCancelCount.getLength() > 0) {
205             this.frontpanelCancelCount = Integer.parseInt(frontpanelCancelCount.item(0).getTextContent());
206         }
207
208         // Print Apps
209         NodeList printAppsSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:PrintApplicationSubunit");
210         if (printAppsSubUnit.getLength() > 0) {
211             Element currPrintAppsSubUnit = (Element) printAppsSubUnit.item(0);
212
213             NodeList cloudPrintImpressions = currPrintAppsSubUnit.getElementsByTagName("dd:CloudPrintImpressions");
214
215             if (cloudPrintImpressions.getLength() > 0) {
216                 this.cloudPrintImpressions = Integer.parseInt(cloudPrintImpressions.item(0).getTextContent());
217             }
218         }
219
220         // Scan
221         NodeList scanSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:ScanApplicationSubunit");
222         if (scanSubUnit.getLength() > 0) {
223             Element currScanSubUnit = (Element) scanSubUnit.item(0);
224
225             this.scanAdfCount = setInt("dd:AdfImages", currScanSubUnit);
226             this.scanFlatbedCount = setInt("dd:FlatbedImages", currScanSubUnit);
227
228             this.scanToEmailCount = setInt("dd:ImagesSentToEmail", currScanSubUnit);
229             this.scanToFolderCount = setInt("dd:ImagesSentToFolder", currScanSubUnit);
230
231             this.scanToHostCount = setInt("dd:ScanToHostImages", currScanSubUnit);
232         }
233
234         // Scanner
235         NodeList scannerSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:ScannerEngineSubunit");
236         if (scannerSubUnit.getLength() > 0) {
237             Element currScannerSubUnit = (Element) scannerSubUnit.item(0);
238
239             this.scannerAdfCount = setInt("dd:AdfImages", currScannerSubUnit);
240             this.scannerFlatbedCount = setInt("dd:FlatbedImages", currScannerSubUnit);
241             this.scannerJamEvents = setInt("dd:JamEvents", currScannerSubUnit);
242             this.scannerMispickEvents = setInt("dd:MispickEvents", currScannerSubUnit);
243         }
244
245         // Copy
246         NodeList copySubUnit = document.getDocumentElement().getElementsByTagName("pudyn:CopyApplicationSubunit");
247         if (copySubUnit.getLength() > 0) {
248             Element currCopySubUnit = (Element) copySubUnit.item(0);
249
250             this.copyAdfCount = setInt("dd:AdfImages", currCopySubUnit);
251             this.copyFlatbedCount = setInt("dd:FlatbedImages", currCopySubUnit);
252             this.copyTotalColorImpressions = setInt("dd:ColorImpressions", currCopySubUnit);
253             this.copyTotalMonochromeImpressions = setInt("dd:MonochromeImpressions", currCopySubUnit);
254             this.copyTotalImpressions = setInt("dd:TotalImpressions", currCopySubUnit);
255         }
256
257         // App Usage
258         NodeList appSubUnit = document.getDocumentElement().getElementsByTagName("pudyn:MobileApplicationSubunit");
259         if (appSubUnit.getLength() > 0) {
260             Element currAppSubUnit = (Element) appSubUnit.item(0);
261
262             this.appWindowsCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "Windows",
263                     "pudyn:TotalImpressions");
264             this.appOsxCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "OSX",
265                     "pudyn:TotalImpressions");
266             this.appIosCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "iOS",
267                     "pudyn:TotalImpressions");
268             this.appAndroidCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "Android",
269                     "pudyn:TotalImpressions");
270             this.appSamsungCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "samsung",
271                     "pudyn:TotalImpressions");
272             this.appChromeCount = setIntCollateDirectChildren(currAppSubUnit, "pudyn:RemoteDeviceType", "Chrome",
273                     "pudyn:TotalImpressions");
274         }
275     }
276
277     private static int setIntCollateDirectChildren(Element parentNode, String collateTagName,
278             String collateTagNameValue, String valueTagName) {
279         int value = 0;
280
281         for (Node n = parentNode.getFirstChild(); n != null; n = n.getNextSibling()) {
282             if (n instanceof Element) {
283                 Element nodeItem = (Element) n;
284                 if (nodeItem.getElementsByTagName(collateTagName).item(0).getTextContent()
285                         .equalsIgnoreCase(collateTagNameValue)) {
286                     int nodeValue = Integer
287                             .parseInt(nodeItem.getElementsByTagName(valueTagName).item(0).getTextContent());
288
289                     value += nodeValue;
290                 }
291             }
292         }
293
294         return value;
295     }
296
297     private int setInt(String tagName, Element parentNode) {
298         NodeList nodeList = parentNode.getElementsByTagName(tagName);
299         if (nodeList.getLength() > 0) {
300             return Integer.parseInt(nodeList.item(0).getTextContent());
301         }
302         return 0;
303     }
304
305     public int getFrontPanelCancelCount() {
306         return frontpanelCancelCount;
307     }
308
309     public int getTotalSubscriptionImpressions() {
310         return totalSubscriptionImpressions;
311     }
312
313     public int getMispickEvents() {
314         return mispickEvents;
315     }
316
317     public int getTotalMonochromeImpressions() {
318         return totalMonochromeImpressions;
319     }
320
321     public int getTotalColorImpressions() {
322         return totalColorImpressions;
323     }
324
325     public int getTotalImpressions() {
326         return totalImpressions;
327     }
328
329     public int getCloudPrintImpressions() {
330         return cloudPrintImpressions;
331     }
332
333     public int getJamEvents() {
334         return jamEvents;
335     }
336
337     public int getInkBlack() {
338         return inkBlack;
339     }
340
341     public float getInkBlackMarking() {
342         return inkBlackMarking;
343     }
344
345     public int getInkCyan() {
346         return inkCyan;
347     }
348
349     public float getInkCyanMarking() {
350         return inkCyanMarking;
351     }
352
353     public int getInkMagenta() {
354         return inkMagenta;
355     }
356
357     public float getInkMagentaMarking() {
358         return inkMagentaMarking;
359     }
360
361     public int getInkYellow() {
362         return inkYellow;
363     }
364
365     public float getInkYellowMarking() {
366         return inkYellowMarking;
367     }
368
369     public int getInkBlackPagesRemaining() {
370         return inkBlackPagesRemaining;
371     }
372
373     public int getInkColorPagesRemaining() {
374         return inkColorPagesRemaining;
375     }
376
377     public int getInkMagentaPagesRemaining() {
378         return inkMagentaPagesRemaining;
379     }
380
381     public int getInkCyanPagesRemaining() {
382         return inkCyanPagesRemaining;
383     }
384
385     public int getInkYellowPagesRemaining() {
386         return inkYellowPagesRemaining;
387     }
388
389     public int getInkColor() {
390         return inkColor;
391     }
392
393     public float getInkColorMarking() {
394         return inkColorMarking;
395     }
396
397     public int getScanAdfCount() {
398         return scanAdfCount;
399     }
400
401     public int getScanFlatbedCount() {
402         return scanFlatbedCount;
403     }
404
405     public int getScanToEmailCount() {
406         return scanToEmailCount;
407     }
408
409     public int getScanToFolderCount() {
410         return scanToFolderCount;
411     }
412
413     public int getScanToHostCount() {
414         return scanToHostCount;
415     }
416
417     public int getAppWindowsCount() {
418         return appWindowsCount;
419     }
420
421     public int getAppOSXCount() {
422         return appOsxCount;
423     }
424
425     public int getAppIosCount() {
426         return appIosCount;
427     }
428
429     public int getAppAndroidCount() {
430         return appAndroidCount;
431     }
432
433     public int getAppSamsungCount() {
434         return appSamsungCount;
435     }
436
437     public int getAppChromeCount() {
438         return appChromeCount;
439     }
440
441     public int getScannerAdfCount() {
442         return scannerAdfCount;
443     }
444
445     public int getScannerFlatbedCount() {
446         return scannerFlatbedCount;
447     }
448
449     public int getScannerJamEvents() {
450         return scannerJamEvents;
451     }
452
453     public int getScannerMispickEvents() {
454         return scannerMispickEvents;
455     }
456
457     public int getCopyAdfCount() {
458         return copyAdfCount;
459     }
460
461     public int getCopyFlatbedCount() {
462         return copyFlatbedCount;
463     }
464
465     public int getCopyTotalImpressions() {
466         return copyTotalImpressions;
467     }
468
469     public int getCopyTotalColorImpressions() {
470         return copyTotalColorImpressions;
471     }
472
473     public int getCopyTotalMonochromeImpressions() {
474         return copyTotalMonochromeImpressions;
475     }
476 }