| 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
|
| index 49fb1fdcef0c675f8538b0922d21b5a40ac05c4f..8c69b9219e703314740b4baca1ce11627e1111c7 100644
|
| --- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| +++ b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
|
| @@ -128,6 +128,21 @@ public class Decoder {
|
| }
|
|
|
| /**
|
| + * Deserializes a {@link DataHeader} of an array at the given offset.
|
| + *
|
| + * @param expectedLength the expected length of the array.
|
| + */
|
| + public DataHeader readArrayDataHeader(int expectedLength) {
|
| + DataHeader dataHeader = readDataHeader();
|
| + 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 byte at the given offset.
|
| */
|
| public byte readByte(int offset) {
|
| @@ -199,12 +214,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of boolean at the given offset.
|
| */
|
| - public boolean[] readBooleans(int offset, int arrayNullability) {
|
| + public boolean[] readBooleans(int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| byte[] bytes = new byte[si.numFields + 7 / BindingsHelper.ALIGNMENT];
|
| d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.buffer.get(bytes);
|
| @@ -223,12 +238,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of bytes at the given offset.
|
| */
|
| - public byte[] readBytes(int offset, int arrayNullability) {
|
| + public byte[] readBytes(int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| byte[] result = new byte[si.numFields];
|
| d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.buffer.get(result);
|
| @@ -238,12 +253,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of shorts at the given offset.
|
| */
|
| - public short[] readShorts(int offset, int arrayNullability) {
|
| + public short[] readShorts(int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| short[] result = new short[si.numFields];
|
| d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.buffer.asShortBuffer().get(result);
|
| @@ -253,12 +268,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of ints at the given offset.
|
| */
|
| - public int[] readInts(int offset, int arrayNullability) {
|
| + public int[] readInts(int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| int[] result = new int[si.numFields];
|
| d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.buffer.asIntBuffer().get(result);
|
| @@ -268,12 +283,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of floats at the given offset.
|
| */
|
| - public float[] readFloats(int offset, int arrayNullability) {
|
| + public float[] readFloats(int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| float[] result = new float[si.numFields];
|
| d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.buffer.asFloatBuffer().get(result);
|
| @@ -283,12 +298,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of longs at the given offset.
|
| */
|
| - public long[] readLongs(int offset, int arrayNullability) {
|
| + public long[] readLongs(int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| long[] result = new long[si.numFields];
|
| d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.buffer.asLongBuffer().get(result);
|
| @@ -298,12 +313,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of doubles at the given offset.
|
| */
|
| - public double[] readDoubles(int offset, int arrayNullability) {
|
| + public double[] readDoubles(int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| double[] result = new double[si.numFields];
|
| d.mMessage.buffer.position(d.mBaseOffset + DataHeader.HEADER_SIZE);
|
| d.mMessage.buffer.asDoubleBuffer().get(result);
|
| @@ -392,7 +407,7 @@ public class Decoder {
|
| */
|
| public String readString(int offset, boolean nullable) {
|
| final int arrayNullability = nullable ? BindingsHelper.ARRAY_NULLABLE : 0;
|
| - byte[] bytes = readBytes(offset, arrayNullability);
|
| + byte[] bytes = readBytes(offset, arrayNullability, BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
|
| if (bytes == null) {
|
| return null;
|
| }
|
| @@ -402,12 +417,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |Handle| at the given offset.
|
| */
|
| - public Handle[] readHandles(int offset, int arrayNullability) {
|
| + public Handle[] readHandles(int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| Handle[] result = new Handle[si.numFields];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readHandle(
|
| @@ -420,12 +435,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |UntypedHandle| at the given offset.
|
| */
|
| - public UntypedHandle[] readUntypedHandles(int offset, int arrayNullability) {
|
| + public UntypedHandle[] readUntypedHandles(
|
| + int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| UntypedHandle[] result = new UntypedHandle[si.numFields];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readUntypedHandle(
|
| @@ -438,12 +454,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |ConsumerHandle| at the given offset.
|
| */
|
| - public DataPipe.ConsumerHandle[] readConsumerHandles(int offset, int arrayNullability) {
|
| + 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.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| DataPipe.ConsumerHandle[] result = new DataPipe.ConsumerHandle[si.numFields];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readConsumerHandle(
|
| @@ -456,12 +473,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |ProducerHandle| at the given offset.
|
| */
|
| - public DataPipe.ProducerHandle[] readProducerHandles(int offset, int arrayNullability) {
|
| + 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.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| DataPipe.ProducerHandle[] result = new DataPipe.ProducerHandle[si.numFields];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readProducerHandle(
|
| @@ -475,12 +493,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |MessagePipeHandle| at the given offset.
|
| */
|
| - public MessagePipeHandle[] readMessagePipeHandles(int offset, int arrayNullability) {
|
| + public MessagePipeHandle[] readMessagePipeHandles(
|
| + int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| MessagePipeHandle[] result = new MessagePipeHandle[si.numFields];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readMessagePipeHandle(
|
| @@ -494,12 +513,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |SharedBufferHandle| at the given offset.
|
| */
|
| - public SharedBufferHandle[] readSharedBufferHandles(int offset, int arrayNullability) {
|
| + public SharedBufferHandle[] readSharedBufferHandles(
|
| + int offset, int arrayNullability, int expectedLength) {
|
| Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
|
| if (d == null) {
|
| return null;
|
| }
|
| - DataHeader si = d.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| SharedBufferHandle[] result = new SharedBufferHandle[si.numFields];
|
| for (int i = 0; i < result.length; ++i) {
|
| result[i] = d.readSharedBufferHandle(
|
| @@ -513,13 +533,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |ServiceHandle| at the given offset.
|
| */
|
| - public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(int offset,
|
| - int arrayNullability, Interface.Manager<S, P> manager) {
|
| + 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.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(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
|
| @@ -536,13 +556,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |InterfaceRequest| at the given offset.
|
| */
|
| - public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(int offset,
|
| - int arrayNullability) {
|
| + 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.readDataHeader();
|
| + DataHeader si = d.readArrayDataHeader(expectedLength);
|
| @SuppressWarnings("unchecked")
|
| InterfaceRequest<I>[] result = new InterfaceRequest[si.numFields];
|
| for (int i = 0; i < result.length; ++i) {
|
|
|