/*
*
*
* 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 DEFINITION
//-----------------------------------------------------------------------------
package sim.toolkit;
//-----------------------------------------------------------------------------
// IMPORTS
//-----------------------------------------------------------------------------
import javacard.framework.Util;
/**
*
* The EnvelopeHandler class contains basic methods to handle the <b>Envelope
* </b>data field. This class will be used by the Toolkit applet in order to
* have access to the current Envelope information. No constructor is available
* for the Toolkit applet. The EnvelopeHandler class is a <b>Temporary JCRE
* Entry Point Object</b>. The only way to get a EnvelopeHandler reference is
* through the <code>getTheHandler()</code> static method.<p>
*
* Toolkit Applet Example:<pre><code>
* private static final byte MY_TAG = (byte)0x54;
* private byte[] data;
* data = new byte[32];
*
* void processToolkit(byte event) throws ToolkitException {
* // get the EnvelopeHandler system instance
* EnvelopeHandler theEnv = EnvelopeHandler.getTheHandler();
* // look for MY_TAG TLV
* if (theEnv.findTLV(MY_TAG, (byte)1) != TLV_NOT_FOUND) {
* // check first element byte
* if (theEnv.getValueByte((short)0) == (byte)1) {
* // copy element part into data buffer
* theEnv.copyValue((short)1,
* data,
* (short)0,
* (short)(theEnv.getValueLength() - 1));
* }
* }
* }
* </code></pre>
*
* @version 8.3.0
*
* @see ViewHandler
* @see EnvelopeResponseHandler
* @see ProactiveHandler
* @see ToolkitException
*/
public final class EnvelopeHandler extends ViewHandler {
// ------------------------------- Constructors ---------------------------
/**
* constructor
*/
private EnvelopeHandler() {
}
// ------------------------------- Public methods -------------------------
/**
* Returns the single system instance of the EnvelopeHandler class.
* The applet shall get the reference of the handler at its triggering,
* the beginning of the processToolkit method.
*
* @return reference of the system instance
*
* @exception ToolkitException with the following reason codes: <ul>
* <li><code>HANDLER_NOT_AVAILABLE</code> if the handler is busy.</ul>
*/
public static EnvelopeHandler getTheHandler() throws ToolkitException {
EnvelopeHandler theEnvelopeHandler = new EnvelopeHandler();
// BER TLV offset is 5 in the buffer
// offset for the first TLV would be BER TLV offset + 2
theEnvelopeHandler.firstTLVOffset = (short)(BER_TLV_TAG_OFFSET + 2);
theEnvelopeHandler.currentTLVOffset = (short)(BER_TLV_TAG_OFFSET + 2);
return theEnvelopeHandler;
}
/**
* Returns the Envelope BER-TLV tag.
*
* @return Envelope BER-TLV tag
*/
public byte getEnvelopeTag() {
byte[] buffer = ViewHandler.getAPDUBuffer();
return buffer[BER_TLV_TAG_OFFSET];
}
/**
* Looks for the TP-UDL field in the first TPDU TLV element in the Envelope
* data field. This method can be used on the events
* EVENT_FORMATTED_SMS_PP_ENV,
* EVENT_FORMATTED_SMS_PP_UPD, EVENT_UNFORMATTED_SMS_PP_ENV,
* EVENT_UNFORMATTED_SMS_PP_UPD.
* If the element is available it becomes the TLV selected.
*
* @return TPUDL offset in the first TPDU TLV element if TPUDL exists.
* The TPUD length can be recovered by using the getValueByte method
* in Handler class.
*
* @exception ToolkitException with the following reason codes: <ul>
* <li><code>UNAVAILABLE_ELEMENT</code> in case of unavailable TPDU
* TLV element or if the TPUDL field does not exist</ul>
*/
public short getTPUDLOffset() throws ToolkitException {
// get to the SMS TLV
byte[] buffer = ViewHandler.getAPDUBuffer();
short Lc = buffer[OFFSET_LC];
short SMSTLVOffset = getTLVOffset(buffer,
ToolkitConstants.TAG_SMS_TPDU, Lc, (byte)1);
if (SMSTLVOffset >= Lc)
ToolkitException.throwIt(ToolkitException.UNAVAILABLE_ELEMENT);
currentTLVOffset = SMSTLVOffset;
return 0;
}
/**
* Looks for the Secured Data from the Command Packet in the first SMS
* TPDU or Cell Broadcast Page Simple TLV contained in the Envelope
* handler. This can be used on the events:
* - EVENT_FORMATTED_SMS_PP_ENV, EVENT_FORMATTED_SMS_PP_UPD,
* if the SMS TP-UD is formatted according to GSM03.48 Single
* Short Message.
* - EVENT_FORMATTED_SMS_CB, if the Cell Broadcast Page is formatted
* according to GSM 03.48.
* If the element is available it becomes the TLV selected.
*
* @return the offset of the Secured Data first byte in the first
* SMS TPDU or Cell Broadcast Page TLV element. If the Secured Data
* length is zero the value returned shall be the SMS TPDU TLV length.
*
* @exception ToolkitException with the following reason codes: <ul>
* <li><code>UNAVAILABLE_ELEMENT</code> in case of unavailable
* SMS TPDU or Cell Broadcast Page TLV element or
* wrong data format </ul>
*/
public short getSecuredDataOffset() throws ToolkitException {
return 0;
}
/**
* Looks for the length of the Secured Data from the Command Packet
* in the first SMS TPDU or Cell Broadcast Page Simple TLV contained
* in the Envelope handler. This can be used on the events:
* - EVENT_FORMATTED_SMS_PP_ENV, EVENT_FORMATTED_SMS_PP_UPD,
* if the SMS TP-UD is formatted according to GSM03.48 Single
* Short Message.
* - EVENT_FORMATTED_SMS_CB, if the Cell Broadcast Page is formatted
* according to GSM 03.48.
* If the element is available it becomes the TLV selected.
*
* @return the length of the Secured Data contained in the first SMS
* TPDU or Cell Broadcast Page TLV element (without padding bytes).
* If the Secured Data length is zero, no exception shall be thrown.
*
* @exception ToolkitException with the following reason codes: <ul>
* <li><code>UNAVAILABLE_ELEMENT</code> in case of unavailable
* SMS TPDU or Cell Broadcast Page TLV element or wrong data
* format </ul>
*/
public short getSecuredDataLength() throws ToolkitException {
return 0;
}
/**
* Returns the item identifier byte value from the first Item
* Identifier TLV element in the current Envelope data field.
* If the element is available it becomes the TLV selected.
*
* @return item identifier
*
* @exception ToolkitException with the following reason codes: <ul>
* <li><code>UNAVAILABLE_ELEMENT</code> in case of unavailable
* TLV element
* <li><code>OUT_OF_TLV_BOUNDARIES</code> if the item identifier
* byte is missing in the Item Identifier Simple TLV </ul>
*/
public byte getItemIdentifier() throws ToolkitException {
byte[] buffer = ViewHandler.getAPDUBuffer();
currentTLVOffset = firstTLVOffset;
return buffer[firstTLVOffset];
}
}
|