FileDocCategorySizeDatePackage
CldcPlatformRequest.javaAPI DocphoneME MR2 API (J2ME)11705Wed May 02 18:00:06 BST 2007com.sun.midp.main

CldcPlatformRequest

public class CldcPlatformRequest extends Object implements com.sun.midp.midlet.PlatformRequest
Implements platform request functionality for CLDC platform.

Fields Summary
static final String
INSTALLER_CLASS
Class name of the installer use for plaformRequest.
static final String
JAD_MT
Media-Type for valid application descriptor files.
static final String
JAR_MT_1
Media-Type for valid Jar file.
static final String
JAR_MT_2
Media-Type for valid Jar file.
private com.sun.midp.security.SecurityToken
securityToken
This class has a different security domain than the application.
Constructors Summary
CldcPlatformRequest(com.sun.midp.security.SecurityToken token)
Initializes the security token for this object, so it can perform actions that a normal MIDlet Suite cannot.

param
token security token for this object


                                  
      
        securityToken = token;
    
Methods Summary
public booleandispatch(java.lang.String URL)
Requests that the device handle (e.g. display or install) the indicated URL.

If the platform has the appropriate capabilities and resources available, it SHOULD bring the appropriate application to the foreground and let the user interact with the content, while keeping the MIDlet suite running in the background. If the platform does not have appropriate capabilities or resources available, it MAY wait to handle the URL request until after the MIDlet suite exits. In this case, when the requesting MIDlet suite exits, the platform MUST then bring the appropriate application to the foreground to let the user interact with the content.

This is a non-blocking method. In addition, this method does NOT queue multiple requests. On platforms where the MIDlet suite must exit before the request is handled, the platform MUST handle only the last request made. On platforms where the MIDlet suite and the request can be handled concurrently, each request that the MIDlet suite makes MUST be passed to the platform software for handling in a timely fashion.

If the URL specified refers to a MIDlet suite (either an Application Descriptor or a JAR file), the request is interpreted as a request to install the named package. In this case, the platform's normal MIDlet suite installation process SHOULD be used, and the user MUST be allowed to control the process (including cancelling the download and/or installation). If the MIDlet suite being installed is an update of the currently running MIDlet suite, the platform MUST first stop the currently running MIDlet suite before performing the update. On some platforms, the currently running MIDlet suite MAY need to be stopped before any installations can occur.

If the URL specified is of the form tel:<number>, as specified in RFC2806, then the platform MUST interpret this as a request to initiate a voice call. The request MUST be passed to the "phone" application to handle if one is present in the platform.

Devices MAY choose to support additional URL schemes beyond the requirements listed above.

Many of the ways this method will be used could have a financial impact to the user (e.g. transferring data through a wireless network, or initiating a voice call). Therefore the platform MUST ask the user to explicitly acknowledge each request before the action is taken. Implementation freedoms are possible so that a pleasant user experience is retained. For example, some platforms may put up a dialog for each request asking the user for permission, while other platforms may launch the appropriate application and populate the URL or phone number fields, but not take the action until the user explicitly clicks the load or dial buttons.

return
true if the MIDlet suite MUST first exit before the content can be fetched.
param
URL The URL for the platform to load.
exception
ConnectionNotFoundException if the platform cannot handle the URL requested.

        if ("".equals(URL)) {
            if (Configuration.getIntProperty(
                    "useJavaInstallerForPlaformRequest", 0) != 0) {
                /*
                 * This is request to try to cancel the last request.
                 *
                 * If the next MIDlet to run is the installer then it can be
                 * cancelled.
                 */
                if (INSTALLER_CLASS.equals(
                    MIDletSuiteUtils.getNextMIDletToRun())) {
                    /*
                     * Try to cancel the installer midlet. Note this call only
                     * works now because suite are not run concurrently and
                     * must be queued to be run after this MIDlet is
                     * destroyed.
                     * This cancel code can be remove when the installer is
                     * runs concurrently with this suite.
                     */
                    MIDletSuiteUtils.execute(securityToken,
                        MIDletSuite.UNUSED_SUITE_ID, null, null);
                    return false;
                }
            }

            /*
             * Give the platform a chance to cancel the request.
             * Note: if the application was launched already this will
             * not have any effect.
             */
            dispatchPlatformRequest("");
            return false;
        }

        /*
         * Remove this "if", when not using the Installer MIDlet,
         * or the native installer will not be launched.
         */
        if (Configuration.getIntProperty(
                "useJavaInstallerForPlaformRequest", 0) != 0) {
            if (isMidletSuiteUrl(URL)) {
                return dispatchMidletSuiteUrl(URL);
            }
        }

        return dispatchPlatformRequest(URL);
    
private booleandispatchMidletSuiteUrl(java.lang.String url)
Dispatches the a JAD or JAD HTTP URL to the Graphical Installer.

param
url The URL to dispatch
return
true if the MIDlet suite MUST first exit before the content can be fetched.

        return MIDletSuiteUtils.executeWithArgs(securityToken,
            MIDletSuite.INTERNAL_SUITE_ID, INSTALLER_CLASS,
                "MIDlet Suite Installer", "I", url, null);
    
public final native booleandispatchPlatformRequest(java.lang.String url)
Passes the URL to the native handler.

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.

private booleanisMidletSuiteUrl(java.lang.String url)
Find out if the given URL is a JAD or JAR HTTP URL by performing a HTTP head request and checking the MIME type.

param
url The URL for to check
return
true if the URL points to a MIDlet suite

        Connection conn = null;
        HttpConnection httpConnection = null;
        String profile;
        int space;
        String configuration;
        String locale;
        int responseCode;
        String mediaType;

        try {
            conn = Connector.open(url, Connector.READ);
        } catch (IllegalArgumentException e) {
            return false;
        } catch (IOException e) {
            return false;
        }

        try {
            if (!(conn instanceof HttpConnection)) {
                // only HTTP or HTTPS are supported
                return false;
            }

            httpConnection = (HttpConnection)conn;

            httpConnection.setRequestMethod(HttpConnection.HEAD);

            httpConnection.setRequestProperty("Accept", "*/*");

            profile = System.getProperty("microedition.profiles");
            space = profile.indexOf(' ");
            if (space != -1) {
                profile = profile.substring(0, space);
            }

            configuration = System.getProperty("microedition.configuration");
            httpConnection.setRequestProperty("User-Agent",
                "Profile/" + profile + " Configuration/" + configuration);

            httpConnection.setRequestProperty("Accept-Charset",
                                              "UTF-8, ISO-8859-1");

            /* locale can be null */
            locale = System.getProperty("microedition.locale");
            if (locale != null) {
                httpConnection.setRequestProperty("Accept-Language", locale);
            }

            responseCode = httpConnection.getResponseCode();

            if (responseCode != HttpConnection.HTTP_OK) {
                return false;
            }

            mediaType = Util.getHttpMediaType(httpConnection.getType());
            if (mediaType == null) {
                return false;
            }

            if (mediaType.equals(JAD_MT) || mediaType.equals(JAR_MT_1) ||
                    mediaType.equals(JAR_MT_2)) {
                return true;
            }

            return false;
        } catch (IOException ioe) {
            return false;
        } finally {
            try {
                conn.close();
            } catch (Exception e) {
                if (Logging.REPORT_LEVEL <= Logging.WARNING) {
                    Logging.report(Logging.WARNING, LogChannels.LC_AMS,
                                  "Exception while closing  connection");
                }
            }
        }