1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.cf.direct; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.FileUtils; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ByteArrayOutputStream; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.InputStream; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.zip.ZipFile; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.zip.ZipEntry; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Comparator; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Collections; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Opens all the class files found in a class path element. Path elements 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * can point to class files, {jar,zip,apk} files, or directories containing 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class files. 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class ClassPathOpener { 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} pathname to start with */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final String pathname; 4199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} callback interface */ 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final Consumer consumer; 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If true, sort such that classes appear before their inner 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * classes and "package-info" occurs before all other classes in that 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * package. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final boolean sort; 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 5199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Callback interface for {@code ClassOpener}. 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public interface Consumer { 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Provides the file name and byte array for a class path element. 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 5899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param name {@code non-null;} filename of element. May not be a valid 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * filesystem path. 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 61dc86cd9edc8b80953c8b698a83cdaebf6825d798Jesse Wilson * @param lastModified milliseconds since 1970-Jan-1 00:00:00 GMT 6299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param bytes {@code non-null;} file data 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return true on success. Result is or'd with all other results 6499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * from {@code processFileBytes} and returned to the caller 6599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * of {@code process()}. 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 67dc86cd9edc8b80953c8b698a83cdaebf6825d798Jesse Wilson boolean processFileBytes(String name, long lastModified, byte[] bytes); 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Informs consumer that an exception occurred while processing 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this path element. Processing will continue if possible. 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param ex {@code non-null;} exception 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void onException(Exception ex); 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Informs consumer that processing of an archive file has begun. 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param file {@code non-null;} archive file being processed 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void onProcessArchiveStart(File file); 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param pathname {@code non-null;} path element to process 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param sort if true, sort such that classes appear before their inner 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * classes and "package-info" occurs before all other classes in that 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * package. 9299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param consumer {@code non-null;} callback interface 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ClassPathOpener(String pathname, boolean sort, Consumer consumer) { 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.pathname = pathname; 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.sort = sort; 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.consumer = consumer; 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Processes a path element. 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the OR of all return values 10499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * from {@code Consumer.processFileBytes()}. 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean process() { 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project File file = new File(pathname); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return processOne(file, true); 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Processes one file. 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param file {@code non-null;} the file to process 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param topLevel whether this is a top-level file (that is, 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specified directly on the commandline) 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return whether any processing actually happened 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean processOne(File file, boolean topLevel) { 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (file.isDirectory()) { 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return processDirectory(file, topLevel); 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String path = file.getPath(); 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (path.endsWith(".zip") || 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project path.endsWith(".jar") || 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project path.endsWith(".apk")) { 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return processArchive(file); 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] bytes = FileUtils.readFile(file); 135dc86cd9edc8b80953c8b698a83cdaebf6825d798Jesse Wilson return consumer.processFileBytes(path, file.lastModified(), bytes); 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (Exception ex) { 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project consumer.onException(ex); 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sorts java class names such that outer classes preceed their inner 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * classes and "package-info" preceeds all other classes in its package. 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 14699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param a {@code non-null;} first class name 14799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param b {@code non-null;} second class name 14899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code compareTo()}-style result 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static int compareClassNames(String a, String b) { 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Ensure inner classes sort second 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project a = a.replace('$','0'); 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b = b.replace('$','0'); 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Assuming "package-info" only occurs at the end, ensures package-info 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sorts first. 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project a = a.replace("package-info", ""); 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b = b.replace("package-info", ""); 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return a.compareTo(b); 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Processes a directory recursively. 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 16899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param dir {@code non-null;} file representing the directory 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param topLevel whether this is a top-level directory (that is, 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specified directly on the commandline) 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return whether any processing actually happened 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean processDirectory(File dir, boolean topLevel) { 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (topLevel) { 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dir = new File(dir, "."); 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project File[] files = dir.listFiles(); 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = files.length; 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean any = false; 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sort) { 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Arrays.sort(files, new Comparator<File>() { 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int compare(File a, File b) { 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return compareClassNames(a.getName(), b.getName()); 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }); 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < len; i++) { 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project any |= processOne(files[i], false); 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return any; 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 19899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Processes the contents of an archive ({@code .zip}, 19999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code .jar}, or {@code .apk}). 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 20199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param file {@code non-null;} archive file to process 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return whether any processing actually happened 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException on i/o problem 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean processArchive(File file) throws IOException { 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ZipFile zip = new ZipFile(file); 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ByteArrayOutputStream baos = new ByteArrayOutputStream(40000); 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buf = new byte[20000]; 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean any = false; 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 211de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro ArrayList<? extends java.util.zip.ZipEntry> entriesList 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project = Collections.list(zip.entries()); 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sort) { 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Collections.sort(entriesList, new Comparator<ZipEntry>() { 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int compare (ZipEntry a, ZipEntry b) { 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return compareClassNames(a.getName(), b.getName()); 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }); 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project consumer.onProcessArchiveStart(file); 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22441aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (ZipEntry one : entriesList) { 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (one.isDirectory()) { 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project continue; 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String path = one.getName(); 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InputStream in = zip.getInputStream(one); 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project baos.reset(); 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (;;) { 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int amt = in.read(buf); 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (amt < 0) { 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project baos.write(buf, 0, amt); 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project in.close(); 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] bytes = baos.toByteArray(); 245dc86cd9edc8b80953c8b698a83cdaebf6825d798Jesse Wilson any |= consumer.processFileBytes(path, one.getTime(), bytes); 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project zip.close(); 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return any; 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 252