OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 #library("utils"); |
| 6 |
| 7 #import("dart-ext:dart_archive"); |
| 8 #import("dart:isolate"); |
| 9 #import("archive.dart", prefix: "archive"); |
| 10 |
| 11 /** The cache of the port used to communicate with the C extension. */ |
| 12 SendPort _port; |
| 13 |
| 14 /** The port used to communicate with the C extension. */ |
| 15 SendPort get servicePort() { |
| 16 if (_port == null) _port = _newServicePort(); |
| 17 return _port; |
| 18 } |
| 19 |
| 20 /** Creates a new port to communicate with the C extension. */ |
| 21 SendPort _newServicePort() native "Archive_ServicePort"; |
| 22 |
| 23 /** |
| 24 * Send a message to the C extension. |
| 25 * |
| 26 * [requestType] is the specific request id to send. [id] is the id of the |
| 27 * archive; it may be null for requests that don't operate on a specific |
| 28 * archive. [args] are arguments that will be passed on to the extension. They |
| 29 * should all be C-safe. |
| 30 * |
| 31 * Returns a future that completes with the C extension's reply. |
| 32 */ |
| 33 Future call(int requestType, int id, [List args]) { |
| 34 var fullArgs = [requestType, id]; |
| 35 if (args != null) fullArgs.addAll(args); |
| 36 return servicePort.call(listForC(fullArgs)).transform((response) { |
| 37 var success = response[0]; |
| 38 var errno = response[1]; |
| 39 var message = response[2]; |
| 40 |
| 41 if (!success) throw new ArchiveException(message, errno); |
| 42 return message; |
| 43 }); |
| 44 } |
| 45 |
| 46 /** Converts [input] to a fixed-length list which C can understand. */ |
| 47 List listForC(List input) { |
| 48 var list = new List(input.length); |
| 49 list.setRange(0, input.length, input); |
| 50 return list; |
| 51 } |
| 52 |
| 53 /** Converts [input] to a [Uint8List] that C can process easily. */ |
| 54 Uint8List bytesForC(List<int> input) { |
| 55 var list = new Uint8List(input.length); |
| 56 list.setRange(0, input.length, input); |
| 57 return list; |
| 58 } |
| 59 |
| 60 /** |
| 61 * Returns a [Future] that completes immediately upon hitting the event loop. |
| 62 */ |
| 63 Future async() { |
| 64 var completer = new Completer(); |
| 65 new Timer(0, (_) => completer.complete(null)); |
| 66 return completer.future; |
| 67 } |
| 68 |
| 69 /** An error raised by the archive library. */ |
| 70 class ArchiveException implements archive.ArchiveException { |
| 71 /** A description of the error that occurred. */ |
| 72 final String message; |
| 73 |
| 74 /** The error code for the error, or null. */ |
| 75 final int errno; |
| 76 |
| 77 ArchiveException(this.message, [this.errno]); |
| 78 |
| 79 String toString() { |
| 80 if (errno == null) return "Archive error: $message"; |
| 81 return "Archive error $errno: $message"; |
| 82 } |
| 83 } |
OLD | NEW |