blob: 11241c5757fa0c3796288e538d6fb3df4ed53f6f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.mozglue;
import android.support.annotation.Keep;
import org.mozilla.gecko.annotation.JNITarget;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
public class NativeZip implements NativeReference {
private static final int DEFLATE = 8;
private static final int STORE = 0;
private volatile long mObj;
@Keep
private InputStream mInput;
public NativeZip(String path) {
mObj = getZip(path);
}
public NativeZip(InputStream input) {
if (!(input instanceof ByteBufferInputStream)) {
throw new IllegalArgumentException("Got " + input.getClass()
+ ", but expected ByteBufferInputStream!");
}
ByteBufferInputStream bbinput = (ByteBufferInputStream)input;
mObj = getZipFromByteBuffer(bbinput.mBuf);
mInput = input;
}
@Override
protected void finalize() {
release();
}
@Override
public void release() {
if (mObj != 0) {
_release(mObj);
mObj = 0;
}
mInput = null;
}
@Override
public boolean isReleased() {
return (mObj == 0);
}
public InputStream getInputStream(String path) {
if (isReleased()) {
throw new IllegalStateException("Can't get path \"" + path
+ "\" because NativeZip is closed!");
}
return _getInputStream(mObj, path);
}
private static native long getZip(String path);
private static native long getZipFromByteBuffer(ByteBuffer buffer);
private static native void _release(long obj);
private native InputStream _getInputStream(long obj, String path);
@JNITarget
private InputStream createInputStream(ByteBuffer buffer, int compression) {
if (compression != STORE && compression != DEFLATE) {
throw new IllegalArgumentException("Unexpected compression: " + compression);
}
InputStream input = new ByteBufferInputStream(buffer, this);
if (compression == DEFLATE) {
Inflater inflater = new Inflater(true);
input = new InflaterInputStream(input, inflater);
}
return input;
}
}
|