midletsuiteloader.java
来自「This is a resource based on j2me embedde」· Java 代码 · 共 365 行
JAVA
365 行
/* * * * 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.midp.main;import com.sun.midp.lcdui.ForegroundEventProducer;import com.sun.midp.midlet.*;import com.sun.midp.jsr.JSRInitializer;import com.sun.midp.automation.AutomationInitializer;import com.sun.midp.io.j2me.push.PushRegistryInternal;import com.sun.midp.content.CHManager;import com.sun.midp.wma.WMACleanupMonitor;import com.sun.midp.configurator.Constants;import com.sun.midp.i18n.*;import com.sun.midp.log.*;import com.sun.midp.security.SecurityToken;/** * The first class loaded in VM by midp_run_midlet_with_args to initialize * internal security the internal AMS classes and start a MIDlet suite. * <p> * In SVM mode it handles all MIDlet suites (AMS and internal romized, * and application). * <p> * In MVM mode it only handles the first MIDlet suite isolate which is used * by the MIDP AMS and other internal MIDlets. */public class MIDletSuiteLoader extends CldcMIDletSuiteLoader { /** Command state of the MIDlet suite loader */ protected CommandState state; /** Disable startup error alerts, uninitialized by default */ protected int disableAlerts = -1; /** MIDlet state event producer needed by AMS */ protected MIDletEventProducer midletEventProducer; /** Foreground event producer needed by AMS. */ protected static ForegroundEventProducer foregroundEventProducer; /** List of MIDlet proxies needed by AMS */ protected MIDletProxyList midletProxyList; /** * Extends base class initialization with initializatons * specific for the AMS task */ protected void init() { /* * WARNING: Don't add any calls before this ! * * Register AMS task ID native global variable. * Since native functions rely on this value to distinguish * whether Java AMS is running, this MUST be called before any * other native functions from this Isolate. I.E. This call * must be the first thing this main make. */ MIDletSuiteUtils.registerAmsIsolateId(); super.init(); } /** Creates environment objects needed to AMS task */ protected void createSuiteEnvironment() { super.createSuiteEnvironment(); midletEventProducer = new MIDletEventProducer(eventQueue); foregroundEventProducer = new ForegroundEventProducer(eventQueue); midletProxyList = new MIDletProxyList(eventQueue); } /** * Inits global systems common for all started MIDlet suite tasks. * The systems should be initialized only once in the AMS task. */ protected void initGlobalSystems() { // Initialize AMS task resources needed for all tasks MIDletSuiteUtils.initAmsResources(); // Initialize JSR subsystems JSRInitializer.init(); // Initaialize automation API AutomationInitializer.init( eventQueue, midletControllerEventProducer); // Start inbound connection watcher thread. PushRegistryInternal.startListening(internalSecurityToken); // Initialize the Content Handler Monitor of MIDlet exits CHManager.getManager(internalSecurityToken).init( midletProxyList, eventQueue); // Initialize WMA's cleanup monitor WMACleanupMonitor.init(midletProxyList); } /** * Inits created MIDlet suite environment objects and global * subsystems needed for all suites. * <p> * The method also loads MIDlet suite paramaters and arguments * from the natively saved <code>CommandState</code> instance. */ protected void initSuiteEnvironment() { super.initSuiteEnvironment(); AmsUtil.initClass( midletProxyList, midletControllerEventProducer); MIDletProxy.initClass(foregroundEventProducer, midletEventProducer); MIDletProxyList.initClass(midletProxyList); // Listen for start MIDlet requests from the other isolates ExecuteMIDletEventListener.startListening(internalSecurityToken, eventQueue); // Init gloabal systems common for all isolates initGlobalSystems(); } /** * Sets suite arguments as temporary suite properties. * The implementation extends base class method with * additional properties specific for AMS MIDlet in * the internal suite. */ protected void setSuiteProperties() { super.setSuiteProperties(); // Handle logo displaying for Manager MIDlet if (suiteId == MIDletSuite.INTERNAL_SUITE_ID) { // Disable logo when startup performance is being // measured or if the logo has been displayed already if (Constants.MEASURE_STARTUP || state.logoDisplayed) { midletSuite.setTempProperty( internalSecurityToken, "logo-displayed", ""); } else { state.logoDisplayed = true; } } } /** * The AMS MIDlet started in the suite loader could request for * shutdown, so we need to check it, wait for other MIDlets destroying * and update <code>CommandState</code> with appropriate status. */ protected void checkForShutdown() { if (MIDletProxyList.shutdownInProgress()) { // The MIDlet was shutdown by either the OS or the // push system. Set the command state to signal this // to the native AMS code. state.status = CommandState.SHUTDOWN; midletProxyList.waitForShutdownToComplete(); } else { state.status = CommandState.OK; } } /** Overrides suite close logic for the AMS task */ protected void closeSuite() { /* * The midletSuite is not closed because the other * active threads may be depending on it. * For example, Display uses isTrusted to update * screen icons. * A native finalizer will take care of unlocking * the native locks. */ } /** * Extends base class implementation with additional actions for main * task shutdown. Update and save <code>CommandState</code> instance * for VM cycling mechanism. */ protected void done() { super.done(); state.suiteId = MIDletSuite.UNUSED_SUITE_ID; state.midletClassName = null; if (state.status != CommandState.SHUTDOWN) { if (MIDletSuiteUtils.lastMidletSuiteToRun != MIDletSuite.UNUSED_SUITE_ID) { state.lastSuiteId = MIDletSuiteUtils.lastMidletSuiteToRun; state.lastMidletClassName = MIDletSuiteUtils.lastMidletToRun; state.lastArg0 = MIDletSuiteUtils.arg0ForLastMidlet; state.lastArg1 = MIDletSuiteUtils.arg1ForLastMidlet; } // Check to see if we need to run a selected suite next if (MIDletSuiteUtils.nextMidletSuiteToRun != MIDletSuite.UNUSED_SUITE_ID) { state.suiteId = MIDletSuiteUtils.nextMidletSuiteToRun; state.midletClassName = MIDletSuiteUtils.nextMidletToRun; state.arg0 = MIDletSuiteUtils.arg0ForNextMidlet; state.arg1 = MIDletSuiteUtils.arg1ForNextMidlet; state.arg2 = MIDletSuiteUtils.arg2ForNextMidlet; state.runtimeInfo.memoryReserved = MIDletSuiteUtils.memoryReserved; state.runtimeInfo.memoryTotal = MIDletSuiteUtils.memoryTotal; state.runtimeInfo.priority = MIDletSuiteUtils.priority; state.runtimeInfo.profileName = MIDletSuiteUtils.profileName; state.isDebugMode = MIDletSuiteUtils.isDebugMode; } else if (state.lastSuiteId != MIDletSuite.UNUSED_SUITE_ID) { state.suiteId = state.lastSuiteId; state.midletClassName = state.lastMidletClassName; state.arg0 = state.lastArg0; state.arg1 = state.lastArg1; /* Avoid an endless loop. */ state.lastSuiteId = MIDletSuite.UNUSED_SUITE_ID; state.lastMidletClassName = null; state.lastArg0 = null; state.lastArg1 = null; /* * This could an bad JAD from an auto test suite, * so make sure the status to OK, the native * code will run the last suite. */ state.status = CommandState.OK; } } state.save(); // Finalize JSR subsystems JSRInitializer.cleanup(); } /** Gracefully terminates VM with proper return code */ protected void exitLoader() { /* Return specific non-zero number so the native AMS code can * know that this is graceful exit and not VM abort. */ CommandState.exitInternal(CommandState.MAIN_EXIT); } /** * Displays an exception message to user * @param securityToken security token for displaying System Alert. * @param exceptionMsg the message text */ protected void displayException(SecurityToken securityToken, String exceptionMsg) { MIDletSuiteUtils.displayException(internalSecurityToken, exceptionMsg); } /** * Updates CommandState status and displays proper * exception message to user * * @param errorCode generic error code * @param details text with error details */ protected void reportError(int errorCode, String details) { state.status = errorCode; // Initialize display alerts state on first error handling if (disableAlerts < 0) { disableAlerts = Configuration.getIntProperty( "DisableStartupErrorAlert", 0); } int msgId = getErrorMessageId(errorCode); String errorMsg = Resource.getString(msgId); if (details != null) { errorMsg += "\n\n" + details; } if (disableAlerts == 0) { displayException(internalSecurityToken, errorMsg); } // Error message is always obtained for logging if (Logging.REPORT_LEVEL <= Logging.ERROR) { Logging.report(Logging.ERROR, LogChannels.LC_CORE, errorMsg); } } /** * Called at the initial start of the VM. * Initializes internal security and any other AMS classes related * classes before starting the MIDlet. * * @param args not used, * a {@link CommandState} object is obtained and * used for arguments */ public static void main(String args[]) { try { MIDletSuiteLoader loader = new MIDletSuiteLoader(); /** * The following call has no effect until both USE_WTK_DEBUG * and USE_MULTIPLE_ISOLATES are true. */ DebugUtil.attachDebugger(); loader.runMIDletSuite(); } catch (Throwable t) { t.printStackTrace(); } } /** * Creates class instance and gets suite parameters * from the persistent {@link CommandState} object. */ private MIDletSuiteLoader() { // Restore command state transfered to MIDlet suite loader state = CommandState.getCommandState(); // Init internal state from the restored command state externalAppId = 0; midletDisplayName = null; args = new String[] { state.arg0, state.arg1, state.arg2}; suiteId = state.suiteId; midletClassName = state.midletClassName; // Release command state argument references state.arg0 = null; state.arg1 = null; state.arg2 = null; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?