Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(636)

Unified Diff: mojo/bindings/java/src/org/chromium/mojo/bindings/Decoder.java

Issue 364063006: JAVA BINDINGS WIP. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updates Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/bindings/java/src/org/chromium/mojo/bindings/Decoder.java
diff --git a/mojo/bindings/java/src/org/chromium/mojo/bindings/Decoder.java b/mojo/bindings/java/src/org/chromium/mojo/bindings/Decoder.java
index 86a038fc503fab3261a4f038c043686ef3fbeebb..55bca8e77a13d7a4b87ce24d5669da7ce074b33e 100644
--- a/mojo/bindings/java/src/org/chromium/mojo/bindings/Decoder.java
+++ b/mojo/bindings/java/src/org/chromium/mojo/bindings/Decoder.java
@@ -40,10 +40,16 @@ public class Decoder {
private final long mMaxMemory;
/**
+ * The number of handle in the message.
+ */
+ private final long mNumberOfHandles;
+
+ /**
* Constructor.
*/
- Validator(long maxMemory) {
+ Validator(long maxMemory, int numberOfHandles) {
mMaxMemory = maxMemory;
+ mNumberOfHandles = numberOfHandles;
}
public void claimHandle(int handle) {
@@ -51,6 +57,9 @@ public class Decoder {
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;
}
@@ -92,7 +101,7 @@ public class Decoder {
* @param message The message to decode.
*/
public Decoder(Message message) {
- this(message, new Validator(message.buffer.limit()), 0);
+ this(message, new Validator(message.buffer.limit(), message.handles.size()), 0);
}
private Decoder(Message message, Validator validator, int baseOffset) {
@@ -338,17 +347,29 @@ public class Decoder {
/**
* Deserializes a |ServiceHandle| at the given offset.
*/
- public <S extends Interface> S readServiceInterface(int offset, Object builder) {
- // TODO(qsr): To be implemented when interfaces proxy and stubs are implemented.
- throw new UnsupportedOperationException("Unimplemented operation");
+ public <S extends Interface> S readServiceInterface(int offset,
+ Interface.Builder<S, ?> builder) {
+ int index = readInt(offset);
+ if (index == -1) {
+ return null;
+ }
+ mValidator.claimHandle(index);
+ MessagePipeHandle handle = mMessage.handles.get(index).toUntypedHandle()
+ .toMessagePipeHandle();
+ @SuppressWarnings("unchecked")
+ S service = (S) builder.connect(handle);
+ return service;
}
/**
* Deserializes a |InterfaceRequest| at the given offset.
*/
public <S extends Interface> InterfaceRequest<S> readInterfaceRequest(int offset) {
- // TODO(qsr): To be implemented when interfaces proxy and stubs are implemented.
- throw new UnsupportedOperationException("Unimplemented operation");
+ MessagePipeHandle handle = readMessagePipeHandle(offset);
+ if (handle == null) {
+ return null;
+ }
+ return new InterfaceRequest<S>(handle);
}
/**
@@ -453,9 +474,18 @@ public class Decoder {
/**
* Deserializes an array of |ServiceHandle| at the given offset.
*/
- public <S extends Interface> S[] readServiceInterfaces(int offset, Object builder) {
- // TODO(qsr): To be implemented when interfaces proxy and stubs are implemented.
- throw new UnsupportedOperationException("Unimplemented operation");
+ public <S extends Interface> S[] readServiceInterfaces(int offset,
+ Interface.Builder<S, ?> builder) {
+ Decoder d = readPointer(offset);
+ if (d == null) {
+ return null;
+ }
+ DataHeader si = d.readDataHeader();
+ S[] result = builder.newArray(si.numFields);
+ for (int i = 0; i < result.length; ++i) {
+ result[i] = d.readServiceInterface(8 + 4 * i, builder);
+ }
+ return result;
}
/**

Powered by Google App Engine
This is Rietveld 408576698