Index: mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java |
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java |
index cc9f12ceb8d75134af4af02533ef5b8c735d7792..84cc7de196deee3878dadbbcaa51e20218045a26 100644 |
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java |
+++ b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java |
@@ -7,9 +7,12 @@ package org.chromium.mojo.bindings; |
import org.chromium.mojo.system.AsyncWaiter; |
import org.chromium.mojo.system.Core; |
import org.chromium.mojo.system.MessagePipeHandle; |
+import org.chromium.mojo.system.MessagePipeHandle.ReadMessageResult; |
import org.chromium.mojo.system.MojoException; |
import org.chromium.mojo.system.MojoResult; |
+import java.nio.ByteBuffer; |
+ |
/** |
* A {@link Connector} owns a {@link MessagePipeHandle} and will send any received messages to the |
* registered {@link MessageReceiver}. It also acts as a {@link MessageReceiver} and will send any |
@@ -92,13 +95,13 @@ public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle |
} |
/** |
- * @see MessageReceiver#accept(MessageWithHeader) |
+ * @see MessageReceiver#accept(Message) |
*/ |
@Override |
- public boolean accept(MessageWithHeader message) { |
+ public boolean accept(Message message) { |
try { |
- mMessagePipeHandle.writeMessage(message.getMessage().buffer, |
- message.getMessage().handles, MessagePipeHandle.WriteFlags.NONE); |
+ mMessagePipeHandle.writeMessage(message.getData(), |
+ message.getHandles(), MessagePipeHandle.WriteFlags.NONE); |
return true; |
} catch (MojoException e) { |
onError(e); |
@@ -194,8 +197,7 @@ public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle |
int result; |
do { |
try { |
- result = MessageWithHeader.readAndDispatchMessage(mMessagePipeHandle, |
- mIncomingMessageReceiver); |
+ result = readAndDispatchMessage(mMessagePipeHandle, mIncomingMessageReceiver); |
} catch (MojoException e) { |
onError(e); |
return; |
@@ -214,4 +216,26 @@ public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle |
mCancellable = null; |
} |
} |
+ |
+ /** |
+ * Read a message, and pass it to the given |MessageReceiver| if not null. If the |
+ * |MessageReceiver| is null, the message is lost. |
+ * |
+ * @param receiver The {@link MessageReceiver} that will receive the read {@link Message}. Can |
+ * be <code>null</code>, in which case the message is discarded. |
+ */ |
+ static int readAndDispatchMessage(MessagePipeHandle handle, MessageReceiver receiver) { |
+ // TODO(qsr) Allow usage of a pool of pre-allocated buffer for performance. |
+ ReadMessageResult result = handle.readMessage(null, 0, MessagePipeHandle.ReadFlags.NONE); |
+ if (result.getMojoResult() != MojoResult.RESOURCE_EXHAUSTED) { |
+ return result.getMojoResult(); |
+ } |
+ ByteBuffer buffer = ByteBuffer.allocateDirect(result.getMessageSize()); |
+ result = handle.readMessage(buffer, result.getHandlesCount(), |
+ MessagePipeHandle.ReadFlags.NONE); |
+ if (receiver != null && result.getMojoResult() == MojoResult.OK) { |
+ receiver.accept(new SimpleMessage(buffer, result.getHandles())); |
+ } |
+ return result.getMojoResult(); |
+ } |
} |