/*
*
*
* Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*/
package com.sun.cardreader;
import java.io.IOException;
/**
* Device driver for the real card reader.
*/
public class PlatformCardDevice extends CardDevice {
/**
* Initializes the device.
*
* @throws IOException If a device initialization failed.
* @throws CardDeviceException If a configuration initialization failed.
*/
public void init() throws IOException, CardDeviceException {
if (!init0()) {
String err_msg = getErrorMessage0();
if (err_msg != null)
throw new IOException(err_msg);
else
throw new IOException("Init failed");
}
}
/**
* Closes the device.
* No exceptions thrown to avoid mess in exception handlers trying
* to clean up and close the device.
*/
public void close() {
finalize0();
}
/**
* Performs platform lock of the device. This is intended to make
* sure that no other native application
* uses the same device during a transaction.
*
* @throws IOException If a device locking failed.
*/
public void lock() throws IOException {
if (!lock0()) {
String err_msg = getErrorMessage0();
if (err_msg != null)
throw new IOException(err_msg);
else
throw new IOException("Lock failed");
}
}
/**
* Unlocks the device.
*
* @throws IOException If a device unlocking failed.
*/
public void unlock() throws IOException {
if (!unlock0()) {
String err_msg = getErrorMessage0();
if (err_msg != null)
throw new IOException(err_msg);
else
throw new IOException("Unlock failed");
}
}
/**
* Gets number of slots on a device.
*
* @return Number of slots on a device. In case of error
* returns 0.
*/
public int getSlotCount() {
return getSlotCount0();
}
/**
* Checks if this slot is SAT slot.
*
* @param slotNumber Slot number
* @return <code>true</code> if the slot is dedicated for SAT,
* <code>false</code> otherwise
* @throws IOException If an error occured.
*/
public boolean isSatSlot(int slotNumber) throws IOException {
int result = isSatSlot0(slotNumber);
if (result == -1) {
String err_msg = getErrorMessage0();
if (err_msg != null)
throw new IOException(err_msg);
else
throw new IOException("isSAT failed");
}
return result != 0;
}
/**
* Selects the current slot for the subsequent transfer operations.
* For the one-slot devices the default slot number is 0.
*
* @param slot Slot number
* @throws IOException If a slot selection failed.
*/
public void selectSlot(int slot) throws IOException {
if (!selectSlot0(slot)) {
String err_msg = getErrorMessage0();
if (err_msg != null)
throw new IOException(err_msg);
else
throw new IOException("SelectSlot failed");
}
}
/**
* Performs reset of device.
*
* @param atr ATR bytes
* @return Length of ATR
* @throws IOException If a reset failed.
*/
public int cmdReset(byte[] atr)
throws IOException {
int bytes_read;
if ((bytes_read = reset0(atr)) < 0) {
String err_msg = getErrorMessage0();
if (err_msg != null)
throw new IOException(err_msg);
else
throw new IOException("reset failed");
}
return bytes_read;
}
/**
* Performs data transfer to the device.
*
* @param request Request bytes
* @param response Response bytes
* @return Length of response
* @throws IOException If a data transfer failed.
*/
public int cmdXfer(byte[] request, byte[] response)
throws IOException {
int bytes_read;
if ((bytes_read = cmdXfer0(request, response)) < 0) {
String err_msg = getErrorMessage0();
if (err_msg != null)
throw new IOException(err_msg);
else
throw new IOException("cmdXfer failed");
}
return bytes_read;
}
/**
* Checks if the card in the selected slot was changed
* since last call or since last reset.
* Always called after any transfer operation, so
* implementation can check and store that status during
* this operation.
*
* @return true if was changed, false otherwise.
* @throws IOException If something fails.
*/
public boolean isCardChanged() throws IOException {
int result = checkCardMovement0();
if (result < 0) {
String err_msg = getErrorMessage0();
if (err_msg != null)
throw new IOException(err_msg);
else
throw new IOException("Checking of card movement failed");
}
if (result == 0) {
return false;
} else {
return true;
}
}
/**
* Initializes the device.
*
* @return true if successful, false otherwise
* @throws CardDeviceException If a configuration failed.
*/
private native boolean init0() throws CardDeviceException;
/**
* Finalizes the device.
*/
private native void finalize0();
/**
* Locks the device.
*
* @return true if successful, false otherwise
*/
private native boolean lock0();
/**
* Unlocks the device.
*
* @return true if successful, false otherwise
*/
private native boolean unlock0();
/**
* Gets number of slots on a device.
*
* @return Number of slots on a device. In case of error
* returns 0.
*/
private native int getSlotCount0();
/**
* Checks if this slot is SAT slot.
*
* @param slotNumber Slot number
* @return <code> 1</code> if the slot is dedicated for SAT,
* <code> 0</code> if not,
* <code>-1</code> if any error occured
*/
private native int isSatSlot0(int slotNumber);
/**
* Selects the current slot for the subsequent transfer operations.
* For the one-slot devices the default slot number is 0.
*
* @param slotIndex Slot number
* @return true if successful, false otherwise
*/
private native boolean selectSlot0(int slotIndex);
/**
* Performs reset of device.
* Fills diven array with ATR bytes.
*
* @param atr ATR bytes
* @return Length of ATR if successful, < 0 otherwise
*/
private native int reset0(byte[] atr);
/**
* Performs data transfer to the device.
*
* @param request Request bytes
* @param response Response bytes
* @return Length of response if successful, < 0 otherwise
*/
private native int cmdXfer0(byte[] request, byte[] response);
/**
* Checks if the card in the selected slot was changed
* since last call or since last reset.
* Called after any transfer operation, so
* implementation can check and store that status during
* this operation.
*
* @return 0 if no movements has happened,
* > 0 if the card was changed,
* < 0 if an error occured.
*/
private native int checkCardMovement0();
/**
* Retrives last error message.
*
* @return Error message as String
*/
private native String getErrorMessage0();
}
|