/**
  * Issues a ISO VERIFY on the remote terminal.
  *
  * @param p2 P2 parameter in the VERIFY APDU
  * @param text to be displayed to the user
  * @return true if VERIFY returned 0x9000, false otherwise
  * @throws IOException when communication fails
  */
 public boolean verifyPIN(int p2, String text) throws IOException, UserCancelExcption {
   Map<String, Object> m = JSONProtocol.cmd("verify");
   m.put("p2", p2);
   m.put("text", text);
   pipe.send(m);
   return JSONProtocol.check(m, pipe.recv());
 }
 /**
  * Shows a message on the screen
  *
  * @param text message to be shown
  * @throws IOException when communication fails
  */
 public void statusMessage(String text) throws IOException {
   Map<String, Object> m = JSONProtocol.cmd("message");
   m.put("text", text);
   pipe.send(m);
   if (!JSONProtocol.check(m, pipe.recv())) {
     throw new IOException("Could not display status");
   }
 }
 /**
  * Shows a dialog message to the user and returns the pressed button.
  *
  * @param message text to display to the user
  * @return {@link Button} that was pressed by the user
  * @throws IOException when communication fails
  */
 public Button dialog(String message) throws IOException, UserCancelExcption {
   Map<String, Object> m = JSONProtocol.cmd("dialog");
   m.put("text", message);
   pipe.send(m);
   Map<String, Object> r = pipe.recv();
   if (!JSONProtocol.check(m, r) || !r.containsKey("button")) {
     throw new IOException("Unknown button pressed");
   }
   return Button.valueOf(((String) r.get("button")).toUpperCase());
 }
 /**
  * Asks for input from the user.
  *
  * @param message text to display to the user
  * @return null or input
  * @throws IOException when communication fails
  */
 public String input(String message) throws IOException, UserCancelExcption {
   Map<String, Object> m = JSONProtocol.cmd("input");
   m.put("text", message);
   pipe.send(m);
   Map<String, Object> r = pipe.recv();
   if (!JSONProtocol.check(m, r) || !r.containsKey("value")) {
     throw new IOException("No value");
   }
   return (String) r.get("value");
 }
 /**
  * Shows the response of the APDU to the user.
  *
  * <p>Normally this requires the verification of a PIN code beforehand.
  *
  * @param message text to display to the user
  * @param apdu APDU to send to the terminal
  * @return {@link Button} that was pressed by the user
  * @throws IOException when communication fails
  */
 public Button decrypt(String message, byte[] apdu) throws IOException, UserCancelExcption {
   Map<String, Object> m = JSONProtocol.cmd("decrypt");
   m.put("text", message);
   m.put("bytes", HexUtils.bin2hex(apdu));
   pipe.send(m);
   Map<String, Object> r = pipe.recv();
   if (JSONProtocol.check(m, r)) {
     return Button.valueOf(((String) r.get("button")).toUpperCase());
   } else {
     throw new IOException("Unknown button pressed");
   }
 }
 public int select(String message, Map<Integer, String> choices)
     throws IOException, UserCancelExcption {
   Map<String, Object> m = JSONProtocol.cmd("select");
   for (Map.Entry<Integer, String> e : choices.entrySet()) {
     m.put(e.getKey().toString(), e.getValue());
   }
   m.put("text", message);
   pipe.send(m);
   Map<String, Object> r = pipe.recv();
   if (!JSONProtocol.check(m, r) || !r.containsKey("value")) {
     throw new IOException("No value");
   }
   try {
     return Integer.valueOf((String) r.get("value"));
   } catch (NumberFormatException e) {
     throw new IOException("Choice was not numeric", e);
   }
 }