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

Side by Side Diff: runtime/bin/directory_impl.dart

Issue 10392023: Change dart:io to use Future for one-shot operations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Adding stable test binaries Created 8 years, 7 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 | « runtime/bin/directory.dart ('k') | runtime/bin/file.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 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 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 5
6 class _Directory implements Directory { 6 class _Directory implements Directory {
7 static final kCreateRequest = 0; 7 static final kCreateRequest = 0;
8 static final kDeleteRequest = 1; 8 static final kDeleteRequest = 1;
9 static final kExistsRequest = 2; 9 static final kExistsRequest = 2;
10 static final kCreateTempRequest = 3; 10 static final kCreateTempRequest = 3;
11 static final kListRequest = 4; 11 static final kListRequest = 4;
12 12
13 static final kSuccessResponse = 0; 13 static final kSuccessResponse = 0;
14 static final kIllegalArgumentResponse = 1; 14 static final kIllegalArgumentResponse = 1;
15 static final kOSErrorResponse = 2; 15 static final kOSErrorResponse = 2;
16 16
17 _Directory(String this._path); 17 _Directory(String this._path);
18 _Directory.current() : _path = _current(); 18 _Directory.current() : _path = _current();
19 19
20 static String _current() native "Directory_Current"; 20 static String _current() native "Directory_Current";
21 static _createTemp(String template) native "Directory_CreateTemp"; 21 static _createTemp(String template) native "Directory_CreateTemp";
22 static int _exists(String path) native "Directory_Exists"; 22 static int _exists(String path) native "Directory_Exists";
23 static _create(String path) native "Directory_Create"; 23 static _create(String path) native "Directory_Create";
24 static _delete(String path, bool recursive) native "Directory_Delete"; 24 static _delete(String path, bool recursive) native "Directory_Delete";
25 static SendPort _newServicePort() native "Directory_NewServicePort"; 25 static SendPort _newServicePort() native "Directory_NewServicePort";
26 26
27 void exists(void callback(bool exists)) { 27 Future<bool> exists() {
28 _ensureDirectoryService(); 28 _ensureDirectoryService();
29 Completer<bool> completer = new Completer<bool>();
29 List request = new List(2); 30 List request = new List(2);
30 request[0] = kExistsRequest; 31 request[0] = kExistsRequest;
31 request[1] = _path; 32 request[1] = _path;
32 _directoryService.call(request).then((response) { 33 _directoryService.call(request).then((response) {
33 if (_isErrorResponse(response)) { 34 if (_isErrorResponse(response)) {
34 _handleErrorResponse(response, "Exists failed"); 35 var e = _exceptionFromResponse(response, "Exists failed");
36 completer.completeException(e);
35 } else { 37 } else {
36 callback(response == 1); 38 completer.complete(response == 1);
37 } 39 }
38 }); 40 });
41 return completer.future;
39 } 42 }
40 43
41 bool existsSync() { 44 bool existsSync() {
42 if (_path is !String) { 45 if (_path is !String) {
43 throw new IllegalArgumentException(); 46 throw new IllegalArgumentException();
44 } 47 }
45 var result = _exists(_path); 48 var result = _exists(_path);
46 if (result is OSError) { 49 if (result is OSError) {
47 throw new DirectoryIOException("Exists failed", _path, result); 50 throw new DirectoryIOException("Exists failed", _path, result);
48 } 51 }
49 return (result == 1); 52 return (result == 1);
50 } 53 }
51 54
52 void create(void callback()) { 55 Future<Directory> create() {
53 _ensureDirectoryService(); 56 _ensureDirectoryService();
57 Completer<Directory> completer = new Completer<Directory>();
54 List request = new List(2); 58 List request = new List(2);
55 request[0] = kCreateRequest; 59 request[0] = kCreateRequest;
56 request[1] = _path; 60 request[1] = _path;
57 _directoryService.call(request).then((response) { 61 _directoryService.call(request).then((response) {
58 if (_isErrorResponse(response)) { 62 if (_isErrorResponse(response)) {
59 _handleErrorResponse(response, "Creation failed"); 63 var e = _exceptionFromResponse(response, "Creation failed");
64 completer.completeException(e);
60 } else { 65 } else {
61 callback(); 66 completer.complete(this);
62 } 67 }
63 }); 68 });
69 return completer.future;
64 } 70 }
65 71
66 void createSync() { 72 void createSync() {
67 if (_path is !String) { 73 if (_path is !String) {
68 throw new IllegalArgumentException(); 74 throw new IllegalArgumentException();
69 } 75 }
70 var result = _create(_path); 76 var result = _create(_path);
71 if (result is OSError) { 77 if (result is OSError) {
72 throw new DirectoryIOException("Creation failed", _path, result); 78 throw new DirectoryIOException("Creation failed", _path, result);
73 } 79 }
74 } 80 }
75 81
76 void createTemp(void callback()) { 82 Future<Directory> createTemp() {
77 _ensureDirectoryService(); 83 _ensureDirectoryService();
84 Completer<Directory> completer = new Completer<Directory>();
78 List request = new List(2); 85 List request = new List(2);
79 request[0] = kCreateTempRequest; 86 request[0] = kCreateTempRequest;
80 request[1] = _path; 87 request[1] = _path;
81 _directoryService.call(request).then((response) { 88 _directoryService.call(request).then((response) {
82 if (_isErrorResponse(response)) { 89 if (_isErrorResponse(response)) {
83 _handleErrorResponse(response, "Creation of temporary directory failed") ; 90 var e =
91 _exceptionFromResponse(response,
92 "Creation of temporary directory failed");
93 completer.completeException(e);
84 } else { 94 } else {
85 _path = response; 95 completer.complete(new Directory(response));
86 callback();
87 } 96 }
88 }); 97 });
98 return completer.future;
89 } 99 }
90 100
91 void createTempSync() { 101 void createTempSync() {
92 if (_path is !String) { 102 if (_path is !String) {
93 throw new IllegalArgumentException(); 103 throw new IllegalArgumentException();
94 } 104 }
95 var result = _createTemp(path); 105 var result = _createTemp(path);
96 if (result is OSError) { 106 if (result is OSError) {
97 throw new DirectoryIOException("Creation of temporary directory failed", 107 throw new DirectoryIOException("Creation of temporary directory failed",
98 _path, 108 _path,
99 result); 109 result);
100 } 110 }
101 _path = result; 111 return new Directory(result);
102 } 112 }
103 113
104 void _deleteHelper(bool recursive, String errorMsg, void callback()) { 114 Future<Directory> _deleteHelper(bool recursive, String errorMsg) {
105 _ensureDirectoryService(); 115 _ensureDirectoryService();
116 Completer<Directory> completer = new Completer<Directory>();
106 List request = new List(3); 117 List request = new List(3);
107 request[0] = kDeleteRequest; 118 request[0] = kDeleteRequest;
108 request[1] = _path; 119 request[1] = _path;
109 request[2] = recursive; 120 request[2] = recursive;
110 _directoryService.call(request).then((response) { 121 _directoryService.call(request).then((response) {
111 if (_isErrorResponse(response)) { 122 if (_isErrorResponse(response)) {
112 _handleErrorResponse(response, errorMsg); 123 var e = _exceptionFromResponse(response, errorMsg);
124 completer.completeException(e);
113 } else { 125 } else {
114 callback(); 126 completer.complete(this);
115 } 127 }
116 }); 128 });
129 return completer.future;
117 } 130 }
118 131
119 void delete(void callback()) { 132 Future<Directory> delete() {
120 _deleteHelper(false, "Deletion failed", callback); 133 return _deleteHelper(false, "Deletion failed");
121 } 134 }
122 135
123 void deleteRecursively(void callback()) { 136 Future<Directory> deleteRecursively() {
124 _deleteHelper(true, "Deletion failed", callback); 137 return _deleteHelper(true, "Deletion failed");
125 } 138 }
126 139
127 void deleteSync() { 140 void deleteSync() {
128 if (_path is !String) { 141 if (_path is !String) {
129 throw new IllegalArgumentException(); 142 throw new IllegalArgumentException();
130 } 143 }
131 var result = _delete(_path, false); 144 var result = _delete(_path, false);
132 if (result is OSError) { 145 if (result is OSError) {
133 throw new DirectoryIOException("Deletion failed", _path, result); 146 throw new DirectoryIOException("Deletion failed", _path, result);
134 } 147 }
135 } 148 }
136 149
137 void deleteRecursivelySync() { 150 void deleteRecursivelySync() {
138 if (_path is !String) { 151 if (_path is !String) {
139 throw new IllegalArgumentException(); 152 throw new IllegalArgumentException();
140 } 153 }
141 var result = _delete(_path, true); 154 var result = _delete(_path, true);
142 if (result is OSError) { 155 if (result is OSError) {
143 throw new DirectoryIOException("Deletion failed", _path, result); 156 throw new DirectoryIOException("Deletion failed", _path, result);
144 } 157 }
145 } 158 }
146 159
147 void list([bool recursive = false]) { 160 DirectoryLister list([bool recursive = false]) {
161 return new _DirectoryLister(_path, recursive);
162 }
163
164 String get path() { return _path; }
165
166 bool _isErrorResponse(response) {
167 return response is List && response[0] != _FileUtils.kSuccessResponse;
168 }
169
170 Exception _exceptionFromResponse(response, String message) {
171 assert(_isErrorResponse(response));
172 switch (response[_FileUtils.kErrorResponseErrorType]) {
173 case _FileUtils.kIllegalArgumentResponse:
174 return new IllegalArgumentException();
175 case _FileUtils.kOSErrorResponse:
176 var err = new OSError(response[_FileUtils.kOSErrorResponseMessage],
177 response[_FileUtils.kOSErrorResponseErrorCode]);
178 return new DirectoryIOException(message, _path, err);
179 default:
180 return new Exception("Unknown error");
181 }
182 }
183
184 void _ensureDirectoryService() {
185 if (_directoryService == null) {
186 _directoryService = _newServicePort();
187 }
188 }
189
190 final String _path;
191 SendPort _directoryService;
192 }
193
194 class _DirectoryLister implements DirectoryLister {
195 _DirectoryLister(String path, bool recursive) {
148 final int kListDirectory = 0; 196 final int kListDirectory = 0;
149 final int kListFile = 1; 197 final int kListFile = 1;
150 final int kListError = 2; 198 final int kListError = 2;
151 final int kListDone = 3; 199 final int kListDone = 3;
152 200
153 final int kResponseType = 0; 201 final int kResponseType = 0;
154 final int kResponsePath = 1; 202 final int kResponsePath = 1;
155 final int kResponseComplete = 1; 203 final int kResponseComplete = 1;
156 final int kResponseError = 2; 204 final int kResponseError = 2;
157 205
158 List request = new List(3); 206 List request = new List(3);
159 request[0] = kListRequest; 207 request[0] = _Directory.kListRequest;
160 request[1] = _path; 208 request[1] = path;
161 request[2] = recursive; 209 request[2] = recursive;
162 ReceivePort responsePort = new ReceivePort(); 210 ReceivePort responsePort = new ReceivePort();
163 // Use a separate directory service port for each listing as 211 // Use a separate directory service port for each listing as
164 // listing operations on the same directory can run in parallel. 212 // listing operations on the same directory can run in parallel.
165 _newServicePort().send(request, responsePort.toSendPort()); 213 _Directory._newServicePort().send(request, responsePort.toSendPort());
166 responsePort.receive((message, replyTo) { 214 responsePort.receive((message, replyTo) {
167 if (message is !List || message[kResponseType] is !int) { 215 if (message is !List || message[kResponseType] is !int) {
168 responsePort.close(); 216 responsePort.close();
169 _reportError(new DirectoryIOException("Internal error")); 217 _reportError(new DirectoryIOException("Internal error"));
170 return; 218 return;
171 } 219 }
172 switch (message[kResponseType]) { 220 switch (message[kResponseType]) {
173 case kListDirectory: 221 case kListDirectory:
174 if (_onDir != null) _onDir(message[kResponsePath]); 222 if (_onDir != null) _onDir(message[kResponsePath]);
175 break; 223 break;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 } 257 }
210 258
211 void set onDone(void onDone(bool completed)) { 259 void set onDone(void onDone(bool completed)) {
212 _onDone = onDone; 260 _onDone = onDone;
213 } 261 }
214 262
215 void set onError(void onError(e)) { 263 void set onError(void onError(e)) {
216 _onError = onError; 264 _onError = onError;
217 } 265 }
218 266
219 String get path() { return _path; }
220
221 void _ensureDirectoryService() {
222 if (_directoryService == null) {
223 _directoryService = _newServicePort();
224 }
225 }
226
227 void _reportError(e) { 267 void _reportError(e) {
228 if (_onError != null) { 268 if (_onError != null) {
229 _onError(e); 269 _onError(e);
230 } else { 270 } else {
231 throw e; 271 throw e;
232 } 272 }
233 } 273 }
234 274
235 bool _isErrorResponse(response) {
236 return response is List && response[0] != _FileUtils.kSuccessResponse;
237 }
238
239 void _handleErrorResponse(response, String message) {
240 assert(_isErrorResponse(response));
241 switch (response[_FileUtils.kErrorResponseErrorType]) {
242 case _FileUtils.kIllegalArgumentResponse:
243 _reportError(new IllegalArgumentException());
244 break;
245 case _FileUtils.kOSErrorResponse:
246 var err = new OSError(response[_FileUtils.kOSErrorResponseMessage],
247 response[_FileUtils.kOSErrorResponseErrorCode]);
248 _reportError(new DirectoryIOException(message, _path, err));
249 break;
250 default:
251 _reportError(new Exception("Unknown error"));
252 break;
253 }
254 }
255
256 Function _onDir; 275 Function _onDir;
257 Function _onFile; 276 Function _onFile;
258 Function _onDone; 277 Function _onDone;
259 Function _onError; 278 Function _onError;
260
261 String _path;
262 SendPort _directoryService;
263 } 279 }
OLDNEW
« no previous file with comments | « runtime/bin/directory.dart ('k') | runtime/bin/file.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698