cdcmidletsuiteloader.java

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

JAVA
487
字号
/* * * * 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 javax.microedition.io.ConnectionNotFoundException;import javax.microedition.lcdui.Displayable;import javax.microedition.midlet.MIDlet;import com.sun.j2me.security.AccessController;import com.sun.midp.log.*;import com.sun.midp.configurator.Constants;import com.sun.midp.installer.InternalMIDletSuiteImpl;import com.sun.midp.lcdui.*;import com.sun.midp.midlet.*;import com.sun.midp.midletsuite.*;import com.sun.midp.security.*;import com.sun.midp.rms.RmsEnvironment;/** * 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. */public class CdcMIDletSuiteLoader extends AbstractMIDletSuiteLoader    implements ForegroundController, MIDletStateListener,    PlatformRequest {    /** Disable startup error alerts, uninitialized by default */    protected int disableAlerts = -1;    /** Holds the ID of the current display, for preempting purposes. */    protected int currentDisplayId;    /**     * Called at the initial start of the VM.     * Initializes internal security and any other AMS classes related     * classes before starting the MIDlet.     *     *     * @param args arg[0] the suite ID (-1=rommized MIDlet),     *             arg[1] the class name of the MIDlet,     *             arg[2-n] optional MIDlet args, the first labled arg-0,     *             then second arg-1, etc     */    public static void main(String args[]) {        try {            CDCInit.init();            CdcMIDletSuiteLoader loader = new CdcMIDletSuiteLoader();            if (args.length < 1) {                System.err.println("The suite ID for the " +                                   "MIDlet suite was not given");                throw new IllegalArgumentException("Suite ID absent");            }            try {                loader.suiteId = Integer.parseInt(args[0]);            } catch (Throwable t) {                throw new                    IllegalArgumentException("Suite ID: " + t.getMessage());            }                        if (args.length < 2) {                System.err.println("The class name for the " +                                   "MIDlet was not given");                throw new                    IllegalArgumentException("MIDlet class name absent.");            }            loader.midletClassName = args[1];            int numberOfSuiteArgs = args.length - 2;            if (numberOfSuiteArgs > 0) {                loader.args = new String[numberOfSuiteArgs];                for (int i = 0; i < numberOfSuiteArgs; i++) {                    loader.args[i] = args[i + 2];                }            }            loader.runMIDletSuite();        } catch (Throwable t) {            t.printStackTrace();        }    }    /**     * Extends base class initialization with initializatons     * specific for the AMS task     */    protected void init() {        super.init();    }    /** Creates environment objects needed to AMS task */    protected void createSuiteEnvironment() {        foregroundController = this;        lcduiEnvironment = new LCDUIEnvironmentForCDC(internalSecurityToken, 						      eventQueue, isolateId, 						      foregroundController);        // creates display container, needs foregroundController        super.createSuiteEnvironment();        midletStateHandler =            MIDletStateHandler.getMidletStateHandler();        MIDletSuiteStorage mss =            MIDletSuiteStorage.getMIDletSuiteStorage(internalSecurityToken);        midletStateHandler.initMIDletStateHandler(            internalSecurityToken,            this,            new CdcMIDletLoader(mss),            this);               MidletSuiteContainer msc = new MidletSuiteContainer(mss);              RmsEnvironment.init( internalSecurityToken, msc);     }    /**     * 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();        externalAppId = 0;        midletDisplayName = null;        /* Set up permission checking for this suite. */        AccessController.setAccessControlContext(            new CdcAccessControlContext(midletSuite));    }    /**     * Creates MIDlet suite instance by suite ID     *     * @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 MIDletSuite createMIDletSuite() throws Exception {        MIDletSuiteStorage storage;        MIDletSuite suite = null;        if (suiteId == MIDletSuite.INTERNAL_SUITE_ID) {            // assume a class name of a MIDlet in the classpath            suite = InternalMIDletSuiteImpl.create(midletDisplayName, suiteId);        } else {            storage = MIDletSuiteStorage.                getMIDletSuiteStorage(internalSecurityToken);            suite = storage.getMIDletSuite(suiteId, false);            Logging.initLogSettings(suiteId);        }        return suite;    }    /** Gracefully terminates VM with proper return code */    protected void exitLoader() {        System.exit(0);    }    /**     * Displays an exception message to user     * @param exceptionMsg the message text     */    protected void displayException(String exceptionMsg) {        System.err.println(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) {        String errorMsg = getErrorMessage(errorCode);        if (details != null) {            errorMsg += "\n\n" + details;        }        displayException(errorMsg);        // Error message is always obtained for logging        if (Logging.REPORT_LEVEL <= Logging.ERROR) {            Logging.report(Logging.ERROR, LogChannels.LC_CORE, errorMsg);        }    }    /**     * Handles exceptions happened during MIDlet suite execution.     * @param t exception instance     */    public void handleException(Throwable t) {        t.printStackTrace();        int errorCode = getErrorCode(t);        if (Logging.TRACE_ENABLED) {            Logging.trace(t,                "Exception caught in CdcMIDletSuiteLoader");        }        reportError(errorCode, t.getMessage());    }    /**     * Gets AMS error message by generic error code.     *     * @param errorCode generic error code     * @return error message     */    static protected String getErrorMessage(int errorCode) {        switch (errorCode) {            case Constants.MIDLET_SUITE_DISABLED:                return "MIDlet suite dispabled.";            case Constants.MIDLET_SUITE_NOT_FOUND:                return "MIDlet suite not found.";            case Constants.MIDLET_CLASS_NOT_FOUND:                return "MIDlet class not found.";            case Constants.MIDLET_INSTANTIATION_EXCEPTION:                return "Cannot launch MIDlet due to illegal operation.";            case Constants.MIDLET_ILLEGAL_ACCESS_EXCEPTION:                return "Cannot launch MIDlet due to illegal operation.";            case Constants.MIDLET_OUT_OF_MEM_ERROR:                return "Out of memory";        }        return "MIDlet suite has unexpectedly quit.";    }    /**     * Gets error code by exception type     *     * @param t exception instance     * @return error code     */    static protected int getErrorCode(Throwable t) {        if (t instanceof ClassNotFoundException) {            return Constants.MIDLET_CLASS_NOT_FOUND;        } else if (t instanceof InstantiationException) {            return Constants.MIDLET_INSTANTIATION_EXCEPTION;        } else if (t instanceof IllegalAccessException) {            return Constants.MIDLET_ILLEGAL_ACCESS_EXCEPTION;        } else if (t instanceof OutOfMemoryError) {            return Constants.MIDLET_OUT_OF_MEM_ERROR;        } else if (t instanceof MIDletSuiteLockedException) {            return Constants.MIDLET_INSTALLER_RUNNING;        } else {            return Constants.MIDLET_CONSTRUCTOR_FAILED;        }    }    // MIDletStateListener    /**     * Called before a MIDlet is created.     * This implementation does nothing.     *     * @param suite reference to the loaded suite     * @param className class name of the MIDlet to be created     */    public void midletPreStart(MIDletSuite suite, String className) {    }    /**     * Called after a MIDlet is successfully created.     * This implementation does nothing.     *     * @param suite reference to the loaded suite     * @param className Class name of the MIDlet     * @param externalAppId ID of given by an external application manager     */    public void midletCreated(MIDletSuite suite, String className,                              int externalAppId) {    }    /**     * Called before a MIDlet is activated.     * This implementation does nothing.     *     * @param suite reference to the loaded suite     * @param className class name of the MIDlet     */    public void preActivated(MIDletSuite suite, String className) {    }    /**     * Called after a MIDlet is successfully activated. This is after     * the startApp method is called.     * This implementation does nothing.     *     * @param suite reference to the loaded suite     * @param midlet reference to the MIDlet     */    public void midletActivated(MIDletSuite suite, MIDlet midlet) {    }    /**     * Called after a MIDlet is successfully paused.     * This implementation does nothing.     *     * @param suite reference to the loaded suite     * @param className class name of the MIDlet     */    public void midletPaused(MIDletSuite suite, String className) {    }    /**     * Called after a MIDlet pauses itself. In this case pauseApp has     * not been called.     *     * @param suite reference to the loaded suite     * @param className class name of the MIDlet     */    public void midletPausedItself(MIDletSuite suite, String className) {    }    /**     * Called when a MIDlet calls MIDlet resume request.     *     * @param suite reference to the loaded suite     * @param className class name of the MIDlet     */    public void resumeRequest(MIDletSuite suite, String className) {        MIDletEventConsumer mec =            midletStateHandler.getMIDletEventConsumer(internalSecurityToken,                                                      className);        if (mec == null) {            return;        }        mec.handleMIDletActivateEvent();    }    /**     * Called after a MIDlet is successfully destroyed.     * This implementation does nothing.     *     * @param suite reference to the loaded suite     * @param className class name of the MIDlet     * @param midlet reference to the MIDlet, null if the MIDlet's constructor     *               was not successful     */    public void midletDestroyed(MIDletSuite suite, String className,                                MIDlet midlet) {        if (midlet != null) {            displayContainer.removeDisplaysByOwner(midlet);        }    }    // ForegroundController    /**     * Called to register a newly create Display. Must method must     * be called before the other methods can be called.     * This implementation does nothing.     *     * @param displayId ID of the Display     * @param ownerClassName Class name of the  that owns the display     *     * @return a place holder displayable to used when "getCurrent()==null",     *         if null is returned an empty form is used     */    public Displayable registerDisplay(int displayId, String ownerClassName) {        currentDisplayId = displayId;        return null;    }    /**     * Called to request the foreground.     * This implementation does nothing.     *     * @param displayId ID of the Display     * @param isAlert true if the current displayable is an Alert     */    public void requestForeground(int displayId, boolean isAlert) {        ForegroundEventConsumer fc =            displayContainer.findForegroundEventConsumer(displayId);        if (fc == null) {            return;        }        NativeForegroundState.setState(internalSecurityToken, displayId);        fc.handleDisplayForegroundNotifyEvent();    }    /**     * Called to request the background.     * This implementation does nothing.     *     * @param displayId ID of the Display     */    public void requestBackground(int displayId) {        ForegroundEventConsumer fc =            displayContainer.findForegroundEventConsumer(displayId);        if (fc == null) {            return;        }        fc.handleDisplayBackgroundNotifyEvent();    }    /**     * Called to start preempting. The given display will preempt all other     * displays for this isolate.     *     * @param displayId ID of the Display     */    public void startPreempting(int displayId) {        requestBackground(currentDisplayId);        requestForeground(displayId, true);    }    /**     * Called to end preempting.     *     * @param displayId ID of the Display     */    public void stopPreempting(int displayId) {        requestBackground(displayId);        requestForeground(currentDisplayId, false);    }    // Platform Request    /*     * This is empty.     *     * @param URL The URL for the platform to load.     *     * @return true if the MIDlet suite MUST first exit before the     * content can be fetched.     *     * @exception ConnectionNotFoundException if     * the platform cannot handle the URL requested.     *     */    public boolean dispatch(String URL) throws ConnectionNotFoundException {        throw new ConnectionNotFoundException("not implemented");    }}

⌨️ 快捷键说明

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