Search in sources :

Example 1 with SessionException

use of org.openecard.mdlw.sal.exceptions.SessionException in project open-ecard by ecsec.

the class MwEventRunner method run.

@Override
public void run() {
    LOG.debug("Start event loop.");
    while (true) {
        try {
            LOG.debug("Waiting for Middleware event.");
            long slotId;
            if (supportsBlockingWait) {
                slotId = mwModule.waitForSlotEvent(0);
            } else if (supportsNonBlockingWait) {
                // TODO: this polling causes to flood logs in case debug is enabled for the wait call
                slotId = mwModule.waitForSlotEvent(1);
                if (slotId == -1) {
                    // nothing changed
                    try {
                        Thread.sleep(1000);
                        continue;
                    } catch (InterruptedException ex) {
                        LOG.debug("Middleware Event Runner interrupted.");
                        return;
                    }
                }
            } else {
                throw new IllegalStateException("This point should never be reached");
            }
            LOG.debug("Middleware event detected.");
            // Flag to check if Terminal was removed
            boolean isProcessed = false;
            // find actual slot object
            for (MwSlot slot : this.mwModule.getSlotList(false)) {
                if (isHwSlot(slot) && slot.getSlotInfo().getSlotID() == slotId) {
                    isProcessed = true;
                    String ifdName = slot.getSlotInfo().getSlotDescription();
                    LOG.debug("Slot event recognized, slotId={}, ifdName={}.", slotId, ifdName);
                    try {
                        slot.getTokenInfo().getLabel();
                        // send card inserted
                        this.sendCardInserted(slot);
                        // send recognized
                        this.sendCardRecognized(slot);
                    } catch (TokenException | SessionException ex) {
                        LOG.debug("Error requesting token information.", ex);
                        this.sendCardRemoved(slot);
                    }
                }
            }
            if (!isProcessed) {
                this.sendTerminalRemoved(slotId);
            }
        } catch (CryptokiException ex) {
            // handle downgrade of the wait method
            if (ex.getErrorCode() == CryptokiLibrary.CKR_FUNCTION_NOT_SUPPORTED) {
                if (supportsBlockingWait) {
                    LOG.info("Blocking wait is not supported. Falling back to non-blocking wait.");
                    supportsBlockingWait = false;
                    continue;
                } else if (supportsNonBlockingWait) {
                    LOG.info("Non-blocking wait is not supported. Terminating event thread.");
                    supportsNonBlockingWait = false;
                    return;
                }
            }
            LOG.error("Unrecoverable error during operation on the token list.", ex);
            try {
                Thread.sleep(10000);
            } catch (InterruptedException ex1) {
                LOG.debug("Middleware Event Runner interrupted.");
                return;
            }
        } catch (RuntimeException ex) {
            LOG.error("Unexpected exception occurred in Middleware Event Runner.", ex);
            throw ex;
        }
    }
}
Also used : MwSlot(org.openecard.mdlw.sal.MwSlot) CryptokiException(org.openecard.mdlw.sal.exceptions.CryptokiException) TokenException(org.openecard.mdlw.sal.exceptions.TokenException) SessionException(org.openecard.mdlw.sal.exceptions.SessionException)

Example 2 with SessionException

use of org.openecard.mdlw.sal.exceptions.SessionException in project open-ecard by ecsec.

the class MwEventRunner method initRunner.

void initRunner() throws CryptokiException {
    for (MwSlot slot : this.mwModule.getSlotList(TokenState.NotPresent)) {
        if (isHwSlot(slot)) {
            this.sendTerminalAdded(slot);
            String ifdName = slot.getSlotInfo().getSlotDescription();
            try {
                slot.getTokenInfo().getLabel();
                this.sendCardInserted(slot);
                // send recognized
                this.sendCardRecognized(slot);
            } catch (TokenException | SessionException e) {
                LOG.debug("Error getting token information, no card present in the requested slot.", e);
            }
        }
    }
}
Also used : MwSlot(org.openecard.mdlw.sal.MwSlot) TokenException(org.openecard.mdlw.sal.exceptions.TokenException) SessionException(org.openecard.mdlw.sal.exceptions.SessionException)

Aggregations

MwSlot (org.openecard.mdlw.sal.MwSlot)2 SessionException (org.openecard.mdlw.sal.exceptions.SessionException)2 TokenException (org.openecard.mdlw.sal.exceptions.TokenException)2 CryptokiException (org.openecard.mdlw.sal.exceptions.CryptokiException)1