ClassPathOpener.java revision 41aecd0a6bfea1e9a6713014b2b3d56fec8c552c
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 * 6199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param bytes {@code non-null;} file data 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return true on success. Result is or'd with all other results 6399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * from {@code processFileBytes} and returned to the caller 6499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * of {@code process()}. 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean processFileBytes(String name, byte[] bytes); 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Informs consumer that an exception occurred while processing 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this path element. Processing will continue if possible. 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param ex {@code non-null;} exception 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void onException(Exception ex); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Informs consumer that processing of an archive file has begun. 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 7999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param file {@code non-null;} archive file being processed 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void onProcessArchiveStart(File file); 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param pathname {@code non-null;} path element to process 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param sort if true, sort such that classes appear before their inner 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * classes and "package-info" occurs before all other classes in that 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * package. 9199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param consumer {@code non-null;} callback interface 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ClassPathOpener(String pathname, boolean sort, Consumer consumer) { 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.pathname = pathname; 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.sort = sort; 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.consumer = consumer; 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Processes a path element. 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the OR of all return values 10399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * from {@code Consumer.processFileBytes()}. 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean process() { 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project File file = new File(pathname); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return processOne(file, true); 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Processes one file. 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 11499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param file {@code non-null;} the file to process 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param topLevel whether this is a top-level file (that is, 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specified directly on the commandline) 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return whether any processing actually happened 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean processOne(File file, boolean topLevel) { 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (file.isDirectory()) { 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return processDirectory(file, topLevel); 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String path = file.getPath(); 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (path.endsWith(".zip") || 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project path.endsWith(".jar") || 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project path.endsWith(".apk")) { 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return processArchive(file); 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] bytes = FileUtils.readFile(file); 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return consumer.processFileBytes(path, bytes); 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (Exception ex) { 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project consumer.onException(ex); 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sorts java class names such that outer classes preceed their inner 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * classes and "package-info" preceeds all other classes in its package. 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 14599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param a {@code non-null;} first class name 14699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param b {@code non-null;} second class name 14799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code compareTo()}-style result 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static int compareClassNames(String a, String b) { 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Ensure inner classes sort second 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project a = a.replace('$','0'); 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b = b.replace('$','0'); 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Assuming "package-info" only occurs at the end, ensures package-info 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sorts first. 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project a = a.replace("package-info", ""); 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project b = b.replace("package-info", ""); 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return a.compareTo(b); 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Processes a directory recursively. 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 16799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param dir {@code non-null;} file representing the directory 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param topLevel whether this is a top-level directory (that is, 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specified directly on the commandline) 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return whether any processing actually happened 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean processDirectory(File dir, boolean topLevel) { 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (topLevel) { 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dir = new File(dir, "."); 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project File[] files = dir.listFiles(); 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int len = files.length; 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean any = false; 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sort) { 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Arrays.sort(files, new Comparator<File>() { 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int compare(File a, File b) { 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return compareClassNames(a.getName(), b.getName()); 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }); 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < len; i++) { 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project any |= processOne(files[i], false); 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return any; 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 19799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Processes the contents of an archive ({@code .zip}, 19899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code .jar}, or {@code .apk}). 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 20099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param file {@code non-null;} archive file to process 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return whether any processing actually happened 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @throws IOException on i/o problem 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private boolean processArchive(File file) throws IOException { 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ZipFile zip = new ZipFile(file); 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ByteArrayOutputStream baos = new ByteArrayOutputStream(40000); 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] buf = new byte[20000]; 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean any = false; 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayList<? extends java.util.zip.ZipEntry> entriesList 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project = Collections.list(zip.entries()); 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sort) { 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Collections.sort(entriesList, new Comparator<ZipEntry>() { 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int compare (ZipEntry a, ZipEntry b) { 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return compareClassNames(a.getName(), b.getName()); 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project }); 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project consumer.onProcessArchiveStart(file); 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22341aecd0a6bfea1e9a6713014b2b3d56fec8c552cDan Bornstein for (ZipEntry one : entriesList) { 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (one.isDirectory()) { 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project continue; 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project String path = one.getName(); 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InputStream in = zip.getInputStream(one); 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project baos.reset(); 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (;;) { 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int amt = in.read(buf); 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (amt < 0) { 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project baos.write(buf, 0, amt); 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project in.close(); 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] bytes = baos.toByteArray(); 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project any |= consumer.processFileBytes(path, bytes); 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project zip.close(); 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return any; 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 251