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) { |