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 | 7 |
8 class _FileStream extends Stream<List<int>> { | 8 class _FileStream extends Stream<List<int>> { |
9 // Stream controller. | 9 // Stream controller. |
10 StreamController<List<int>> _controller; | 10 StreamController<List<int>> _controller; |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 throw new ArgumentError('${Error.safeToString(_name)} ' | 258 throw new ArgumentError('${Error.safeToString(_name)} ' |
259 'is not a String'); | 259 'is not a String'); |
260 } | 260 } |
261 } | 261 } |
262 | 262 |
263 // Constructor from Path for file. | 263 // Constructor from Path for file. |
264 _File.fromPath(Path path) : this(path.toNativePath()); | 264 _File.fromPath(Path path) : this(path.toNativePath()); |
265 | 265 |
266 Future<bool> exists() { | 266 Future<bool> exists() { |
267 _ensureFileService(); | 267 _ensureFileService(); |
268 List request = new List.fixedLength(2); | 268 List request = new List(2); |
269 request[0] = _EXISTS_REQUEST; | 269 request[0] = _EXISTS_REQUEST; |
270 request[1] = _name; | 270 request[1] = _name; |
271 return _fileService.call(request).then((response) { | 271 return _fileService.call(request).then((response) { |
272 if (_isErrorResponse(response)) { | 272 if (_isErrorResponse(response)) { |
273 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); | 273 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); |
274 } | 274 } |
275 return response; | 275 return response; |
276 }); | 276 }); |
277 } | 277 } |
278 | 278 |
279 external static _exists(String name); | 279 external static _exists(String name); |
280 | 280 |
281 bool existsSync() { | 281 bool existsSync() { |
282 var result = _exists(_name); | 282 var result = _exists(_name); |
283 throwIfError(result, "Cannot check existence of file '$_name'"); | 283 throwIfError(result, "Cannot check existence of file '$_name'"); |
284 return result; | 284 return result; |
285 } | 285 } |
286 | 286 |
287 Future<File> create() { | 287 Future<File> create() { |
288 _ensureFileService(); | 288 _ensureFileService(); |
289 List request = new List.fixedLength(2); | 289 List request = new List(2); |
290 request[0] = _CREATE_REQUEST; | 290 request[0] = _CREATE_REQUEST; |
291 request[1] = _name; | 291 request[1] = _name; |
292 return _fileService.call(request).then((response) { | 292 return _fileService.call(request).then((response) { |
293 if (_isErrorResponse(response)) { | 293 if (_isErrorResponse(response)) { |
294 throw _exceptionFromResponse(response, "Cannot create file '$_name'"); | 294 throw _exceptionFromResponse(response, "Cannot create file '$_name'"); |
295 } | 295 } |
296 return this; | 296 return this; |
297 }); | 297 }); |
298 } | 298 } |
299 | 299 |
300 external static _create(String name); | 300 external static _create(String name); |
301 | 301 |
302 void createSync() { | 302 void createSync() { |
303 var result = _create(_name); | 303 var result = _create(_name); |
304 throwIfError(result, "Cannot create file '$_name'"); | 304 throwIfError(result, "Cannot create file '$_name'"); |
305 } | 305 } |
306 | 306 |
307 Future<File> delete() { | 307 Future<File> delete() { |
308 _ensureFileService(); | 308 _ensureFileService(); |
309 List request = new List.fixedLength(2); | 309 List request = new List(2); |
310 request[0] = _DELETE_REQUEST; | 310 request[0] = _DELETE_REQUEST; |
311 request[1] = _name; | 311 request[1] = _name; |
312 return _fileService.call(request).then((response) { | 312 return _fileService.call(request).then((response) { |
313 if (_isErrorResponse(response)) { | 313 if (_isErrorResponse(response)) { |
314 throw _exceptionFromResponse(response, "Cannot delete file '$_name'"); | 314 throw _exceptionFromResponse(response, "Cannot delete file '$_name'"); |
315 } | 315 } |
316 return this; | 316 return this; |
317 }); | 317 }); |
318 } | 318 } |
319 | 319 |
320 external static _delete(String name); | 320 external static _delete(String name); |
321 | 321 |
322 void deleteSync() { | 322 void deleteSync() { |
323 var result = _delete(_name); | 323 var result = _delete(_name); |
324 throwIfError(result, "Cannot delete file '$_name'"); | 324 throwIfError(result, "Cannot delete file '$_name'"); |
325 } | 325 } |
326 | 326 |
327 Future<Directory> directory() { | 327 Future<Directory> directory() { |
328 _ensureFileService(); | 328 _ensureFileService(); |
329 List request = new List.fixedLength(2); | 329 List request = new List(2); |
330 request[0] = _DIRECTORY_REQUEST; | 330 request[0] = _DIRECTORY_REQUEST; |
331 request[1] = _name; | 331 request[1] = _name; |
332 return _fileService.call(request).then((response) { | 332 return _fileService.call(request).then((response) { |
333 if (_isErrorResponse(response)) { | 333 if (_isErrorResponse(response)) { |
334 throw _exceptionFromResponse(response, | 334 throw _exceptionFromResponse(response, |
335 "Cannot retrieve directory for " | 335 "Cannot retrieve directory for " |
336 "file '$_name'"); | 336 "file '$_name'"); |
337 } | 337 } |
338 return new Directory(response); | 338 return new Directory(response); |
339 }); | 339 }); |
(...skipping 11 matching lines...) Expand all Loading... |
351 _ensureFileService(); | 351 _ensureFileService(); |
352 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 352 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
353 if (mode != FileMode.READ && | 353 if (mode != FileMode.READ && |
354 mode != FileMode.WRITE && | 354 mode != FileMode.WRITE && |
355 mode != FileMode.APPEND) { | 355 mode != FileMode.APPEND) { |
356 Timer.run(() { | 356 Timer.run(() { |
357 completer.completeError(new ArgumentError()); | 357 completer.completeError(new ArgumentError()); |
358 }); | 358 }); |
359 return completer.future; | 359 return completer.future; |
360 } | 360 } |
361 List request = new List.fixedLength(3); | 361 List request = new List(3); |
362 request[0] = _OPEN_REQUEST; | 362 request[0] = _OPEN_REQUEST; |
363 request[1] = _name; | 363 request[1] = _name; |
364 request[2] = mode._mode; // Direct int value for serialization. | 364 request[2] = mode._mode; // Direct int value for serialization. |
365 return _fileService.call(request).then((response) { | 365 return _fileService.call(request).then((response) { |
366 if (_isErrorResponse(response)) { | 366 if (_isErrorResponse(response)) { |
367 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); | 367 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); |
368 } | 368 } |
369 return new _RandomAccessFile(response, _name); | 369 return new _RandomAccessFile(response, _name); |
370 }); | 370 }); |
371 } | 371 } |
372 | 372 |
373 Future<int> length() { | 373 Future<int> length() { |
374 _ensureFileService(); | 374 _ensureFileService(); |
375 List request = new List.fixedLength(2); | 375 List request = new List(2); |
376 request[0] = _LENGTH_FROM_NAME_REQUEST; | 376 request[0] = _LENGTH_FROM_NAME_REQUEST; |
377 request[1] = _name; | 377 request[1] = _name; |
378 return _fileService.call(request).then((response) { | 378 return _fileService.call(request).then((response) { |
379 if (_isErrorResponse(response)) { | 379 if (_isErrorResponse(response)) { |
380 throw _exceptionFromResponse(response, | 380 throw _exceptionFromResponse(response, |
381 "Cannot retrieve length of " | 381 "Cannot retrieve length of " |
382 "file '$_name'"); | 382 "file '$_name'"); |
383 } | 383 } |
384 return response; | 384 return response; |
385 }); | 385 }); |
386 } | 386 } |
387 | 387 |
388 | 388 |
389 external static _lengthFromName(String name); | 389 external static _lengthFromName(String name); |
390 | 390 |
391 int lengthSync() { | 391 int lengthSync() { |
392 var result = _lengthFromName(_name); | 392 var result = _lengthFromName(_name); |
393 throwIfError(result, "Cannot retrieve length of file '$_name'"); | 393 throwIfError(result, "Cannot retrieve length of file '$_name'"); |
394 return result; | 394 return result; |
395 } | 395 } |
396 | 396 |
397 Future<DateTime> lastModified() { | 397 Future<DateTime> lastModified() { |
398 _ensureFileService(); | 398 _ensureFileService(); |
399 List request = new List.fixedLength(2); | 399 List request = new List(2); |
400 request[0] = _LAST_MODIFIED_REQUEST; | 400 request[0] = _LAST_MODIFIED_REQUEST; |
401 request[1] = _name; | 401 request[1] = _name; |
402 return _fileService.call(request).then((response) { | 402 return _fileService.call(request).then((response) { |
403 if (_isErrorResponse(response)) { | 403 if (_isErrorResponse(response)) { |
404 throw _exceptionFromResponse(response, | 404 throw _exceptionFromResponse(response, |
405 "Cannot retrieve modification time " | 405 "Cannot retrieve modification time " |
406 "for file '$_name'"); | 406 "for file '$_name'"); |
407 } | 407 } |
408 return new DateTime.fromMillisecondsSinceEpoch(response); | 408 return new DateTime.fromMillisecondsSinceEpoch(response); |
409 }); | 409 }); |
(...skipping 26 matching lines...) Expand all Loading... |
436 static RandomAccessFile _openStdioSync(int fd) { | 436 static RandomAccessFile _openStdioSync(int fd) { |
437 var id = _openStdio(fd); | 437 var id = _openStdio(fd); |
438 if (id == 0) { | 438 if (id == 0) { |
439 throw new FileIOException("Cannot open stdio file for: $fd"); | 439 throw new FileIOException("Cannot open stdio file for: $fd"); |
440 } | 440 } |
441 return new _RandomAccessFile(id, ""); | 441 return new _RandomAccessFile(id, ""); |
442 } | 442 } |
443 | 443 |
444 Future<String> fullPath() { | 444 Future<String> fullPath() { |
445 _ensureFileService(); | 445 _ensureFileService(); |
446 List request = new List.fixedLength(2); | 446 List request = new List(2); |
447 request[0] = _FULL_PATH_REQUEST; | 447 request[0] = _FULL_PATH_REQUEST; |
448 request[1] = _name; | 448 request[1] = _name; |
449 return _fileService.call(request).then((response) { | 449 return _fileService.call(request).then((response) { |
450 if (_isErrorResponse(response)) { | 450 if (_isErrorResponse(response)) { |
451 throw _exceptionFromResponse(response, | 451 throw _exceptionFromResponse(response, |
452 "Cannot retrieve full path" | 452 "Cannot retrieve full path" |
453 " for '$_name'"); | 453 " for '$_name'"); |
454 } | 454 } |
455 return response; | 455 return response; |
456 }); | 456 }); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 } | 612 } |
613 | 613 |
614 | 614 |
615 class _RandomAccessFile extends _FileBase implements RandomAccessFile { | 615 class _RandomAccessFile extends _FileBase implements RandomAccessFile { |
616 _RandomAccessFile(int this._id, String this._name); | 616 _RandomAccessFile(int this._id, String this._name); |
617 | 617 |
618 Future<RandomAccessFile> close() { | 618 Future<RandomAccessFile> close() { |
619 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 619 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
620 if (closed) return _completeWithClosedException(completer); | 620 if (closed) return _completeWithClosedException(completer); |
621 _ensureFileService(); | 621 _ensureFileService(); |
622 List request = new List.fixedLength(2); | 622 List request = new List(2); |
623 request[0] = _CLOSE_REQUEST; | 623 request[0] = _CLOSE_REQUEST; |
624 request[1] = _id; | 624 request[1] = _id; |
625 // Set the id_ to 0 (NULL) to ensure the no more async requests | 625 // Set the id_ to 0 (NULL) to ensure the no more async requests |
626 // can be issued for this file. | 626 // can be issued for this file. |
627 _id = 0; | 627 _id = 0; |
628 return _fileService.call(request).then((result) { | 628 return _fileService.call(request).then((result) { |
629 if (result != -1) { | 629 if (result != -1) { |
630 _id = result; | 630 _id = result; |
631 return this; | 631 return this; |
632 } else { | 632 } else { |
(...skipping 10 matching lines...) Expand all Loading... |
643 if (id == -1) { | 643 if (id == -1) { |
644 throw new FileIOException("Cannot close file '$_name'"); | 644 throw new FileIOException("Cannot close file '$_name'"); |
645 } | 645 } |
646 _id = id; | 646 _id = id; |
647 } | 647 } |
648 | 648 |
649 Future<int> readByte() { | 649 Future<int> readByte() { |
650 _ensureFileService(); | 650 _ensureFileService(); |
651 Completer<int> completer = new Completer<int>(); | 651 Completer<int> completer = new Completer<int>(); |
652 if (closed) return _completeWithClosedException(completer); | 652 if (closed) return _completeWithClosedException(completer); |
653 List request = new List.fixedLength(2); | 653 List request = new List(2); |
654 request[0] = _READ_BYTE_REQUEST; | 654 request[0] = _READ_BYTE_REQUEST; |
655 request[1] = _id; | 655 request[1] = _id; |
656 return _fileService.call(request).then((response) { | 656 return _fileService.call(request).then((response) { |
657 if (_isErrorResponse(response)) { | 657 if (_isErrorResponse(response)) { |
658 throw _exceptionFromResponse(response, | 658 throw _exceptionFromResponse(response, |
659 "readByte failed for file '$_name'"); | 659 "readByte failed for file '$_name'"); |
660 } | 660 } |
661 return response; | 661 return response; |
662 }); | 662 }); |
663 } | 663 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 // Complete asynchronously so the user has a chance to setup | 717 // Complete asynchronously so the user has a chance to setup |
718 // handlers without getting exceptions when registering the | 718 // handlers without getting exceptions when registering the |
719 // then handler. | 719 // then handler. |
720 Timer.run(() { | 720 Timer.run(() { |
721 completer.completeError(new FileIOException( | 721 completer.completeError(new FileIOException( |
722 "Invalid arguments to readList for file '$_name'")); | 722 "Invalid arguments to readList for file '$_name'")); |
723 }); | 723 }); |
724 return completer.future; | 724 return completer.future; |
725 }; | 725 }; |
726 if (closed) return _completeWithClosedException(completer); | 726 if (closed) return _completeWithClosedException(completer); |
727 List request = new List.fixedLength(3); | 727 List request = new List(3); |
728 request[0] = _READ_LIST_REQUEST; | 728 request[0] = _READ_LIST_REQUEST; |
729 request[1] = _id; | 729 request[1] = _id; |
730 request[2] = bytes; | 730 request[2] = bytes; |
731 return _fileService.call(request).then((response) { | 731 return _fileService.call(request).then((response) { |
732 if (_isErrorResponse(response)) { | 732 if (_isErrorResponse(response)) { |
733 throw _exceptionFromResponse(response, | 733 throw _exceptionFromResponse(response, |
734 "readList failed for file '$_name'"); | 734 "readList failed for file '$_name'"); |
735 } | 735 } |
736 var read = response[1]; | 736 var read = response[1]; |
737 var data = response[2]; | 737 var data = response[2]; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 // Complete asynchronously so the user has a chance to setup | 773 // Complete asynchronously so the user has a chance to setup |
774 // handlers without getting exceptions when registering the | 774 // handlers without getting exceptions when registering the |
775 // then handler. | 775 // then handler. |
776 Timer.run(() { | 776 Timer.run(() { |
777 completer.completeError(new FileIOException( | 777 completer.completeError(new FileIOException( |
778 "Invalid argument to writeByte for file '$_name'")); | 778 "Invalid argument to writeByte for file '$_name'")); |
779 }); | 779 }); |
780 return completer.future; | 780 return completer.future; |
781 } | 781 } |
782 if (closed) return _completeWithClosedException(completer); | 782 if (closed) return _completeWithClosedException(completer); |
783 List request = new List.fixedLength(3); | 783 List request = new List(3); |
784 request[0] = _WRITE_BYTE_REQUEST; | 784 request[0] = _WRITE_BYTE_REQUEST; |
785 request[1] = _id; | 785 request[1] = _id; |
786 request[2] = value; | 786 request[2] = value; |
787 return _fileService.call(request).then((response) { | 787 return _fileService.call(request).then((response) { |
788 if (_isErrorResponse(response)) { | 788 if (_isErrorResponse(response)) { |
789 throw _exceptionFromResponse(response, | 789 throw _exceptionFromResponse(response, |
790 "writeByte failed for file '$_name'"); | 790 "writeByte failed for file '$_name'"); |
791 } | 791 } |
792 return this; | 792 return this; |
793 }); | 793 }); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 try { | 828 try { |
829 result = _ensureFastAndSerializableBuffer(buffer, offset, bytes); | 829 result = _ensureFastAndSerializableBuffer(buffer, offset, bytes); |
830 } catch (e) { | 830 } catch (e) { |
831 // Complete asynchronously so the user has a chance to setup | 831 // Complete asynchronously so the user has a chance to setup |
832 // handlers without getting exceptions when registering the | 832 // handlers without getting exceptions when registering the |
833 // then handler. | 833 // then handler. |
834 Timer.run(() => completer.completeError(e)); | 834 Timer.run(() => completer.completeError(e)); |
835 return completer.future; | 835 return completer.future; |
836 } | 836 } |
837 | 837 |
838 List request = new List.fixedLength(5); | 838 List request = new List(5); |
839 request[0] = _WRITE_LIST_REQUEST; | 839 request[0] = _WRITE_LIST_REQUEST; |
840 request[1] = _id; | 840 request[1] = _id; |
841 request[2] = result.buffer; | 841 request[2] = result.buffer; |
842 request[3] = result.offset; | 842 request[3] = result.offset; |
843 request[4] = bytes; | 843 request[4] = bytes; |
844 return _fileService.call(request).then((response) { | 844 return _fileService.call(request).then((response) { |
845 if (_isErrorResponse(response)) { | 845 if (_isErrorResponse(response)) { |
846 throw _exceptionFromResponse(response, | 846 throw _exceptionFromResponse(response, |
847 "writeList failed for file '$_name'"); | 847 "writeList failed for file '$_name'"); |
848 } | 848 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 "Invalid encoding in writeStringSync: $encoding"); | 890 "Invalid encoding in writeStringSync: $encoding"); |
891 } | 891 } |
892 var data = _encodeString(string, encoding); | 892 var data = _encodeString(string, encoding); |
893 return writeListSync(data, 0, data.length); | 893 return writeListSync(data, 0, data.length); |
894 } | 894 } |
895 | 895 |
896 Future<int> position() { | 896 Future<int> position() { |
897 _ensureFileService(); | 897 _ensureFileService(); |
898 Completer<int> completer = new Completer<int>(); | 898 Completer<int> completer = new Completer<int>(); |
899 if (closed) return _completeWithClosedException(completer); | 899 if (closed) return _completeWithClosedException(completer); |
900 List request = new List.fixedLength(2); | 900 List request = new List(2); |
901 request[0] = _POSITION_REQUEST; | 901 request[0] = _POSITION_REQUEST; |
902 request[1] = _id; | 902 request[1] = _id; |
903 return _fileService.call(request).then((response) { | 903 return _fileService.call(request).then((response) { |
904 if (_isErrorResponse(response)) { | 904 if (_isErrorResponse(response)) { |
905 throw _exceptionFromResponse(response, | 905 throw _exceptionFromResponse(response, |
906 "position failed for file '$_name'"); | 906 "position failed for file '$_name'"); |
907 } | 907 } |
908 return response; | 908 return response; |
909 }); | 909 }); |
910 } | 910 } |
911 | 911 |
912 external static _position(int id); | 912 external static _position(int id); |
913 | 913 |
914 int positionSync() { | 914 int positionSync() { |
915 _checkNotClosed(); | 915 _checkNotClosed(); |
916 var result = _position(_id); | 916 var result = _position(_id); |
917 if (result is OSError) { | 917 if (result is OSError) { |
918 throw new FileIOException("position failed for file '$_name'", result); | 918 throw new FileIOException("position failed for file '$_name'", result); |
919 } | 919 } |
920 return result; | 920 return result; |
921 } | 921 } |
922 | 922 |
923 Future<RandomAccessFile> setPosition(int position) { | 923 Future<RandomAccessFile> setPosition(int position) { |
924 _ensureFileService(); | 924 _ensureFileService(); |
925 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 925 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
926 if (closed) return _completeWithClosedException(completer); | 926 if (closed) return _completeWithClosedException(completer); |
927 List request = new List.fixedLength(3); | 927 List request = new List(3); |
928 request[0] = _SET_POSITION_REQUEST; | 928 request[0] = _SET_POSITION_REQUEST; |
929 request[1] = _id; | 929 request[1] = _id; |
930 request[2] = position; | 930 request[2] = position; |
931 return _fileService.call(request).then((response) { | 931 return _fileService.call(request).then((response) { |
932 if (_isErrorResponse(response)) { | 932 if (_isErrorResponse(response)) { |
933 throw _exceptionFromResponse(response, | 933 throw _exceptionFromResponse(response, |
934 "setPosition failed for file '$_name'"); | 934 "setPosition failed for file '$_name'"); |
935 } | 935 } |
936 return this; | 936 return this; |
937 }); | 937 }); |
938 } | 938 } |
939 | 939 |
940 external static _setPosition(int id, int position); | 940 external static _setPosition(int id, int position); |
941 | 941 |
942 void setPositionSync(int position) { | 942 void setPositionSync(int position) { |
943 _checkNotClosed(); | 943 _checkNotClosed(); |
944 var result = _setPosition(_id, position); | 944 var result = _setPosition(_id, position); |
945 if (result is OSError) { | 945 if (result is OSError) { |
946 throw new FileIOException("setPosition failed for file '$_name'", result); | 946 throw new FileIOException("setPosition failed for file '$_name'", result); |
947 } | 947 } |
948 } | 948 } |
949 | 949 |
950 Future<RandomAccessFile> truncate(int length) { | 950 Future<RandomAccessFile> truncate(int length) { |
951 _ensureFileService(); | 951 _ensureFileService(); |
952 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 952 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
953 if (closed) return _completeWithClosedException(completer); | 953 if (closed) return _completeWithClosedException(completer); |
954 List request = new List.fixedLength(3); | 954 List request = new List(3); |
955 request[0] = _TRUNCATE_REQUEST; | 955 request[0] = _TRUNCATE_REQUEST; |
956 request[1] = _id; | 956 request[1] = _id; |
957 request[2] = length; | 957 request[2] = length; |
958 return _fileService.call(request).then((response) { | 958 return _fileService.call(request).then((response) { |
959 if (_isErrorResponse(response)) { | 959 if (_isErrorResponse(response)) { |
960 throw _exceptionFromResponse(response, | 960 throw _exceptionFromResponse(response, |
961 "truncate failed for file '$_name'"); | 961 "truncate failed for file '$_name'"); |
962 } | 962 } |
963 return this; | 963 return this; |
964 }); | 964 }); |
965 } | 965 } |
966 | 966 |
967 external static _truncate(int id, int length); | 967 external static _truncate(int id, int length); |
968 | 968 |
969 void truncateSync(int length) { | 969 void truncateSync(int length) { |
970 _checkNotClosed(); | 970 _checkNotClosed(); |
971 var result = _truncate(_id, length); | 971 var result = _truncate(_id, length); |
972 if (result is OSError) { | 972 if (result is OSError) { |
973 throw new FileIOException("truncate failed for file '$_name'", result); | 973 throw new FileIOException("truncate failed for file '$_name'", result); |
974 } | 974 } |
975 } | 975 } |
976 | 976 |
977 Future<int> length() { | 977 Future<int> length() { |
978 _ensureFileService(); | 978 _ensureFileService(); |
979 Completer<int> completer = new Completer<int>(); | 979 Completer<int> completer = new Completer<int>(); |
980 if (closed) return _completeWithClosedException(completer); | 980 if (closed) return _completeWithClosedException(completer); |
981 List request = new List.fixedLength(2); | 981 List request = new List(2); |
982 request[0] = _LENGTH_REQUEST; | 982 request[0] = _LENGTH_REQUEST; |
983 request[1] = _id; | 983 request[1] = _id; |
984 return _fileService.call(request).then((response) { | 984 return _fileService.call(request).then((response) { |
985 if (_isErrorResponse(response)) { | 985 if (_isErrorResponse(response)) { |
986 throw _exceptionFromResponse(response, | 986 throw _exceptionFromResponse(response, |
987 "length failed for file '$_name'"); | 987 "length failed for file '$_name'"); |
988 } | 988 } |
989 return response; | 989 return response; |
990 }); | 990 }); |
991 } | 991 } |
992 | 992 |
993 external static _length(int id); | 993 external static _length(int id); |
994 | 994 |
995 int lengthSync() { | 995 int lengthSync() { |
996 _checkNotClosed(); | 996 _checkNotClosed(); |
997 var result = _length(_id); | 997 var result = _length(_id); |
998 if (result is OSError) { | 998 if (result is OSError) { |
999 throw new FileIOException("length failed for file '$_name'", result); | 999 throw new FileIOException("length failed for file '$_name'", result); |
1000 } | 1000 } |
1001 return result; | 1001 return result; |
1002 } | 1002 } |
1003 | 1003 |
1004 Future<RandomAccessFile> flush() { | 1004 Future<RandomAccessFile> flush() { |
1005 _ensureFileService(); | 1005 _ensureFileService(); |
1006 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); | 1006 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
1007 if (closed) return _completeWithClosedException(completer); | 1007 if (closed) return _completeWithClosedException(completer); |
1008 List request = new List.fixedLength(2); | 1008 List request = new List(2); |
1009 request[0] = _FLUSH_REQUEST; | 1009 request[0] = _FLUSH_REQUEST; |
1010 request[1] = _id; | 1010 request[1] = _id; |
1011 return _fileService.call(request).then((response) { | 1011 return _fileService.call(request).then((response) { |
1012 if (_isErrorResponse(response)) { | 1012 if (_isErrorResponse(response)) { |
1013 throw _exceptionFromResponse(response, | 1013 throw _exceptionFromResponse(response, |
1014 "flush failed for file '$_name'"); | 1014 "flush failed for file '$_name'"); |
1015 } | 1015 } |
1016 return this; | 1016 return this; |
1017 }); | 1017 }); |
1018 } | 1018 } |
(...skipping 30 matching lines...) Expand all Loading... |
1049 new FileIOException("File closed '$_name'")); | 1049 new FileIOException("File closed '$_name'")); |
1050 }); | 1050 }); |
1051 return completer.future; | 1051 return completer.future; |
1052 } | 1052 } |
1053 | 1053 |
1054 final String _name; | 1054 final String _name; |
1055 int _id; | 1055 int _id; |
1056 | 1056 |
1057 SendPort _fileService; | 1057 SendPort _fileService; |
1058 } | 1058 } |
OLD | NEW |