Index: mojo/runner/android/apk/src/org/chromium/mojo/shell/FileHelper.java |
diff --git a/mojo/runner/android/apk/src/org/chromium/mojo/shell/FileHelper.java b/mojo/runner/android/apk/src/org/chromium/mojo/shell/FileHelper.java |
deleted file mode 100644 |
index a6d814ed834fec3a4680a7ebd528c9fda2d0e051..0000000000000000000000000000000000000000 |
--- a/mojo/runner/android/apk/src/org/chromium/mojo/shell/FileHelper.java |
+++ /dev/null |
@@ -1,257 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-package org.chromium.mojo.shell; |
- |
-import android.content.Context; |
-import android.content.pm.PackageInfo; |
-import android.content.pm.PackageManager; |
- |
-import org.chromium.base.Log; |
- |
-import java.io.BufferedInputStream; |
-import java.io.BufferedOutputStream; |
-import java.io.BufferedReader; |
-import java.io.File; |
-import java.io.FileInputStream; |
-import java.io.FileNotFoundException; |
-import java.io.FileOutputStream; |
-import java.io.IOException; |
-import java.io.InputStream; |
-import java.io.InputStreamReader; |
-import java.io.OutputStream; |
-import java.nio.charset.Charset; |
-import java.util.ArrayList; |
-import java.util.List; |
-import java.util.zip.ZipEntry; |
-import java.util.zip.ZipInputStream; |
- |
-/** |
- * Helper methods for file extraction from APK assets and zip archives. |
- */ |
-class FileHelper { |
- public static final String TAG = "MojoFileHelper"; |
- |
- // Size of the buffer used in streaming file operations. |
- private static final int BUFFER_SIZE = 1024 * 1024; |
- // Prefix used when naming temporary files. |
- private static final String TEMP_FILE_PREFIX = "temp-"; |
- // Prefix used when naming timestamp files. |
- private static final String TIMESTAMP_PREFIX = "asset_timestamp-"; |
- // Name of the file listing assets to extract with one asset file per line. |
- private static final String ASSETS_LIST_NAME = "assets_list"; |
- // Directory where applications cached with the shell will be extracted. |
- private static final String CACHED_APP_DIRECTORY = "cached_apps"; |
- |
- /** |
- * Used to indicate the type of destination file that should be created. |
- */ |
- public enum FileType { |
- TEMPORARY, |
- PERMANENT, |
- } |
- |
- public enum ArchiveType { |
- /** |
- * The archive was created for a content handler (contains the mojo escape sequence). |
- */ |
- CONTENT_HANDLER, |
- NORMAL, |
- } |
- |
- /** |
- * Looks for a timestamp file on disk that indicates the version of the APK that the resource |
- * assets were extracted from. Returns null if a timestamp was found and it indicates that the |
- * resources match the current APK. Otherwise returns the file to create. |
- */ |
- private static File findAssetTimestamp(Context context, File outputDir) { |
- PackageManager pm = context.getPackageManager(); |
- PackageInfo pi = null; |
- |
- try { |
- pi = pm.getPackageInfo(context.getPackageName(), 0); |
- } catch (PackageManager.NameNotFoundException e) { |
- } |
- |
- if (pi == null) { |
- return new File(outputDir, TIMESTAMP_PREFIX); |
- } |
- |
- final File expectedTimestamp = |
- new File(outputDir, TIMESTAMP_PREFIX + pi.versionCode + "-" + pi.lastUpdateTime); |
- return expectedTimestamp.exists() ? null : expectedTimestamp; |
- } |
- |
- /** |
- * Returns the directory where cached applications will be extracted. |
- */ |
- public static File getCachedAppsDir(Context context) { |
- return context.getDir(CACHED_APP_DIRECTORY, Context.MODE_PRIVATE); |
- } |
- |
- /** |
- * Returns the names of the assets in ASSETS_LIST_NAME. |
- */ |
- public static List<String> getAssetsList(Context context) throws IOException { |
- List<String> results = new ArrayList<String>(); |
- BufferedReader reader = new BufferedReader(new InputStreamReader( |
- context.getAssets().open(ASSETS_LIST_NAME), Charset.forName("UTF-8"))); |
- |
- try { |
- String line; |
- while ((line = reader.readLine()) != null) { |
- line = line.trim(); |
- // These two are read by the system and don't need to be extracted. |
- if (!line.isEmpty() && !line.equals("bootstrap_java.dex.jar") |
- && !line.equals("libbootstrap.so")) { |
- results.add(line); |
- } |
- } |
- } finally { |
- reader.close(); |
- } |
- return results; |
- } |
- |
- /** |
- * Invoke prior to extracting any assets into {@code directory}. If necessary deletes all the |
- * files in the specified directory. The return value must be supplied to {@link |
- *createTimestampIfNecessary}. |
- * |
- * @param directory directory assets will be extracted to |
- * @return non-null if a file with the specified name needs to be created after assets have |
- * been extracted. |
- */ |
- public static File prepareDirectoryForAssets(Context context, File directory) { |
- final File timestamp = findAssetTimestamp(context, directory); |
- if (timestamp == null) { |
- return null; |
- } |
- for (File child : directory.listFiles()) { |
- deleteRecursively(child); |
- } |
- return timestamp; |
- } |
- |
- /** |
- * Creates a file used as a timestamp. The supplied file comes from {@link |
- *prepareDirectoryForAssets}. |
- * |
- * @param timestamp path of file to create, or null if a file does not need to be created |
- */ |
- public static void createTimestampIfNecessary(File timestamp) { |
- if (timestamp == null) { |
- return; |
- } |
- try { |
- timestamp.createNewFile(); |
- } catch (IOException e) { |
- // In the worst case we don't write a timestamp, so we'll re-extract the asset next |
- // time. |
- Log.w(TAG, "Failed to write asset timestamp!"); |
- } |
- } |
- |
- public static File extractFromAssets(Context context, String assetName, File outputDirectory, |
- FileType fileType) throws IOException, FileNotFoundException { |
- File outputFile; |
- if (fileType == FileType.TEMPORARY) { |
- // Make the original filename part of the temp file name. |
- // TODO(ppi): do we need to sanitize the suffix? |
- String suffix = "-" + assetName; |
- outputFile = File.createTempFile(TEMP_FILE_PREFIX, suffix, outputDirectory); |
- } else { |
- outputFile = new File(outputDirectory, assetName); |
- if (outputFile.exists()) { |
- return outputFile; |
- } |
- outputFile.getParentFile().mkdirs(); |
- } |
- |
- BufferedInputStream inputStream = new BufferedInputStream( |
- context.getAssets().open(assetName)); |
- try { |
- writeStreamToFile(inputStream, outputFile); |
- } finally { |
- inputStream.close(); |
- } |
- return outputFile; |
- } |
- |
- /** |
- * Extracts the file of the given extension from the archive. Throws FileNotFoundException if no |
- * matching file is found. |
- * |
- * @return path of extracted file |
- */ |
- static File extractFromArchive(File archive, String suffixToMatch, File outputDirectory, |
- FileType fileType, ArchiveType archiveType) throws IOException, FileNotFoundException { |
- if (!outputDirectory.exists() && !outputDirectory.mkdirs()) { |
- Log.e(TAG, "extractFromArchive unable to create directory " |
- + outputDirectory.getAbsolutePath()); |
- throw new FileNotFoundException(); |
- } |
- |
- BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(archive)); |
- if (archiveType == ArchiveType.CONTENT_HANDLER) { |
- int currentChar; |
- do { |
- currentChar = inputStream.read(); |
- } while (currentChar != -1 && currentChar != '\n'); |
- if (currentChar == -1) { |
- throw new FileNotFoundException(); |
- } |
- inputStream = new BufferedInputStream(inputStream); |
- } |
- ZipInputStream zip = new ZipInputStream(inputStream); |
- ZipEntry entry; |
- while ((entry = zip.getNextEntry()) != null) { |
- if (entry.getName().endsWith(suffixToMatch)) { |
- // TODO(sky): sanitize name. |
- final String name = new File(entry.getName()).getName(); |
- File extractedFile; |
- // Make the original filename part of the temp file name. |
- if (fileType == FileType.TEMPORARY) { |
- final String suffix = "-" + name; |
- extractedFile = File.createTempFile(TEMP_FILE_PREFIX, suffix, outputDirectory); |
- } else { |
- extractedFile = new File(outputDirectory, name); |
- } |
- writeStreamToFile(zip, extractedFile); |
- zip.close(); |
- return extractedFile; |
- } |
- } |
- zip.close(); |
- throw new FileNotFoundException(); |
- } |
- |
- /** |
- * Deletes a file or directory. Directory will be deleted even if not empty. |
- */ |
- static void deleteRecursively(File file) { |
- if (file.isDirectory()) { |
- for (File child : file.listFiles()) { |
- deleteRecursively(child); |
- } |
- } |
- if (!file.delete()) { |
- Log.w(TAG, "Unable to delete file: " + file.getAbsolutePath()); |
- } |
- } |
- |
- private static void writeStreamToFile(InputStream inputStream, File outputFile) |
- throws IOException { |
- byte[] buffer = new byte[BUFFER_SIZE]; |
- OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); |
- try { |
- int read; |
- while ((read = inputStream.read(buffer, 0, BUFFER_SIZE)) > 0) { |
- outputStream.write(buffer, 0, read); |
- } |
- } finally { |
- outputStream.close(); |
- } |
- } |
-} |