001: /*
002: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
004: *
005: * This program is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU General Public License version
007: * 2 only, as published by the Free Software Foundation.
008: *
009: * This program is distributed in the hope that it will be useful, but
010: * WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * General Public License version 2 for more details (a copy is
013: * included at /legal/license.txt).
014: *
015: * You should have received a copy of the GNU General Public License
016: * version 2 along with this work; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
018: * 02110-1301 USA
019: *
020: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
021: * Clara, CA 95054 or visit www.sun.com if you need additional
022: * information or have any questions.
023: */
024:
025: package com.sun.midp.jump.installer;
026:
027: import java.io.ByteArrayOutputStream;
028: import java.io.IOException;
029: import javax.microedition.io.ConnectionNotFoundException;
030: import javax.microedition.io.Connector;
031: import com.sun.midp.configurator.Constants;
032: import com.sun.midp.installer.InvalidJadException;
033: import com.sun.midp.io.j2me.storage.RandomAccessStream;
034: import com.sun.midp.midletsuite.MIDletSuiteLockedException;
035: import com.sun.midp.security.SecurityToken;
036: import com.sun.midp.jump.installer.JUMPInstallerInterface;
037:
038: /**
039: * An Installer allowing to install a midlet suite from a file.
040: * If the midlet suite is given by a descriptor file, the jar
041: * URL specified in the descriptor must have a "file" scheme.
042: */
043: public class JUMPFileInstaller extends JUMPInstaller implements
044: JUMPInstallerInterface {
045:
046: /** Number of bytes to read at one time when copying a file. */
047: private static final int CHUNK_SIZE = 10 * 1024;
048:
049: /**
050: * Downloads an application descriptor file from the given URL.
051: *
052: * @return a byte array representation of the file or null if not found
053: *
054: * @exception IOException is thrown if any error prevents the download
055: * of the JAD
056: */
057: protected byte[] downloadJAD() throws IOException {
058: RandomAccessStream jadInputStream;
059: ByteArrayOutputStream bos = new ByteArrayOutputStream(
060: CHUNK_SIZE);
061: String jadFilename = getUrlPath(state.localJadUrl);
062:
063: state.beginTransferDataStatus = DOWNLOADING_JAD;
064: state.transferStatus = DOWNLOADED_1K_OF_JAD;
065:
066: jadInputStream = new RandomAccessStream();
067: jadInputStream.connect(jadFilename, Connector.READ);
068:
069: transferData(jadInputStream.openInputStream(), bos, CHUNK_SIZE);
070:
071: jadInputStream.close();
072:
073: return bos.toByteArray();
074: }
075:
076: /**
077: * Downloads an application archive file from the given URL into the
078: * given file. Automatically handle re-tries.
079: *
080: * @param filename name of the file to write. This file resides
081: * in the storage area of the given application
082: *
083: * @return size of the JAR
084: *
085: * @exception IOException is thrown if any error prevents the download
086: * of the JAR
087: */
088: protected int downloadJAR(String filename) throws IOException {
089: int jarSize;
090: RandomAccessStream jarInputStream, jarOutputStream;
091: String jarFilename = getUrlPath(state.localJarUrl);
092:
093: // Open source (jar) file
094: jarInputStream = new RandomAccessStream();
095: jarInputStream.connect(jarFilename, Connector.READ);
096:
097: // Open destination (temporary) file
098: jarOutputStream = new RandomAccessStream();
099: jarOutputStream.connect(filename,
100: RandomAccessStream.READ_WRITE_TRUNCATE);
101:
102: // transfer data
103: state.beginTransferDataStatus = DOWNLOADING_JAR;
104: state.transferStatus = DOWNLOADED_1K_OF_JAR;
105:
106: jarSize = transferData(jarInputStream.openInputStream(),
107: jarOutputStream.openOutputStream(), CHUNK_SIZE);
108:
109: jarInputStream.close();
110:
111: return jarSize;
112: }
113:
114: /**
115: * Compares two URLs for equality in sense that they have the same
116: * scheme, host and path.
117: *
118: * @param url1 the first URL for comparision
119: * @param url2 the second URL for comparision
120: *
121: * @return true if the scheme, host and path of the first given url
122: * is identical to the scheme, host and path of the second
123: * given url; false otherwise
124: */
125: protected boolean isSameUrl(String url1, String url2) {
126: try {
127: String defaultScheme = "file";
128: String scheme1 = getUrlScheme(url1, defaultScheme);
129: String scheme2 = getUrlScheme(url2, defaultScheme);
130:
131: if (url1.equals(url2)) {
132: return true;
133: }
134: } catch (NullPointerException npe) {
135: // no match, fall through
136: }
137:
138: return true;
139: }
140:
141: /**
142: * Stops the installation. If installer is not installing then this
143: * method has no effect. This will cause the install method to
144: * throw an IOException if the install is not writing the suite
145: * to storage which is the point of no return.
146: *
147: * @return true if the install will stop, false if it is too late
148: */
149: public boolean stopInstalling() {
150:
151: boolean res = super .stopInstalling();
152: if (!res) {
153: return res;
154: }
155:
156: /* some additional actions can be added here */
157:
158: return true;
159: }
160:
161: public int verifyAndStoreSuite(String jadSourceUrl,
162: String encoding, String tempJadFileName,
163: String tempJarFileName, boolean isUpdate)
164: throws IOException, InvalidJadException,
165: MIDletSuiteLockedException, SecurityException {
166:
167: return installJad(jadSourceUrl, tempJadFileName,
168: tempJarFileName, encoding,
169: Constants.INTERNAL_STORAGE_ID, isUpdate, false, null);
170: }
171:
172: public int verifyAndStoreSuite(String jarSourceUrl,
173: String tempJarFileName, String suiteName, boolean isUpdate)
174: throws IOException, InvalidJadException,
175: MIDletSuiteLockedException, SecurityException {
176:
177: return installJar(jarSourceUrl, tempJarFileName, suiteName,
178: Constants.INTERNAL_STORAGE_ID, isUpdate, false, null);
179: }
180: }
|