/* * * * Copyright 1990-2009 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 DEFINITION //----------------------------------------------------------------------------- package sim.toolkit; //----------------------------------------------------------------------------- // IMPORTS //----------------------------------------------------------------------------- import javacard.framework.Util; /** * This class is the basic class for the construction of a list of simple TLV * elements. * This class is able to handle Simple TLV with a value field no longer than * 255 bytes. * * @version 8.3.0 * * @see ViewHandler * @see ProactiveHandler * @see EnvelopeResponseHandler * @see ToolkitException */ public abstract class EditHandler extends ViewHandler { /** * Default constructor. */ EditHandler() {} // ------------------------------- Constructors --------------------------- /** * Builds a new EditHandler object. * * @param buffer the buffer containg the TLV list * @param offset the position of the TLV list * @param length the length of the TLV list * * @exception NullPointerException if <code>buffer</code> * is <code>null</code> * @exception ArrayIndexOutOfBoundsException if <code>offset</code> or * <code>length</code> or both would cause access outside array bounds */ EditHandler(byte[] buffer, short offset, short length) throws NullPointerException, ArrayIndexOutOfBoundsException { } // ------------------------------- Public methods ------------------------- /** * Clears the TLV list of an EditHandler and resets the current * TLV selected. * * @exception ToolkitException with the following reason codes: <ul> * <li><code>HANDLER_NOT_AVAILABLE</code> if the handler is busy</ul> */ public void clear() throws ToolkitException { } /** * Appends a buffer into the EditHandler buffer. * A successful append does not modify the TLV selected. * The TLV list structure of the handler should be maintained by the * applet in the appended array (e.g. the length of the TLV element * should be coded according to ISO 7816-6), if the TLV manipulation * methods are to be used afterwards with the handler. * * <p> * Notes:<ul> * <li><em>If </em><code>offset</code><em> or * </em><code>length</code><em> parameter is negative an * </em><code>ArrayIndexOutOfBoundsException</code> * <em> exception is thrown and no append is performed.</em> * <li><em>If </em><code>offset+length</code><em> is greater than * </em><code>buffer.length</code><em>, the length of the * </em><code>buffer</code><em> array an * </em><code>ArrayIndexOutOfBoundsException</code><em> exception is * thrown and no append is performed.</em> * </ul> * * @param buffer the buffer containing data for copy * @param offset the offset in the buffer * @param length the value length of the buffer * * @exception NullPointerException if <code>buffer</code> * is <code>null</code> * @exception ArrayIndexOutOfBoundsException if append would cause * access of data outside array bounds * @exception ToolkitException with the following reason codes: <ul> * <li><code>HANDLER_OVERFLOW</code> if the EditHandler buffer * is to small to append the requested data * <li><code>HANDLER_NOT_AVAILABLE</code> if the handler is busy</ul> */ public void appendArray(byte[] buffer, short offset, short length) throws NullPointerException, ArrayIndexOutOfBoundsException, ToolkitException { byte[] APDUBuffer = ViewHandler.getAPDUBuffer(); Util.arrayCopy(buffer, offset, APDUBuffer, (short)0, length); ViewHandler.setOutBufferData(length); } /** * Appends a TLV element to the current TLV list (byte array format). * A successful append does not modify the TLV selected. * * <p> * Notes:<ul> * <li><em>If </em><code>valueOffset</code><em> or * </em><code>valueLength</code><em> parameter is negative an * </em><code>ArrayIndexOutOfBoundsException</code> * <em> exception is thrown and no append is performed.</em> * <li><em>If </em><code>valueOffset+valueLength</code><em> is * greater than </em><code>value.length</code><em>, the length * of the </em><code>value</code><em> array an * </em><code>ArrayIndexOutOfBoundsException</code><em> exception * is thrown and no append is performed.</em> * </ul> * * @param tag the tag of the TLV to append, including the Comprehension * Required flag * @param value the buffer containing the TLV value * @param valueOffset the offset of the TLV value in the buffer * @param valueLength the value length of the TLV to append * * @exception NullPointerException if <code>value</code> * is <code>null</code> * @exception ArrayIndexOutOfBoundsException if append would cause * access of data outside array bounds * @exception ToolkitException with the following reason codes: <ul> * <li><code>HANDLER_OVERFLOW</code> if the EditHandler buffer * is to small to append the requested data * <li><code>HANDLER_NOT_AVAILABLE</code> if the handler is busy * <li><code>BAD_INPUT_PARAMETER</code> if <code>valueLength</code> * is greater than 255</ul> */ public void appendTLV(byte tag, byte[] value, short valueOffset, short valueLength) throws NullPointerException, ArrayIndexOutOfBoundsException, ToolkitException { byte[] APDUBuffer = ViewHandler.getAPDUBuffer(); // prepare the data to be appended to the TLV list APDUBuffer[0] = tag; APDUBuffer[1] = (byte)valueLength; Util.arrayCopy(value, valueOffset, APDUBuffer, (short)2, valueLength); ViewHandler.setOutBufferData((short)(valueLength + 2)); } /** * Appends a TLV element to the current TLV list (1-byte element). * This method is useful to add single byte elements as Item Identifier * or Tone. * A successful append does not modify the TLV selected. * * @param tag the tag of the TLV to append, including the Comprehension * Required flag * @param value the TLV value on 1 byte * * @exception ToolkitException with the following reason codes: <ul> * <li><code>HANDLER_OVERFLOW</code> if the EditHandler buffer * is to small to append the requested data * <li><code>HANDLER_NOT_AVAILABLE</code> if the handler is busy</ul> */ public void appendTLV(byte tag, byte value) throws ToolkitException { byte[] APDUBuffer = ViewHandler.getAPDUBuffer(); // prepare the data to be appended to the TLV list APDUBuffer[0] = tag; // set the tag APDUBuffer[1] = (byte)1; // 1-byte element so length is 1 APDUBuffer[2] = value; // 1-byte element ViewHandler.setOutBufferData((short)3); } /** * Appends a TLV element to the current TLV list (2-byte element) * This method is useful to add double byte elements as Device Identities, * Duration or Response Length. A successful append does not modify the * TLV selected. * * * @param tag the tag of the TLV to append, including the Comprehension * Required flag * @param value1 the 1st byte (msb) of the TLV value * @param value2 the 2nd byte (lsb) of the TLV value * * @exception ToolkitException with the following reason codes: <ul> * <li><code>HANDLER_OVERFLOW</code> if the EditHandler buffer * is to small to append the requested data * <li><code>HANDLER_NOT_AVAILABLE</code> if the handler is busy</ul> */ public void appendTLV(byte tag, byte value1, byte value2) throws ToolkitException { byte[] APDUBuffer = ViewHandler.getAPDUBuffer(); // prepare the data to be appended to the TLV list APDUBuffer[0] = tag; // set the tag APDUBuffer[1] = (byte)1; // 2-byte element so length is 1 APDUBuffer[2] = value1; // 1-byte element APDUBuffer[3] = value2; // 1-byte element ViewHandler.setOutBufferData((short)4); } /** * Appends a TLV element to the current TLV list (1 byte and a * byte array format). * A successful append does not modify the TLV selected. * * <p> * Notes:<ul> * <li><em>If </em><code>value2Offset</code><em> or * </em><code>value2Length</code><em> parameter is negative * an </em><code>ArrayIndexOutOfBoundsException</code><em> * exception is thrown and no append is performed.</em> * <li><em>If </em><code>value2Offset+value2Length</code><em> is greater * than </em><code>value2.length</code><em>, the length * of the </em><code>value2</code><em> array an * </em><code>ArrayIndexOutOfBoundsException</code><em> exception is thrown * and no append is performed.</em> * </ul> * * @param tag the tag of the TLV to append, including the * Comprehension Required flag * @param value1 the first byte in the value field * @param value2 the buffer containing the rest of the TLV field * @param value2Offset the offset of the rest of the TLV field in the buffer * @param value2Length the value length of the rest of the TLV * field to append * * @exception NullPointerException if <code>value2</code> is * <code>null</code> * @exception ArrayIndexOutOfBoundsException if append would * cause access of data outside array bounds. * @exception ToolkitException with the following reason codes: <ul> * <li><code>HANDLER_OVERFLOW</code> if the EditHandler buffer is to * small to append the requested data * <li><code>HANDLER_NOT_AVAILABLE</code> if the handler is busy * <li><code>BAD_INPUT_PARAMETER</code> if <code>value2Length</code> * is greater than 254</ul> */ public void appendTLV(byte tag, byte value1, byte[] value2, short value2Offset, short value2Length) throws NullPointerException, ArrayIndexOutOfBoundsException, ToolkitException { byte[] APDUBuffer = ViewHandler.getAPDUBuffer(); // prepare the data to be appended to the TLV list APDUBuffer[0] = tag; // set the tag APDUBuffer[1] = (byte)(value2Length + 1); // 1-byte element // so length is 1 APDUBuffer[2] = value1; // 1-byte element Util.arrayCopy(value2, value2Offset, APDUBuffer, (short)3, value2Length); ViewHandler.setOutBufferData((short)(value2Length+3)); } }