blob: 086f6267df3a9983ce628d4b82ce3f0f7c9b5e42 [file] [log] [blame]
// 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;
/**
* Immutable flag with no bit set.
*/
public static final WriteFlags NONE = WriteFlags.none().immutable();
/**
* 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;
/**
* Immutable flag with no bit set.
*/
public static final ReadFlags NONE = ReadFlags.none().immutable();
/**
* 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<? extends Handle> handles, WriteFlags flags);
/**
* Result of the |readMessage| method.
*/
public static class ReadMessageResult {
/**
* The MojoResult value of the read call.
*/
private int mMojoResult;
/**
* 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 mojoResult
*/
public int getMojoResult() {
return mMojoResult;
}
/**
* @param mojoResult the mojoResult to set
*/
public void setMojoResult(int mojoResult) {
mMojoResult = mojoResult;
}
/**
* @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);
}