Skip to content

Commit edc1301

Browse files
committed
updateStateAttributes(), new option for isProcessing(), isIdle(), isStopped()
1 parent 6779f70 commit edc1301

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

src/main/kotlin/de/gmuth/ipp/client/IppPrinter.kt

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import de.gmuth.ipp.iana.IppRegistrationsSection2
1717
import java.io.*
1818
import java.net.URI
1919
import java.time.Duration
20+
import java.time.Instant
21+
import java.time.Instant.now
2022
import java.util.logging.Level
2123
import java.util.logging.Level.*
2224
import java.util.logging.Logger
@@ -236,22 +238,29 @@ class IppPrinter(
236238

237239
//-------------------------------------------------------
238240

239-
fun isIdle() = state == Idle
240-
fun isStopped() = state == Stopped
241-
fun isProcessing() = state == Processing
241+
private fun stateIs(updateStateAttributes: Boolean, expectedState: PrinterState): Boolean {
242+
if (updateStateAttributes) updateStateAttributes()
243+
return state == expectedState
244+
}
245+
246+
fun isIdle(updateStateAttributes: Boolean = false) = stateIs(updateStateAttributes, Idle)
247+
fun isStopped(updateStateAttributes: Boolean = false) = stateIs(updateStateAttributes, Stopped)
248+
fun isProcessing(updateStateAttributes: Boolean = false) = stateIs(updateStateAttributes, Processing)
249+
242250
fun isPaused() = stateReasons.contains("paused")
243251
fun isOffline() = stateReasons.contains("offline-report") // reported by CUPS
244-
fun isDuplexSupported() = sidesSupported.any { it.startsWith("two-sided") }
245-
fun supportsOperations(vararg operations: IppOperation) = operationsSupported.containsAll(operations.toList())
246-
fun supportsVersion(version: String) = versionsSupported.contains(version)
247-
fun isCups() = attributes.contains("cups-version")
248252
fun isTonerLow() = stateReasons.contains("toner-low")
249253
fun isTonerEmpty() = stateReasons.any { it.contains("toner-empty") } // toner-empty-error
250254
fun isMediaJam() = stateReasons.contains("media-jam")
251255
fun isMediaLow() = stateReasons.contains("media-low")
252256
fun isMediaEmpty() = stateReasons.any { it.contains("media-empty") } // media-empty-report
253257
fun isMediaNeeded() = stateReasons.contains("media-needed")
254258

259+
fun isDuplexSupported() = sidesSupported.any { it.startsWith("two-sided") }
260+
fun supportsOperations(vararg operations: IppOperation) = operationsSupported.containsAll(operations.toList())
261+
fun supportsVersion(version: String) = versionsSupported.contains(version)
262+
fun isCups() = attributes.contains("cups-version")
263+
255264
fun isMediaSizeSupported(size: MediaSize) = mediaSizeSupported.supports(size)
256265

257266
fun isMediaSizeReady(size: MediaSize) = mediaColReady
@@ -315,17 +324,33 @@ class IppPrinter(
315324

316325
fun getPrinterAttributesOrNull(requestedAttributes: Collection<String>? = null) =
317326
exchange(ippRequest(GetPrinterAttributes, requestedAttributes))
318-
.attributesGroups.find { it.tag == Printer }
327+
.attributesGroups.singleOrNull { it.tag == Printer }
319328

320329
fun getPrinterAttributesOrNull(vararg requestedAttributes: String) =
321330
getPrinterAttributesOrNull(requestedAttributes.toList())
322331

332+
private lateinit var stateAttributesLastUpdated: Instant
333+
323334
fun updateAttributes(requestedAttributes: List<String>? = null) =
324-
getPrinterAttributesOrNull(requestedAttributes)?.let { attributes.put(it) }
335+
getPrinterAttributesOrNull(requestedAttributes)?.let {
336+
attributes.put(it)
337+
stateAttributesLastUpdated = now()
338+
}
325339

326340
fun updateAttributes(vararg requestedAttributes: String) =
327341
updateAttributes(requestedAttributes.toList())
328342

343+
fun updateStateAttributes() = updateAttributes(
344+
"printer-state", "printer-state-reasons", "printer-state-message",
345+
"printer-is-accepting-jobs", "media-ready"
346+
)
347+
348+
var stateAttributesExpireAfter: Duration? = null
349+
350+
fun stateAttributesExpired() =
351+
if (stateAttributesExpireAfter == null) false // never expire
352+
else now().isAfter(stateAttributesLastUpdated.plus(stateAttributesExpireAfter))
353+
329354
//-------------
330355
// Validate-Job
331356
//-------------

0 commit comments

Comments
 (0)