blob: 47d8e0136a1de175a33f534bc099a1f64c2c7c07 [file] [log] [blame]
// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.utils;
import com.android.tools.r8.errors.CompilationError;
import com.google.common.io.ByteStreams;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipUtils {
public interface OnEntryHandler {
void onEntry(ZipEntry entry, ZipInputStream input) throws IOException;
}
public static void iter(String zipFile, OnEntryHandler handler) throws IOException {
try (ZipInputStream input = new ZipInputStream(new FileInputStream(zipFile))){
ZipEntry entry;
while ((entry = input.getNextEntry()) != null) {
handler.onEntry(entry, input);
}
}
}
public static List<File> unzip(String zipFile, File outDirectory) throws IOException {
return unzip(zipFile, outDirectory, (entry) -> true);
}
public static List<File> unzip(String zipFile, File outDirectory, Predicate<ZipEntry> filter)
throws IOException {
final Path outDirectoryPath = outDirectory.toPath();
final List<File> outFiles = new ArrayList<>();
iter(zipFile, (entry, input) -> {
String name = entry.getName();
if (!entry.isDirectory() && filter.test(entry)) {
if (name.contains("..")) {
// Protect against malicious archives.
throw new CompilationError("Invalid entry name \"" + name + "\"");
}
Path outPath = outDirectoryPath.resolve(name);
File outFile = outPath.toFile();
outFile.getParentFile().mkdirs();
FileOutputStream output = new FileOutputStream(outFile);
ByteStreams.copy(input, output);
outFiles.add(outFile);
}
});
return outFiles;
}
}