abstractmidletsuiteloader.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 335 行

JAVA
335
字号
/* * 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.midlet.*;import com.sun.midp.security.*;import com.sun.midp.events.EventQueue;import com.sun.midp.lcdui.*;import com.sun.midp.configurator.Constants;import com.sun.midp.log.*;import com.sun.midp.installer.InternalMIDletSuiteImpl;/** * The class presents abstract MIDlet suite loader with routines to prepare * runtime environment for a suite execution. The class provides generic * scenario to load, start and terminate a MIDlet suite in the common way * for both SVM and MVM modes. All the differences of SVM & MVM modes are * designed as virtual or abstract methods. */abstract class AbstractMIDletSuiteLoader	implements MIDletSuiteExceptionListener {    /** The ID of the MIDlte suite task Isolate */    protected int isolateId;    /** The ID of the AMS task Isolate */    protected int amsIsolateId;    /** Suite ID of the MIDlet suite */    protected int suiteId;    /** External application ID that can be provided by native AMS */    protected int externalAppId;    /** Name of the class to start MIDlet suite execution */    protected String midletClassName;    /** Display name of a MIDlet suite */    protected String midletDisplayName;    /** The arguments to start MIDlet suite with */    protected String args[];    /**     * Inner class to request security token from SecurityInitializer.     * SecurityInitializer should be able to check this inner class name.     */    static private class SecurityTrusted implements ImplicitlyTrustedClass {}    /** This class has a different security domain than the MIDlet suite */    protected static SecurityToken internalSecurityToken =        SecurityInitializer.requestToken(new SecurityTrusted());    /** Event queue instance created for this MIDlet suite execution */    protected EventQueue eventQueue;    /**     * MIDlet suite instance created and properly initialized for     * a MIDlet suite invocation.     */    protected MIDletSuite midletSuite;    /** Foreground Controller adapter. */    protected ForegroundController foregroundController;    /** Stores array of active displays for a MIDlet suite isolate. */    protected DisplayContainer displayContainer;    /**     * Provides interface to lcdui environment.     */    protected LCDUIEnvironment lcduiEnvironment;    /** Starts and controls MIDlets through the lifecycle states. */    protected MIDletStateHandler midletStateHandler;    /**     * Reports an error detected during MIDlet suite invocation.     * @param errorCode the error code to report     */    protected abstract void reportError(int errorCode, String details);        /**     * Reports an error detected during MIDlet suite invocation.     * @param errorCode the error code to report     */    protected void reportError(int errorCode) {        reportError(errorCode, null);    }    /**     * Allocates resources for a suite execution according to     * global resource policy.     *     * @return true in the case resources were successfully allocated,     *   false otherwise     */    protected boolean allocateReservedResources() {        return true;    }    /**     * Sets MIDlet suite arguments as temporary suite properties.     * Subclasses can override the method to export any other needed     * suite properties.     */    protected void setSuiteProperties() {        if (args != null) {            for (int i = 0; i < args.length; i++) {                if (args[i] != null) {                    midletSuite.setTempProperty(                        internalSecurityToken,                        "arg-" + i, args[i]);                }            }        }    }    /** Core initialization of a MIDlet suite loader */    protected void init() {        // Init security tokens for core subsystems        SecurityInitializer.initSystem();        eventQueue = EventQueue.getEventQueue(            internalSecurityToken);    }    /** Final actions to finish a MIDlet suite loader */    protected void done() {        eventQueue.shutdown();    }    /**     * Creates all needed objects of a MIDlet suite environment, but     * only initialization that is done, will be to pass other created objects,     * and the current and AMS isolate IDs. It is mostly event-related     * objects, however subclasses can extend the environment with more     * specific parts     */    protected void createSuiteEnvironment() {	if (lcduiEnvironment == null) {	    throw new		RuntimeException("Suite environment not complete.");	}        displayContainer = lcduiEnvironment.getDisplayContainer();    }    /**     * Does all initialization for already created objects of a MIDlet suite     * environment. Subclasses can also extend the initialization with     * various global system initializations needed for all suites.     * The MIDlet suite has been created at this point, so it can be     * used to initialize any per suite data.     */    protected void initSuiteEnvironment() {        lcduiEnvironment.setTrustedState(midletSuite.isTrusted());    }    /**     * Handles exception occurred during MIDlet suite execution.     * @param t exception instance     */    public abstract void handleException(Throwable t);    /** Restricts suite access to internal API */    protected void restrictAPIAccess() {        // IMPL_NOTE: No restrictions by default    }    /**     * Start MIDlet suite in the prepared environment     * @throws Exception can be thrown during execution     */    protected void startSuite() throws Exception {        if (suiteId == -1 && midletClassName.equals("internal")) {            // no class name, need to look for it in the JAD file            midletClassName =                 ((InternalMIDletSuiteImpl)midletSuite).getMIDletClassName();        }        midletStateHandler.startSuite(            this, midletSuite, externalAppId, midletClassName);    }    /** Closes suite and unlock native suite locks */    protected void closeSuite() {        if (midletSuite != null) {            /* When possible, don't wait for the finalizer             * to unlock the suite. */            midletSuite.close();        }        if (lcduiEnvironment != null) {            lcduiEnvironment.shutDown();        }    }    /**     * Checks whether an executed MIDlet suite has requested     * for a system shutdown. User MIDlets most probably have     * no right for it, however Java AMS MIDlet could do it.     */    protected void checkForShutdown() {        // IMPL_NOTE: No checks for shutdown by default    }    /**     * Explicitly requests suite loader exit after MIDlet     * suite execution is finished and created environment is done.     */    protected abstract void exitLoader();    /**     * Creates MIDlet suite instance by suite ID, the      *     * @return MIDlet suite to load     *     * @throws Exception in the case MIDlet suite can not be     *   created because of a security reasons or some problems     *   related to suite storage     */    protected abstract MIDletSuite createMIDletSuite() throws Exception;    /**     * Inits MIDlet suite runtime environment and start a MIDlet     * suite with it     */    protected void runMIDletSuite() {        // WARNING: Don't add any calls before this!        //        // The core init of a MIDlet suite task should be able        // to perform the very first initializations of the environment        init();        try {            /*             * Prepare MIDlet suite environment, classes that only need             * the isolate ID can be created here.             */            createSuiteEnvironment();            /* Check to see that all of the core object are created. */            if (foregroundController == null ||                displayContainer == null ||                midletStateHandler == null) {                throw new                    RuntimeException("Suite environment not complete.");	    }            // Regard resource policy for the suite task            if (!allocateReservedResources()) {                reportError(Constants.MIDLET_RESOURCE_LIMIT);                return;            }                      // Create suite instance ready for start            midletSuite = createMIDletSuite();            if (midletSuite == null) {                reportError(Constants.MIDLET_SUITE_NOT_FOUND);                return;            }            if (!midletSuite.isEnabled()) {                reportError(Constants.MIDLET_SUITE_DISABLED);                return;            }            /*             * Now that we have the suite and reserved its resources             * we can initialize any classes that need MIDlet Suite             * information.             */            initSuiteEnvironment();            // Export suite arguments as properties, so well            // set any other properties to control a suite            setSuiteProperties();            // Restrict suite access to internal API            restrictAPIAccess();            if (Logging.REPORT_LEVEL <= Logging.WARNING) {                Logging.report(Logging.WARNING, LogChannels.LC_CORE,                    "MIDlet suite task starting a suite");            }            // Blocking call to start MIDlet suite            // in the prepared environment            startSuite();            // Check for shutdown possibly requested from the suite            checkForShutdown();            if (Logging.REPORT_LEVEL <= Logging.WARNING) {                Logging.report(Logging.INFORMATION, LogChannels.LC_CORE,                    "MIDlet suite loader exiting");            }        } catch (Throwable t) {           handleException(t);        } finally {            closeSuite();            done();            exitLoader();        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?