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