| 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 8295c5eed3202d0a3efa2a81b6adbecdce7f280a..bb11efd35d2007e0a171b61105fbddf63a762d67 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) {
|
| @@ -195,12 +210,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of boolean at the given offset.
|
| */
|
| - public boolean[] readBooleans(int offset) {
|
| + public boolean[] readBooleans(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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);
|
| @@ -219,12 +234,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of bytes at the given offset.
|
| */
|
| - public byte[] readBytes(int offset) {
|
| + public byte[] readBytes(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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);
|
| @@ -234,12 +249,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of shorts at the given offset.
|
| */
|
| - public short[] readShorts(int offset) {
|
| + public short[] readShorts(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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);
|
| @@ -249,12 +264,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of ints at the given offset.
|
| */
|
| - public int[] readInts(int offset) {
|
| + public int[] readInts(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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);
|
| @@ -264,12 +279,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of floats at the given offset.
|
| */
|
| - public float[] readFloats(int offset) {
|
| + public float[] readFloats(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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);
|
| @@ -279,12 +294,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of longs at the given offset.
|
| */
|
| - public long[] readLongs(int offset) {
|
| + public long[] readLongs(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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);
|
| @@ -294,12 +309,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of doubles at the given offset.
|
| */
|
| - public double[] readDoubles(int offset) {
|
| + public double[] readDoubles(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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);
|
| @@ -358,8 +373,7 @@ public class Decoder {
|
| *
|
| * @return a proxy to the service.
|
| */
|
| - public <P extends Proxy> P readServiceInterface(int offset,
|
| - Interface.Manager<?, P> manager) {
|
| + public <P extends Proxy> P readServiceInterface(int offset, Interface.Manager<?, P> manager) {
|
| MessagePipeHandle handle = readMessagePipeHandle(offset);
|
| if (!handle.isValid()) {
|
| return null;
|
| @@ -382,7 +396,7 @@ public class Decoder {
|
| * Deserializes a string at the given offset.
|
| */
|
| public String readString(int offset) {
|
| - byte[] bytes = readBytes(offset);
|
| + byte[] bytes = readBytes(offset, BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
|
| if (bytes == null) {
|
| return null;
|
| }
|
| @@ -392,12 +406,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |Handle| at the given offset.
|
| */
|
| - public Handle[] readHandles(int offset) {
|
| + public Handle[] readHandles(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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(
|
| @@ -409,12 +423,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |UntypedHandle| at the given offset.
|
| */
|
| - public UntypedHandle[] readUntypedHandles(int offset) {
|
| + public UntypedHandle[] readUntypedHandles(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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(
|
| @@ -426,12 +440,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |ConsumerHandle| at the given offset.
|
| */
|
| - public DataPipe.ConsumerHandle[] readConsumerHandles(int offset) {
|
| + public DataPipe.ConsumerHandle[] readConsumerHandles(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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(
|
| @@ -443,12 +457,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |ProducerHandle| at the given offset.
|
| */
|
| - public DataPipe.ProducerHandle[] readProducerHandles(int offset) {
|
| + public DataPipe.ProducerHandle[] readProducerHandles(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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(
|
| @@ -461,12 +475,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |MessagePipeHandle| at the given offset.
|
| */
|
| - public MessagePipeHandle[] readMessagePipeHandles(int offset) {
|
| + public MessagePipeHandle[] readMessagePipeHandles(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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(
|
| @@ -479,12 +493,12 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |SharedBufferHandle| at the given offset.
|
| */
|
| - public SharedBufferHandle[] readSharedBufferHandles(int offset) {
|
| + public SharedBufferHandle[] readSharedBufferHandles(int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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(
|
| @@ -497,13 +511,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |ServiceHandle| at the given offset.
|
| */
|
| - public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(int offset,
|
| - Interface.Manager<S, P> manager) {
|
| + public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(
|
| + int offset, Interface.Manager<S, P> manager, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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
|
| @@ -519,12 +533,13 @@ public class Decoder {
|
| /**
|
| * Deserializes an array of |InterfaceRequest| at the given offset.
|
| */
|
| - public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(int offset) {
|
| + public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(
|
| + int offset, int expectedLength) {
|
| Decoder d = readPointer(offset);
|
| 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) {
|
|
|