Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: utils/archive/utils.dart

Issue 10842002: Add the beginnings of a Dart wrapper for libarchive. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Merge Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « utils/archive/reader.dart ('k') | utils/tests/archive/reader_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 }
OLDNEW
« no previous file with comments | « utils/archive/reader.dart ('k') | utils/tests/archive/reader_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698