You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
6.1 KiB
187 lines
6.1 KiB
/*
|
|
* Copyright 2019 dorkbox, llc
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package dorkbox.cabParser.extractor;
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.util.Enumeration;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
import dorkbox.cabParser.CabException;
|
|
import dorkbox.cabParser.CabParser;
|
|
import dorkbox.cabParser.CabStreamSaver;
|
|
import dorkbox.cabParser.structure.CabFileEntry;
|
|
import dorkbox.cabParser.structure.CabFolderEntry;
|
|
import dorkbox.cabParser.structure.CabHeader;
|
|
|
|
/**
|
|
* Extracts the content of CAB (file or stream).
|
|
*/
|
|
public class CabExtractor {
|
|
|
|
private final InputStream inputStream;
|
|
private final CabParser parser;
|
|
private final AtomicBoolean done = new AtomicBoolean(false);
|
|
|
|
/**
|
|
* To extract all files from CAB file and save to sub-directory (named after
|
|
* CAB file name) of working directory.
|
|
*
|
|
* @param cabFile
|
|
* CAB file
|
|
*/
|
|
public CabExtractor(File cabFile) throws CabException, IOException {
|
|
this(cabFile, null, new DefaultCabFileSaver( new File("drivers"), cabFile));
|
|
}
|
|
|
|
/**
|
|
* To extract some files from CAB file and save to sub-directory (named
|
|
* after CAB file name) of working directory.
|
|
*
|
|
* @param cabFile
|
|
* CAB file
|
|
* @param filter
|
|
* which files to extract (extract all files if
|
|
* <code>null</code>)
|
|
*/
|
|
public CabExtractor(File cabFile, CabFileFilter filter) throws CabException, IOException {
|
|
this(cabFile, filter, new DefaultCabFileSaver(null, cabFile));
|
|
}
|
|
|
|
/**
|
|
* To extract some files from CAB file and save to defined extract
|
|
* directory.
|
|
*
|
|
* @param cabFile
|
|
* CAB file
|
|
* @param filter
|
|
* which files to extract (extract all files if
|
|
* <code>null</code>)
|
|
* @param extractDirectory
|
|
* directory to extract files (no sub-directory will be created)
|
|
*/
|
|
public CabExtractor(File cabFile, CabFileFilter filter, File extractDirectory)
|
|
throws CabException, IOException {
|
|
this(cabFile, filter, new DefaultCabFileSaver(extractDirectory));
|
|
}
|
|
|
|
/**
|
|
* To extract some files from CAB file and handle (save) them using
|
|
* {@link CabFileSaver}.
|
|
*
|
|
* @param cabFile
|
|
* CAB file
|
|
* @param filter
|
|
* which files to extract (extract all files if
|
|
* <code>null</code>)
|
|
* @param saver
|
|
* defines how to save the extracted
|
|
* {@link ByteArrayOutputStream} corresponding to
|
|
* {@link CabFileEntry}
|
|
*/
|
|
public CabExtractor(File cabFile, CabFileFilter filter, CabFileSaver saver)
|
|
throws CabException, IOException {
|
|
this.inputStream = new BufferedInputStream(new FileInputStream(cabFile));
|
|
this.parser = new CabParser(this.inputStream, new FilteredCabStreamSaver(saver, filter));
|
|
}
|
|
|
|
/**
|
|
* To extract some files from CAB {@link InputStream} and handle (save) them
|
|
* using {@link CabFileSaver}.
|
|
*
|
|
* @param inputStream
|
|
* representing CAB file
|
|
* @param filter
|
|
* which files to extract (extract all files if
|
|
* <code>null</code>)
|
|
* @param saver
|
|
* defines how to save the extracted
|
|
* {@link ByteArrayOutputStream} corresponding to
|
|
* {@link CabFileEntry}
|
|
*/
|
|
public CabExtractor(InputStream inputStream, CabFileFilter filter, CabFileSaver saver)
|
|
throws CabException, IOException {
|
|
this(inputStream, new FilteredCabStreamSaver(saver, filter));
|
|
}
|
|
|
|
/**
|
|
* To extract files from CAB {@link InputStream} and handle (save) them
|
|
* using {@link CabStreamSaver}.
|
|
*
|
|
* @param inputStream
|
|
* representing CAB file
|
|
* @param streamSaver
|
|
* defines which files to save and how to save them
|
|
*/
|
|
public CabExtractor(InputStream inputStream, CabStreamSaver streamSaver)
|
|
throws CabException, IOException {
|
|
this.inputStream = inputStream;
|
|
this.parser = new CabParser(this.inputStream, streamSaver);
|
|
}
|
|
|
|
/**
|
|
* Extract files from CAB stream using the strategy defined by constructor
|
|
* parameter(s). Only first invocation of this method extracts files (mostly
|
|
* because we are extracting from potentially non-rewindable CAB stream, but
|
|
* also because extracting with predefined parameters is an idempotent
|
|
* operation).
|
|
*
|
|
* @return <code>true</code> if files were extracted, <code>false</code>
|
|
* otherwise (if executed second time on the same
|
|
* {@link CabExtractor) object)
|
|
*/
|
|
public boolean extract() throws CabException, IOException {
|
|
boolean result = done.compareAndSet(false, true);
|
|
if (result) {
|
|
try {
|
|
parser.extractStream();
|
|
} finally {
|
|
inputStream.close();
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static String getVersion() {
|
|
return CabParser.getVersion();
|
|
}
|
|
|
|
public Enumeration<Object> entries() {
|
|
return parser.entries();
|
|
}
|
|
|
|
public Enumeration<Object> entries(boolean b) {
|
|
return parser.entries(b);
|
|
}
|
|
|
|
public CabHeader getHeader() {
|
|
return parser.header;
|
|
}
|
|
|
|
public CabFolderEntry[] getFolders() {
|
|
return parser.folders;
|
|
}
|
|
|
|
public CabFileEntry[] getFiles() {
|
|
return parser.files;
|
|
}
|
|
|
|
}
|