Index: mojo/public/dart/system/lib/src/message_pipe.dart |
diff --git a/mojo/public/dart/system/lib/src/message_pipe.dart b/mojo/public/dart/system/lib/src/message_pipe.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c49e123295ef3eaae3f449fa9212087706f92c0c |
--- /dev/null |
+++ b/mojo/public/dart/system/lib/src/message_pipe.dart |
@@ -0,0 +1,122 @@ |
+// 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 _MojoMessagePipeNatives { |
+ static List MojoCreateMessagePipe(int flags) |
+ native "MojoMessagePipe_Create"; |
+ |
+ static int MojoWriteMessage( |
+ int handle, ByteData data, int num_bytes, List<int> handles, int flags) |
+ native "MojoMessagePipe_Write"; |
+ |
+ static List MojoReadMessage( |
+ int handle, ByteData data, int num_bytes, List<int> handles, int flags) |
+ native "MojoMessagePipe_Read"; |
+} |
+ |
+ |
+class MojoMessagePipeEndpoint { |
+ static final int WRITE_FLAG_NONE = 0; |
+ static final int READ_FLAG_NONE = 0; |
+ static final int READ_FLAG_MAY_DISCARD = 0; |
+ |
+ RawMojoHandle handle; |
+ int status; |
+ |
+ MojoMessagePipeEndpoint(this.handle); |
+ |
+ int write(ByteData data, |
+ [int num_bytes = -1, |
+ List<RawMojoHandle> handles = null, |
+ int flags = 0]) { |
+ // If num_bytes has the default value, use the full length of the data. |
+ int data_num_bytes = (num_bytes == -1) ? data.lengthInBytes : num_bytes; |
+ |
+ // handles may be null, otherwise convert to ints. |
+ List<int> mojo_handles = |
+ (handles != null) ? handles.map((h) => h.h).toList() : null; |
+ |
+ // Do the call. |
+ int result = _MojoMessagePipeNatives.MojoWriteMessage( |
+ handle.h, data, data_num_bytes, mojo_handles, flags); |
+ |
+ status = result; |
+ return status; |
+ } |
+ |
+ // return[0] = MojoResult |
+ // return[1] = bytes read |
+ // return[2] = handles read |
+ List read(ByteData data, |
+ [int num_bytes = -1, |
+ List<RawMojoHandle> handles = null, |
+ int flags = 0]) { |
+ // If num_bytes has the default value, use the full length of the data. |
+ int data_num_bytes; |
+ if (data == null) { |
+ data_num_bytes = 0; |
+ } else { |
+ data_num_bytes = (num_bytes == -1) ? data.lengthInBytes : num_bytes; |
+ } |
+ |
+ // handles may be null, otherwise make an int list for the handles. |
+ List<int> mojo_handles; |
+ if (handles == null) { |
+ mojo_handles = null; |
+ } else { |
+ mojo_handles = new List<int>(handles.length); |
+ } |
+ |
+ // Do the call. |
+ List result = _MojoMessagePipeNatives.MojoReadMessage( |
+ handle.h, data, data_num_bytes, mojo_handles, flags); |
+ |
+ if (result == null) { |
+ status = MojoResult.INVALID_ARGUMENT; |
+ return null; |
+ } |
+ assert((result is List) && (result.length == 3)); |
+ |
+ status = result[0]; |
+ return result; |
+ } |
+ |
+ List query() => read(null); |
+} |
+ |
+ |
+class MojoMessagePipe { |
+ static final int FLAG_NONE = 0; |
+ |
+ List<MojoMessagePipeEndpoint> endpoints; |
+ int status; |
+ |
+ MojoMessagePipe._internal() { |
+ endpoints = null; |
+ status = MojoResult.OK; |
+ } |
+ |
+ factory MojoMessagePipe() { |
+ return new MojoMessagePipe.create(FLAG_NONE); |
+ } |
+ |
+ factory MojoMessagePipe.create(int flags) { |
+ List result = _MojoMessagePipeNatives.MojoCreateMessagePipe(flags); |
+ if (result == null) { |
+ return null; |
+ } |
+ assert((result is List) && (result.length == 3)); |
+ |
+ RawMojoHandle end1 = new RawMojoHandle(result[1]); |
+ RawMojoHandle end2 = new RawMojoHandle(result[2]); |
+ MojoMessagePipe pipe = new MojoMessagePipe._internal(); |
+ pipe.endpoints = new List(2); |
+ pipe.endpoints[0] = new MojoMessagePipeEndpoint(end1); |
+ pipe.endpoints[1] = new MojoMessagePipeEndpoint(end2); |
+ pipe.status = result[0]; |
+ return pipe; |
+ } |
+} |