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

Side by Side Diff: sdk/lib/io/directory_impl.dart

Issue 12316036: Merge IO v2 branch to bleeding edge (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased to r18818 Created 7 years, 10 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 | « sdk/lib/io/directory.dart ('k') | sdk/lib/io/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 part of dart.io; 5 part of dart.io;
6 6
7 class _Directory implements Directory { 7 class _Directory implements Directory {
8 static const CREATE_REQUEST = 0; 8 static const CREATE_REQUEST = 0;
9 static const DELETE_REQUEST = 1; 9 static const DELETE_REQUEST = 1;
10 static const EXISTS_REQUEST = 2; 10 static const EXISTS_REQUEST = 2;
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 if (_path is !String || newPath is !String) { 219 if (_path is !String || newPath is !String) {
220 throw new ArgumentError(); 220 throw new ArgumentError();
221 } 221 }
222 var result = _rename(_path, newPath); 222 var result = _rename(_path, newPath);
223 if (result is OSError) { 223 if (result is OSError) {
224 throw new DirectoryIOException("Rename failed", _path, result); 224 throw new DirectoryIOException("Rename failed", _path, result);
225 } 225 }
226 return new Directory(newPath); 226 return new Directory(newPath);
227 } 227 }
228 228
229 DirectoryLister list({bool recursive: false}) { 229 Stream<FileSystemEntity> list({bool recursive: false}) {
230 return new _DirectoryLister(_path, recursive); 230 const int LIST_FILE = 0;
231 } 231 const int LIST_DIRECTORY = 1;
232
233 List listSync({bool recursive: false}) {
234 if (_path is! String || recursive is! bool) {
235 throw new ArgumentError();
236 }
237 return _list(_path, recursive);
238 }
239
240 String get path => _path;
241
242 String toString() => "Directory: '$path'";
243
244 bool _isErrorResponse(response) {
245 return response is List && response[0] != _SUCCESS_RESPONSE;
246 }
247
248 _exceptionOrErrorFromResponse(response, String message) {
249 assert(_isErrorResponse(response));
250 switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
251 case _ILLEGAL_ARGUMENT_RESPONSE:
252 return new ArgumentError();
253 case _OSERROR_RESPONSE:
254 var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
255 response[_OSERROR_RESPONSE_ERROR_CODE]);
256 return new DirectoryIOException(message, _path, err);
257 default:
258 return new Exception("Unknown error");
259 }
260 }
261
262 void _ensureDirectoryService() {
263 if (_directoryService == null) {
264 _directoryService = _newServicePort();
265 }
266 }
267
268 final String _path;
269 SendPort _directoryService;
270 }
271
272 class _DirectoryLister implements DirectoryLister {
273 _DirectoryLister(String path, bool recursive) {
274 const int LIST_DIRECTORY = 0;
275 const int LIST_FILE = 1;
276 const int LIST_ERROR = 2; 232 const int LIST_ERROR = 2;
277 const int LIST_DONE = 3; 233 const int LIST_DONE = 3;
278 234
279 final int RESPONSE_TYPE = 0; 235 const int RESPONSE_TYPE = 0;
280 final int RESPONSE_PATH = 1; 236 const int RESPONSE_PATH = 1;
281 final int RESPONSE_COMPLETE = 1; 237 const int RESPONSE_COMPLETE = 1;
282 final int RESPONSE_ERROR = 2; 238 const int RESPONSE_ERROR = 2;
283 239
284 List request = new List.fixedLength(3); 240 var controller = new StreamController<FileSystemEntity>();
285 request[0] = _Directory.LIST_REQUEST; 241
286 request[1] = path; 242 List request = [ _Directory.LIST_REQUEST, path, recursive ];
287 request[2] = recursive;
288 ReceivePort responsePort = new ReceivePort(); 243 ReceivePort responsePort = new ReceivePort();
289 // Use a separate directory service port for each listing as 244 // Use a separate directory service port for each listing as
290 // listing operations on the same directory can run in parallel. 245 // listing operations on the same directory can run in parallel.
291 _Directory._newServicePort().send(request, responsePort.toSendPort()); 246 _Directory._newServicePort().send(request, responsePort.toSendPort());
292 responsePort.receive((message, replyTo) { 247 responsePort.receive((message, replyTo) {
293 if (message is !List || message[RESPONSE_TYPE] is !int) { 248 if (message is !List || message[RESPONSE_TYPE] is !int) {
294 responsePort.close(); 249 responsePort.close();
295 _reportError(new DirectoryIOException("Internal error")); 250 controller.signalError(new DirectoryIOException("Internal error"));
296 return; 251 return;
297 } 252 }
298 switch (message[RESPONSE_TYPE]) { 253 switch (message[RESPONSE_TYPE]) {
254 case LIST_FILE:
255 controller.add(new File(message[RESPONSE_PATH]));
256 break;
299 case LIST_DIRECTORY: 257 case LIST_DIRECTORY:
300 if (_onDir != null) _onDir(message[RESPONSE_PATH]); 258 controller.add(new Directory(message[RESPONSE_PATH]));
301 break;
302 case LIST_FILE:
303 if (_onFile != null) _onFile(message[RESPONSE_PATH]);
304 break; 259 break;
305 case LIST_ERROR: 260 case LIST_ERROR:
306 var errorType = 261 var errorType =
307 message[RESPONSE_ERROR][_ERROR_RESPONSE_ERROR_TYPE]; 262 message[RESPONSE_ERROR][_ERROR_RESPONSE_ERROR_TYPE];
308 if (errorType == _ILLEGAL_ARGUMENT_RESPONSE) { 263 if (errorType == _ILLEGAL_ARGUMENT_RESPONSE) {
309 _reportError(new ArgumentError()); 264 controller.signalError(new ArgumentError());
310 } else if (errorType == _OSERROR_RESPONSE) { 265 } else if (errorType == _OSERROR_RESPONSE) {
311 var responseError = message[RESPONSE_ERROR]; 266 var responseError = message[RESPONSE_ERROR];
312 var err = new OSError( 267 var err = new OSError(
313 responseError[_OSERROR_RESPONSE_MESSAGE], 268 responseError[_OSERROR_RESPONSE_MESSAGE],
314 responseError[_OSERROR_RESPONSE_ERROR_CODE]); 269 responseError[_OSERROR_RESPONSE_ERROR_CODE]);
315 var errorPath = message[RESPONSE_PATH]; 270 var errorPath = message[RESPONSE_PATH];
316 if (errorPath == null) errorPath = path; 271 if (errorPath == null) errorPath = path;
317 _reportError(new DirectoryIOException("Directory listing failed", 272 controller.signalError(
318 errorPath, 273 new DirectoryIOException("Directory listing failed",
319 err)); 274 errorPath,
275 err));
320 } else { 276 } else {
321 _reportError(new DirectoryIOException("Internal error")); 277 controller.signalError(new DirectoryIOException("Internal error"));
322 } 278 }
323 break; 279 break;
324 case LIST_DONE: 280 case LIST_DONE:
325 responsePort.close(); 281 responsePort.close();
326 if (_onDone != null) _onDone(message[RESPONSE_COMPLETE]); 282 controller.close();
327 break; 283 break;
328 } 284 }
329 }); 285 });
286
287 return controller.stream;
330 } 288 }
331 289
332 void set onDir(void onDir(String dir)) { 290 List listSync({bool recursive: false}) {
333 _onDir = onDir; 291 if (_path is! String || recursive is! bool) {
292 throw new ArgumentError();
293 }
294 return _list(_path, recursive);
334 } 295 }
335 296
336 void set onFile(void onFile(String file)) { 297 String get path => _path;
337 _onFile = onFile; 298
299 String toString() => "Directory: '$path'";
300
301 bool _isErrorResponse(response) {
302 return response is List && response[0] != _SUCCESS_RESPONSE;
338 } 303 }
339 304
340 void set onDone(void onDone(bool completed)) { 305 _exceptionOrErrorFromResponse(response, String message) {
341 _onDone = onDone; 306 assert(_isErrorResponse(response));
342 } 307 switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
343 308 case _ILLEGAL_ARGUMENT_RESPONSE:
344 void set onError(void onError(e)) { 309 return new ArgumentError();
345 _onError = onError; 310 case _OSERROR_RESPONSE:
346 } 311 var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
347 312 response[_OSERROR_RESPONSE_ERROR_CODE]);
348 void _reportError(e) { 313 return new DirectoryIOException(message, _path, err);
349 if (_onError != null) { 314 default:
350 _onError(e); 315 return new Exception("Unknown error");
351 } else {
352 throw e;
353 } 316 }
354 } 317 }
355 318
356 Function _onDir; 319 void _ensureDirectoryService() {
357 Function _onFile; 320 if (_directoryService == null) {
358 Function _onDone; 321 _directoryService = _newServicePort();
359 Function _onError; 322 }
323 }
324
325 final String _path;
326 SendPort _directoryService;
360 } 327 }
OLDNEW
« no previous file with comments | « sdk/lib/io/directory.dart ('k') | sdk/lib/io/file.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698