Index: mojo/public/java/src/org/chromium/mojo/system/MessagePipeHandle.java |
diff --git a/mojo/public/java/src/org/chromium/mojo/system/MessagePipeHandle.java b/mojo/public/java/src/org/chromium/mojo/system/MessagePipeHandle.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c187497d3f7d34199467cff57399018cd102d1f0 |
--- /dev/null |
+++ b/mojo/public/java/src/org/chromium/mojo/system/MessagePipeHandle.java |
@@ -0,0 +1,181 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.mojo.system; |
+ |
+import java.nio.ByteBuffer; |
+import java.util.List; |
+ |
+/** |
+ * Message pipes are bidirectional communication channel for framed data (i.e., messages). Messages |
+ * can contain plain data and/or Mojo handles. |
+ */ |
+public interface MessagePipeHandle extends Handle { |
+ /** |
+ * Flags for the write operations on MessagePipeHandle . |
+ */ |
+ public static class WriteFlags extends Flags<WriteFlags> { |
+ private static final int FLAG_NONE = 0; |
+ |
+ /** |
+ * Dedicated constructor. |
+ * |
+ * @param flags initial value of the flag. |
+ */ |
+ private WriteFlags(int flags) { |
+ super(flags); |
+ } |
+ |
+ /** |
+ * @return a flag with no bit set. |
+ */ |
+ public static WriteFlags none() { |
+ return new WriteFlags(FLAG_NONE); |
+ } |
+ } |
+ |
+ /** |
+ * Flags for the read operations on MessagePipeHandle. |
+ */ |
+ public static class ReadFlags extends Flags<ReadFlags> { |
+ private static final int FLAG_NONE = 0; |
+ private static final int FLAG_MAY_DISCARD = 1 << 0; |
+ |
+ /** |
+ * Dedicated constructor. |
+ * |
+ * @param flags initial value of the flag. |
+ */ |
+ private ReadFlags(int flags) { |
+ super(flags); |
+ } |
+ |
+ /** |
+ * Change the may-discard bit of this flag. If set, if the message is unable to be read for |
+ * whatever reason (e.g., the caller-supplied buffer is too small), discard the message |
+ * (i.e., simply dequeue it). |
+ * |
+ * @param mayDiscard the new value of the may-discard bit. |
+ * @return this. |
+ */ |
+ public ReadFlags setMayDiscard(boolean mayDiscard) { |
+ return setFlag(FLAG_MAY_DISCARD, mayDiscard); |
+ } |
+ |
+ /** |
+ * @return a flag with no bit set. |
+ */ |
+ public static ReadFlags none() { |
+ return new ReadFlags(FLAG_NONE); |
+ } |
+ |
+ } |
+ |
+ /** |
+ * Writes a message to the message pipe endpoint, with message data specified by |bytes| and |
+ * attached handles specified by |handles|, and options specified by |flags|. If there is no |
+ * message data, |bytes| may be null, otherwise it must be a direct ByteBuffer. If there are no |
+ * attached handles, |handles| may be null. |
+ * <p> |
+ * If handles are attached, on success the handles will no longer be valid (the receiver will |
+ * receive equivalent, but logically different, handles). Handles to be sent should not be in |
+ * simultaneous use (e.g., on another thread). |
+ */ |
+ void writeMessage(ByteBuffer bytes, List<Handle> handles, WriteFlags flags); |
+ |
+ /** |
+ * Result of the |readMessage| method. |
+ */ |
+ public static class ReadMessageResult { |
+ /** |
+ * <code>true</code> if a message was read. |
+ */ |
+ private boolean mWasMessageRead; |
+ /** |
+ * If a message was read, the size in bytes of the message, otherwise the size in bytes of |
+ * the next message. |
+ */ |
+ private int mMessageSize; |
+ /** |
+ * If a message was read, the number of handles contained in the message, otherwise the |
+ * number of handles contained in the next message. |
+ */ |
+ private int mHandlesCount; |
+ /** |
+ * If a message was read, the handles contained in the message, undefined otherwise. |
+ */ |
+ private List<UntypedHandle> mHandles; |
+ |
+ /** |
+ * @return the wasMessageRead |
+ */ |
+ public boolean getWasMessageRead() { |
+ return mWasMessageRead; |
+ } |
+ |
+ /** |
+ * @param wasMessageRead the wasMessageRead to set |
+ */ |
+ public void setWasMessageRead(boolean wasMessageRead) { |
+ mWasMessageRead = wasMessageRead; |
+ } |
+ |
+ /** |
+ * @return the messageSize |
+ */ |
+ public int getMessageSize() { |
+ return mMessageSize; |
+ } |
+ |
+ /** |
+ * @param messageSize the messageSize to set |
+ */ |
+ public void setMessageSize(int messageSize) { |
+ mMessageSize = messageSize; |
+ } |
+ |
+ /** |
+ * @return the handlesCount |
+ */ |
+ public int getHandlesCount() { |
+ return mHandlesCount; |
+ } |
+ |
+ /** |
+ * @param handlesCount the handlesCount to set |
+ */ |
+ public void setHandlesCount(int handlesCount) { |
+ mHandlesCount = handlesCount; |
+ } |
+ |
+ /** |
+ * @return the handles |
+ */ |
+ public List<UntypedHandle> getHandles() { |
+ return mHandles; |
+ } |
+ |
+ /** |
+ * @param handles the handles to set |
+ */ |
+ public void setHandles(List<UntypedHandle> handles) { |
+ mHandles = handles; |
+ } |
+ } |
+ |
+ /** |
+ * Reads a message from the message pipe endpoint; also usable to query the size of the next |
+ * message or discard the next message. |bytes| indicate the buffer/buffer size to receive the |
+ * message data (if any) and |maxNumberOfHandles| indicate the maximum handle count to receive |
+ * the attached handles (if any). |bytes| is optional. If null, |maxNumberOfHandles| must be |
+ * zero, and the return value will indicate the size of the next message. If non-null, it must |
+ * be a direct ByteBuffer and the return value will indicate if the message was read or not. If |
+ * the message was read its content will be in |bytes|, and the attached handles will be in the |
+ * return value. Partial reads are NEVER done. Either a full read is done and |wasMessageRead| |
+ * will be true, or the read is NOT done and |wasMessageRead| will be false (if |mayDiscard| was |
+ * set, the message is also discarded in this case). |
+ */ |
+ ReadMessageResult readMessage(ByteBuffer bytes, int maxNumberOfHandles, |
+ ReadFlags flags); |
+} |