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

Side by Side Diff: lib/io/file_impl.dart

Issue 11337019: Use patching for dart:io. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments Created 8 years, 1 month 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
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 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 const int _READ_LIST_REQUEST = 16; 322 const int _READ_LIST_REQUEST = 16;
323 const int _WRITE_LIST_REQUEST = 17; 323 const int _WRITE_LIST_REQUEST = 17;
324 const int _WRITE_STRING_REQUEST = 18; 324 const int _WRITE_STRING_REQUEST = 18;
325 325
326 // Base class for _File and _RandomAccessFile with shared functions. 326 // Base class for _File and _RandomAccessFile with shared functions.
327 class _FileBase { 327 class _FileBase {
328 bool _isErrorResponse(response) { 328 bool _isErrorResponse(response) {
329 return response is List && response[0] != _SUCCESS_RESPONSE; 329 return response is List && response[0] != _SUCCESS_RESPONSE;
330 } 330 }
331 331
332 Exception _exceptionFromResponse(response, String message) { 332 _exceptionFromResponse(response, String message) {
333 assert(_isErrorResponse(response)); 333 assert(_isErrorResponse(response));
334 switch (response[_ERROR_RESPONSE_ERROR_TYPE]) { 334 switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
335 case _ILLEGAL_ARGUMENT_RESPONSE: 335 case _ILLEGAL_ARGUMENT_RESPONSE:
336 return new ArgumentError(); 336 return new ArgumentError();
337 case _OSERROR_RESPONSE: 337 case _OSERROR_RESPONSE:
338 var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE], 338 var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
339 response[_OSERROR_RESPONSE_ERROR_CODE]); 339 response[_OSERROR_RESPONSE_ERROR_CODE]);
340 return new FileIOException(message, err); 340 return new FileIOException(message, err);
341 case _FILE_CLOSED_RESPONSE: 341 case _FILE_CLOSED_RESPONSE:
342 return new FileIOException("File closed"); 342 return new FileIOException("File closed");
343 default: 343 default:
344 return new Exception("Unknown error"); 344 return new Exception("Unknown error");
345 } 345 }
346 } 346 }
347 } 347 }
348 348
349 SendPort _newServicePort() native "File_NewServicePort"; 349 // TODO(ager): The only reason for this class is that the patching
350 // mechanism doesn't seem to like patching a private top level
351 // function.
352 class _FileUtils {
Anders Johnsen 2012/10/30 10:43:06 abstract?
353 external static SendPort _newServicePort();
354 }
350 355
351 // Class for encapsulating the native implementation of files. 356 // Class for encapsulating the native implementation of files.
352 class _File extends _FileBase implements File { 357 class _File extends _FileBase implements File {
353 // Constructor for file. 358 // Constructor for file.
354 _File(String this._name) { 359 _File(String this._name) {
355 if (_name is! String) { 360 if (_name is! String) {
356 throw new ArgumentError('${NoSuchMethodError.safeToString(_name)} ' 361 throw new ArgumentError('${NoSuchMethodError.safeToString(_name)} '
357 'is not a String'); 362 'is not a String');
358 } 363 }
359 } 364 }
360 365
361 // Constructor from Path for file. 366 // Constructor from Path for file.
362 _File.fromPath(Path path) : this(path.toNativePath()); 367 _File.fromPath(Path path) : this(path.toNativePath());
363 368
364 Future<bool> exists() { 369 Future<bool> exists() {
365 _ensureFileService(); 370 _ensureFileService();
366 List request = new List(2); 371 List request = new List(2);
367 request[0] = _EXISTS_REQUEST; 372 request[0] = _EXISTS_REQUEST;
368 request[1] = _name; 373 request[1] = _name;
369 return _fileService.call(request).transform((response) { 374 return _fileService.call(request).transform((response) {
370 if (_isErrorResponse(response)) { 375 if (_isErrorResponse(response)) {
371 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); 376 throw _exceptionFromResponse(response, "Cannot open file '$_name'");
372 } 377 }
373 return response; 378 return response;
374 }); 379 });
375 } 380 }
376 381
377 382 external static _exists(String name);
378 static _exists(String name) native "File_Exists";
379 383
380 bool existsSync() { 384 bool existsSync() {
381 var result = _exists(_name); 385 var result = _exists(_name);
382 throwIfError(result, "Cannot check existence of file '$_name'"); 386 throwIfError(result, "Cannot check existence of file '$_name'");
383 return result; 387 return result;
384 } 388 }
385 389
386 Future<File> create() { 390 Future<File> create() {
387 _ensureFileService(); 391 _ensureFileService();
388 List request = new List(2); 392 List request = new List(2);
389 request[0] = _CREATE_REQUEST; 393 request[0] = _CREATE_REQUEST;
390 request[1] = _name; 394 request[1] = _name;
391 return _fileService.call(request).transform((response) { 395 return _fileService.call(request).transform((response) {
392 if (_isErrorResponse(response)) { 396 if (_isErrorResponse(response)) {
393 throw _exceptionFromResponse(response, "Cannot create file '$_name'"); 397 throw _exceptionFromResponse(response, "Cannot create file '$_name'");
394 } 398 }
395 return this; 399 return this;
396 }); 400 });
397 } 401 }
398 402
399 static _create(String name) native "File_Create"; 403 external static _create(String name);
400 404
401 void createSync() { 405 void createSync() {
402 var result = _create(_name); 406 var result = _create(_name);
403 throwIfError(result, "Cannot create file '$_name'"); 407 throwIfError(result, "Cannot create file '$_name'");
404 } 408 }
405 409
406 Future<File> delete() { 410 Future<File> delete() {
407 _ensureFileService(); 411 _ensureFileService();
408 List request = new List(2); 412 List request = new List(2);
409 request[0] = _DELETE_REQUEST; 413 request[0] = _DELETE_REQUEST;
410 request[1] = _name; 414 request[1] = _name;
411 return _fileService.call(request).transform((response) { 415 return _fileService.call(request).transform((response) {
412 if (_isErrorResponse(response)) { 416 if (_isErrorResponse(response)) {
413 throw _exceptionFromResponse(response, "Cannot delete file '$_name'"); 417 throw _exceptionFromResponse(response, "Cannot delete file '$_name'");
414 } 418 }
415 return this; 419 return this;
416 }); 420 });
417 } 421 }
418 422
419 static _delete(String name) native "File_Delete"; 423 external static _delete(String name);
420 424
421 void deleteSync() { 425 void deleteSync() {
422 var result = _delete(_name); 426 var result = _delete(_name);
423 throwIfError(result, "Cannot delete file '$_name'"); 427 throwIfError(result, "Cannot delete file '$_name'");
424 } 428 }
425 429
426 Future<Directory> directory() { 430 Future<Directory> directory() {
427 _ensureFileService(); 431 _ensureFileService();
428 List request = new List(2); 432 List request = new List(2);
429 request[0] = _DIRECTORY_REQUEST; 433 request[0] = _DIRECTORY_REQUEST;
430 request[1] = _name; 434 request[1] = _name;
431 return _fileService.call(request).transform((response) { 435 return _fileService.call(request).transform((response) {
432 if (_isErrorResponse(response)) { 436 if (_isErrorResponse(response)) {
433 throw _exceptionFromResponse(response, 437 throw _exceptionFromResponse(response,
434 "Cannot retrieve directory for " 438 "Cannot retrieve directory for "
435 "file '$_name'"); 439 "file '$_name'");
436 } 440 }
437 return new Directory(response); 441 return new Directory(response);
438 }); 442 });
439 } 443 }
440 444
441 static _directory(String name) native "File_Directory"; 445 external static _directory(String name);
442 446
443 Directory directorySync() { 447 Directory directorySync() {
444 var result = _directory(name); 448 var result = _directory(name);
445 throwIfError(result, "Cannot retrieve directory for file '$_name'"); 449 throwIfError(result, "Cannot retrieve directory for file '$_name'");
446 return new Directory(result); 450 return new Directory(result);
447 } 451 }
448 452
449 Future<RandomAccessFile> open([FileMode mode = FileMode.READ]) { 453 Future<RandomAccessFile> open([FileMode mode = FileMode.READ]) {
450 _ensureFileService(); 454 _ensureFileService();
451 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 455 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
(...skipping 26 matching lines...) Expand all
478 if (_isErrorResponse(response)) { 482 if (_isErrorResponse(response)) {
479 throw _exceptionFromResponse(response, 483 throw _exceptionFromResponse(response,
480 "Cannot retrieve length of " 484 "Cannot retrieve length of "
481 "file '$_name'"); 485 "file '$_name'");
482 } 486 }
483 return response; 487 return response;
484 }); 488 });
485 } 489 }
486 490
487 491
488 static _lengthFromName(String name) native "File_LengthFromName"; 492 external static _lengthFromName(String name);
489 493
490 int lengthSync() { 494 int lengthSync() {
491 var result = _lengthFromName(_name); 495 var result = _lengthFromName(_name);
492 throwIfError(result, "Cannot retrieve length of file '$_name'"); 496 throwIfError(result, "Cannot retrieve length of file '$_name'");
493 return result; 497 return result;
494 } 498 }
495 499
496 Future<Date> lastModified() { 500 Future<Date> lastModified() {
497 _ensureFileService(); 501 _ensureFileService();
498 List request = new List(2); 502 List request = new List(2);
499 request[0] = _LAST_MODIFIED_REQUEST; 503 request[0] = _LAST_MODIFIED_REQUEST;
500 request[1] = _name; 504 request[1] = _name;
501 return _fileService.call(request).transform((response) { 505 return _fileService.call(request).transform((response) {
502 if (_isErrorResponse(response)) { 506 if (_isErrorResponse(response)) {
503 throw _exceptionFromResponse(response, 507 throw _exceptionFromResponse(response,
504 "Cannot retrieve modification time " 508 "Cannot retrieve modification time "
505 "for file '$_name'"); 509 "for file '$_name'");
506 } 510 }
507 return new Date.fromMillisecondsSinceEpoch(response); 511 return new Date.fromMillisecondsSinceEpoch(response);
508 }); 512 });
509 } 513 }
510 514
511 static _lastModified(String name) native "File_LastModified"; 515 external static _lastModified(String name);
512 516
513 Date lastModifiedSync() { 517 Date lastModifiedSync() {
514 var ms = _lastModified(name); 518 var ms = _lastModified(name);
515 throwIfError(ms, "Cannot retrieve modification time for file '$_name'"); 519 throwIfError(ms, "Cannot retrieve modification time for file '$_name'");
516 return new Date.fromMillisecondsSinceEpoch(ms); 520 return new Date.fromMillisecondsSinceEpoch(ms);
517 } 521 }
518 522
519 static _open(String name, int mode) native "File_Open"; 523 external static _open(String name, int mode);
520 524
521 RandomAccessFile openSync([FileMode mode = FileMode.READ]) { 525 RandomAccessFile openSync([FileMode mode = FileMode.READ]) {
522 if (mode != FileMode.READ && 526 if (mode != FileMode.READ &&
523 mode != FileMode.WRITE && 527 mode != FileMode.WRITE &&
524 mode != FileMode.APPEND) { 528 mode != FileMode.APPEND) {
525 throw new FileIOException("Unknown file mode. Use FileMode.READ, " 529 throw new FileIOException("Unknown file mode. Use FileMode.READ, "
526 "FileMode.WRITE or FileMode.APPEND."); 530 "FileMode.WRITE or FileMode.APPEND.");
527 } 531 }
528 var id = _open(_name, mode._mode); 532 var id = _open(_name, mode._mode);
529 throwIfError(id, "Cannot open file '$_name'"); 533 throwIfError(id, "Cannot open file '$_name'");
530 return new _RandomAccessFile(id, _name); 534 return new _RandomAccessFile(id, _name);
531 } 535 }
532 536
533 static int _openStdio(int fd) native "File_OpenStdio"; 537 external static int _openStdio(int fd);
534 538
535 static RandomAccessFile _openStdioSync(int fd) { 539 static RandomAccessFile _openStdioSync(int fd) {
536 var id = _openStdio(fd); 540 var id = _openStdio(fd);
537 if (id == 0) { 541 if (id == 0) {
538 throw new FileIOException("Cannot open stdio file for: $fd"); 542 throw new FileIOException("Cannot open stdio file for: $fd");
539 } 543 }
540 return new _RandomAccessFile(id, ""); 544 return new _RandomAccessFile(id, "");
541 } 545 }
542 546
543 Future<String> fullPath() { 547 Future<String> fullPath() {
544 _ensureFileService(); 548 _ensureFileService();
545 List request = new List(2); 549 List request = new List(2);
546 request[0] = _FULL_PATH_REQUEST; 550 request[0] = _FULL_PATH_REQUEST;
547 request[1] = _name; 551 request[1] = _name;
548 return _fileService.call(request).transform((response) { 552 return _fileService.call(request).transform((response) {
549 if (_isErrorResponse(response)) { 553 if (_isErrorResponse(response)) {
550 throw _exceptionFromResponse(response, 554 throw _exceptionFromResponse(response,
551 "Cannot retrieve full path" 555 "Cannot retrieve full path"
552 " for '$_name'"); 556 " for '$_name'");
553 } 557 }
554 return response; 558 return response;
555 }); 559 });
556 } 560 }
557 561
558 static _fullPath(String name) native "File_FullPath"; 562 external static _fullPath(String name);
559 563
560 String fullPathSync() { 564 String fullPathSync() {
561 var result = _fullPath(_name); 565 var result = _fullPath(_name);
562 throwIfError(result, "Cannot retrieve full path for file '$_name'"); 566 throwIfError(result, "Cannot retrieve full path for file '$_name'");
563 return result; 567 return result;
564 } 568 }
565 569
566 InputStream openInputStream() { 570 InputStream openInputStream() {
567 return new _FileInputStream(_name); 571 return new _FileInputStream(_name);
568 } 572 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 var decoder = _StringDecoders.decoder(encoding); 658 var decoder = _StringDecoders.decoder(encoding);
655 List<int> bytes = readAsBytesSync(); 659 List<int> bytes = readAsBytesSync();
656 decoder.write(bytes); 660 decoder.write(bytes);
657 return _getDecodedLines(decoder); 661 return _getDecodedLines(decoder);
658 } 662 }
659 663
660 String get name => _name; 664 String get name => _name;
661 665
662 void _ensureFileService() { 666 void _ensureFileService() {
663 if (_fileService == null) { 667 if (_fileService == null) {
664 _fileService = _newServicePort(); 668 _fileService = _FileUtils._newServicePort();
665 } 669 }
666 } 670 }
667 671
668 static throwIfError(Object result, String msg) { 672 static throwIfError(Object result, String msg) {
669 if (result is OSError) { 673 if (result is OSError) {
670 throw new FileIOException(msg, result); 674 throw new FileIOException(msg, result);
671 } 675 }
672 } 676 }
673 677
674 final String _name; 678 final String _name;
(...skipping 18 matching lines...) Expand all
693 return _fileService.call(request).transform((result) { 697 return _fileService.call(request).transform((result) {
694 if (result != -1) { 698 if (result != -1) {
695 _id = result; 699 _id = result;
696 return this; 700 return this;
697 } else { 701 } else {
698 throw new FileIOException("Cannot close file '$_name'"); 702 throw new FileIOException("Cannot close file '$_name'");
699 } 703 }
700 }); 704 });
701 } 705 }
702 706
703 static int _close(int id) native "File_Close"; 707 external static int _close(int id);
704 708
705 void closeSync() { 709 void closeSync() {
706 _checkNotClosed(); 710 _checkNotClosed();
707 var id = _close(_id); 711 var id = _close(_id);
708 if (id == -1) { 712 if (id == -1) {
709 throw new FileIOException("Cannot close file '$_name'"); 713 throw new FileIOException("Cannot close file '$_name'");
710 } 714 }
711 _id = id; 715 _id = id;
712 } 716 }
713 717
714 Future<int> readByte() { 718 Future<int> readByte() {
715 _ensureFileService(); 719 _ensureFileService();
716 Completer<int> completer = new Completer<int>(); 720 Completer<int> completer = new Completer<int>();
717 if (closed) return _completeWithClosedException(completer); 721 if (closed) return _completeWithClosedException(completer);
718 List request = new List(2); 722 List request = new List(2);
719 request[0] = _READ_BYTE_REQUEST; 723 request[0] = _READ_BYTE_REQUEST;
720 request[1] = _id; 724 request[1] = _id;
721 return _fileService.call(request).transform((response) { 725 return _fileService.call(request).transform((response) {
722 if (_isErrorResponse(response)) { 726 if (_isErrorResponse(response)) {
723 throw _exceptionFromResponse(response, 727 throw _exceptionFromResponse(response,
724 "readByte failed for file '$_name'"); 728 "readByte failed for file '$_name'");
725 } 729 }
726 return response; 730 return response;
727 }); 731 });
728 } 732 }
729 733
730 static _readByte(int id) native "File_ReadByte"; 734 external static _readByte(int id);
731 735
732 int readByteSync() { 736 int readByteSync() {
733 _checkNotClosed(); 737 _checkNotClosed();
734 var result = _readByte(_id); 738 var result = _readByte(_id);
735 if (result is OSError) { 739 if (result is OSError) {
736 throw new FileIOException("readByte failed for file '$_name'", result); 740 throw new FileIOException("readByte failed for file '$_name'", result);
737 } 741 }
738 return result; 742 return result;
739 } 743 }
740 744
(...skipping 28 matching lines...) Expand all
769 } 773 }
770 774
771 static void _checkReadWriteListArguments(int length, int offset, int bytes) { 775 static void _checkReadWriteListArguments(int length, int offset, int bytes) {
772 if (offset < 0) throw new IndexOutOfRangeException(offset); 776 if (offset < 0) throw new IndexOutOfRangeException(offset);
773 if (bytes < 0) throw new IndexOutOfRangeException(bytes); 777 if (bytes < 0) throw new IndexOutOfRangeException(bytes);
774 if ((offset + bytes) > length) { 778 if ((offset + bytes) > length) {
775 throw new IndexOutOfRangeException(offset + bytes); 779 throw new IndexOutOfRangeException(offset + bytes);
776 } 780 }
777 } 781 }
778 782
779 static _readList(int id, List<int> buffer, int offset, int bytes) 783 external static _readList(int id, List<int> buffer, int offset, int bytes);
780 native "File_ReadList";
781 784
782 int readListSync(List<int> buffer, int offset, int bytes) { 785 int readListSync(List<int> buffer, int offset, int bytes) {
783 _checkNotClosed(); 786 _checkNotClosed();
784 if (buffer is !List || offset is !int || bytes is !int) { 787 if (buffer is !List || offset is !int || bytes is !int) {
785 throw new FileIOException( 788 throw new FileIOException(
786 "Invalid arguments to readList for file '$_name'"); 789 "Invalid arguments to readList for file '$_name'");
787 } 790 }
788 if (bytes == 0) return 0; 791 if (bytes == 0) return 0;
789 _checkReadWriteListArguments(buffer.length, offset, bytes); 792 _checkReadWriteListArguments(buffer.length, offset, bytes);
790 var result = _readList(_id, buffer, offset, bytes); 793 var result = _readList(_id, buffer, offset, bytes);
(...skipping 24 matching lines...) Expand all
815 request[2] = value; 818 request[2] = value;
816 return _fileService.call(request).transform((response) { 819 return _fileService.call(request).transform((response) {
817 if (_isErrorResponse(response)) { 820 if (_isErrorResponse(response)) {
818 throw _exceptionFromResponse(response, 821 throw _exceptionFromResponse(response,
819 "writeByte failed for file '$_name'"); 822 "writeByte failed for file '$_name'");
820 } 823 }
821 return this; 824 return this;
822 }); 825 });
823 } 826 }
824 827
825 static _writeByte(int id, int value) native "File_WriteByte"; 828 external static _writeByte(int id, int value);
826 829
827 int writeByteSync(int value) { 830 int writeByteSync(int value) {
828 _checkNotClosed(); 831 _checkNotClosed();
829 if (value is !int) { 832 if (value is !int) {
830 throw new FileIOException( 833 throw new FileIOException(
831 "Invalid argument to writeByte for file '$_name'"); 834 "Invalid argument to writeByte for file '$_name'");
832 } 835 }
833 var result = _writeByte(_id, value); 836 var result = _writeByte(_id, value);
834 if (result is OSError) { 837 if (result is OSError) {
835 throw new FileIOException("writeByte failed for file '$_name'", 838 throw new FileIOException("writeByte failed for file '$_name'",
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 request[4] = bytes; 875 request[4] = bytes;
873 return _fileService.call(request).transform((response) { 876 return _fileService.call(request).transform((response) {
874 if (_isErrorResponse(response)) { 877 if (_isErrorResponse(response)) {
875 throw _exceptionFromResponse(response, 878 throw _exceptionFromResponse(response,
876 "writeList failed for file '$_name'"); 879 "writeList failed for file '$_name'");
877 } 880 }
878 return this; 881 return this;
879 }); 882 });
880 } 883 }
881 884
882 static _writeList(int id, List<int> buffer, int offset, int bytes) 885 external static _writeList(int id, List<int> buffer, int offset, int bytes);
883 native "File_WriteList";
884 886
885 int writeListSync(List<int> buffer, int offset, int bytes) { 887 int writeListSync(List<int> buffer, int offset, int bytes) {
886 _checkNotClosed(); 888 _checkNotClosed();
887 if (buffer is !List || offset is !int || bytes is !int) { 889 if (buffer is !List || offset is !int || bytes is !int) {
888 throw new FileIOException( 890 throw new FileIOException(
889 "Invalid arguments to writeList for file '$_name'"); 891 "Invalid arguments to writeList for file '$_name'");
890 } 892 }
891 if (bytes == 0) return 0; 893 if (bytes == 0) return 0;
892 _checkReadWriteListArguments(buffer.length, offset, bytes); 894 _checkReadWriteListArguments(buffer.length, offset, bytes);
893 _BufferAndOffset bufferAndOffset = 895 _BufferAndOffset bufferAndOffset =
(...skipping 17 matching lines...) Expand all
911 request[2] = string; 913 request[2] = string;
912 return _fileService.call(request).transform((response) { 914 return _fileService.call(request).transform((response) {
913 if (_isErrorResponse(response)) { 915 if (_isErrorResponse(response)) {
914 throw _exceptionFromResponse(response, 916 throw _exceptionFromResponse(response,
915 "writeString failed for file '$_name'"); 917 "writeString failed for file '$_name'");
916 } 918 }
917 return this; 919 return this;
918 }); 920 });
919 } 921 }
920 922
921 static _writeString(int id, String string) native "File_WriteString"; 923 external static _writeString(int id, String string);
922 924
923 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) { 925 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) {
924 _checkNotClosed(); 926 _checkNotClosed();
925 if (string is !String) throw new ArgumentError(); 927 if (string is !String) throw new ArgumentError();
926 var result = _writeString(_id, string); 928 var result = _writeString(_id, string);
927 if (result is OSError) { 929 if (result is OSError) {
928 throw new FileIOException("writeString failed for file '$_name'"); 930 throw new FileIOException("writeString failed for file '$_name'");
929 } 931 }
930 return result; 932 return result;
931 } 933 }
932 934
933 Future<int> position() { 935 Future<int> position() {
934 _ensureFileService(); 936 _ensureFileService();
935 Completer<int> completer = new Completer<int>(); 937 Completer<int> completer = new Completer<int>();
936 if (closed) return _completeWithClosedException(completer); 938 if (closed) return _completeWithClosedException(completer);
937 List request = new List(2); 939 List request = new List(2);
938 request[0] = _POSITION_REQUEST; 940 request[0] = _POSITION_REQUEST;
939 request[1] = _id; 941 request[1] = _id;
940 return _fileService.call(request).transform((response) { 942 return _fileService.call(request).transform((response) {
941 if (_isErrorResponse(response)) { 943 if (_isErrorResponse(response)) {
942 throw _exceptionFromResponse(response, 944 throw _exceptionFromResponse(response,
943 "position failed for file '$_name'"); 945 "position failed for file '$_name'");
944 } 946 }
945 return response; 947 return response;
946 }); 948 });
947 } 949 }
948 950
949 static _position(int id) native "File_Position"; 951 external static _position(int id);
950 952
951 int positionSync() { 953 int positionSync() {
952 _checkNotClosed(); 954 _checkNotClosed();
953 var result = _position(_id); 955 var result = _position(_id);
954 if (result is OSError) { 956 if (result is OSError) {
955 throw new FileIOException("position failed for file '$_name'", result); 957 throw new FileIOException("position failed for file '$_name'", result);
956 } 958 }
957 return result; 959 return result;
958 } 960 }
959 961
960 Future<RandomAccessFile> setPosition(int position) { 962 Future<RandomAccessFile> setPosition(int position) {
961 _ensureFileService(); 963 _ensureFileService();
962 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 964 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
963 if (closed) return _completeWithClosedException(completer); 965 if (closed) return _completeWithClosedException(completer);
964 List request = new List(3); 966 List request = new List(3);
965 request[0] = _SET_POSITION_REQUEST; 967 request[0] = _SET_POSITION_REQUEST;
966 request[1] = _id; 968 request[1] = _id;
967 request[2] = position; 969 request[2] = position;
968 return _fileService.call(request).transform((response) { 970 return _fileService.call(request).transform((response) {
969 if (_isErrorResponse(response)) { 971 if (_isErrorResponse(response)) {
970 throw _exceptionFromResponse(response, 972 throw _exceptionFromResponse(response,
971 "setPosition failed for file '$_name'"); 973 "setPosition failed for file '$_name'");
972 } 974 }
973 return this; 975 return this;
974 }); 976 });
975 } 977 }
976 978
977 static _setPosition(int id, int position) native "File_SetPosition"; 979 external static _setPosition(int id, int position);
978 980
979 void setPositionSync(int position) { 981 void setPositionSync(int position) {
980 _checkNotClosed(); 982 _checkNotClosed();
981 var result = _setPosition(_id, position); 983 var result = _setPosition(_id, position);
982 if (result is OSError) { 984 if (result is OSError) {
983 throw new FileIOException("setPosition failed for file '$_name'", result); 985 throw new FileIOException("setPosition failed for file '$_name'", result);
984 } 986 }
985 } 987 }
986 988
987 Future<RandomAccessFile> truncate(int length) { 989 Future<RandomAccessFile> truncate(int length) {
988 _ensureFileService(); 990 _ensureFileService();
989 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 991 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
990 if (closed) return _completeWithClosedException(completer); 992 if (closed) return _completeWithClosedException(completer);
991 List request = new List(3); 993 List request = new List(3);
992 request[0] = _TRUNCATE_REQUEST; 994 request[0] = _TRUNCATE_REQUEST;
993 request[1] = _id; 995 request[1] = _id;
994 request[2] = length; 996 request[2] = length;
995 return _fileService.call(request).transform((response) { 997 return _fileService.call(request).transform((response) {
996 if (_isErrorResponse(response)) { 998 if (_isErrorResponse(response)) {
997 throw _exceptionFromResponse(response, 999 throw _exceptionFromResponse(response,
998 "truncate failed for file '$_name'"); 1000 "truncate failed for file '$_name'");
999 } 1001 }
1000 return this; 1002 return this;
1001 }); 1003 });
1002 } 1004 }
1003 1005
1004 static _truncate(int id, int length) native "File_Truncate"; 1006 external static _truncate(int id, int length);
1005 1007
1006 void truncateSync(int length) { 1008 void truncateSync(int length) {
1007 _checkNotClosed(); 1009 _checkNotClosed();
1008 var result = _truncate(_id, length); 1010 var result = _truncate(_id, length);
1009 if (result is OSError) { 1011 if (result is OSError) {
1010 throw new FileIOException("truncate failed for file '$_name'", result); 1012 throw new FileIOException("truncate failed for file '$_name'", result);
1011 } 1013 }
1012 } 1014 }
1013 1015
1014 Future<int> length() { 1016 Future<int> length() {
1015 _ensureFileService(); 1017 _ensureFileService();
1016 Completer<int> completer = new Completer<int>(); 1018 Completer<int> completer = new Completer<int>();
1017 if (closed) return _completeWithClosedException(completer); 1019 if (closed) return _completeWithClosedException(completer);
1018 List request = new List(2); 1020 List request = new List(2);
1019 request[0] = _LENGTH_REQUEST; 1021 request[0] = _LENGTH_REQUEST;
1020 request[1] = _id; 1022 request[1] = _id;
1021 return _fileService.call(request).transform((response) { 1023 return _fileService.call(request).transform((response) {
1022 if (_isErrorResponse(response)) { 1024 if (_isErrorResponse(response)) {
1023 throw _exceptionFromResponse(response, 1025 throw _exceptionFromResponse(response,
1024 "length failed for file '$_name'"); 1026 "length failed for file '$_name'");
1025 } 1027 }
1026 return response; 1028 return response;
1027 }); 1029 });
1028 } 1030 }
1029 1031
1030 static _length(int id) native "File_Length"; 1032 external static _length(int id);
1031 1033
1032 int lengthSync() { 1034 int lengthSync() {
1033 _checkNotClosed(); 1035 _checkNotClosed();
1034 var result = _length(_id); 1036 var result = _length(_id);
1035 if (result is OSError) { 1037 if (result is OSError) {
1036 throw new FileIOException("length failed for file '$_name'", result); 1038 throw new FileIOException("length failed for file '$_name'", result);
1037 } 1039 }
1038 return result; 1040 return result;
1039 } 1041 }
1040 1042
1041 Future<RandomAccessFile> flush() { 1043 Future<RandomAccessFile> flush() {
1042 _ensureFileService(); 1044 _ensureFileService();
1043 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 1045 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
1044 if (closed) return _completeWithClosedException(completer); 1046 if (closed) return _completeWithClosedException(completer);
1045 List request = new List(2); 1047 List request = new List(2);
1046 request[0] = _FLUSH_REQUEST; 1048 request[0] = _FLUSH_REQUEST;
1047 request[1] = _id; 1049 request[1] = _id;
1048 return _fileService.call(request).transform((response) { 1050 return _fileService.call(request).transform((response) {
1049 if (_isErrorResponse(response)) { 1051 if (_isErrorResponse(response)) {
1050 throw _exceptionFromResponse(response, 1052 throw _exceptionFromResponse(response,
1051 "flush failed for file '$_name'"); 1053 "flush failed for file '$_name'");
1052 } 1054 }
1053 return this; 1055 return this;
1054 }); 1056 });
1055 } 1057 }
1056 1058
1057 static _flush(int id) native "File_Flush"; 1059 external static _flush(int id);
1058 1060
1059 void flushSync() { 1061 void flushSync() {
1060 _checkNotClosed(); 1062 _checkNotClosed();
1061 var result = _flush(_id); 1063 var result = _flush(_id);
1062 if (result is OSError) { 1064 if (result is OSError) {
1063 throw new FileIOException("flush failed for file '$_name'", result); 1065 throw new FileIOException("flush failed for file '$_name'", result);
1064 } 1066 }
1065 } 1067 }
1066 1068
1067 String get name => _name; 1069 String get name => _name;
1068 1070
1069 void _ensureFileService() { 1071 void _ensureFileService() {
1070 if (_fileService == null) { 1072 if (_fileService == null) {
1071 _fileService = _newServicePort(); 1073 _fileService = _FileUtils._newServicePort();
1072 } 1074 }
1073 } 1075 }
1074 1076
1075 bool get closed => _id == 0; 1077 bool get closed => _id == 0;
1076 1078
1077 void _checkNotClosed() { 1079 void _checkNotClosed() {
1078 if (closed) { 1080 if (closed) {
1079 throw new FileIOException("File closed '$_name'"); 1081 throw new FileIOException("File closed '$_name'");
1080 } 1082 }
1081 } 1083 }
1082 1084
1083 Future _completeWithClosedException(Completer completer) { 1085 Future _completeWithClosedException(Completer completer) {
1084 new Timer(0, (t) { 1086 new Timer(0, (t) {
1085 completer.completeException( 1087 completer.completeException(
1086 new FileIOException("File closed '$_name'")); 1088 new FileIOException("File closed '$_name'"));
1087 }); 1089 });
1088 return completer.future; 1090 return completer.future;
1089 } 1091 }
1090 1092
1091 final String _name; 1093 final String _name;
1092 int _id; 1094 int _id;
1093 1095
1094 SendPort _fileService; 1096 SendPort _fileService;
1095 } 1097 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698