001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.midp.main;
028:
029: import com.sun.cldc.isolate.Isolate;
030: import com.sun.midp.security.Permissions;
031:
032: /**
033: * The first class loaded in an application Isolate by the MIDP AMS to
034: * initialize internal security and start a MIDlet suite.
035: */
036: public class AppIsolateMIDletSuiteLoader extends CldcMIDletSuiteLoader {
037:
038: /** Guards against multiple use in an Isolate. */
039: protected static boolean inUse;
040:
041: /** Cached reference to the current Isolate */
042: protected Isolate currentIsolate;
043:
044: /** Event producer to send events for other MIDlets execution */
045: protected MIDletExecuteEventProducer midletExecuteEventProducer;
046:
047: /**
048: * Creates class instance and gets suite parameters
049: * from array with arguments
050: *
051: * @param args the arguments passed to main class of the Isolate
052: */
053: private AppIsolateMIDletSuiteLoader(String args[]) {
054: this .suiteId = Integer.parseInt(args[0]);
055: this .midletClassName = args[1];
056: this .midletDisplayName = args[2];
057: this .args = new String[] { args[3], args[4], args[5] };
058: this .externalAppId = Integer.parseInt(args[6]);
059: }
060:
061: /** Inits suite loader instance */
062: protected void init() {
063: currentIsolate = Isolate.currentIsolate();
064: super .init();
065: }
066:
067: /**
068: * Extends base class implementation with
069: * creation of additional event producers
070: */
071: protected void createSuiteEnvironment() {
072: super .createSuiteEnvironment();
073:
074: // Create event producer to execute other MIDlets
075: // from non-AMS tasks
076: midletExecuteEventProducer = new MIDletExecuteEventProducer(
077: internalSecurityToken, eventQueue, amsIsolateId);
078: }
079:
080: /**
081: * Extends base class implementation with MVM specific
082: * initializtion of the <code>AmsUtil</code> class
083: */
084: protected void initSuiteEnvironment() {
085: super .initSuiteEnvironment();
086:
087: AmsUtil.initClassInAppIsolate(midletExecuteEventProducer);
088: }
089:
090: /** Restricts suite access to internal API */
091: protected void restrictAPIAccess() {
092: if (midletSuite.checkPermission(Permissions
093: .getName(Permissions.AMS)) != 1) {
094:
095: // Permission is not allowed.
096: //
097: // Shutdown access to Isolate references before a MIDlet is
098: // loaded. This will not effect the reference already obtained.
099: currentIsolate.setAPIAccess(false);
100: }
101: }
102:
103: /**
104: * Allocates resources for a suite task according
105: * to global resource policy
106: */
107: protected boolean allocateReservedResources() {
108: return allocateReservedResources0();
109: }
110:
111: /**
112: * Posts suite task error to event system.
113: *
114: * @param errorCode the error code to report
115: * @param details text with error details
116: */
117: protected void reportError(int errorCode, String details) {
118: midletControllerEventProducer.sendMIDletStartErrorEvent(
119: suiteId, midletClassName, externalAppId, errorCode,
120: details);
121: }
122:
123: /** Exits suite loader Isolate with proper exit code. */
124: protected void exitLoader() {
125: currentIsolate.exit(0);
126: }
127:
128: /**
129: * Called for isolates other than the initial one.
130: * Initializes internal security, and starts the MIDlet.
131: *
132: * @param args arg[0] the suite ID, arg[1] the class name of the MIDlet,
133: * arg[2] the name of the MIDlet to display,
134: * arg[3] optional MIDlet arg 0, arg[4] optional MIDlet arg 1,
135: * arg[5] optional MIDlet arg 2
136: */
137: public static void main(String args[]) {
138: try {
139: /* This class shouldn't be used more than once. */
140: if (inUse) {
141: throw new IllegalStateException();
142: }
143:
144: inUse = true;
145: new AppIsolateMIDletSuiteLoader(args).runMIDletSuite();
146: } catch (Throwable t) {
147: handleFatalError(t);
148: }
149: }
150:
151: /**
152: * Native cleanup code, called when this isolate is done,
153: * even if killed.
154: */
155: private native void finalize();
156:
157: /**
158: * Allocates reserved resources for the given isolate.
159: *
160: * @return true if the reserved resources are available otherwise false
161: */
162: private native static boolean allocateReservedResources0();
163:
164: /**
165: * Handles a fatal error
166: *
167: * @param t the Throwable that caused the fatal error
168: */
169: private static native void handleFatalError(Throwable t);
170: }
|