mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
65 lines
1.6 KiB
Java
65 lines
1.6 KiB
Java
/* -*- 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 java.io.InputStream;
|
|
import java.nio.ByteBuffer;
|
|
|
|
class ByteBufferInputStream extends InputStream {
|
|
|
|
protected ByteBuffer mBuf;
|
|
// Reference to a native object holding the data backing the ByteBuffer.
|
|
private NativeReference mNativeRef;
|
|
|
|
protected ByteBufferInputStream(ByteBuffer buffer, NativeReference ref) {
|
|
mBuf = buffer;
|
|
mNativeRef = ref;
|
|
}
|
|
|
|
@Override
|
|
public int available() {
|
|
return mBuf.remaining();
|
|
}
|
|
|
|
@Override
|
|
public void close() {
|
|
mBuf = null;
|
|
mNativeRef.release();
|
|
}
|
|
|
|
@Override
|
|
public int read() {
|
|
if (!mBuf.hasRemaining() || mNativeRef.isReleased()) {
|
|
return -1;
|
|
}
|
|
|
|
return mBuf.get() & 0xff; // Avoid sign extension
|
|
}
|
|
|
|
@Override
|
|
public int read(byte[] buffer, int offset, int length) {
|
|
if (!mBuf.hasRemaining() || mNativeRef.isReleased()) {
|
|
return -1;
|
|
}
|
|
|
|
length = Math.min(length, mBuf.remaining());
|
|
mBuf.get(buffer, offset, length);
|
|
return length;
|
|
}
|
|
|
|
@Override
|
|
public long skip(long byteCount) {
|
|
if (byteCount < 0 || mNativeRef.isReleased()) {
|
|
return 0;
|
|
}
|
|
|
|
byteCount = Math.min(byteCount, mBuf.remaining());
|
|
mBuf.position(mBuf.position() + (int)byteCount);
|
|
return byteCount;
|
|
}
|
|
|
|
}
|