Chromium Code Reviews| 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 |