gecko/mobile/android/base/mozglue/ByteBufferInputStream.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;
}
}