Drop a7zip for libarchive integrate
This commit is contained in:
1 parent
43edf11275
commit
657e1b1d0f
47 files changed
+7
-4818
No files matched your search
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
public class ArchiveException extends Exception {
|
||||
|
||||
public ArchiveException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public ArchiveException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* Copyright 2020 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
|
||||
public class FileSeekableInputStream extends SeekableInputStream {
|
||||
|
||||
private final RandomAccessFile file;
|
||||
|
||||
public FileSeekableInputStream(String path) throws FileNotFoundException {
|
||||
this(new File(path));
|
||||
}
|
||||
|
||||
public FileSeekableInputStream(File file) throws FileNotFoundException {
|
||||
this(new RandomAccessFile(file, "r"));
|
||||
}
|
||||
|
||||
public FileSeekableInputStream(RandomAccessFile file) {
|
||||
this.file = file;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seek(long pos) throws IOException {
|
||||
file.seek(pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long tell() throws IOException {
|
||||
return file.getFilePointer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long size() throws IOException {
|
||||
return file.length();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
return file.read();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(@NonNull byte[] b) throws IOException {
|
||||
return file.read(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(@NonNull byte[] b, int off, int len) throws IOException {
|
||||
return file.read(b, off, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
* Copyright 2020 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
|
||||
public class FileSeekableOutputStream extends SeekableOutputStream {
|
||||
|
||||
private final RandomAccessFile file;
|
||||
|
||||
public FileSeekableOutputStream(String path) throws FileNotFoundException {
|
||||
this(new File(path));
|
||||
}
|
||||
|
||||
public FileSeekableOutputStream(File file) throws FileNotFoundException {
|
||||
this(new RandomAccessFile(file, "rw"));
|
||||
}
|
||||
|
||||
public FileSeekableOutputStream(RandomAccessFile file) {
|
||||
this.file = file;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seek(long pos) throws IOException {
|
||||
file.seek(pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long tell() throws IOException {
|
||||
return file.getFilePointer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long size() throws IOException {
|
||||
return file.length();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void truncate(long size) throws IOException {
|
||||
file.setLength(size);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(int b) throws IOException {
|
||||
file.write(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(@NonNull byte[] b) throws IOException {
|
||||
file.write(b);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(@NonNull byte[] b, int off, int len) throws IOException {
|
||||
file.write(b, off, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
@@ -1,456 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
public class InArchive implements Closeable {
|
||||
|
||||
private long nativePtr;
|
||||
@Nullable
|
||||
private final Charset charset;
|
||||
@Nullable
|
||||
private final String password;
|
||||
|
||||
private InArchive(long nativePtr, @Nullable Charset charset, @Nullable String password) {
|
||||
this.nativePtr = nativePtr;
|
||||
this.charset = charset;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
private void checkClosed() {
|
||||
if (nativePtr == 0) {
|
||||
throw new IllegalStateException("This InArchive is closed.");
|
||||
}
|
||||
}
|
||||
|
||||
// Sometimes p7zip returns string in the original charset, sometimes in utf-16.
|
||||
// If it's in the original charset, each byte stores in each char,
|
||||
// so every char in the string is smaller than 0xFF.
|
||||
// But if every char in the string is smaller than 0xFF,
|
||||
// it's hard to tell the string is in utf-16 or the original charset.
|
||||
// TODO Let p7zip tell whether it have encoded the string.
|
||||
private static String applyCharsetToString(String str, Charset charset) {
|
||||
if (str == null || charset == null) {
|
||||
return str;
|
||||
}
|
||||
|
||||
int length = str.length();
|
||||
for (int i = 0; i < length; i++) {
|
||||
char c = str.charAt(i);
|
||||
if (c > 0xFF) {
|
||||
// It's not a pure byte list, can't apply charset
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
byte[] bytes = new byte[length];
|
||||
for (int i = 0; i < length; i++) {
|
||||
bytes[i] = (byte) str.charAt(i);
|
||||
}
|
||||
|
||||
return new String(bytes, charset);
|
||||
}
|
||||
|
||||
private static String applyCharsetToPassword(String str, Charset charset) {
|
||||
if (str == null || charset == null) {
|
||||
return str;
|
||||
}
|
||||
|
||||
byte[] bytes = str.getBytes(charset);
|
||||
char[] chars = new char[bytes.length];
|
||||
for (int i = 0; i < chars.length; i++) {
|
||||
chars[i] = (char) (bytes[i] & 0xFF);
|
||||
}
|
||||
return new String(chars);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the format name of this archive.
|
||||
* Empty string if can't get the name.
|
||||
*/
|
||||
@NonNull
|
||||
public String getFormatName() {
|
||||
checkClosed();
|
||||
return nativeGetFormatName(nativePtr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of entries in this archive.
|
||||
* {@code -1} if get error.
|
||||
*/
|
||||
public int getNumberOfEntries() {
|
||||
checkClosed();
|
||||
return nativeGetNumberOfEntries(nativePtr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of the property for the archive.
|
||||
*
|
||||
* @param propID the id of the property
|
||||
* @return one of {@link PropType}
|
||||
*/
|
||||
public PropType getArchivePropertyType(PropID propID) {
|
||||
int type = nativeGetArchivePropertyType(nativePtr, propID.ordinal());
|
||||
if (type >= 0 && type < PropType.values().length) {
|
||||
return PropType.values()[type];
|
||||
} else {
|
||||
return PropType.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns boolean property for the archive.
|
||||
*
|
||||
* @param propID the id of the property
|
||||
* @return the boolean property, {@code false} if get error
|
||||
*/
|
||||
public boolean getArchiveBooleanProperty(PropID propID) {
|
||||
checkClosed();
|
||||
return nativeGetArchiveBooleanProperty(nativePtr, propID.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns int property for the archive.
|
||||
*
|
||||
* @param propID the id of the property
|
||||
* @return the int property, {@code 0} if get error
|
||||
*/
|
||||
public int getArchiveIntProperty(PropID propID) {
|
||||
checkClosed();
|
||||
return nativeGetArchiveIntProperty(nativePtr, propID.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns long property for the archive.
|
||||
*
|
||||
* @param propID the id of the property
|
||||
* @return the long property, {@code 0} if get error
|
||||
*/
|
||||
public long getArchiveLongProperty(PropID propID) {
|
||||
checkClosed();
|
||||
return nativeGetArchiveLongProperty(nativePtr, propID.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string property for the archive.
|
||||
*
|
||||
* @param propID the id of the property
|
||||
* @return the string property, empty string if get error
|
||||
*/
|
||||
@NonNull
|
||||
public String getArchiveStringProperty(PropID propID) {
|
||||
return getArchiveStringProperty(propID, charset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string property for the archive.
|
||||
*
|
||||
* @param propID the id of the property
|
||||
* @param charset the charset of the string, {@code null} to let p7zip handle it
|
||||
* @return the string property, empty string if get error
|
||||
*/
|
||||
@NonNull
|
||||
public String getArchiveStringProperty(PropID propID, @Nullable Charset charset) {
|
||||
checkClosed();
|
||||
String str = nativeGetArchiveStringProperty(nativePtr, propID.ordinal());
|
||||
str = applyCharsetToString(str, charset);
|
||||
return str != null ? str : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of the property for the archive.
|
||||
*
|
||||
* @param propID the id of the property
|
||||
* @return one of {@link PropType}
|
||||
*/
|
||||
public PropType getEntryPropertyType(int index, PropID propID) {
|
||||
int type = nativeGetEntryPropertyType(nativePtr, index, propID.ordinal());
|
||||
if (type >= 0 && type < PropType.values().length) {
|
||||
return PropType.values()[type];
|
||||
} else {
|
||||
return PropType.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns boolean property for the entry.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @param propID the id of the property
|
||||
* @return the boolean property, {@code false} if get error
|
||||
*/
|
||||
public boolean getEntryBooleanProperty(int index, PropID propID) {
|
||||
checkClosed();
|
||||
return nativeGetEntryBooleanProperty(nativePtr, index, propID.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns int property for the entry.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @param propID the id of the property
|
||||
* @return the int property, {@code 0} if get error
|
||||
*/
|
||||
public int getEntryIntProperty(int index, PropID propID) {
|
||||
checkClosed();
|
||||
return nativeGetEntryIntProperty(nativePtr, index, propID.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns long property for the entry.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @param propID the id of the property
|
||||
* @return the long property, {@code 0} if get error
|
||||
*/
|
||||
public long getEntryLongProperty(int index, PropID propID) {
|
||||
checkClosed();
|
||||
return nativeGetEntryLongProperty(nativePtr, index, propID.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string property for the entry.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @param propID the id of the property
|
||||
* @return the string property, empty string if get error
|
||||
*/
|
||||
@NonNull
|
||||
public String getEntryStringProperty(int index, PropID propID) {
|
||||
return getEntryStringProperty(index, propID, charset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns string property for the entry.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @param propID the id of the property
|
||||
* @param charset the charset of the string, {@code null} to let p7zip handle it
|
||||
* @return the string property, empty string if get error
|
||||
*/
|
||||
@NonNull
|
||||
public String getEntryStringProperty(int index, PropID propID, @Nullable Charset charset) {
|
||||
checkClosed();
|
||||
String str = nativeGetEntryStringProperty(nativePtr, index, propID.ordinal());
|
||||
str = applyCharsetToString(str, charset);
|
||||
return str != null ? str : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path of the entry.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @return the path, empty string if get error
|
||||
*/
|
||||
@NonNull
|
||||
public String getEntryPath(int index) {
|
||||
return getEntryPath(index, charset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path of the entry.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @param charset the charset of the string, {@code null} to let p7zip handle it
|
||||
* @return the path, empty string if get error
|
||||
*/
|
||||
@NonNull
|
||||
public String getEntryPath(int index, @Nullable Charset charset) {
|
||||
return getEntryStringProperty(index, PropID.PATH, charset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the stream of the entry. Only a few archive formats support it.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @return the stream of the entry
|
||||
* @throws ArchiveException if the archive format doesn't support the operation or get error
|
||||
* @see #extractEntry(int, OutputStream)
|
||||
* @see #extractEntry(int, String, OutputStream)
|
||||
*/
|
||||
@NonNull
|
||||
public InputStream getEntryStream(int index) throws ArchiveException {
|
||||
return nativeGetEntryStream(nativePtr, index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the context of the entry into the output stream.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @param os the output steam to receive the content,
|
||||
* it will be closed at the end of this method
|
||||
* @throws ArchiveException if get error
|
||||
* @see #getEntryStream(int)
|
||||
*/
|
||||
public void extractEntry(int index, @NonNull OutputStream os) throws ArchiveException {
|
||||
extractEntry(index, password, os);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the context of the entry into the output stream.
|
||||
*
|
||||
* @param index the index of the entry
|
||||
* @param password the password of the entry
|
||||
* @param os the output steam to receive the content,
|
||||
* it will be closed at the end of this method
|
||||
* @throws ArchiveException if get error
|
||||
*/
|
||||
@SuppressWarnings("ThrowFromFinallyBlock")
|
||||
public void extractEntry(int index, String password, @NonNull OutputStream os) throws ArchiveException {
|
||||
try {
|
||||
checkClosed();
|
||||
nativeExtractEntry(nativePtr, index, password, os);
|
||||
} finally {
|
||||
try {
|
||||
os.close();
|
||||
} catch (IOException e) {
|
||||
throw new ArchiveException("Catch IOException while closing the OutputStream", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
if (nativePtr != 0) {
|
||||
nativeClose(nativePtr);
|
||||
nativePtr = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if the archive is closed.
|
||||
*/
|
||||
public boolean isClosed() {
|
||||
return nativePtr == 0;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static InArchive open(File file) throws ArchiveException {
|
||||
try {
|
||||
return open(new FileSeekableInputStream(file), null, null, file.getName(), new OpenVolumeInDirCallback(file.getParentFile()));
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new ArchiveException("Can't open the archive: " + file.getPath(), e);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static InArchive open(SeekableInputStream stream) throws ArchiveException {
|
||||
return open(stream, null, null, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens an archive to read from the specified stream.
|
||||
* <p>
|
||||
* {@code charset} is for password and string property.
|
||||
* The charset of string property can reset in
|
||||
* {@link InArchive#getArchiveStringProperty(PropID, Charset)}.
|
||||
*/
|
||||
@NonNull
|
||||
public static InArchive open(
|
||||
SeekableInputStream stream,
|
||||
@Nullable Charset charset,
|
||||
@Nullable String password,
|
||||
@Nullable String filename,
|
||||
@Nullable OpenVolumeCallback openVolumeCallback
|
||||
) throws ArchiveException {
|
||||
password = applyCharsetToPassword(password, charset);
|
||||
long nativePtr = nativeOpen(stream, password, filename, openVolumeCallback);
|
||||
|
||||
if (nativePtr == 0) {
|
||||
// It should not be 0
|
||||
throw new ArchiveException("a7zip is buggy");
|
||||
}
|
||||
|
||||
return new InArchive(nativePtr, charset, password);
|
||||
}
|
||||
|
||||
@Keep
|
||||
public interface OpenVolumeCallback {
|
||||
@NonNull
|
||||
SeekableInputStream openVolume(String filename) throws ArchiveException;
|
||||
}
|
||||
|
||||
public static class OpenVolumeInDirCallback implements OpenVolumeCallback {
|
||||
|
||||
private final File dir;
|
||||
|
||||
public OpenVolumeInDirCallback(File dir) {
|
||||
this.dir = dir;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public SeekableInputStream openVolume(String filename) throws ArchiveException {
|
||||
try {
|
||||
return new FileSeekableInputStream(new File(dir, filename));
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new ArchiveException("Can't find the file<" + filename + "> in dir<" + dir.getPath() + ">", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static native long nativeOpen(
|
||||
SeekableInputStream stream,
|
||||
String password,
|
||||
String filename,
|
||||
OpenVolumeCallback openVolumeCallback
|
||||
) throws ArchiveException;
|
||||
|
||||
private static native String nativeGetFormatName(long nativePtr);
|
||||
|
||||
private static native int nativeGetNumberOfEntries(long nativePtr);
|
||||
|
||||
private static native int nativeGetArchivePropertyType(long nativePtr, int propID);
|
||||
|
||||
private static native boolean nativeGetArchiveBooleanProperty(long nativePtr, int propID);
|
||||
|
||||
private static native int nativeGetArchiveIntProperty(long nativePtr, int propID);
|
||||
|
||||
private static native long nativeGetArchiveLongProperty(long nativePtr, int propID);
|
||||
|
||||
@Nullable
|
||||
private static native String nativeGetArchiveStringProperty(long nativePtr, int propID);
|
||||
|
||||
private static native int nativeGetEntryPropertyType(long nativePtr, int index, int propID);
|
||||
|
||||
private static native boolean nativeGetEntryBooleanProperty(long nativePtr, int index, int propID);
|
||||
|
||||
private static native int nativeGetEntryIntProperty(long nativePtr, int index, int propID);
|
||||
|
||||
private static native long nativeGetEntryLongProperty(long nativePtr, int index, int propID);
|
||||
|
||||
@Nullable
|
||||
private static native String nativeGetEntryStringProperty(long nativePtr, int index, int propID);
|
||||
|
||||
@NonNull
|
||||
private static native InputStream nativeGetEntryStream(long nativePtr, int index) throws ArchiveException;
|
||||
|
||||
private static native void nativeExtractEntry(long nativePtr, int index, String password, OutputStream os) throws ArchiveException;
|
||||
|
||||
private static native void nativeClose(long nativePtr);
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
class NativeInputStream extends InputStream {
|
||||
|
||||
private long nativePtr;
|
||||
private final byte[] scratch = new byte[8];
|
||||
|
||||
private NativeInputStream(long nativePtr) {
|
||||
this.nativePtr = nativePtr;
|
||||
}
|
||||
|
||||
private void checkClosed() {
|
||||
if (nativePtr == 0) {
|
||||
throw new IllegalStateException("This JavaInputStream is closed.");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
return (read(scratch, 0, 1) != -1) ? scratch[0] & 0xff : -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(@NonNull byte[] b) throws IOException {
|
||||
return read(b, 0, b.length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
checkClosed();
|
||||
return nativeRead(nativePtr, b, off, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
if (nativePtr != 0) {
|
||||
nativeClose(nativePtr);
|
||||
nativePtr = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private static native int nativeRead(long nativePtr, byte[] b, int off, int len) throws IOException;
|
||||
|
||||
private static native void nativeClose(long nativePtr) throws IOException;
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
class NativeSeekableInputStream extends SeekableInputStream {
|
||||
|
||||
private long nativePtr;
|
||||
private final byte[] scratch = new byte[8];
|
||||
|
||||
private NativeSeekableInputStream(long nativePtr) {
|
||||
this.nativePtr = nativePtr;
|
||||
}
|
||||
|
||||
private void checkClosed() {
|
||||
if (nativePtr == 0) {
|
||||
throw new IllegalStateException("This JavaSeekableInputStream is closed.");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seek(long pos) throws IOException {
|
||||
checkClosed();
|
||||
nativeSeek(nativePtr, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long tell() throws IOException {
|
||||
checkClosed();
|
||||
return nativeTell(nativePtr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long size() throws IOException {
|
||||
checkClosed();
|
||||
return nativeSize(nativePtr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read() throws IOException {
|
||||
return (read(scratch, 0, 1) != -1) ? scratch[0] & 0xff : -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(@NonNull byte[] b) throws IOException {
|
||||
return read(b, 0, b.length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
checkClosed();
|
||||
return nativeRead(nativePtr, b, off, len);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
if (nativePtr != 0) {
|
||||
nativeClose(nativePtr);
|
||||
nativePtr = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private static native void nativeSeek(long nativePtr, long pos) throws IOException;
|
||||
|
||||
private static native long nativeTell(long nativePtr) throws IOException;
|
||||
|
||||
private static native long nativeSize(long nativePtr) throws IOException;
|
||||
|
||||
private static native int nativeRead(long nativePtr, byte[] b, int off, int len) throws IOException;
|
||||
|
||||
private static native void nativeClose(long nativePtr) throws IOException;
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
|
||||
@Keep
|
||||
public class PasswordException extends ArchiveException {
|
||||
|
||||
public PasswordException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public PasswordException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
public enum PropID {
|
||||
NO_PROPERTY,
|
||||
MAIN_SUBFILE,
|
||||
HANDLER_ITEM_INDEX,
|
||||
PATH,
|
||||
NAME,
|
||||
EXTENSION,
|
||||
IS_DIR,
|
||||
SIZE,
|
||||
PACK_SIZE,
|
||||
ATTRIB,
|
||||
C_TIME,
|
||||
A_TIME,
|
||||
M_TIME,
|
||||
SOLID,
|
||||
COMMENTED,
|
||||
ENCRYPTED,
|
||||
SPLIT_BEFORE,
|
||||
SPLIT_AFTER,
|
||||
DICTIONARY_SIZE,
|
||||
CRC,
|
||||
TYPE,
|
||||
IS_ANTI,
|
||||
METHOD,
|
||||
HOST_OS,
|
||||
FILE_SYSTEM,
|
||||
USER,
|
||||
GROUP,
|
||||
BLOCK,
|
||||
COMMENT,
|
||||
POSITION,
|
||||
PREFIX,
|
||||
NUM_SUB_DIRS,
|
||||
NUM_SUB_FILES,
|
||||
UNPACK_VER,
|
||||
VOLUME,
|
||||
IS_VOLUME,
|
||||
OFFSET,
|
||||
LINKS,
|
||||
NUM_BLOCKS,
|
||||
NUM_VOLUMES,
|
||||
TIME_TYPE,
|
||||
BIT64,
|
||||
BIG_ENDIAN,
|
||||
CPU,
|
||||
PHY_SIZE,
|
||||
HEADERS_SIZE,
|
||||
CHECKSUM,
|
||||
CHARACTS,
|
||||
VA,
|
||||
ID,
|
||||
SHORT_NAME,
|
||||
CREATOR_APP,
|
||||
SECTOR_SIZE,
|
||||
POSIX_ATTRIB,
|
||||
SYM_LINK,
|
||||
ERROR,
|
||||
TOTAL_SIZE,
|
||||
FREE_SPACE,
|
||||
CLUSTER_SIZE,
|
||||
VOLUME_NAME,
|
||||
LOCAL_NAME,
|
||||
PROVIDER,
|
||||
NT_SECURE,
|
||||
IS_ALT_STREAM,
|
||||
IS_AUX,
|
||||
IS_DELETED,
|
||||
IS_TREE,
|
||||
SHA1,
|
||||
SHA256,
|
||||
ERROR_TYPE,
|
||||
NUM_ERRORS,
|
||||
ERROR_FLAGS,
|
||||
WARNING_FLAGS,
|
||||
WARNING,
|
||||
NUM_STREAMS,
|
||||
NUM_ALT_STREAMS,
|
||||
ALT_STREAMS_SIZE,
|
||||
VIRTUAL_SIZE,
|
||||
UNPACK_SIZE,
|
||||
TOTAL_PHY_SIZE,
|
||||
VOLUME_INDEX,
|
||||
SUB_TYPE,
|
||||
SHORT_COMMENT,
|
||||
CODE_PAGE,
|
||||
IS_NOT_ARC_TYPE,
|
||||
PHY_SIZE_CANT_BE_DETECTED,
|
||||
ZEROS_TAIL_IS_ALLOWED,
|
||||
TAIL_SIZE,
|
||||
EMBEDDED_STUB_SIZE,
|
||||
NT_REPARSE,
|
||||
HARD_LINK,
|
||||
INODE,
|
||||
STREAM_ID,
|
||||
READ_ONLY,
|
||||
OUT_NAME,
|
||||
COPY_LINK,
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
* Copyright 2018 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
public enum PropType {
|
||||
UNKNOWN,
|
||||
EMPTY,
|
||||
BOOL,
|
||||
INT,
|
||||
LONG,
|
||||
FLOAT,
|
||||
DOUBLE,
|
||||
STRING,
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright 2020 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public abstract class SeekableInputStream extends InputStream {
|
||||
|
||||
/**
|
||||
* Sets the position, measured from the beginning,
|
||||
* at which the next read occurs. The offset may be
|
||||
* set beyond the end of the file.
|
||||
*/
|
||||
public abstract void seek(long pos) throws IOException;
|
||||
|
||||
/**
|
||||
* Returns current position, measured from the beginning.
|
||||
*/
|
||||
public abstract long tell() throws IOException;
|
||||
|
||||
/**
|
||||
* Returns the size.
|
||||
*/
|
||||
public abstract long size() throws IOException;
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright 2020 Hippo Seven
|
||||
*
|
||||
* 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 com.hippo.a7zip;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
public abstract class SeekableOutputStream extends OutputStream {
|
||||
|
||||
/**
|
||||
* Sets the position, measured from the beginning,
|
||||
* at which the next write occurs. The offset may be
|
||||
* set beyond the end of the file.
|
||||
*/
|
||||
public abstract void seek(long pos) throws IOException;
|
||||
|
||||
/**
|
||||
* Returns current position, measured from the beginning.
|
||||
*/
|
||||
public abstract long tell() throws IOException;
|
||||
|
||||
/**
|
||||
* Returns the size.
|
||||
*/
|
||||
public abstract long size() throws IOException;
|
||||
|
||||
/**
|
||||
* Sets the size.
|
||||
*/
|
||||
public abstract void truncate(long size) throws IOException;
|
||||
}
|
||||
Reference in new issue
Block a user