Class IfdCollection

java.lang.Object
javax.smartcardio.CardTerminals
de.gematik.smartcards.pcsc.IfdCollection
All Implemented Interfaces:
AutoCloseable

public final class IfdCollection extends CardTerminals implements AutoCloseable
Class providing an implementation of CardTerminals.
Author:
gematik
See Also:
  • Constructor Details

    • IfdCollection

      public IfdCollection()
      Default constructor.
  • Method Details

    • list

      public List<CardTerminal> list(CardTerminals.State state) throws CardException
      Returns an unmodifiable list of all terminals matching the specified state.

      If state is State.ALL, this method returns all CardTerminals encapsulated by this object. If state is State.CARD_PRESENT or State.CARD_ABSENT, it returns all CardTerminals where a card is currently present or absent, respectively.

      If state is State.CARD_INSERTION or State.CARD_REMOVAL, it returns all CardTerminals for which an insertion (or removal, respectively) was detected during the last call to waitForChange(long). If waitForChange() has not been called on this object, CARD_INSERTION is equivalent to CARD_PRESENT and CARD_REMOVAL is equivalent to CARD_ABSENT. For an example of the use of CARD_INSERTION, see waitForChange(long).

      Specified by:
      list in class CardTerminals
      Parameters:
      state - the State of each element in the returned list
      Returns:
      an unmodifiable list of all terminals matching the specified state.
      Throws:
      NullPointerException - if state is null
      CardException - if the card operation failed
      See Also:
    • waitForChange

      public boolean waitForChange(long timeout) throws CardException
      Waits for card insertion or removal in any terminal of this object or until the timeout expires.

      This method examines each CardTerminal of this object. If a card was inserted into or removed from a CardTerminal since the previous call to waitForChange(), it returns immediately. Otherwise, or if this is the first call to waitForChange() on this object, it blocks until a card is inserted into or removed from a CardTerminal.

      If timeout is greater than 0, the method returns after timeout milliseconds even if there is no change in state. In that case, this method returns false; otherwise it returns true.

      This method is often used in a loop in combination with list(State.CARD_INSERTION), for example:

        TerminalFactory factory = ...;
        CardTerminals terminals = factory.terminals();
        while (true) {
            for (CardTerminal terminal : terminals.list(CARD_INSERTION)) {
                // examine Card in terminal, return if it matches
            }
            terminals.waitForChange();
        }
      Specified by:
      waitForChange in class CardTerminals
      Parameters:
      timeout - if positive, block for up to timeout milliseconds; if zero, block indefinitely; must not be negative
      Returns:
      false if the method returns due to an expired timeout, true otherwise.
      Throws:
      IllegalStateException - if this CardTerminals object does not contain any terminals
      IllegalArgumentException - if timeout is negative
      CardException - if the card operation failed
      See Also:
    • close

      public void close() throws PcscException
      Closes this resource, relinquishing any underlying resources. This method is invoked automatically on objects managed by the try-with-resources statement.
      Specified by:
      close in interface AutoCloseable
      Throws:
      PcscException - if this resource cannot be closed
      See Also:
    • isClosed

      public boolean isClosed()
      Getter.
      Returns:
      TRUE if close() has previously been called, FALSE otherwise