OLD | NEW |
---|---|
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 Loading... | |
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 |
Søren Gjesse
2012/10/30 09:28:32
Answers previous comment. Then add a TODO there as
Mads Ager (google)
2012/10/30 11:12:40
Done.
| |
350 // mechanism doesn't seem to like patching a private top level | |
351 // function. | |
352 class _FileUtils { | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |