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

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

Issue 11023003: Clean up file implementation. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address review comments. Created 8 years, 2 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_impl.dart ('k') | runtime/bin/socket_impl.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 class _FileInputStream extends _BaseDataInputStream implements InputStream { 5 class _FileInputStream extends _BaseDataInputStream implements InputStream {
6 _FileInputStream(String name) 6 _FileInputStream(String name)
7 : _data = const [], 7 : _data = const [],
8 _position = 0, 8 _position = 0,
9 _filePosition = 0 { 9 _filePosition = 0 {
10 var file = new File(name); 10 var file = new File(name);
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 int outstandingWrites = 0; 296 int outstandingWrites = 0;
297 297
298 // List of pending writes that were issued before the underlying 298 // List of pending writes that were issued before the underlying
299 // file was successfully opened. 299 // file was successfully opened.
300 List _pendingOperations; 300 List _pendingOperations;
301 301
302 Function _onNoPendingWrites; 302 Function _onNoPendingWrites;
303 Function _onClosed; 303 Function _onClosed;
304 } 304 }
305 305
306 306 const int _EXISTS_REQUEST = 0;
307 // Helper class containing static file helper methods. 307 const int _CREATE_REQUEST = 1;
308 class _FileUtils { 308 const int _DELETE_REQUEST = 2;
309 static const EXISTS_REQUEST = 0; 309 const int _OPEN_REQUEST = 3;
310 static const CREATE_REQUEST = 1; 310 const int _FULL_PATH_REQUEST = 4;
311 static const DELETE_REQUEST = 2; 311 const int _DIRECTORY_REQUEST = 5;
312 static const OPEN_REQUEST = 3; 312 const int _CLOSE_REQUEST = 6;
313 static const FULL_PATH_REQUEST = 4; 313 const int _POSITION_REQUEST = 7;
314 static const DIRECTORY_REQUEST = 5; 314 const int _SET_POSITION_REQUEST = 8;
315 static const CLOSE_REQUEST = 6; 315 const int _TRUNCATE_REQUEST = 9;
316 static const POSITION_REQUEST = 7; 316 const int _LENGTH_REQUEST = 10;
317 static const SET_POSITION_REQUEST = 8; 317 const int _LENGTH_FROM_NAME_REQUEST = 11;
318 static const TRUNCATE_REQUEST = 9; 318 const int _LAST_MODIFIED_REQUEST = 12;
319 static const LENGTH_REQUEST = 10; 319 const int _FLUSH_REQUEST = 13;
320 static const LENGTH_FROM_NAME_REQUEST = 11; 320 const int _READ_BYTE_REQUEST = 14;
321 static const LAST_MODIFIED_REQUEST = 12; 321 const int _WRITE_BYTE_REQUEST = 15;
322 static const FLUSH_REQUEST = 13; 322 const int _READ_LIST_REQUEST = 16;
323 static const READ_BYTE_REQUEST = 14; 323 const int _WRITE_LIST_REQUEST = 17;
324 static const WRITE_BYTE_REQUEST = 15; 324 const int _WRITE_STRING_REQUEST = 18;
325 static const READ_LIST_REQUEST = 16;
326 static const WRITE_LIST_REQUEST = 17;
327 static const WRITE_STRING_REQUEST = 18;
328
329 static const SUCCESS_RESPONSE = 0;
330 static const ILLEGAL_ARGUMENT_RESPONSE = 1;
331 static const OSERROR_RESPONSE = 2;
332 static const FILE_CLOSED_RESPONSE = 3;
333
334 static const ERROR_RESPONSE_ERROR_TYPE = 0;
335 static const OSERROR_RESPONSE_ERROR_CODE = 1;
336 static const OSERROR_RESPONSE_MESSAGE = 2;
337
338 static exists(String name) native "File_Exists";
339 static open(String name, int mode) native "File_Open";
340 static create(String name) native "File_Create";
341 static delete(String name) native "File_Delete";
342 static fullPath(String name) native "File_FullPath";
343 static directory(String name) native "File_Directory";
344 static lengthFromName(String name) native "File_LengthFromName";
345 static lastModified(String name) native "File_LastModified";
346 static int close(int id) native "File_Close";
347 static readByte(int id) native "File_ReadByte";
348 static readList(int id, List<int> buffer, int offset, int bytes)
349 native "File_ReadList";
350 static writeByte(int id, int value) native "File_WriteByte";
351 static writeList(int id, List<int> buffer, int offset, int bytes) {
352 List result = _ensureFastAndSerializableBuffer(buffer, offset, bytes);
353 List outBuffer = result[0];
354 int outOffset = result[1];
355 return writeListNative(id, outBuffer, outOffset, bytes);
356 }
357 static writeListNative(int id, List<int> buffer, int offset, int bytes)
358 native "File_WriteList";
359 static writeString(int id, String string) native "File_WriteString";
360 static position(int id) native "File_Position";
361 static setPosition(int id, int position) native "File_SetPosition";
362 static truncate(int id, int length) native "File_Truncate";
363 static length(int id) native "File_Length";
364 static flush(int id) native "File_Flush";
365 static int openStdio(int fd) native "File_OpenStdio";
366 static SendPort newServicePort() native "File_NewServicePort";
367
368 static bool checkedExists(String name) {
369 if (name is !String) throw new ArgumentError();
370 var result = exists(name);
371 throwIfError(result, "Cannot check existence of file '$name'");
372 return result;
373 }
374
375 static int checkedOpen(String name, int mode) {
376 if (name is !String || mode is !int) throw new ArgumentError();
377 var result = open(name, mode);
378 throwIfError(result, "Cannot open file '$name'");
379 return result;
380 }
381
382 static bool checkedCreate(String name) {
383 if (name is !String) throw new ArgumentError();
384 var result = create(name);
385 throwIfError(result, "Cannot create file '$name'");
386 return true;
387 }
388
389 static bool checkedDelete(String name) {
390 if (name is !String) throw new ArgumentError();
391 var result = delete(name);
392 throwIfError(result, "Cannot delete file '$name'");
393 return true;
394 }
395
396 static String checkedFullPath(String name) {
397 if (name is !String) throw new ArgumentError();
398 var result = fullPath(name);
399 throwIfError(result, "Cannot retrieve full path for file '$name'");
400 return result;
401 }
402
403 static String checkedDirectory(String name) {
404 if (name is !String) throw new ArgumentError();
405 var result = directory(name);
406 throwIfError(result, "Cannot retrieve directory for file '$name'");
407 return result;
408 }
409
410 static int checkedLengthFromName(String name) {
411 if (name is !String) throw new ArgumentError();
412 var result = lengthFromName(name);
413 throwIfError(result, "Cannot retrieve length of file '$name'");
414 return result;
415 }
416
417 static int checkedLastModified(String name) {
418 if (name is !String) throw new ArgumentError();
419 var result = lastModified(name);
420 throwIfError(result, "Cannot retrieve modification time for file '$name'");
421 return result;
422 }
423
424 static int checkReadWriteListArguments(int length, int offset, int bytes) {
425 if (offset < 0) return offset;
426 if (bytes < 0) return bytes;
427 if ((offset + bytes) > length) return offset + bytes;
428 return 0;
429 }
430
431 static int checkedWriteString(int id, String string) {
432 if (string is !String) throw new ArgumentError();
433 return writeString(id, string);
434 }
435
436 static throwIfError(Object result, String msg) {
437 if (result is OSError) {
438 throw new FileIOException(msg, result);
439 }
440 }
441 }
442 325
443 // Base class for _File and _RandomAccessFile with shared functions. 326 // Base class for _File and _RandomAccessFile with shared functions.
444 class _FileBase { 327 class _FileBase {
445 bool _isErrorResponse(response) { 328 bool _isErrorResponse(response) {
446 return response is List && response[0] != _FileUtils.SUCCESS_RESPONSE; 329 return response is List && response[0] != _SUCCESS_RESPONSE;
447 } 330 }
448 331
449 Exception _exceptionFromResponse(response, String message) { 332 Exception _exceptionFromResponse(response, String message) {
450 assert(_isErrorResponse(response)); 333 assert(_isErrorResponse(response));
451 switch (response[_FileUtils.ERROR_RESPONSE_ERROR_TYPE]) { 334 switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
452 case _FileUtils.ILLEGAL_ARGUMENT_RESPONSE: 335 case _ILLEGAL_ARGUMENT_RESPONSE:
453 return new ArgumentError(); 336 return new ArgumentError();
454 case _FileUtils.OSERROR_RESPONSE: 337 case _OSERROR_RESPONSE:
455 var err = new OSError(response[_FileUtils.OSERROR_RESPONSE_MESSAGE], 338 var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
456 response[_FileUtils.OSERROR_RESPONSE_ERROR_CODE]); 339 response[_OSERROR_RESPONSE_ERROR_CODE]);
457 return new FileIOException(message, err); 340 return new FileIOException(message, err);
458 case _FileUtils.FILE_CLOSED_RESPONSE: 341 case _FILE_CLOSED_RESPONSE:
459 return new FileIOException("File closed"); 342 return new FileIOException("File closed");
460 default: 343 default:
461 return new Exception("Unknown error"); 344 return new Exception("Unknown error");
462 } 345 }
463 } 346 }
464 } 347 }
465 348
349 SendPort _newServicePort() native "File_NewServicePort";
350
466 // Class for encapsulating the native implementation of files. 351 // Class for encapsulating the native implementation of files.
467 class _File extends _FileBase implements File { 352 class _File extends _FileBase implements File {
468 // Constructor for file. 353 // Constructor for file.
469 _File(String this._name) { 354 _File(String this._name) {
470 if (_name is! String) { 355 if (_name is! String) {
471 throw new ArgumentError('${NoSuchMethodError.safeToString(_name)} ' 356 throw new ArgumentError('${NoSuchMethodError.safeToString(_name)} '
472 'is not a String'); 357 'is not a String');
473 } 358 }
474 } 359 }
475 360
476 // Constructor from Path for file. 361 // Constructor from Path for file.
477 _File.fromPath(Path path) : this(path.toNativePath()); 362 _File.fromPath(Path path) : this(path.toNativePath());
478 363
479 Future<bool> exists() { 364 Future<bool> exists() {
480 _ensureFileService(); 365 _ensureFileService();
481 List request = new List(2); 366 List request = new List(2);
482 request[0] = _FileUtils.EXISTS_REQUEST; 367 request[0] = _EXISTS_REQUEST;
483 request[1] = _name; 368 request[1] = _name;
484 return _fileService.call(request).transform((response) { 369 return _fileService.call(request).transform((response) {
485 if (_isErrorResponse(response)) { 370 if (_isErrorResponse(response)) {
486 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); 371 throw _exceptionFromResponse(response, "Cannot open file '$_name'");
487 } 372 }
488 return response; 373 return response;
489 }); 374 });
490 } 375 }
491 376
377
378 static _exists(String name) native "File_Exists";
379
492 bool existsSync() { 380 bool existsSync() {
493 return _FileUtils.checkedExists(_name); 381 var result = _exists(_name);
382 throwIfError(result, "Cannot check existence of file '$_name'");
383 return result;
494 } 384 }
495 385
496 Future<File> create() { 386 Future<File> create() {
497 _ensureFileService(); 387 _ensureFileService();
498 List request = new List(2); 388 List request = new List(2);
499 request[0] = _FileUtils.CREATE_REQUEST; 389 request[0] = _CREATE_REQUEST;
500 request[1] = _name; 390 request[1] = _name;
501 return _fileService.call(request).transform((response) { 391 return _fileService.call(request).transform((response) {
502 if (_isErrorResponse(response)) { 392 if (_isErrorResponse(response)) {
503 throw _exceptionFromResponse(response, "Cannot create file '$_name'"); 393 throw _exceptionFromResponse(response, "Cannot create file '$_name'");
504 } 394 }
505 return this; 395 return this;
506 }); 396 });
507 } 397 }
508 398
399 static _create(String name) native "File_Create";
400
509 void createSync() { 401 void createSync() {
510 bool created = _FileUtils.checkedCreate(_name); 402 var result = _create(_name);
511 if (!created) { 403 throwIfError(result, "Cannot create file '$_name'");
512 throw new FileIOException("Cannot create file '$_name'");
513 }
514 } 404 }
515 405
516 Future<File> delete() { 406 Future<File> delete() {
517 _ensureFileService(); 407 _ensureFileService();
518 List request = new List(2); 408 List request = new List(2);
519 request[0] = _FileUtils.DELETE_REQUEST; 409 request[0] = _DELETE_REQUEST;
520 request[1] = _name; 410 request[1] = _name;
521 return _fileService.call(request).transform((response) { 411 return _fileService.call(request).transform((response) {
522 if (_isErrorResponse(response)) { 412 if (_isErrorResponse(response)) {
523 throw _exceptionFromResponse(response, "Cannot delete file '$_name'"); 413 throw _exceptionFromResponse(response, "Cannot delete file '$_name'");
524 } 414 }
525 return this; 415 return this;
526 }); 416 });
527 } 417 }
528 418
419 static _delete(String name) native "File_Delete";
420
529 void deleteSync() { 421 void deleteSync() {
530 _FileUtils.checkedDelete(_name); 422 var result = _delete(_name);
423 throwIfError(result, "Cannot delete file '$_name'");
531 } 424 }
532 425
533 Future<Directory> directory() { 426 Future<Directory> directory() {
534 _ensureFileService(); 427 _ensureFileService();
535 List request = new List(2); 428 List request = new List(2);
536 request[0] = _FileUtils.DIRECTORY_REQUEST; 429 request[0] = _DIRECTORY_REQUEST;
537 request[1] = _name; 430 request[1] = _name;
538 return _fileService.call(request).transform((response) { 431 return _fileService.call(request).transform((response) {
539 if (_isErrorResponse(response)) { 432 if (_isErrorResponse(response)) {
540 throw _exceptionFromResponse(response, 433 throw _exceptionFromResponse(response,
541 "Cannot retrieve directory for " 434 "Cannot retrieve directory for "
542 "file '$_name'"); 435 "file '$_name'");
543 } 436 }
544 return new Directory(response); 437 return new Directory(response);
545 }); 438 });
546 } 439 }
547 440
441 static _directory(String name) native "File_Directory";
442
548 Directory directorySync() { 443 Directory directorySync() {
549 _FileUtils.checkedDirectory(_name); 444 var result = _directory(name);
550 return new Directory(_FileUtils.directory(_name)); 445 throwIfError(result, "Cannot retrieve directory for file '$_name'");
446 return new Directory(result);
551 } 447 }
552 448
553 Future<RandomAccessFile> open([FileMode mode = FileMode.READ]) { 449 Future<RandomAccessFile> open([FileMode mode = FileMode.READ]) {
554 _ensureFileService(); 450 _ensureFileService();
555 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 451 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
556 if (mode != FileMode.READ && 452 if (mode != FileMode.READ &&
557 mode != FileMode.WRITE && 453 mode != FileMode.WRITE &&
558 mode != FileMode.APPEND) { 454 mode != FileMode.APPEND) {
559 new Timer(0, (t) { 455 new Timer(0, (t) {
560 completer.completeException(new ArgumentError()); 456 completer.completeException(new ArgumentError());
561 }); 457 });
562 return completer.future; 458 return completer.future;
563 } 459 }
564 List request = new List(3); 460 List request = new List(3);
565 request[0] = _FileUtils.OPEN_REQUEST; 461 request[0] = _OPEN_REQUEST;
566 request[1] = _name; 462 request[1] = _name;
567 request[2] = mode._mode; // Direct int value for serialization. 463 request[2] = mode._mode; // Direct int value for serialization.
568 return _fileService.call(request).transform((response) { 464 return _fileService.call(request).transform((response) {
569 if (_isErrorResponse(response)) { 465 if (_isErrorResponse(response)) {
570 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); 466 throw _exceptionFromResponse(response, "Cannot open file '$_name'");
571 } 467 }
572 return new _RandomAccessFile(response, _name); 468 return new _RandomAccessFile(response, _name);
573 }); 469 });
574 } 470 }
575 471
576 Future<int> length() { 472 Future<int> length() {
577 _ensureFileService(); 473 _ensureFileService();
578 List request = new List(2); 474 List request = new List(2);
579 request[0] = _FileUtils.LENGTH_FROM_NAME_REQUEST; 475 request[0] = _LENGTH_FROM_NAME_REQUEST;
580 request[1] = _name; 476 request[1] = _name;
581 return _fileService.call(request).transform((response) { 477 return _fileService.call(request).transform((response) {
582 if (_isErrorResponse(response)) { 478 if (_isErrorResponse(response)) {
583 throw _exceptionFromResponse(response, 479 throw _exceptionFromResponse(response,
584 "Cannot retrieve length of " 480 "Cannot retrieve length of "
585 "file '$_name'"); 481 "file '$_name'");
586 } 482 }
587 return response; 483 return response;
588 }); 484 });
589 } 485 }
590 486
487
488 static _lengthFromName(String name) native "File_LengthFromName";
489
591 int lengthSync() { 490 int lengthSync() {
592 return _FileUtils.checkedLengthFromName(_name); 491 var result = _lengthFromName(_name);
492 throwIfError(result, "Cannot retrieve length of file '$_name'");
493 return result;
593 } 494 }
594 495
595 Future<Date> lastModified() { 496 Future<Date> lastModified() {
596 _ensureFileService(); 497 _ensureFileService();
597 List request = new List(2); 498 List request = new List(2);
598 request[0] = _FileUtils.LAST_MODIFIED_REQUEST; 499 request[0] = _LAST_MODIFIED_REQUEST;
599 request[1] = _name; 500 request[1] = _name;
600 return _fileService.call(request).transform((response) { 501 return _fileService.call(request).transform((response) {
601 if (_isErrorResponse(response)) { 502 if (_isErrorResponse(response)) {
602 throw _exceptionFromResponse(response, 503 throw _exceptionFromResponse(response,
603 "Cannot retrieve modification time " 504 "Cannot retrieve modification time "
604 "for file '$_name'"); 505 "for file '$_name'");
605 } 506 }
606 return new Date.fromMillisecondsSinceEpoch(response); 507 return new Date.fromMillisecondsSinceEpoch(response);
607 }); 508 });
608 } 509 }
609 510
511 static _lastModified(String name) native "File_LastModified";
512
610 Date lastModifiedSync() { 513 Date lastModifiedSync() {
611 int ms = _FileUtils.checkedLastModified(_name); 514 var ms = _lastModified(name);
515 throwIfError(ms, "Cannot retrieve modification time for file '$_name'");
612 return new Date.fromMillisecondsSinceEpoch(ms); 516 return new Date.fromMillisecondsSinceEpoch(ms);
613 } 517 }
614 518
519 static _open(String name, int mode) native "File_Open";
520
615 RandomAccessFile openSync([FileMode mode = FileMode.READ]) { 521 RandomAccessFile openSync([FileMode mode = FileMode.READ]) {
616 if (mode != FileMode.READ && 522 if (mode != FileMode.READ &&
617 mode != FileMode.WRITE && 523 mode != FileMode.WRITE &&
618 mode != FileMode.APPEND) { 524 mode != FileMode.APPEND) {
619 throw new FileIOException("Unknown file mode. Use FileMode.READ, " 525 throw new FileIOException("Unknown file mode. Use FileMode.READ, "
620 "FileMode.WRITE or FileMode.APPEND."); 526 "FileMode.WRITE or FileMode.APPEND.");
621 } 527 }
622 var id = _FileUtils.checkedOpen(_name, mode._mode); 528 var id = _open(_name, mode._mode);
623 assert(id != 0); 529 throwIfError(id, "Cannot open file '$_name'");
624 return new _RandomAccessFile(id, _name); 530 return new _RandomAccessFile(id, _name);
625 } 531 }
626 532
533 static int _openStdio(int fd) native "File_OpenStdio";
534
627 static RandomAccessFile _openStdioSync(int fd) { 535 static RandomAccessFile _openStdioSync(int fd) {
628 var id = _FileUtils.openStdio(fd); 536 var id = _openStdio(fd);
629 if (id == 0) { 537 if (id == 0) {
630 throw new FileIOException("Cannot open stdio file for: $fd"); 538 throw new FileIOException("Cannot open stdio file for: $fd");
631 } 539 }
632 return new _RandomAccessFile(id, ""); 540 return new _RandomAccessFile(id, "");
633 } 541 }
634 542
635 Future<String> fullPath() { 543 Future<String> fullPath() {
636 _ensureFileService(); 544 _ensureFileService();
637 List request = new List(2); 545 List request = new List(2);
638 request[0] = _FileUtils.FULL_PATH_REQUEST; 546 request[0] = _FULL_PATH_REQUEST;
639 request[1] = _name; 547 request[1] = _name;
640 return _fileService.call(request).transform((response) { 548 return _fileService.call(request).transform((response) {
641 if (_isErrorResponse(response)) { 549 if (_isErrorResponse(response)) {
642 throw _exceptionFromResponse(response, 550 throw _exceptionFromResponse(response,
643 "Cannot retrieve full path" 551 "Cannot retrieve full path"
644 " for '$_name'"); 552 " for '$_name'");
645 } 553 }
646 return response; 554 return response;
647 }); 555 });
648 } 556 }
649 557
558 static _fullPath(String name) native "File_FullPath";
559
650 String fullPathSync() { 560 String fullPathSync() {
651 return _FileUtils.checkedFullPath(_name); 561 var result = _fullPath(_name);
562 throwIfError(result, "Cannot retrieve full path for file '$_name'");
563 return result;
652 } 564 }
653 565
654 InputStream openInputStream() { 566 InputStream openInputStream() {
655 return new _FileInputStream(_name); 567 return new _FileInputStream(_name);
656 } 568 }
657 569
658 OutputStream openOutputStream([FileMode mode = FileMode.WRITE]) { 570 OutputStream openOutputStream([FileMode mode = FileMode.WRITE]) {
659 if (mode != FileMode.WRITE && 571 if (mode != FileMode.WRITE &&
660 mode != FileMode.APPEND) { 572 mode != FileMode.APPEND) {
661 throw new FileIOException( 573 throw new FileIOException(
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 var decoder = _StringDecoders.decoder(encoding); 654 var decoder = _StringDecoders.decoder(encoding);
743 List<int> bytes = readAsBytesSync(); 655 List<int> bytes = readAsBytesSync();
744 decoder.write(bytes); 656 decoder.write(bytes);
745 return _getDecodedLines(decoder); 657 return _getDecodedLines(decoder);
746 } 658 }
747 659
748 String get name => _name; 660 String get name => _name;
749 661
750 void _ensureFileService() { 662 void _ensureFileService() {
751 if (_fileService == null) { 663 if (_fileService == null) {
752 _fileService = _FileUtils.newServicePort(); 664 _fileService = _newServicePort();
753 } 665 }
754 } 666 }
755 667
668 static throwIfError(Object result, String msg) {
669 if (result is OSError) {
670 throw new FileIOException(msg, result);
671 }
672 }
673
756 final String _name; 674 final String _name;
757 675
758 SendPort _fileService; 676 SendPort _fileService;
759 } 677 }
760 678
761 679
762 class _RandomAccessFile extends _FileBase implements RandomAccessFile { 680 class _RandomAccessFile extends _FileBase implements RandomAccessFile {
763 _RandomAccessFile(int this._id, String this._name); 681 _RandomAccessFile(int this._id, String this._name);
764 682
765 Future<RandomAccessFile> close() { 683 Future<RandomAccessFile> close() {
766 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 684 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
767 if (closed) return _completeWithClosedException(completer); 685 if (closed) return _completeWithClosedException(completer);
768 _ensureFileService(); 686 _ensureFileService();
769 List request = new List(2); 687 List request = new List(2);
770 request[0] = _FileUtils.CLOSE_REQUEST; 688 request[0] = _CLOSE_REQUEST;
771 request[1] = _id; 689 request[1] = _id;
772 // Set the id_ to 0 (NULL) to ensure the no more async requests 690 // Set the id_ to 0 (NULL) to ensure the no more async requests
773 // can be issued for this file. 691 // can be issued for this file.
774 _id = 0; 692 _id = 0;
775 return _fileService.call(request).transform((result) { 693 return _fileService.call(request).transform((result) {
776 if (result != -1) { 694 if (result != -1) {
777 _id = result; 695 _id = result;
778 return this; 696 return this;
779 } else { 697 } else {
780 throw new FileIOException("Cannot close file '$_name'"); 698 throw new FileIOException("Cannot close file '$_name'");
781 } 699 }
782 }); 700 });
783 } 701 }
784 702
703 static int _close(int id) native "File_Close";
704
785 void closeSync() { 705 void closeSync() {
786 _checkNotClosed(); 706 _checkNotClosed();
787 var id = _FileUtils.close(_id); 707 var id = _close(_id);
788 if (id == -1) { 708 if (id == -1) {
789 throw new FileIOException("Cannot close file '$_name'"); 709 throw new FileIOException("Cannot close file '$_name'");
790 } 710 }
791 _id = id; 711 _id = id;
792 } 712 }
793 713
794 Future<int> readByte() { 714 Future<int> readByte() {
795 _ensureFileService(); 715 _ensureFileService();
796 Completer<int> completer = new Completer<int>(); 716 Completer<int> completer = new Completer<int>();
797 if (closed) return _completeWithClosedException(completer); 717 if (closed) return _completeWithClosedException(completer);
798 List request = new List(2); 718 List request = new List(2);
799 request[0] = _FileUtils.READ_BYTE_REQUEST; 719 request[0] = _READ_BYTE_REQUEST;
800 request[1] = _id; 720 request[1] = _id;
801 return _fileService.call(request).transform((response) { 721 return _fileService.call(request).transform((response) {
802 if (_isErrorResponse(response)) { 722 if (_isErrorResponse(response)) {
803 throw _exceptionFromResponse(response, 723 throw _exceptionFromResponse(response,
804 "readByte failed for file '$_name'"); 724 "readByte failed for file '$_name'");
805 } 725 }
806 return response; 726 return response;
807 }); 727 });
808 } 728 }
809 729
730 static _readByte(int id) native "File_ReadByte";
731
810 int readByteSync() { 732 int readByteSync() {
811 _checkNotClosed(); 733 _checkNotClosed();
812 var result = _FileUtils.readByte(_id); 734 var result = _readByte(_id);
813 if (result is OSError) { 735 if (result is OSError) {
814 throw new FileIOException("readByte failed for file '$_name'", result); 736 throw new FileIOException("readByte failed for file '$_name'", result);
815 } 737 }
816 return result; 738 return result;
817 } 739 }
818 740
819 Future<int> readList(List<int> buffer, int offset, int bytes) { 741 Future<int> readList(List<int> buffer, int offset, int bytes) {
820 _ensureFileService(); 742 _ensureFileService();
821 Completer<int> completer = new Completer<int>(); 743 Completer<int> completer = new Completer<int>();
822 if (buffer is !List || offset is !int || bytes is !int) { 744 if (buffer is !List || offset is !int || bytes is !int) {
823 // Complete asynchronously so the user has a chance to setup 745 // Complete asynchronously so the user has a chance to setup
824 // handlers without getting exceptions when registering the 746 // handlers without getting exceptions when registering the
825 // then handler. 747 // then handler.
826 new Timer(0, (t) { 748 new Timer(0, (t) {
827 completer.completeException(new FileIOException( 749 completer.completeException(new FileIOException(
828 "Invalid arguments to readList for file '$_name'")); 750 "Invalid arguments to readList for file '$_name'"));
829 }); 751 });
830 return completer.future; 752 return completer.future;
831 }; 753 };
832 if (closed) return _completeWithClosedException(completer); 754 if (closed) return _completeWithClosedException(completer);
833 List request = new List(3); 755 List request = new List(3);
834 request[0] = _FileUtils.READ_LIST_REQUEST; 756 request[0] = _READ_LIST_REQUEST;
835 request[1] = _id; 757 request[1] = _id;
836 request[2] = bytes; 758 request[2] = bytes;
837 return _fileService.call(request).transform((response) { 759 return _fileService.call(request).transform((response) {
838 if (_isErrorResponse(response)) { 760 if (_isErrorResponse(response)) {
839 throw _exceptionFromResponse(response, 761 throw _exceptionFromResponse(response,
840 "readList failed for file '$_name'"); 762 "readList failed for file '$_name'");
841 } 763 }
842 var read = response[1]; 764 var read = response[1];
843 var data = response[2]; 765 var data = response[2];
844 buffer.setRange(offset, read, data); 766 buffer.setRange(offset, read, data);
845 return read; 767 return read;
846 }); 768 });
847 } 769 }
848 770
771 static void _checkReadWriteListArguments(int length, int offset, int bytes) {
772 if (offset < 0) throw new IndexOutOfRangeException(offset);
773 if (bytes < 0) throw new IndexOutOfRangeException(bytes);
774 if ((offset + bytes) > length) {
775 throw new IndexOutOfRangeException(offset + bytes);
776 }
777 }
778
779 static _readList(int id, List<int> buffer, int offset, int bytes)
780 native "File_ReadList";
781
849 int readListSync(List<int> buffer, int offset, int bytes) { 782 int readListSync(List<int> buffer, int offset, int bytes) {
850 _checkNotClosed(); 783 _checkNotClosed();
851 if (buffer is !List || offset is !int || bytes is !int) { 784 if (buffer is !List || offset is !int || bytes is !int) {
852 throw new FileIOException( 785 throw new FileIOException(
853 "Invalid arguments to readList for file '$_name'"); 786 "Invalid arguments to readList for file '$_name'");
854 } 787 }
855 if (bytes == 0) return 0; 788 if (bytes == 0) return 0;
856 int index = 789 _checkReadWriteListArguments(buffer.length, offset, bytes);
857 _FileUtils.checkReadWriteListArguments(buffer.length, offset, bytes); 790 var result = _readList(_id, buffer, offset, bytes);
858 if (index != 0) {
859 throw new IndexOutOfRangeException(index);
860 }
861 var result = _FileUtils.readList(_id, buffer, offset, bytes);
862 if (result is OSError) { 791 if (result is OSError) {
863 throw new FileIOException("readList failed for file '$_name'", 792 throw new FileIOException("readList failed for file '$_name'",
864 result); 793 result);
865 } 794 }
866 return result; 795 return result;
867 } 796 }
868 797
869 Future<RandomAccessFile> writeByte(int value) { 798 Future<RandomAccessFile> writeByte(int value) {
870 _ensureFileService(); 799 _ensureFileService();
871 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 800 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
872 if (value is !int) { 801 if (value is !int) {
873 // Complete asynchronously so the user has a chance to setup 802 // Complete asynchronously so the user has a chance to setup
874 // handlers without getting exceptions when registering the 803 // handlers without getting exceptions when registering the
875 // then handler. 804 // then handler.
876 new Timer(0, (t) { 805 new Timer(0, (t) {
877 completer.completeException(new FileIOException( 806 completer.completeException(new FileIOException(
878 "Invalid argument to writeByte for file '$_name'")); 807 "Invalid argument to writeByte for file '$_name'"));
879 }); 808 });
880 return completer.future; 809 return completer.future;
881 } 810 }
882 if (closed) return _completeWithClosedException(completer); 811 if (closed) return _completeWithClosedException(completer);
883 List request = new List(3); 812 List request = new List(3);
884 request[0] = _FileUtils.WRITE_BYTE_REQUEST; 813 request[0] = _WRITE_BYTE_REQUEST;
885 request[1] = _id; 814 request[1] = _id;
886 request[2] = value; 815 request[2] = value;
887 return _fileService.call(request).transform((response) { 816 return _fileService.call(request).transform((response) {
888 if (_isErrorResponse(response)) { 817 if (_isErrorResponse(response)) {
889 throw _exceptionFromResponse(response, 818 throw _exceptionFromResponse(response,
890 "writeByte failed for file '$_name'"); 819 "writeByte failed for file '$_name'");
891 } 820 }
892 return this; 821 return this;
893 }); 822 });
894 } 823 }
895 824
825 static _writeByte(int id, int value) native "File_WriteByte";
826
896 int writeByteSync(int value) { 827 int writeByteSync(int value) {
897 _checkNotClosed(); 828 _checkNotClosed();
898 if (value is !int) { 829 if (value is !int) {
899 throw new FileIOException( 830 throw new FileIOException(
900 "Invalid argument to writeByte for file '$_name'"); 831 "Invalid argument to writeByte for file '$_name'");
901 } 832 }
902 var result = _FileUtils.writeByte(_id, value); 833 var result = _writeByte(_id, value);
903 if (result is OSError) { 834 if (result is OSError) {
904 throw new FileIOException("writeByte failed for file '$_name'", 835 throw new FileIOException("writeByte failed for file '$_name'",
905 result); 836 result);
906 } 837 }
907 return result; 838 return result;
908 } 839 }
909 840
910 Future<RandomAccessFile> writeList(List<int> buffer, int offset, int bytes) { 841 Future<RandomAccessFile> writeList(List<int> buffer, int offset, int bytes) {
911 _ensureFileService(); 842 _ensureFileService();
912 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 843 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
913 if (buffer is !List || offset is !int || bytes is !int) { 844 if (buffer is !List || offset is !int || bytes is !int) {
914 // Complete asynchronously so the user has a chance to setup 845 // Complete asynchronously so the user has a chance to setup
915 // handlers without getting exceptions when registering the 846 // handlers without getting exceptions when registering the
916 // then handler. 847 // then handler.
917 new Timer(0, (t) { 848 new Timer(0, (t) {
918 completer.completeException(new FileIOException( 849 completer.completeException(new FileIOException(
919 "Invalid arguments to writeList for file '$_name'")); 850 "Invalid arguments to writeList for file '$_name'"));
920 }); 851 });
921 return completer.future; 852 return completer.future;
922 } 853 }
923 if (closed) return _completeWithClosedException(completer); 854 if (closed) return _completeWithClosedException(completer);
924 855
925 List result; 856 _BufferAndOffset result;
926 try { 857 try {
927 result = _ensureFastAndSerializableBuffer(buffer, offset, bytes); 858 result = _ensureFastAndSerializableBuffer(buffer, offset, bytes);
928 } catch (e) { 859 } catch (e) {
929 // Complete asynchronously so the user has a chance to setup 860 // Complete asynchronously so the user has a chance to setup
930 // handlers without getting exceptions when registering the 861 // handlers without getting exceptions when registering the
931 // then handler. 862 // then handler.
932 new Timer(0, (t) => completer.completeException(e)); 863 new Timer(0, (t) => completer.completeException(e));
933 return completer.future; 864 return completer.future;
934 } 865 }
935 List outBuffer = result[0];
936 int outOffset = result[1];
937 866
938 List request = new List(5); 867 List request = new List(5);
939 request[0] = _FileUtils.WRITE_LIST_REQUEST; 868 request[0] = _WRITE_LIST_REQUEST;
940 request[1] = _id; 869 request[1] = _id;
941 request[2] = outBuffer; 870 request[2] = result.buffer;
942 request[3] = outOffset; 871 request[3] = result.offset;
943 request[4] = bytes; 872 request[4] = bytes;
944 return _fileService.call(request).transform((response) { 873 return _fileService.call(request).transform((response) {
945 if (_isErrorResponse(response)) { 874 if (_isErrorResponse(response)) {
946 throw _exceptionFromResponse(response, 875 throw _exceptionFromResponse(response,
947 "writeList failed for file '$_name'"); 876 "writeList failed for file '$_name'");
948 } 877 }
949 return this; 878 return this;
950 }); 879 });
951 } 880 }
952 881
882 static _writeList(int id, List<int> buffer, int offset, int bytes)
883 native "File_WriteList";
884
953 int writeListSync(List<int> buffer, int offset, int bytes) { 885 int writeListSync(List<int> buffer, int offset, int bytes) {
954 _checkNotClosed(); 886 _checkNotClosed();
955 if (buffer is !List || offset is !int || bytes is !int) { 887 if (buffer is !List || offset is !int || bytes is !int) {
956 throw new FileIOException( 888 throw new FileIOException(
957 "Invalid arguments to writeList for file '$_name'"); 889 "Invalid arguments to writeList for file '$_name'");
958 } 890 }
959 if (bytes == 0) return 0; 891 if (bytes == 0) return 0;
960 int index = 892 _checkReadWriteListArguments(buffer.length, offset, bytes);
961 _FileUtils.checkReadWriteListArguments(buffer.length, offset, bytes); 893 _BufferAndOffset bufferAndOffset =
962 if (index != 0) { 894 _ensureFastAndSerializableBuffer(buffer, offset, bytes);
963 throw new IndexOutOfRangeException(index); 895 var result =
964 } 896 _writeList(_id, bufferAndOffset.buffer, bufferAndOffset.offset, bytes);
965 var result = _FileUtils.writeList(_id, buffer, offset, bytes);
966 if (result is OSError) { 897 if (result is OSError) {
967 throw new FileIOException("writeList failed for file '$_name'", result); 898 throw new FileIOException("writeList failed for file '$_name'", result);
968 } 899 }
969 return result; 900 return result;
970 } 901 }
971 902
972 Future<RandomAccessFile> writeString(String string, 903 Future<RandomAccessFile> writeString(String string,
973 [Encoding encoding = Encoding.UTF_8]) { 904 [Encoding encoding = Encoding.UTF_8]) {
974 _ensureFileService(); 905 _ensureFileService();
975 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 906 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
976 if (closed) return _completeWithClosedException(completer); 907 if (closed) return _completeWithClosedException(completer);
977 List request = new List(3); 908 List request = new List(3);
978 request[0] = _FileUtils.WRITE_STRING_REQUEST; 909 request[0] = _WRITE_STRING_REQUEST;
979 request[1] = _id; 910 request[1] = _id;
980 request[2] = string; 911 request[2] = string;
981 return _fileService.call(request).transform((response) { 912 return _fileService.call(request).transform((response) {
982 if (_isErrorResponse(response)) { 913 if (_isErrorResponse(response)) {
983 throw _exceptionFromResponse(response, 914 throw _exceptionFromResponse(response,
984 "writeString failed for file '$_name'"); 915 "writeString failed for file '$_name'");
985 } 916 }
986 return this; 917 return this;
987 }); 918 });
988 } 919 }
989 920
921 static _writeString(int id, String string) native "File_WriteString";
922
990 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) { 923 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) {
991 _checkNotClosed(); 924 _checkNotClosed();
992 var result = _FileUtils.checkedWriteString(_id, string); 925 if (string is !String) throw new ArgumentError();
926 var result = _writeString(_id, string);
993 if (result is OSError) { 927 if (result is OSError) {
994 throw new FileIOException("writeString failed for file '$_name'"); 928 throw new FileIOException("writeString failed for file '$_name'");
995 } 929 }
996 return result; 930 return result;
997 } 931 }
998 932
999 Future<int> position() { 933 Future<int> position() {
1000 _ensureFileService(); 934 _ensureFileService();
1001 Completer<int> completer = new Completer<int>(); 935 Completer<int> completer = new Completer<int>();
1002 if (closed) return _completeWithClosedException(completer); 936 if (closed) return _completeWithClosedException(completer);
1003 List request = new List(2); 937 List request = new List(2);
1004 request[0] = _FileUtils.POSITION_REQUEST; 938 request[0] = _POSITION_REQUEST;
1005 request[1] = _id; 939 request[1] = _id;
1006 return _fileService.call(request).transform((response) { 940 return _fileService.call(request).transform((response) {
1007 if (_isErrorResponse(response)) { 941 if (_isErrorResponse(response)) {
1008 throw _exceptionFromResponse(response, 942 throw _exceptionFromResponse(response,
1009 "position failed for file '$_name'"); 943 "position failed for file '$_name'");
1010 } 944 }
1011 return response; 945 return response;
1012 }); 946 });
1013 } 947 }
1014 948
949 static _position(int id) native "File_Position";
950
1015 int positionSync() { 951 int positionSync() {
1016 _checkNotClosed(); 952 _checkNotClosed();
1017 var result = _FileUtils.position(_id); 953 var result = _position(_id);
1018 if (result is OSError) { 954 if (result is OSError) {
1019 throw new FileIOException("position failed for file '$_name'", result); 955 throw new FileIOException("position failed for file '$_name'", result);
1020 } 956 }
1021 return result; 957 return result;
1022 } 958 }
1023 959
1024 Future<RandomAccessFile> setPosition(int position) { 960 Future<RandomAccessFile> setPosition(int position) {
1025 _ensureFileService(); 961 _ensureFileService();
1026 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 962 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
1027 if (closed) return _completeWithClosedException(completer); 963 if (closed) return _completeWithClosedException(completer);
1028 List request = new List(3); 964 List request = new List(3);
1029 request[0] = _FileUtils.SET_POSITION_REQUEST; 965 request[0] = _SET_POSITION_REQUEST;
1030 request[1] = _id; 966 request[1] = _id;
1031 request[2] = position; 967 request[2] = position;
1032 return _fileService.call(request).transform((response) { 968 return _fileService.call(request).transform((response) {
1033 if (_isErrorResponse(response)) { 969 if (_isErrorResponse(response)) {
1034 throw _exceptionFromResponse(response, 970 throw _exceptionFromResponse(response,
1035 "setPosition failed for file '$_name'"); 971 "setPosition failed for file '$_name'");
1036 } 972 }
1037 return this; 973 return this;
1038 }); 974 });
1039 } 975 }
1040 976
977 static _setPosition(int id, int position) native "File_SetPosition";
978
1041 void setPositionSync(int position) { 979 void setPositionSync(int position) {
1042 _checkNotClosed(); 980 _checkNotClosed();
1043 var result = _FileUtils.setPosition(_id, position); 981 var result = _setPosition(_id, position);
1044 if (result is OSError) { 982 if (result is OSError) {
1045 throw new FileIOException("setPosition failed for file '$_name'", result); 983 throw new FileIOException("setPosition failed for file '$_name'", result);
1046 } 984 }
1047 } 985 }
1048 986
1049 Future<RandomAccessFile> truncate(int length) { 987 Future<RandomAccessFile> truncate(int length) {
1050 _ensureFileService(); 988 _ensureFileService();
1051 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 989 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
1052 if (closed) return _completeWithClosedException(completer); 990 if (closed) return _completeWithClosedException(completer);
1053 List request = new List(3); 991 List request = new List(3);
1054 request[0] = _FileUtils.TRUNCATE_REQUEST; 992 request[0] = _TRUNCATE_REQUEST;
1055 request[1] = _id; 993 request[1] = _id;
1056 request[2] = length; 994 request[2] = length;
1057 return _fileService.call(request).transform((response) { 995 return _fileService.call(request).transform((response) {
1058 if (_isErrorResponse(response)) { 996 if (_isErrorResponse(response)) {
1059 throw _exceptionFromResponse(response, 997 throw _exceptionFromResponse(response,
1060 "truncate failed for file '$_name'"); 998 "truncate failed for file '$_name'");
1061 } 999 }
1062 return this; 1000 return this;
1063 }); 1001 });
1064 } 1002 }
1065 1003
1004 static _truncate(int id, int length) native "File_Truncate";
1005
1066 void truncateSync(int length) { 1006 void truncateSync(int length) {
1067 _checkNotClosed(); 1007 _checkNotClosed();
1068 var result = _FileUtils.truncate(_id, length); 1008 var result = _truncate(_id, length);
1069 if (result is OSError) { 1009 if (result is OSError) {
1070 throw new FileIOException("truncate failed for file '$_name'", result); 1010 throw new FileIOException("truncate failed for file '$_name'", result);
1071 } 1011 }
1072 } 1012 }
1073 1013
1074 Future<int> length() { 1014 Future<int> length() {
1075 _ensureFileService(); 1015 _ensureFileService();
1076 Completer<int> completer = new Completer<int>(); 1016 Completer<int> completer = new Completer<int>();
1077 if (closed) return _completeWithClosedException(completer); 1017 if (closed) return _completeWithClosedException(completer);
1078 List request = new List(2); 1018 List request = new List(2);
1079 request[0] = _FileUtils.LENGTH_REQUEST; 1019 request[0] = _LENGTH_REQUEST;
1080 request[1] = _id; 1020 request[1] = _id;
1081 return _fileService.call(request).transform((response) { 1021 return _fileService.call(request).transform((response) {
1082 if (_isErrorResponse(response)) { 1022 if (_isErrorResponse(response)) {
1083 throw _exceptionFromResponse(response, 1023 throw _exceptionFromResponse(response,
1084 "length failed for file '$_name'"); 1024 "length failed for file '$_name'");
1085 } 1025 }
1086 return response; 1026 return response;
1087 }); 1027 });
1088 } 1028 }
1089 1029
1030 static _length(int id) native "File_Length";
1031
1090 int lengthSync() { 1032 int lengthSync() {
1091 _checkNotClosed(); 1033 _checkNotClosed();
1092 var result = _FileUtils.length(_id); 1034 var result = _length(_id);
1093 if (result is OSError) { 1035 if (result is OSError) {
1094 throw new FileIOException("length failed for file '$_name'", result); 1036 throw new FileIOException("length failed for file '$_name'", result);
1095 } 1037 }
1096 return result; 1038 return result;
1097 } 1039 }
1098 1040
1099 Future<RandomAccessFile> flush() { 1041 Future<RandomAccessFile> flush() {
1100 _ensureFileService(); 1042 _ensureFileService();
1101 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 1043 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
1102 if (closed) return _completeWithClosedException(completer); 1044 if (closed) return _completeWithClosedException(completer);
1103 List request = new List(2); 1045 List request = new List(2);
1104 request[0] = _FileUtils.FLUSH_REQUEST; 1046 request[0] = _FLUSH_REQUEST;
1105 request[1] = _id; 1047 request[1] = _id;
1106 return _fileService.call(request).transform((response) { 1048 return _fileService.call(request).transform((response) {
1107 if (_isErrorResponse(response)) { 1049 if (_isErrorResponse(response)) {
1108 throw _exceptionFromResponse(response, 1050 throw _exceptionFromResponse(response,
1109 "flush failed for file '$_name'"); 1051 "flush failed for file '$_name'");
1110 } 1052 }
1111 return this; 1053 return this;
1112 }); 1054 });
1113 } 1055 }
1114 1056
1057 static _flush(int id) native "File_Flush";
1058
1115 void flushSync() { 1059 void flushSync() {
1116 _checkNotClosed(); 1060 _checkNotClosed();
1117 var result = _FileUtils.flush(_id); 1061 var result = _flush(_id);
1118 if (result is OSError) { 1062 if (result is OSError) {
1119 throw new FileIOException("flush failed for file '$_name'", result); 1063 throw new FileIOException("flush failed for file '$_name'", result);
1120 } 1064 }
1121 } 1065 }
1122 1066
1123 String get name => _name; 1067 String get name => _name;
1124 1068
1125 void _ensureFileService() { 1069 void _ensureFileService() {
1126 if (_fileService == null) { 1070 if (_fileService == null) {
1127 _fileService = _FileUtils.newServicePort(); 1071 _fileService = _newServicePort();
1128 } 1072 }
1129 } 1073 }
1130 1074
1131 bool get closed => _id == 0; 1075 bool get closed => _id == 0;
1132 1076
1133 void _checkNotClosed() { 1077 void _checkNotClosed() {
1134 if (closed) { 1078 if (closed) {
1135 throw new FileIOException("File closed '$_name'"); 1079 throw new FileIOException("File closed '$_name'");
1136 } 1080 }
1137 } 1081 }
1138 1082
1139 Future _completeWithClosedException(Completer completer) { 1083 Future _completeWithClosedException(Completer completer) {
1140 new Timer(0, (t) { 1084 new Timer(0, (t) {
1141 completer.completeException( 1085 completer.completeException(
1142 new FileIOException("File closed '$_name'")); 1086 new FileIOException("File closed '$_name'"));
1143 }); 1087 });
1144 return completer.future; 1088 return completer.future;
1145 } 1089 }
1146 1090
1147 final String _name; 1091 final String _name;
1148 int _id; 1092 int _id;
1149 1093
1150 SendPort _fileService; 1094 SendPort _fileService;
1151 } 1095 }
OLDNEW
« no previous file with comments | « runtime/bin/directory_impl.dart ('k') | runtime/bin/socket_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698