OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 // Read the file in blocks of size 64k. | 7 // Read the file in blocks of size 64k. |
8 const int _BLOCK_SIZE = 64 * 1024; | 8 const int _BLOCK_SIZE = 64 * 1024; |
9 | 9 |
10 | 10 |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 const int _LAST_MODIFIED_REQUEST = 12; | 191 const int _LAST_MODIFIED_REQUEST = 12; |
192 const int _FLUSH_REQUEST = 13; | 192 const int _FLUSH_REQUEST = 13; |
193 const int _READ_BYTE_REQUEST = 14; | 193 const int _READ_BYTE_REQUEST = 14; |
194 const int _WRITE_BYTE_REQUEST = 15; | 194 const int _WRITE_BYTE_REQUEST = 15; |
195 const int _READ_REQUEST = 16; | 195 const int _READ_REQUEST = 16; |
196 const int _READ_LIST_REQUEST = 17; | 196 const int _READ_LIST_REQUEST = 17; |
197 const int _WRITE_LIST_REQUEST = 18; | 197 const int _WRITE_LIST_REQUEST = 18; |
198 const int _CREATE_LINK_REQUEST = 19; | 198 const int _CREATE_LINK_REQUEST = 19; |
199 const int _DELETE_LINK_REQUEST = 20; | 199 const int _DELETE_LINK_REQUEST = 20; |
200 const int _LINK_TARGET_REQUEST = 21; | 200 const int _LINK_TARGET_REQUEST = 21; |
201 | 201 const int _TYPE_REQUEST = 22; |
202 // Base class for _File and _RandomAccessFile with shared functions. | 202 const int _IDENTICAL_REQUEST = 23; |
203 class _FileBase { | |
204 bool _isErrorResponse(response) { | |
205 return response is List && response[0] != _SUCCESS_RESPONSE; | |
206 } | |
207 | |
208 _exceptionFromResponse(response, String message) { | |
209 assert(_isErrorResponse(response)); | |
210 switch (response[_ERROR_RESPONSE_ERROR_TYPE]) { | |
211 case _ILLEGAL_ARGUMENT_RESPONSE: | |
212 return new ArgumentError(); | |
213 case _OSERROR_RESPONSE: | |
214 var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE], | |
215 response[_OSERROR_RESPONSE_ERROR_CODE]); | |
216 return new FileIOException(message, err); | |
217 case _FILE_CLOSED_RESPONSE: | |
218 return new FileIOException("File closed"); | |
219 default: | |
220 return new Exception("Unknown error"); | |
221 } | |
222 } | |
223 } | |
224 | 203 |
225 // TODO(ager): The only reason for this class is that the patching | 204 // TODO(ager): The only reason for this class is that the patching |
226 // mechanism doesn't seem to like patching a private top level | 205 // mechanism doesn't seem to like patching a private top level |
227 // function. | 206 // function. |
228 class _FileUtils { | 207 class _FileUtils { |
229 external static SendPort _newServicePort(); | 208 external static SendPort _newServicePort(); |
230 } | 209 } |
231 | 210 |
232 // Class for encapsulating the native implementation of files. | 211 // Class for encapsulating the native implementation of files. |
233 class _File extends _FileBase implements File { | 212 class _File implements File { |
234 // Constructor for file. | 213 // Constructor for file. |
235 _File(String this._path) { | 214 _File(String this._path) { |
236 if (_path is! String) { | 215 if (_path is! String) { |
237 throw new ArgumentError('${Error.safeToString(_path)} ' | 216 throw new ArgumentError('${Error.safeToString(_path)} ' |
238 'is not a String'); | 217 'is not a String'); |
239 } | 218 } |
240 } | 219 } |
241 | 220 |
242 // Constructor from Path for file. | 221 // Constructor from Path for file. |
243 _File.fromPath(Path path) : this(path.toNativePath()); | 222 _File.fromPath(Path path) : this(path.toNativePath()); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 throw new FileIOException(msg, result); | 559 throw new FileIOException(msg, result); |
581 } | 560 } |
582 } | 561 } |
583 | 562 |
584 final String _path; | 563 final String _path; |
585 | 564 |
586 SendPort _fileService; | 565 SendPort _fileService; |
587 } | 566 } |
588 | 567 |
589 | 568 |
590 class _RandomAccessFile extends _FileBase implements RandomAccessFile { | 569 class _RandomAccessFile implements RandomAccessFile { |
591 _RandomAccessFile(int this._id, String this._path); | 570 _RandomAccessFile(int this._id, String this._path); |
592 | 571 |
593 Future<RandomAccessFile> close() { | 572 Future<RandomAccessFile> close() { |
594 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 573 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
595 if (closed) return _completeWithClosedException(completer); | 574 if (closed) return _completeWithClosedException(completer); |
596 _ensureFileService(); | 575 _ensureFileService(); |
597 List request = new List(2); | 576 List request = new List(2); |
598 request[0] = _CLOSE_REQUEST; | 577 request[0] = _CLOSE_REQUEST; |
599 request[1] = _id; | 578 request[1] = _id; |
600 // Set the id_ to 0 (NULL) to ensure the no more async requests | 579 // Set the id_ to 0 (NULL) to ensure the no more async requests |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 new FileIOException("File closed '$_path'")); | 1009 new FileIOException("File closed '$_path'")); |
1031 }); | 1010 }); |
1032 return completer.future; | 1011 return completer.future; |
1033 } | 1012 } |
1034 | 1013 |
1035 final String _path; | 1014 final String _path; |
1036 int _id; | 1015 int _id; |
1037 | 1016 |
1038 SendPort _fileService; | 1017 SendPort _fileService; |
1039 } | 1018 } |
OLD | NEW |