| 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 part of dart.io; | 5 part of dart.io; |
| 6 | 6 |
| 7 class _FileInputStream extends _BaseDataInputStream implements InputStream { | 7 class _FileInputStream extends _BaseDataInputStream implements InputStream { |
| 8 _FileInputStream(String name) | 8 _FileInputStream(String name) |
| 9 : _data = const [], | 9 : _data = const [], |
| 10 _position = 0, | 10 _position = 0, |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 _closeCallbackScheduled = true; | 217 _closeCallbackScheduled = true; |
| 218 } | 218 } |
| 219 } | 219 } |
| 220 | 220 |
| 221 void set onNoPendingWrites(void callback()) { | 221 void set onNoPendingWrites(void callback()) { |
| 222 _onNoPendingWrites = callback; | 222 _onNoPendingWrites = callback; |
| 223 if ((_pendingOperations == null || _pendingOperations.length == 0) && | 223 if ((_pendingOperations == null || _pendingOperations.length == 0) && |
| 224 outstandingWrites == 0 && | 224 outstandingWrites == 0 && |
| 225 !_streamMarkedClosed && | 225 !_streamMarkedClosed && |
| 226 _onNoPendingWrites != null) { | 226 _onNoPendingWrites != null) { |
| 227 new Timer(0, (t) { | 227 Timer.run(() { |
| 228 if (_onNoPendingWrites != null) { | 228 if (_onNoPendingWrites != null) { |
| 229 _onNoPendingWrites(); | 229 _onNoPendingWrites(); |
| 230 } | 230 } |
| 231 }); | 231 }); |
| 232 } | 232 } |
| 233 } | 233 } |
| 234 | 234 |
| 235 void set onClosed(void callback()) { | 235 void set onClosed(void callback()) { |
| 236 _onClosed = callback; | 236 _onClosed = callback; |
| 237 } | 237 } |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 throwIfError(result, "Cannot retrieve directory for file '$_name'"); | 437 throwIfError(result, "Cannot retrieve directory for file '$_name'"); |
| 438 return new Directory(result); | 438 return new Directory(result); |
| 439 } | 439 } |
| 440 | 440 |
| 441 Future<RandomAccessFile> open([FileMode mode = FileMode.READ]) { | 441 Future<RandomAccessFile> open([FileMode mode = FileMode.READ]) { |
| 442 _ensureFileService(); | 442 _ensureFileService(); |
| 443 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 443 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
| 444 if (mode != FileMode.READ && | 444 if (mode != FileMode.READ && |
| 445 mode != FileMode.WRITE && | 445 mode != FileMode.WRITE && |
| 446 mode != FileMode.APPEND) { | 446 mode != FileMode.APPEND) { |
| 447 new Timer(0, (t) { | 447 Timer.run(() { |
| 448 completer.completeError(new ArgumentError()); | 448 completer.completeError(new ArgumentError()); |
| 449 }); | 449 }); |
| 450 return completer.future; | 450 return completer.future; |
| 451 } | 451 } |
| 452 List request = new List.fixedLength(3); | 452 List request = new List.fixedLength(3); |
| 453 request[0] = _OPEN_REQUEST; | 453 request[0] = _OPEN_REQUEST; |
| 454 request[1] = _name; | 454 request[1] = _name; |
| 455 request[2] = mode._mode; // Direct int value for serialization. | 455 request[2] = mode._mode; // Direct int value for serialization. |
| 456 return _fileService.call(request).then((response) { | 456 return _fileService.call(request).then((response) { |
| 457 if (_isErrorResponse(response)) { | 457 if (_isErrorResponse(response)) { |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 var stream = openOutputStream(mode); | 658 var stream = openOutputStream(mode); |
| 659 stream.write(bytes); | 659 stream.write(bytes); |
| 660 stream.close(); | 660 stream.close(); |
| 661 stream.onClosed = () { | 661 stream.onClosed = () { |
| 662 completer.complete(this); | 662 completer.complete(this); |
| 663 }; | 663 }; |
| 664 stream.onError = (e) { | 664 stream.onError = (e) { |
| 665 completer.completeError(e); | 665 completer.completeError(e); |
| 666 }; | 666 }; |
| 667 } catch (e) { | 667 } catch (e) { |
| 668 new Timer(0, (t) => completer.completeError(e)); | 668 Timer.run(() => completer.completeError(e)); |
| 669 return completer.future; | 669 return completer.future; |
| 670 } | 670 } |
| 671 return completer.future; | 671 return completer.future; |
| 672 } | 672 } |
| 673 | 673 |
| 674 void writeAsBytesSync(List<int> bytes, [FileMode mode = FileMode.WRITE]) { | 674 void writeAsBytesSync(List<int> bytes, [FileMode mode = FileMode.WRITE]) { |
| 675 RandomAccessFile opened = openSync(mode); | 675 RandomAccessFile opened = openSync(mode); |
| 676 opened.writeListSync(bytes, 0, bytes.length); | 676 opened.writeListSync(bytes, 0, bytes.length); |
| 677 opened.closeSync(); | 677 opened.closeSync(); |
| 678 } | 678 } |
| 679 | 679 |
| 680 Future<File> writeAsString(String contents, | 680 Future<File> writeAsString(String contents, |
| 681 {FileMode mode: FileMode.WRITE, | 681 {FileMode mode: FileMode.WRITE, |
| 682 Encoding encoding: Encoding.UTF_8}) { | 682 Encoding encoding: Encoding.UTF_8}) { |
| 683 try { | 683 try { |
| 684 var data = _StringEncoders.encoder(encoding).encodeString(contents); | 684 var data = _StringEncoders.encoder(encoding).encodeString(contents); |
| 685 return writeAsBytes(data, mode); | 685 return writeAsBytes(data, mode); |
| 686 } catch (e) { | 686 } catch (e) { |
| 687 var completer = new Completer(); | 687 var completer = new Completer(); |
| 688 new Timer(0, (t) => completer.completeError(e)); | 688 Timer.run(() => completer.completeError(e)); |
| 689 return completer.future; | 689 return completer.future; |
| 690 } | 690 } |
| 691 } | 691 } |
| 692 | 692 |
| 693 void writeAsStringSync(String contents, | 693 void writeAsStringSync(String contents, |
| 694 {FileMode mode: FileMode.WRITE, | 694 {FileMode mode: FileMode.WRITE, |
| 695 Encoding encoding: Encoding.UTF_8}) { | 695 Encoding encoding: Encoding.UTF_8}) { |
| 696 var data = _StringEncoders.encoder(encoding).encodeString(contents); | 696 var data = _StringEncoders.encoder(encoding).encodeString(contents); |
| 697 writeAsBytesSync(data, mode); | 697 writeAsBytesSync(data, mode); |
| 698 } | 698 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 return result; | 780 return result; |
| 781 } | 781 } |
| 782 | 782 |
| 783 Future<List<int>> read(int bytes) { | 783 Future<List<int>> read(int bytes) { |
| 784 _ensureFileService(); | 784 _ensureFileService(); |
| 785 Completer<List<int>> completer = new Completer<List<int>>(); | 785 Completer<List<int>> completer = new Completer<List<int>>(); |
| 786 if (bytes is !int) { | 786 if (bytes is !int) { |
| 787 // Complete asynchronously so the user has a chance to setup | 787 // Complete asynchronously so the user has a chance to setup |
| 788 // handlers without getting exceptions when registering the | 788 // handlers without getting exceptions when registering the |
| 789 // then handler. | 789 // then handler. |
| 790 new Timer(0, (t) { | 790 Timer.run(() { |
| 791 completer.completeError(new FileIOException( | 791 completer.completeError(new FileIOException( |
| 792 "Invalid arguments to read for file '$_name'")); | 792 "Invalid arguments to read for file '$_name'")); |
| 793 }); | 793 }); |
| 794 return completer.future; | 794 return completer.future; |
| 795 }; | 795 }; |
| 796 if (closed) return _completeWithClosedException(completer); | 796 if (closed) return _completeWithClosedException(completer); |
| 797 List request = new List(3); | 797 List request = new List(3); |
| 798 request[0] = _READ_REQUEST; | 798 request[0] = _READ_REQUEST; |
| 799 request[1] = _id; | 799 request[1] = _id; |
| 800 request[2] = bytes; | 800 request[2] = bytes; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 817 return _read(_id, bytes); | 817 return _read(_id, bytes); |
| 818 } | 818 } |
| 819 | 819 |
| 820 Future<int> readList(List<int> buffer, int offset, int bytes) { | 820 Future<int> readList(List<int> buffer, int offset, int bytes) { |
| 821 _ensureFileService(); | 821 _ensureFileService(); |
| 822 Completer<int> completer = new Completer<int>(); | 822 Completer<int> completer = new Completer<int>(); |
| 823 if (buffer is !List || offset is !int || bytes is !int) { | 823 if (buffer is !List || offset is !int || bytes is !int) { |
| 824 // Complete asynchronously so the user has a chance to setup | 824 // Complete asynchronously so the user has a chance to setup |
| 825 // handlers without getting exceptions when registering the | 825 // handlers without getting exceptions when registering the |
| 826 // then handler. | 826 // then handler. |
| 827 new Timer(0, (t) { | 827 Timer.run(() { |
| 828 completer.completeError(new FileIOException( | 828 completer.completeError(new FileIOException( |
| 829 "Invalid arguments to readList for file '$_name'")); | 829 "Invalid arguments to readList for file '$_name'")); |
| 830 }); | 830 }); |
| 831 return completer.future; | 831 return completer.future; |
| 832 }; | 832 }; |
| 833 if (closed) return _completeWithClosedException(completer); | 833 if (closed) return _completeWithClosedException(completer); |
| 834 List request = new List.fixedLength(3); | 834 List request = new List.fixedLength(3); |
| 835 request[0] = _READ_LIST_REQUEST; | 835 request[0] = _READ_LIST_REQUEST; |
| 836 request[1] = _id; | 836 request[1] = _id; |
| 837 request[2] = bytes; | 837 request[2] = bytes; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 return result; | 873 return result; |
| 874 } | 874 } |
| 875 | 875 |
| 876 Future<RandomAccessFile> writeByte(int value) { | 876 Future<RandomAccessFile> writeByte(int value) { |
| 877 _ensureFileService(); | 877 _ensureFileService(); |
| 878 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 878 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
| 879 if (value is !int) { | 879 if (value is !int) { |
| 880 // Complete asynchronously so the user has a chance to setup | 880 // Complete asynchronously so the user has a chance to setup |
| 881 // handlers without getting exceptions when registering the | 881 // handlers without getting exceptions when registering the |
| 882 // then handler. | 882 // then handler. |
| 883 new Timer(0, (t) { | 883 Timer.run(() { |
| 884 completer.completeError(new FileIOException( | 884 completer.completeError(new FileIOException( |
| 885 "Invalid argument to writeByte for file '$_name'")); | 885 "Invalid argument to writeByte for file '$_name'")); |
| 886 }); | 886 }); |
| 887 return completer.future; | 887 return completer.future; |
| 888 } | 888 } |
| 889 if (closed) return _completeWithClosedException(completer); | 889 if (closed) return _completeWithClosedException(completer); |
| 890 List request = new List.fixedLength(3); | 890 List request = new List.fixedLength(3); |
| 891 request[0] = _WRITE_BYTE_REQUEST; | 891 request[0] = _WRITE_BYTE_REQUEST; |
| 892 request[1] = _id; | 892 request[1] = _id; |
| 893 request[2] = value; | 893 request[2] = value; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 916 return result; | 916 return result; |
| 917 } | 917 } |
| 918 | 918 |
| 919 Future<RandomAccessFile> writeList(List<int> buffer, int offset, int bytes) { | 919 Future<RandomAccessFile> writeList(List<int> buffer, int offset, int bytes) { |
| 920 _ensureFileService(); | 920 _ensureFileService(); |
| 921 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 921 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
| 922 if (buffer is !List || offset is !int || bytes is !int) { | 922 if (buffer is !List || offset is !int || bytes is !int) { |
| 923 // Complete asynchronously so the user has a chance to setup | 923 // Complete asynchronously so the user has a chance to setup |
| 924 // handlers without getting exceptions when registering the | 924 // handlers without getting exceptions when registering the |
| 925 // then handler. | 925 // then handler. |
| 926 new Timer(0, (t) { | 926 Timer.run(() { |
| 927 completer.completeError(new FileIOException( | 927 completer.completeError(new FileIOException( |
| 928 "Invalid arguments to writeList for file '$_name'")); | 928 "Invalid arguments to writeList for file '$_name'")); |
| 929 }); | 929 }); |
| 930 return completer.future; | 930 return completer.future; |
| 931 } | 931 } |
| 932 if (closed) return _completeWithClosedException(completer); | 932 if (closed) return _completeWithClosedException(completer); |
| 933 | 933 |
| 934 _BufferAndOffset result; | 934 _BufferAndOffset result; |
| 935 try { | 935 try { |
| 936 result = _ensureFastAndSerializableBuffer(buffer, offset, bytes); | 936 result = _ensureFastAndSerializableBuffer(buffer, offset, bytes); |
| 937 } catch (e) { | 937 } catch (e) { |
| 938 // Complete asynchronously so the user has a chance to setup | 938 // Complete asynchronously so the user has a chance to setup |
| 939 // handlers without getting exceptions when registering the | 939 // handlers without getting exceptions when registering the |
| 940 // then handler. | 940 // then handler. |
| 941 new Timer(0, (t) => completer.completeError(e)); | 941 Timer.run(() => completer.completeError(e)); |
| 942 return completer.future; | 942 return completer.future; |
| 943 } | 943 } |
| 944 | 944 |
| 945 List request = new List.fixedLength(5); | 945 List request = new List.fixedLength(5); |
| 946 request[0] = _WRITE_LIST_REQUEST; | 946 request[0] = _WRITE_LIST_REQUEST; |
| 947 request[1] = _id; | 947 request[1] = _id; |
| 948 request[2] = result.buffer; | 948 request[2] = result.buffer; |
| 949 request[3] = result.offset; | 949 request[3] = result.offset; |
| 950 request[4] = bytes; | 950 request[4] = bytes; |
| 951 return _fileService.call(request).then((response) { | 951 return _fileService.call(request).then((response) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 974 if (result is OSError) { | 974 if (result is OSError) { |
| 975 throw new FileIOException("writeList failed for file '$_name'", result); | 975 throw new FileIOException("writeList failed for file '$_name'", result); |
| 976 } | 976 } |
| 977 return result; | 977 return result; |
| 978 } | 978 } |
| 979 | 979 |
| 980 Future<RandomAccessFile> writeString(String string, | 980 Future<RandomAccessFile> writeString(String string, |
| 981 [Encoding encoding = Encoding.UTF_8]) { | 981 [Encoding encoding = Encoding.UTF_8]) { |
| 982 if (encoding is! Encoding) { | 982 if (encoding is! Encoding) { |
| 983 var completer = new Completer(); | 983 var completer = new Completer(); |
| 984 new Timer(0, (t) { | 984 Timer.run(() { |
| 985 completer.completeError(new FileIOException( | 985 completer.completeError(new FileIOException( |
| 986 "Invalid encoding in writeString: $encoding")); | 986 "Invalid encoding in writeString: $encoding")); |
| 987 }); | 987 }); |
| 988 return completer.future; | 988 return completer.future; |
| 989 } | 989 } |
| 990 var data = _StringEncoders.encoder(encoding).encodeString(string); | 990 var data = _StringEncoders.encoder(encoding).encodeString(string); |
| 991 return writeList(data, 0, data.length); | 991 return writeList(data, 0, data.length); |
| 992 } | 992 } |
| 993 | 993 |
| 994 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) { | 994 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) { |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1144 | 1144 |
| 1145 bool get closed => _id == 0; | 1145 bool get closed => _id == 0; |
| 1146 | 1146 |
| 1147 void _checkNotClosed() { | 1147 void _checkNotClosed() { |
| 1148 if (closed) { | 1148 if (closed) { |
| 1149 throw new FileIOException("File closed '$_name'"); | 1149 throw new FileIOException("File closed '$_name'"); |
| 1150 } | 1150 } |
| 1151 } | 1151 } |
| 1152 | 1152 |
| 1153 Future _completeWithClosedException(Completer completer) { | 1153 Future _completeWithClosedException(Completer completer) { |
| 1154 new Timer(0, (t) { | 1154 Timer.run(() { |
| 1155 completer.completeError( | 1155 completer.completeError( |
| 1156 new FileIOException("File closed '$_name'")); | 1156 new FileIOException("File closed '$_name'")); |
| 1157 }); | 1157 }); |
| 1158 return completer.future; | 1158 return completer.future; |
| 1159 } | 1159 } |
| 1160 | 1160 |
| 1161 final String _name; | 1161 final String _name; |
| 1162 int _id; | 1162 int _id; |
| 1163 | 1163 |
| 1164 SendPort _fileService; | 1164 SendPort _fileService; |
| 1165 } | 1165 } |
| OLD | NEW |