| Index: mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| deleted file mode 100644
|
| index b95b6dd40ea26f7e3afd1180f1e568a7155da96e..0000000000000000000000000000000000000000
|
| --- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| +++ /dev/null
|
| @@ -1,645 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package org.chromium.mojo.bindings;
|
| -
|
| -import org.chromium.mojo.bindings.Interface.Proxy;
|
| -import org.chromium.mojo.bindings.Struct.DataHeader;
|
| -import org.chromium.mojo.system.DataPipe;
|
| -import org.chromium.mojo.system.Handle;
|
| -import org.chromium.mojo.system.InvalidHandle;
|
| -import org.chromium.mojo.system.MessagePipeHandle;
|
| -import org.chromium.mojo.system.SharedBufferHandle;
|
| -import org.chromium.mojo.system.UntypedHandle;
|
| -
|
| -import java.nio.ByteOrder;
|
| -import java.nio.charset.Charset;
|
| -
|
| -/**
|
| - * A Decoder is a helper class for deserializing a mojo struct. It enables deserialization of basic
|
| - * types from a {@link Message} object at a given offset into it's byte buffer.
|
| - */
|
| -public class Decoder {
|
| -
|
| - /**
|
| - * Helper class to validate the decoded message.
|
| - */
|
| - static final class Validator {
|
| -
|
| - /**
|
| - * Minimal value for the next handle to deserialize.
|
| - */
|
| - private int mMinNextClaimedHandle = 0;
|
| - /**
|
| - * Minimal value of the start of the next memory to claim.
|
| - */
|
| - private long mMinNextMemory = 0;
|
| -
|
| - /**
|
| - * The maximal memory accessible.
|
| - */
|
| - private final long mMaxMemory;
|
| -
|
| - /**
|
| - * The number of handles in the message.
|
| - */
|
| - private final long mNumberOfHandles;
|
| -
|
| - /**
|
| - * Constructor.
|
| - */
|
| - Validator(long maxMemory, int numberOfHandles) {
|
| - mMaxMemory = maxMemory;
|
| - mNumberOfHandles = numberOfHandles;
|
| - }
|
| -
|
| - public void claimHandle(int handle) {
|
| - if (handle < mMinNextClaimedHandle) {
|
| - throw new DeserializationException(
|
| - "Trying to access handle out of order.");
|
| - }
|
| - if (handle >= mNumberOfHandles) {
|
| - throw new DeserializationException("Trying to access non present handle.");
|
| - }
|
| - mMinNextClaimedHandle = handle + 1;
|
| - }
|
| -
|
| - public void claimMemory(long start, long end) {
|
| - if (start % BindingsHelper.ALIGNMENT != 0) {
|
| - throw new DeserializationException("Incorrect starting alignment: " + start + ".");
|
| - }
|
| - if (start < mMinNextMemory) {
|
| - throw new DeserializationException("Trying to access memory out of order.");
|
| - }
|
| - if (end < start) {
|
| - throw new DeserializationException("Incorrect memory range.");
|
| - }
|
| - if (end > mMaxMemory) {
|
| - throw new DeserializationException("Trying to access out of range memory.");
|
| - }
|
| - mMinNextMemory = BindingsHelper.align(end);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * The message to deserialize from.
|
| - */
|
| - private final Message mMessage;
|
| -
|
| - /**
|
| - * The base offset in the byte buffer.
|
| - */
|
| - private final int mBaseOffset;
|
| -
|
| - /**
|
| - * Validator for the decoded message.
|
| - */
|
| - private final Validator mValidator;
|
| -
|
| - /**
|
| - * Constructor.
|
| - *
|
| - * @param message The message to decode.
|
| - */
|
| - public Decoder(Message message) {
|
| - this(message, new Validator(message.getData().limit(), message.getHandles().size()), 0);
|
| - }
|
| -
|
| - private Decoder(Message message, Validator validator, int baseOffset) {
|
| - mMessage = message;
|
| - mMessage.getData().order(ByteOrder.LITTLE_ENDIAN);
|
| - mBaseOffset = baseOffset;
|
| - mValidator = validator;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a {@link DataHeader} at the given offset.
|
| - */
|
| - public DataHeader readDataHeader() {
|
| - // Claim the memory for the header.
|
| - mValidator.claimMemory(mBaseOffset, mBaseOffset + DataHeader.HEADER_SIZE);
|
| - int size = readInt(DataHeader.SIZE_OFFSET);
|
| - int numFields = readInt(DataHeader.NUM_FIELDS_OFFSET);
|
| - if (size < 0) {
|
| - throw new DeserializationException(
|
| - "Negative size. Unsigned integers are not valid for java.");
|
| - }
|
| - if (numFields < 0) {
|
| - throw new DeserializationException(
|
| - "Negative number of fields. Unsigned integers are not valid for java.");
|
| - }
|
| -
|
| - // Claim the remaining memory.
|
| - mValidator.claimMemory(mBaseOffset + DataHeader.HEADER_SIZE, mBaseOffset + size);
|
| - DataHeader res = new DataHeader(size, numFields);
|
| - return res;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
|
| - * array where element have the given size.
|
| - */
|
| - public DataHeader readDataHeaderForPointerArray(int expectedLength) {
|
| - return readDataHeaderForArray(8, expectedLength);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for a map.
|
| - */
|
| - public void readDataHeaderForMap() {
|
| - DataHeader si = readDataHeader();
|
| - if (si.size != BindingsHelper.MAP_STRUCT_HEADER.size) {
|
| - throw new DeserializationException(
|
| - "Incorrect header for map. The size is incorrect.");
|
| - }
|
| - if (si.numFields != BindingsHelper.MAP_STRUCT_HEADER.numFields) {
|
| - throw new DeserializationException(
|
| - "Incorrect header for map. The number of fields is incorrect.");
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a byte at the given offset.
|
| - */
|
| - public byte readByte(int offset) {
|
| - validateBufferSize(offset, 1);
|
| - return mMessage.getData().get(mBaseOffset + offset);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a boolean at the given offset, re-using any partially read byte.
|
| - */
|
| - public boolean readBoolean(int offset, int bit) {
|
| - validateBufferSize(offset, 1);
|
| - return (readByte(offset) & (1 << bit)) != 0;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a short at the given offset.
|
| - */
|
| - public short readShort(int offset) {
|
| - validateBufferSize(offset, 2);
|
| - return mMessage.getData().getShort(mBaseOffset + offset);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an int at the given offset.
|
| - */
|
| - public int readInt(int offset) {
|
| - validateBufferSize(offset, 4);
|
| - return mMessage.getData().getInt(mBaseOffset + offset);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a float at the given offset.
|
| - */
|
| - public float readFloat(int offset) {
|
| - validateBufferSize(offset, 4);
|
| - return mMessage.getData().getFloat(mBaseOffset + offset);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a long at the given offset.
|
| - */
|
| - public long readLong(int offset) {
|
| - validateBufferSize(offset, 8);
|
| - return mMessage.getData().getLong(mBaseOffset + offset);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a double at the given offset.
|
| - */
|
| - public double readDouble(int offset) {
|
| - validateBufferSize(offset, 8);
|
| - return mMessage.getData().getDouble(mBaseOffset + offset);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a pointer at the given offset. Returns a Decoder suitable to decode the content
|
| - * of the pointer.
|
| - */
|
| - public Decoder readPointer(int offset, boolean nullable) {
|
| - int basePosition = mBaseOffset + offset;
|
| - long pointerOffset = readLong(offset);
|
| - if (pointerOffset == 0) {
|
| - if (!nullable) {
|
| - throw new DeserializationException(
|
| - "Trying to decode null pointer for a non-nullable type.");
|
| - }
|
| - return null;
|
| - }
|
| - int newPosition = (int) (basePosition + pointerOffset);
|
| - // The method |getDecoderAtPosition| will validate that the pointer address is valid.
|
| - return getDecoderAtPosition(newPosition);
|
| -
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of boolean at the given offset.
|
| - */
|
| - public boolean[] readBooleans(int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForBooleanArray(expectedLength);
|
| - byte[] bytes = new byte[(si.numFields + 7) / BindingsHelper.ALIGNMENT];
|
| - d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| - d.mMessage.getData().get(bytes);
|
| - boolean[] result = new boolean[si.numFields];
|
| - for (int i = 0; i < bytes.length; ++i) {
|
| - for (int j = 0; j < BindingsHelper.ALIGNMENT; ++j) {
|
| - int booleanIndex = i * BindingsHelper.ALIGNMENT + j;
|
| - if (booleanIndex < result.length) {
|
| - result[booleanIndex] = (bytes[i] & (1 << j)) != 0;
|
| - }
|
| - }
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of bytes at the given offset.
|
| - */
|
| - public byte[] readBytes(int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(1, expectedLength);
|
| - byte[] result = new byte[si.numFields];
|
| - d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| - d.mMessage.getData().get(result);
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of shorts at the given offset.
|
| - */
|
| - public short[] readShorts(int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(2, expectedLength);
|
| - short[] result = new short[si.numFields];
|
| - d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| - d.mMessage.getData().asShortBuffer().get(result);
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of ints at the given offset.
|
| - */
|
| - public int[] readInts(int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - int[] result = new int[si.numFields];
|
| - d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| - d.mMessage.getData().asIntBuffer().get(result);
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of floats at the given offset.
|
| - */
|
| - public float[] readFloats(int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - float[] result = new float[si.numFields];
|
| - d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| - d.mMessage.getData().asFloatBuffer().get(result);
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of longs at the given offset.
|
| - */
|
| - public long[] readLongs(int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(8, expectedLength);
|
| - long[] result = new long[si.numFields];
|
| - d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| - d.mMessage.getData().asLongBuffer().get(result);
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of doubles at the given offset.
|
| - */
|
| - public double[] readDoubles(int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(8, expectedLength);
|
| - double[] result = new double[si.numFields];
|
| - d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| - d.mMessage.getData().asDoubleBuffer().get(result);
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an |Handle| at the given offset.
|
| - */
|
| - public Handle readHandle(int offset, boolean nullable) {
|
| - int index = readInt(offset);
|
| - if (index == -1) {
|
| - if (!nullable) {
|
| - throw new DeserializationException(
|
| - "Trying to decode an invalid handle for a non-nullable type.");
|
| - }
|
| - return InvalidHandle.INSTANCE;
|
| - }
|
| - mValidator.claimHandle(index);
|
| - return mMessage.getHandles().get(index);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an |UntypedHandle| at the given offset.
|
| - */
|
| - public UntypedHandle readUntypedHandle(int offset, boolean nullable) {
|
| - return readHandle(offset, nullable).toUntypedHandle();
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a |ConsumerHandle| at the given offset.
|
| - */
|
| - public DataPipe.ConsumerHandle readConsumerHandle(int offset, boolean nullable) {
|
| - return readUntypedHandle(offset, nullable).toDataPipeConsumerHandle();
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a |ProducerHandle| at the given offset.
|
| - */
|
| - public DataPipe.ProducerHandle readProducerHandle(int offset, boolean nullable) {
|
| - return readUntypedHandle(offset, nullable).toDataPipeProducerHandle();
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a |MessagePipeHandle| at the given offset.
|
| - */
|
| - public MessagePipeHandle readMessagePipeHandle(int offset, boolean nullable) {
|
| - return readUntypedHandle(offset, nullable).toMessagePipeHandle();
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a |SharedBufferHandle| at the given offset.
|
| - */
|
| - public SharedBufferHandle readSharedBufferHandle(int offset, boolean nullable) {
|
| - return readUntypedHandle(offset, nullable).toSharedBufferHandle();
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an interface at the given offset.
|
| - *
|
| - * @return a proxy to the service.
|
| - */
|
| - public <P extends Proxy> P readServiceInterface(int offset, boolean nullable,
|
| - Interface.Manager<?, P> manager) {
|
| - MessagePipeHandle handle = readMessagePipeHandle(offset, nullable);
|
| - if (!handle.isValid()) {
|
| - return null;
|
| - }
|
| - return manager.attachProxy(handle);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a |InterfaceRequest| at the given offset.
|
| - */
|
| - public <I extends Interface> InterfaceRequest<I> readInterfaceRequest(int offset,
|
| - boolean nullable) {
|
| - MessagePipeHandle handle = readMessagePipeHandle(offset, nullable);
|
| - if (handle == null) {
|
| - return null;
|
| - }
|
| - return new InterfaceRequest<I>(handle);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a string at the given offset.
|
| - */
|
| - public String readString(int offset, boolean nullable) {
|
| - final int arrayNullability = nullable ? BindingsHelper.ARRAY_NULLABLE : 0;
|
| - byte[] bytes = readBytes(offset, arrayNullability, BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
|
| - if (bytes == null) {
|
| - return null;
|
| - }
|
| - return new String(bytes, Charset.forName("utf8"));
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of |Handle| at the given offset.
|
| - */
|
| - public Handle[] readHandles(int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - Handle[] result = new Handle[si.numFields];
|
| - for (int i = 0; i < result.length; ++i) {
|
| - result[i] = d.readHandle(
|
| - DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| - BindingsHelper.isElementNullable(arrayNullability));
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of |UntypedHandle| at the given offset.
|
| - */
|
| - public UntypedHandle[] readUntypedHandles(
|
| - int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - UntypedHandle[] result = new UntypedHandle[si.numFields];
|
| - for (int i = 0; i < result.length; ++i) {
|
| - result[i] = d.readUntypedHandle(
|
| - DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| - BindingsHelper.isElementNullable(arrayNullability));
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of |ConsumerHandle| at the given offset.
|
| - */
|
| - public DataPipe.ConsumerHandle[] readConsumerHandles(
|
| - int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - DataPipe.ConsumerHandle[] result = new DataPipe.ConsumerHandle[si.numFields];
|
| - for (int i = 0; i < result.length; ++i) {
|
| - result[i] = d.readConsumerHandle(
|
| - DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| - BindingsHelper.isElementNullable(arrayNullability));
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of |ProducerHandle| at the given offset.
|
| - */
|
| - public DataPipe.ProducerHandle[] readProducerHandles(
|
| - int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - DataPipe.ProducerHandle[] result = new DataPipe.ProducerHandle[si.numFields];
|
| - for (int i = 0; i < result.length; ++i) {
|
| - result[i] = d.readProducerHandle(
|
| - DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| - BindingsHelper.isElementNullable(arrayNullability));
|
| - }
|
| - return result;
|
| -
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of |MessagePipeHandle| at the given offset.
|
| - */
|
| - public MessagePipeHandle[] readMessagePipeHandles(
|
| - int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - MessagePipeHandle[] result = new MessagePipeHandle[si.numFields];
|
| - for (int i = 0; i < result.length; ++i) {
|
| - result[i] = d.readMessagePipeHandle(
|
| - DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| - BindingsHelper.isElementNullable(arrayNullability));
|
| - }
|
| - return result;
|
| -
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of |SharedBufferHandle| at the given offset.
|
| - */
|
| - public SharedBufferHandle[] readSharedBufferHandles(
|
| - int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - SharedBufferHandle[] result = new SharedBufferHandle[si.numFields];
|
| - for (int i = 0; i < result.length; ++i) {
|
| - result[i] = d.readSharedBufferHandle(
|
| - DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| - BindingsHelper.isElementNullable(arrayNullability));
|
| - }
|
| - return result;
|
| -
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of |ServiceHandle| at the given offset.
|
| - */
|
| - public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(
|
| - int offset, int arrayNullability, int expectedLength, Interface.Manager<S, P> manager) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - S[] result = manager.buildArray(si.numFields);
|
| - for (int i = 0; i < result.length; ++i) {
|
| - // This cast is necessary because java 6 doesn't handle wildcard correctly when using
|
| - // Manager<S, ? extends S>
|
| - @SuppressWarnings("unchecked")
|
| - S value = (S) d.readServiceInterface(
|
| - DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| - BindingsHelper.isElementNullable(arrayNullability), manager);
|
| - result[i] = value;
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes an array of |InterfaceRequest| at the given offset.
|
| - */
|
| - public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(
|
| - int offset, int arrayNullability, int expectedLength) {
|
| - Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| - if (d == null) {
|
| - return null;
|
| - }
|
| - DataHeader si = d.readDataHeaderForArray(4, expectedLength);
|
| - @SuppressWarnings("unchecked")
|
| - InterfaceRequest<I>[] result = new InterfaceRequest[si.numFields];
|
| - for (int i = 0; i < result.length; ++i) {
|
| - result[i] = d.readInterfaceRequest(
|
| - DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
|
| - BindingsHelper.isElementNullable(arrayNullability));
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - /**
|
| - * Returns a view of this decoder at the offset |offset|.
|
| - */
|
| - private Decoder getDecoderAtPosition(int offset) {
|
| - return new Decoder(mMessage, mValidator, offset);
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
|
| - * array of booleans.
|
| - */
|
| - private DataHeader readDataHeaderForBooleanArray(int expectedLength) {
|
| - DataHeader dataHeader = readDataHeader();
|
| - if (dataHeader.size < DataHeader.HEADER_SIZE + (dataHeader.numFields + 7) / 8) {
|
| - throw new DeserializationException("Array header is incorrect.");
|
| - }
|
| - if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
|
| - && dataHeader.numFields != expectedLength) {
|
| - throw new DeserializationException("Incorrect array length. Expected: "
|
| - + expectedLength + ", but got: " + dataHeader.numFields + ".");
|
| - }
|
| - return dataHeader;
|
| - }
|
| -
|
| - /**
|
| - * Deserializes a {@link DataHeader} of an array at the given offset.
|
| - */
|
| - private DataHeader readDataHeaderForArray(long elementSize, int expectedLength) {
|
| - DataHeader dataHeader = readDataHeader();
|
| - if (dataHeader.size < (DataHeader.HEADER_SIZE + elementSize * dataHeader.numFields)) {
|
| - throw new DeserializationException("Array header is incorrect.");
|
| - }
|
| - if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
|
| - && dataHeader.numFields != expectedLength) {
|
| - throw new DeserializationException("Incorrect array length. Expected: "
|
| - + expectedLength + ", but got: " + dataHeader.numFields + ".");
|
| - }
|
| - return dataHeader;
|
| - }
|
| -
|
| - private void validateBufferSize(int offset, int size) {
|
| - if (mMessage.getData().limit() < offset + size) {
|
| - throw new DeserializationException("Buffer is smaller than expected.");
|
| - }
|
| - }
|
| -}
|
|
|