/*
*
*
* 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;
import javacard.framework.*;
//-----------------------------------------------------------------------------
// IMPORTS
//-----------------------------------------------------------------------------
/**
*
* The <code>ToolkitRegistry</code> class offers basic services and methods
* to allow
* any Toolkit applet to register its configuration (supported events) during
* the install phase and possibly to change it during all the applet life time.
* Each toolkit applet will get a reference to its registry entry with the
* static
* method <code>getEntry</code>. The initial state of all the events
* is cleared.<p>
*
* Note: the constants related to the events are defined in the
* <code>ToolkitConstants </code> interface.<p>
*
* Example of use:<pre><code>
* public class MyToolkitApplet extends Applet implements
* ToolkitInterface, ToolkitConstants {
* // data fields
* private ToolkitRegistry reg;
* private byte[] menuEntry = { ... };
* private byte menuId;
* //
* // Constructor of applet
* //
* public MyToolkitApplet() {
* // get the reference of the applet ToolkitRegistry object ...
* reg = ToolkitRegistry.getEntry();
* // ...and initialize it according to the applet characteristics
* menuId = reg.initMenuEntry(menuEntry, (short)0,
* (short)menuEntry.length,
* PRO_CMD_SET_UP_CALL, false, 0, 0);
* reg.disableMenuEntry(menuId);
* reg.setEvent(EVENT_FORMATTED_SMS_PP_ENV);
* reg.setEvent(EVENT_CALL_CONTROL_BY_SIM);
* }
* //
* // Install method
* // *param bArray the array containing installation parameters
* // *param bOffset the starting offset in bArray
* // *param bLength the length in bytes of the parameter data in bArray
* //
* public static void install(byte bArray[], short bOffset, byte bLength)
* throws ISOException {
* // create and register applet
* MyToolkitApplet applet = new MyToolkitApplet();
* applet.register();
* }
* //
* // Process toolkit events
* // *param event the type of event to be processed
* // *exception ToolkitException
* //
* public void processToolkit(byte event) throws ToolkitException {
* if (event == EVENT_FORMATTED_SMS_PP_ENV) {
* reg.enableMenuEntry(menuId);
* } else if (event == EVENT_MENU_SELECTION) {
* //...
* }
* }
* }
* </code></pre>
*
* @version 8.3.0
*
* @see ToolkitInterface
* @see ToolkitException
* @see ToolkitConstants
*/
public final class ToolkitRegistry {
// ------------------------------- Constructors ---------------------------
/**
* Constructor
*/
private ToolkitRegistry() {
}
// ------------------------------- Public methods -------------------------
/**
* This method is used by the Toolkit applet to get a reference to its
* Toolkit Registry entry, so that it can handle its registration state to
* the toolkit events.
*
* @return reference to the applet ToolkitRegistry object
*
* @exception ToolkitException with the following reason codes: <ul>
* <li>REGISTRY_ERROR in case of register error</ul>
*/
public static ToolkitRegistry getEntry() throws ToolkitException {
return new ToolkitRegistry();
}
/**
* Sets an event in the Toolkit Registry entry of the applet.
* No exception shall be thrown if the applet registers more than once to
* the same event.
*
* @param event value of the new event to register (between -128 and 127)
*
* @exception ToolkitException with the following reason codes: <ul>
* <li>EVENT_NOT_SUPPORTED if the event is not supported
* <li>EVENT_ALREADY_REGISTERED if the event has already been
* registered (for limited event like Call Control)
* <li>EVENT_NOT_ALLOWED if event is EVENT_MENU_SELECTION,
* EVENT_MENU_SELECTION_HELP_REQUEST,
* EVENT_TIMER_EXPIRATION,
* EVENT_STATUS_COMMAND</ul>
*/
public void setEvent(byte event) throws ToolkitException {
if (event != ToolkitConstants.EVENT_UNFORMATTED_SMS_PP_ENV) {
ToolkitException.throwIt(ToolkitException.EVENT_NOT_SUPPORTED);
}
AID aid = JCSystem.getAID();
ViewHandler.SATAccessor.setEventListener(aid);
}
/**
* Sets an event list in the Toolkit Registry entry of the applet.
* In case of any exception the state of the registry is undefined.
* The toolkit applet has to include this call within a transaction
* if necessary.
*
* <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 event list is set.</em>
* <li><em>If </em><code>offset+length</code><em> is greater than
* </em><code>eventList.length</code><em>, the length
* of the </em><code>eventList</code><em> array an
* </em><code>ArrayIndexOutOfBoundsException</code><em> exception is
* thrown and no event list is set.</em>
* </ul>
*
* @param eventList buffer containing the list of the new events to
* register
* @param offset offset in the eventlist buffer for event registration
* @param length length in the eventlist buffer for event registration
*
* @exception NullPointerException if <code>eventlist</code>
* is <code>null</code>
* @exception ArrayIndexOutOfBoundsException if setEventList would cause
* access of data outside array bounds.
* @exception ToolkitException with the following reason codes: <ul>
* <li>EVENT_NOT_SUPPORTED if one event is not supported
* <li>EVENT_ALREADY_REGISTERED if one event has already been
* registered
* (for limited event like Call Control)
* <li>EVENT_NOT_ALLOWED if eventList contains EVENT_MENU_SELECTION,
* EVENT_MENU_SELECTION_HELP_REQUEST, EVENT_TIMER_EXPIRATION,
* EVENT_STATUS_COMMAND</ul>
*/
public void setEventList(byte[] eventList,
short offset,
short length)
throws NullPointerException,
ArrayIndexOutOfBoundsException,
ToolkitException {
boolean alreadyRegistered = false;
for (short i = 0; i < eventList.length; i++) {
if (eventList[i] !=
ToolkitConstants.EVENT_UNFORMATTED_SMS_PP_ENV) {
ToolkitException.throwIt(ToolkitException.EVENT_NOT_SUPPORTED);
}
if (!alreadyRegistered) {
AID aid = JCSystem.getAID();
ViewHandler.SATAccessor.setEventListener(aid);
alreadyRegistered = true;
}
}
}
/**
* Clears an event in the Toolkit Registry entry of the applet.
*
* @param event the value of the event to unregister (between -128 and 127)
* @exception ToolkitException with the following reason codes: <ul>
* <li>EVENT_NOT_ALLOWED if event is EVENT_MENU_SELECTION,
* EVENT_MENU_SELECTION_HELP_REQUEST, EVENT_TIMER_EXPIRATION,
* EVENT_STATUS_COMMAND</ul>
*/
public void clearEvent(byte event) throws ToolkitException {
if (event != ToolkitConstants.EVENT_UNFORMATTED_SMS_PP_ENV) {
// no other events are supported
return;
}
AID aid = JCSystem.getAID();
ViewHandler.SATAccessor.clearEventListener(aid);
}
/**
* Allows to know if an event is set in the Toolkit Registry entry of the
* applet.
*
* @param event the value of the event (between -128 and 127)
*
* @return true if the event is set in the Toolkit Registry entry of
* the applet, false otherwise
*/
public boolean isEventSet(byte event) {
if (event != ToolkitConstants.EVENT_UNFORMATTED_SMS_PP_ENV)
return false;
AID aid = JCSystem.getAID();
return ViewHandler.SATAccessor.isEventListenerSet(aid);
}
/**
* Disables a menu entry.
* This method doesn't modify the registration state to the
* EVENT_MENU_SELECTION
* and EVENT_MENU_SELECTION_HELP_REQUEST. After invocation of this method,
* during the current card session, the SIM
* Toolkit Framework shall dynamically update the menu stored in the ME.
*
* @param id the menu entry identifier supplied by the
* <code>initMenuEntry()</code> method
*
* @exception ToolkitException with the following reason codes: <ul>
* <li>MENU_ENTRY_NOT_FOUND if the menu entry does not exist
* for this applet</ul>
*/
public void disableMenuEntry(byte id) throws ToolkitException {
ToolkitException.throwIt(ToolkitException.MENU_ENTRY_NOT_FOUND);
}
/**
* Enables a menu entry.
* This method doesn't modify the registration state to the
* EVENT_MENU_SELECTION
* and EVENT_MENU_SELECTION_HELP_REQUEST. After invocation of this method,
* during the current card session, the SIM
* Toolkit Framework shall dynamically update the menu stored in the ME.
*
* @param id the menu entry identifier supplied by the
* <code>initMenuEntry()</code> method
*
* @exception ToolkitException with the following reason codes: <ul>
* <li>MENU_ENTRY_NOT_FOUND if the menu entry does not exist for
* this applet</ul>
*/
public void enableMenuEntry(byte id) throws ToolkitException {
ToolkitException.throwIt(ToolkitException.MENU_ENTRY_NOT_FOUND);
}
/**
* Initialises the next menu entry allocated at loading.
* The default state of the menu entry is
* 'enabled'. The value of the <code>helpSupported</code> boolean
* parameter defines the registration status of the applet to the event
* EVENT_MENU_SELECTION_HELP_REQUEST. The applet is registered to
* the EVENT_MENU_SELECTION. The icon identifier provided will be added to
* the icon identifier list of the item icon identifier list Simple TLV if
* all the applets registered to the EVENT_MENU_SELECTION provide it.
* The Icon list qualifier transmitted to the ME will be 'icon is not self
* explanatory' if one of the applet registered prefers this qualifier.
* This method shall be called by the applet in the same order than the
* order of the item parameters defined at the applet loading if the applet
* has several menu entries. The applet shall initialise all its loaded
* menu entries during its installation.
*
* <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 menu entry is initialised.</em>
* <li><em>If </em><code>offset+length</code><em> is greater than
* </em><code>menuEntry.length</code><em>, the length
* of the </em><code>menuEntry</code><em> array a
* </em><code>ArrayIndexOutOfBoundsException</code><em> exception is thrown
* and no menu entry is initialised.</em>
* </ul>
*
* @param menuEntry a reference on a byte array, containing the menu entry
* string
* @param offset offset of the menu entry string in the buffer
* @param length length of the menu entry string
* @param nextAction a byte coding the next action indicator for the menu
* entry (or 0)
* @param helpSupported equals true if help is available for the menu entry
* @param iconQualifier the preferred value for the icon list qualifier
* @param iconIdentifier the icon identifier for the menu entry
* (0 means no icon)
*
* @return the identifier attached to the initialised menu entry
*
* @exception NullPointerException if <code>menuEntry</code> is
* <code>null</code>
* @exception ArrayIndexOutOfBoundsException if initMenuEntry would
* cause access of data outside array bounds.
* @exception ToolkitException with the following reason codes: <ul>
* <li>REGISTRY_ERROR if the menu entry cannot be initialised
* (eg no more item data in applet loading parameter)
* <li>ALLOWED_LENGTH_EXCEEDED if the menu entry string is
* bigger than the alloacted space</ul>
*/
public byte initMenuEntry(byte[] menuEntry,
short offset,
short length,
byte nextAction,
boolean helpSupported,
byte iconQualifier,
short iconIdentifier) throws NullPointerException,
ArrayIndexOutOfBoundsException,
ToolkitException {
ToolkitException.throwIt(ToolkitException.REGISTRY_ERROR);
return 0;
}
/**
* Changes the value of a menu entry. The default state of the changed
* menu
* entry is 'enabled'. The value of the <code>helpSupported</code> boolean
* parameter defines the registration status of the
* EVENT_MENU_SELECTION_HELP_REQUEST
* event. The icon identifier provided will be added to the icon
* identifier list
* of the item icon identifier list Simple TLV if all the applets
* registered
* to the EVENT_MENU_SELECTION provide it.
* The Icon list qualifier transmitted to the ME will be 'icon is not self
* explanatory' if one of the applet registered prefers this qualifier.
* After the invocation of this method, during the current card session,
* the SIM Toolkit Framework
* shall dynamically update the menu stored in the ME.
*
* <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 menu entry is changed.</em>
* <li><em>If </em><code>offset+length</code><em> is greater than
* </em><code>menuEntry.length</code><em>, the length
* of the </em><code>menuEntry</code><em> array an
* </em><code>ArrayIndexOutOfBoundsException</code><em> exception is thrown
* and no menu entry is changed.</em>
* </ul>
*
* @param id the menu entry identifier supplied by the
* <code>initMenuEntry()</code> method
* @param menuEntry a reference on a byte array, containing the
* menu entry string
* @param offset the position of the menu entry string in the buffer
* @param length the length of the menu entry string
* @param nextAction a byte coding the next action indicator for the
* menu entry (or 0)
* @param helpSupported equals true if help is available for the menu entry
* @param iconQualifier the preferred value for the icon list qualifier
* @param iconIdentifier the icon identifier for the menu entry
* (0 means no icon)
*
* @exception NullPointerException if <code>menuEntry</code>
* is <code>null</code>
* @exception ArrayIndexOutOfBoundsException if changeMenuEntry would
* cause access of data outside array bounds.
* @exception ToolkitException with the following reason codes: <ul>
* <li>MENU_ENTRY_NOT_FOUND if the menu entry does not exist for
* this applet
* <li>ALLOWED_LENGTH_EXCEEDED if the menu entry string is bigger
* than the alloacted space</ul>
*/
public void changeMenuEntry(byte id,
byte[] menuEntry,
short offset,
short length,
byte nextAction,
boolean helpSupported,
byte iconQualifier,
short iconIdentifier)
throws NullPointerException,
ArrayIndexOutOfBoundsException,
ToolkitException {
ToolkitException.throwIt(ToolkitException.MENU_ENTRY_NOT_FOUND);
}
/**
* Asks the Toolkit framework to allocate a Timer that the applet
* can manage.
* By calling this method the applet is registered to the
* EVENT_TIMER_EXPIRATION of the allocated timer.
* The timer is allocated by the applet until it explicitly releases it.
* So it can then issue the Timer Management proactive command to start,
* stop or get the value of its allocated timer.
*
* @return the identifier of the Timer allocated to the applet
*
* @exception ToolkitException with the following reason codes: <ul>
* <li>NO_TIMER_AVAILABLE if all the timers are allocated or the
* maximum number
* of timers have been allocated to this applet</ul>
*/
public byte allocateTimer() throws ToolkitException {
ToolkitException.throwIt(ToolkitException.NO_TIMER_AVAILABLE);
return 0;
}
/**
* Release a Timer that has been allocated to the calling applet.
* The applet is deregistered of the EVENT_TIMER_EXPIRATION
* for the indicated Timer Identifier.
*
* @param timerIdentifier the identifier of the Timer to be released
*
* @exception ToolkitException with the following reason codes: <ul>
* <li>INVALID_TIMER_ID if the timerIdentifierd is not allocated
* to this applet.</ul>
*/
public void releaseTimer(byte timerIdentifier) throws ToolkitException {
ToolkitException.throwIt(ToolkitException.INVALID_TIMER_ID);
}
/**
* Requests a duration for the EVENT_STATUS_COMMAND event of the
* registering
* toolkit applet. Due to different duration requested by other
* toolkit
* applets or due to restriction of the ME, the SIM Toolkit
* Framework may adjust another duration.
* This method can be used at every time to request a new duration.
*
* @param duration specifies the number of seconds requested for
* proactive polling.
* The maximum value of <code>duration</code> is
* <code>15300</code> (255 minutes).
* If <code>duration<code> is equal to
* <code>POLL_NO_DURATION</code>,
* the calling applet deregisters from EVENT_STATUS_COMMAND, and
* the SIM Toolkit Framework may issue the POLLING OFF proactive
* command.
* If <code>duration<code> is equal to
* <code>POLL_SYSTEM_DURATION</code>,
* the calling applet registers to the
* EVENT_STATUS_COMMAND and let
* the SIM Toolkit Framework define the duration.
*
* @exception ToolkitException with the following reason codes: <ul>
* <li>REGISTRY_ERROR if <code>duration</code> is greater than
* the maximum value.</ul>
*/
public void requestPollInterval(short duration) throws ToolkitException {
ToolkitException.throwIt(ToolkitException.REGISTRY_ERROR);
}
/**
* Returns the number of seconds of the adjusted duration for the calling
* toolkit applet.
* If the returned duration is equal to <code>POLL_NO_DURATION<code>, the
* toolkit applet is not registered to EVENT_STATUS_COMMAND event.
* The returned duration may :
* - be a multiple of the real adjusted poll interval time at the ME.
* - differ from the requested duration due to request of
* other toolkit applets or due to restrictions of the current ME.
* - be changed during the card session due requests from other toolkit
* applets.
* - be wrong due to direct generation of the proactive command POLL
* INTERVAL or POLLING OFF.
* - not correspond to the ellasped time due to additional STATUS
* commands send by the ME.
*
* @return the number of seconds of the adjusted duration for the applet
*/
public short getPollInterval() {
return 0;
}
}
|