use of es.inteco.labs.android.usb.device.exception.NotAvailableUSBDeviceException in project jmulticard by ctt-gob-es.
the class AndroidCCIDConnection method transmit.
/**
* {@inheritDoc}
*/
@Override
public ResponseApdu transmit(final CommandApdu command) throws ApduConnectionException {
if (!isOpen()) {
// $NON-NLS-1$
throw new UnavailableReaderException("No existe dispositivo USB asignado a la conexion");
}
try {
if (!this.ccidReader.isCardActive()) {
if (!this.ccidReader.isCardPresent()) {
// No hay tarjeta en el lector
throw new CardNotPresentException();
}
// Hay tarjeta, pero no esta activa
// $NON-NLS-1$ //$NON-NLS-2$
Log.i("es.gob.jmulticard", "La tarjeta del lector no esta activa, se reiniciara");
this.reset();
}
if (DEBUG) {
// $NON-NLS-1$ //$NON-NLS-2$
Log.d("es.gob.jmulticard", "APDU Enviada:\n" + HexUtils.hexify(command.getBytes(), true));
}
final ResponseApdu response;
try {
response = new ResponseApdu(this.ccidReader.transmit(command.getBytes()));
if (DEBUG) {
// $NON-NLS-1$ //$NON-NLS-2$
Log.d("es.gob.jmulticard", "APDU Recibida:\n" + HexUtils.hexify(response.getBytes(), true));
}
// Solicitamos el resultado de la operacion si es necesario
if (response.getStatusWord().getMsb() == TAG_RESPONSE_PENDING) {
// Si ya se ha devuelto parte de los datos, los concatenamos al resultado
if (response.getData().length > 0) {
final byte[] data = response.getData();
final byte[] additionalData = transmit(new GetResponseApduCommand((byte) 0x00, response.getStatusWord().getLsb())).getBytes();
final byte[] fullResponse = new byte[data.length + additionalData.length];
System.arraycopy(data, 0, fullResponse, 0, data.length);
System.arraycopy(additionalData, 0, fullResponse, data.length, additionalData.length);
return new ResponseApdu(fullResponse);
}
return transmit(new GetResponseApduCommand((byte) 0x00, response.getStatusWord().getLsb()));
} else // (de eso se encargara la clase de conexion con canal seguro)
if (response.getStatusWord().getMsb() == TAG_RESPONSE_INVALID_LENGTH && command.getCla() == (byte) 0x00) {
command.setLe(response.getStatusWord().getLsb());
return transmit(command);
}
return response;
} catch (final UsbDeviceException e) {
// $NON-NLS-1$
throw new ApduConnectionException("Error enviando APDU: " + e, e);
}
} catch (final NotAvailableUSBDeviceException e) {
// $NON-NLS-1$
throw new UnavailableReaderException("No se puede acceder al dispositivo USB: " + e, e);
}
}
Aggregations