blob: 62c7cb3a88bc6aa7f40bfd9fe09f2b547c2fffd9 [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.
part of core;
class MojoMessagePipeReadResult {
final MojoResult status;
final int bytesRead;
final int handlesRead;
MojoMessagePipeReadResult(this.status, this.bytesRead, this.handlesRead);
MojoMessagePipeReadResult.fromList(List<int> resultList)
: this(new MojoResult(resultList[0]), resultList[1], resultList[2]);
String toString() {
return "MojoMessagePipeReadResult("
"status: $status, bytesRead: $bytesRead, handlesRead: $handlesRead)";
}
}
class MojoMessagePipeEndpoint {
static const int WRITE_FLAG_NONE = 0;
static const int READ_FLAG_NONE = 0;
static const int READ_FLAG_MAY_DISCARD = 1 << 0;
MojoHandle handle;
MojoResult status;
MojoMessagePipeEndpoint(this.handle);
MojoResult write(ByteData data,
[int numBytes = -1, List<MojoHandle> handles = null, int flags = 0]) {
if (handle == null) {
status = MojoResult.INVALID_ARGUMENT;
return status;
}
int dataLengthInBytes = (data == null) ? 0 : data.lengthInBytes;
// If numBytes has the default value, use the full length of the data.
int dataNumBytes = (numBytes == -1) ? dataLengthInBytes : numBytes;
if (dataNumBytes > dataLengthInBytes) {
status = MojoResult.INVALID_ARGUMENT;
return status;
}
// handles may be null, otherwise convert to ints.
List<int> mojoHandles =
(handles != null) ? handles.map((h) => h.h).toList() : null;
// Do the call.
int result = MojoMessagePipeNatives.MojoWriteMessage(
handle.h, data, dataNumBytes, mojoHandles, flags);
status = new MojoResult(result);
return status;
}
MojoMessagePipeReadResult read(ByteData data,
[int numBytes = -1, List<MojoHandle> handles = null, int flags = 0]) {
if (handle == null) {
status = MojoResult.INVALID_ARGUMENT;
return null;
}
// If numBytes has the default value, use the full length of the data.
int dataNumBytes;
if (data == null) {
dataNumBytes = 0;
} else {
dataNumBytes = (numBytes == -1) ? data.lengthInBytes : numBytes;
if (dataNumBytes > data.lengthInBytes) {
status = MojoResult.INVALID_ARGUMENT;
return null;
}
}
// handles may be null, otherwise make an int list for the handles.
List<int> mojoHandles;
if (handles == null) {
mojoHandles = null;
} else {
mojoHandles = new List<int>(handles.length);
}
// Do the call.
List result = MojoMessagePipeNatives.MojoReadMessage(
handle.h, data, dataNumBytes, mojoHandles, flags);
if (result == null) {
status = MojoResult.INVALID_ARGUMENT;
return null;
}
assert((result is List) && (result.length == 3));
var readResult = new MojoMessagePipeReadResult.fromList(result);
// Copy out the handles that were read.
if (handles != null) {
for (var i = 0; i < readResult.handlesRead; i++) {
handles[i] = new MojoHandle(mojoHandles[i]);
}
}
status = readResult.status;
return readResult;
}
MojoMessagePipeReadResult query() => read(null);
bool setDescription(String description) {
assert(MojoHandle._setHandleLeakDescription(handle, description));
return true;
}
void close() {
handle.close();
handle = null;
}
String toString() =>
"MojoMessagePipeEndpoint(handle: $handle, status: $status)";
}
class MojoMessagePipe {
static const int FLAG_NONE = 0;
List<MojoMessagePipeEndpoint> endpoints;
MojoResult status;
MojoMessagePipe._() {
endpoints = null;
status = MojoResult.OK;
}
factory MojoMessagePipe([int flags = FLAG_NONE]) {
List result = MojoMessagePipeNatives.MojoCreateMessagePipe(flags);
if (result == null) {
return null;
}
assert((result is List) && (result.length == 3));
MojoHandle end1 = new MojoHandle(result[1]);
MojoHandle end2 = new MojoHandle(result[2]);
MojoMessagePipe pipe = new MojoMessagePipe._();
pipe.endpoints = new List(2);
pipe.endpoints[0] = new MojoMessagePipeEndpoint(end1);
pipe.endpoints[1] = new MojoMessagePipeEndpoint(end2);
pipe.status = new MojoResult(result[0]);
return pipe;
}
}