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