128 lines
3.7 KiB
Java
128 lines
3.7 KiB
Java
package okio;
|
|
|
|
import java.io.IOException;
|
|
import java.util.zip.Deflater;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public final class DeflaterSink implements Sink {
|
|
private boolean closed;
|
|
private final Deflater deflater;
|
|
private final BufferedSink sink;
|
|
|
|
public DeflaterSink(Sink sink, Deflater deflater) {
|
|
this(Okio.buffer(sink), deflater);
|
|
}
|
|
|
|
private void deflate(boolean z) throws IOException {
|
|
Segment writableSegment;
|
|
int deflate;
|
|
Buffer buffer = this.sink.buffer();
|
|
while (true) {
|
|
writableSegment = buffer.writableSegment(1);
|
|
if (z) {
|
|
Deflater deflater = this.deflater;
|
|
byte[] bArr = writableSegment.data;
|
|
int i = writableSegment.limit;
|
|
deflate = deflater.deflate(bArr, i, 8192 - i, 2);
|
|
} else {
|
|
Deflater deflater2 = this.deflater;
|
|
byte[] bArr2 = writableSegment.data;
|
|
int i2 = writableSegment.limit;
|
|
deflate = deflater2.deflate(bArr2, i2, 8192 - i2);
|
|
}
|
|
if (deflate > 0) {
|
|
writableSegment.limit += deflate;
|
|
buffer.size += deflate;
|
|
this.sink.emitCompleteSegments();
|
|
} else if (this.deflater.needsInput()) {
|
|
break;
|
|
}
|
|
}
|
|
if (writableSegment.pos == writableSegment.limit) {
|
|
buffer.head = writableSegment.pop();
|
|
SegmentPool.recycle(writableSegment);
|
|
}
|
|
}
|
|
|
|
@Override // okio.Sink, java.io.Closeable, java.lang.AutoCloseable
|
|
public void close() throws IOException {
|
|
if (this.closed) {
|
|
return;
|
|
}
|
|
Throwable th = null;
|
|
try {
|
|
finishDeflate();
|
|
} catch (Throwable th2) {
|
|
th = th2;
|
|
}
|
|
try {
|
|
this.deflater.end();
|
|
} catch (Throwable th3) {
|
|
if (th == null) {
|
|
th = th3;
|
|
}
|
|
}
|
|
try {
|
|
this.sink.close();
|
|
} catch (Throwable th4) {
|
|
if (th == null) {
|
|
th = th4;
|
|
}
|
|
}
|
|
this.closed = true;
|
|
if (th != null) {
|
|
Util.sneakyRethrow(th);
|
|
}
|
|
}
|
|
|
|
void finishDeflate() throws IOException {
|
|
this.deflater.finish();
|
|
deflate(false);
|
|
}
|
|
|
|
@Override // okio.Sink, java.io.Flushable
|
|
public void flush() throws IOException {
|
|
deflate(true);
|
|
this.sink.flush();
|
|
}
|
|
|
|
@Override // okio.Sink
|
|
public Timeout timeout() {
|
|
return this.sink.timeout();
|
|
}
|
|
|
|
public String toString() {
|
|
return "DeflaterSink(" + this.sink + ")";
|
|
}
|
|
|
|
@Override // okio.Sink
|
|
public void write(Buffer buffer, long j) throws IOException {
|
|
Util.checkOffsetAndCount(buffer.size, 0L, j);
|
|
while (j > 0) {
|
|
Segment segment = buffer.head;
|
|
int min = (int) Math.min(j, segment.limit - segment.pos);
|
|
this.deflater.setInput(segment.data, segment.pos, min);
|
|
deflate(false);
|
|
long j2 = min;
|
|
buffer.size -= j2;
|
|
segment.pos += min;
|
|
if (segment.pos == segment.limit) {
|
|
buffer.head = segment.pop();
|
|
SegmentPool.recycle(segment);
|
|
}
|
|
j -= j2;
|
|
}
|
|
}
|
|
|
|
DeflaterSink(BufferedSink bufferedSink, Deflater deflater) {
|
|
if (bufferedSink == null) {
|
|
throw new IllegalArgumentException("source == null");
|
|
}
|
|
if (deflater == null) {
|
|
throw new IllegalArgumentException("inflater == null");
|
|
}
|
|
this.sink = bufferedSink;
|
|
this.deflater = deflater;
|
|
}
|
|
}
|