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]) { | |
Bob Nystrom
2012/07/31 21:56:48
I found this hard to read in the code that was usi
| |
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 ArchiveError(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 ArchiveError implements archive.ArchiveError { | |
Bob Nystrom
2012/07/31 21:56:48
"Error" -> "Exception".
nweiz
2012/07/31 23:38:25
Done.
| |
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 ArchiveError(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 |