jimu-decompiled/sources/okio/DeflaterSink.java
2025-05-13 19:24:51 +02:00

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;
}
}