| 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 _file = new File(name); | 7 _file = new File(name); |
| 8 _data = []; | 8 _data = []; |
| 9 _position = 0; | 9 _position = 0; |
| 10 _file.onError = (e) { | 10 _file.onError = (e) { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 | 93 |
| 94 class _FileOutputStream extends _BaseOutputStream implements OutputStream { | 94 class _FileOutputStream extends _BaseOutputStream implements OutputStream { |
| 95 _FileOutputStream(String name, FileMode mode) { | 95 _FileOutputStream(String name, FileMode mode) { |
| 96 _pendingOperations = new List<List<int>>(); | 96 _pendingOperations = new List<List<int>>(); |
| 97 var f = new File(name); | 97 var f = new File(name); |
| 98 f.open(mode, (openedFile) { | 98 f.open(mode, (openedFile) { |
| 99 _file = openedFile; | 99 _file = openedFile; |
| 100 _setupFileHandlers(); | 100 _setupFileHandlers(); |
| 101 _processPendingOperations(); | 101 _processPendingOperations(); |
| 102 }); | 102 }); |
| 103 f.onError = (e) { | 103 f.onError = (e) => _reportError(e); |
| 104 if (_onError != null) _onError(e); | |
| 105 }; | |
| 106 } | 104 } |
| 107 | 105 |
| 108 _FileOutputStream.fromStdio(int fd) { | 106 _FileOutputStream.fromStdio(int fd) { |
| 109 assert(1 <= fd && fd <= 2); | 107 assert(1 <= fd && fd <= 2); |
| 110 _file = _File._openStdioSync(fd); | 108 _file = _File._openStdioSync(fd); |
| 111 _setupFileHandlers(); | 109 _setupFileHandlers(); |
| 112 } | 110 } |
| 113 | 111 |
| 114 | 112 |
| 115 void _setupFileHandlers() { | 113 void _setupFileHandlers() { |
| 116 _file.onError = (e) { | 114 _file.onError = (e) => _reportError(e); |
| 117 if (_onError != null) _onError(e); | |
| 118 }; | |
| 119 _file.onNoPendingWrites = () { | 115 _file.onNoPendingWrites = () { |
| 120 if (!_streamMarkedClosed && _onNoPendingWrites != null) { | 116 if (!_streamMarkedClosed && _onNoPendingWrites != null) { |
| 121 _onNoPendingWrites(); | 117 _onNoPendingWrites(); |
| 122 } | 118 } |
| 123 }; | 119 }; |
| 124 } | 120 } |
| 125 | 121 |
| 126 bool write(List<int> buffer, [bool copyBuffer = false]) { | 122 bool write(List<int> buffer, [bool copyBuffer = false]) { |
| 127 var data = buffer; | 123 var data = buffer; |
| 128 if (copyBuffer) { | 124 if (copyBuffer) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 } | 158 } |
| 163 | 159 |
| 164 void set onNoPendingWrites(void callback()) { | 160 void set onNoPendingWrites(void callback()) { |
| 165 _onNoPendingWrites = callback; | 161 _onNoPendingWrites = callback; |
| 166 } | 162 } |
| 167 | 163 |
| 168 void set onClosed(void callback()) { | 164 void set onClosed(void callback()) { |
| 169 _onClosed = callback; | 165 _onClosed = callback; |
| 170 } | 166 } |
| 171 | 167 |
| 172 void set onError(void callback(Exception e)) { | |
| 173 _onError = callback; | |
| 174 } | |
| 175 | |
| 176 void _processPendingOperations() { | 168 void _processPendingOperations() { |
| 177 _pendingOperations.forEach((buffer) { | 169 _pendingOperations.forEach((buffer) { |
| 178 (buffer != null) ? write(buffer) : close(); | 170 (buffer != null) ? write(buffer) : close(); |
| 179 }); | 171 }); |
| 180 _pendingOperations = null; | 172 _pendingOperations = null; |
| 181 } | 173 } |
| 182 | 174 |
| 183 void _write(List<int> buffer, int offset, int len) { | 175 void _write(List<int> buffer, int offset, int len) { |
| 184 _file.writeList(buffer, offset, len); | 176 _file.writeList(buffer, offset, len); |
| 185 } | 177 } |
| 186 | 178 |
| 187 RandomAccessFile _file; | 179 RandomAccessFile _file; |
| 188 | 180 |
| 189 // When this is set to true the stream is marked closed. When a | 181 // When this is set to true the stream is marked closed. When a |
| 190 // stream is marked closed no more data can be written. | 182 // stream is marked closed no more data can be written. |
| 191 bool _streamMarkedClosed = false; | 183 bool _streamMarkedClosed = false; |
| 192 | 184 |
| 193 // When this is set to true the close callback has been called and | 185 // When this is set to true the close callback has been called and |
| 194 // the stream is fully closed. | 186 // the stream is fully closed. |
| 195 bool _closeCallbackCalled = false; | 187 bool _closeCallbackCalled = false; |
| 196 | 188 |
| 197 // List of pending writes that were issued before the underlying | 189 // List of pending writes that were issued before the underlying |
| 198 // file was successfully opened. | 190 // file was successfully opened. |
| 199 List<List<int>> _pendingOperations; | 191 List<List<int>> _pendingOperations; |
| 200 | 192 |
| 201 Function _onNoPendingWrites; | 193 Function _onNoPendingWrites; |
| 202 Function _onClosed; | 194 Function _onClosed; |
| 203 Function _onError; | |
| 204 } | 195 } |
| 205 | 196 |
| 206 | 197 |
| 207 // Helper class containing static file helper methods. | 198 // Helper class containing static file helper methods. |
| 208 class _FileUtils { | 199 class _FileUtils { |
| 209 static final kExistsRequest = 0; | 200 static final kExistsRequest = 0; |
| 210 static final kCreateRequest = 1; | 201 static final kCreateRequest = 1; |
| 211 static final kDeleteRequest = 2; | 202 static final kDeleteRequest = 2; |
| 212 static final kOpenRequest = 3; | 203 static final kOpenRequest = 3; |
| 213 static final kFullPathRequest = 4; | 204 static final kFullPathRequest = 4; |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 | 367 |
| 377 static int checkedWriteString(int id, String string) { | 368 static int checkedWriteString(int id, String string) { |
| 378 if (string is !String) return -1; | 369 if (string is !String) return -1; |
| 379 return writeString(id, string); | 370 return writeString(id, string); |
| 380 } | 371 } |
| 381 | 372 |
| 382 } | 373 } |
| 383 | 374 |
| 384 // Base class for _File and _RandomAccessFile with shared functions. | 375 // Base class for _File and _RandomAccessFile with shared functions. |
| 385 class _FileBase { | 376 class _FileBase { |
| 377 void _reportError(e) { |
| 378 if (_onError != null) { |
| 379 _onError(e); |
| 380 } else { |
| 381 throw e; |
| 382 } |
| 383 } |
| 384 |
| 386 bool _isErrorResponse(response) { | 385 bool _isErrorResponse(response) { |
| 387 return response is List && response[0] != _FileUtils.kSuccessResponse; | 386 return response is List && response[0] != _FileUtils.kSuccessResponse; |
| 388 } | 387 } |
| 389 | 388 |
| 390 bool _reportError(response, String message) { | 389 void _handleErrorResponse(response, String message) { |
| 391 assert(_isErrorResponse(response)); | 390 assert(_isErrorResponse(response)); |
| 392 if (_onError != null) { | 391 switch (response[_FileUtils.kErrorResponseErrorType]) { |
| 393 switch (response[_FileUtils.kErrorResponseErrorType]) { | 392 case _FileUtils.kIllegalArgumentResponse: |
| 394 case _FileUtils.kIllegalArgumentResponse: | 393 _reportError(new IllegalArgumentException()); |
| 395 _onError(new IllegalArgumentException()); | 394 break; |
| 396 break; | 395 case _FileUtils.kOSErrorResponse: |
| 397 case _FileUtils.kOSErrorResponse: | 396 var err = new OSError(response[_FileUtils.kOSErrorResponseMessage], |
| 398 var err = new OSError(response[_FileUtils.kOSErrorResponseMessage], | 397 response[_FileUtils.kOSErrorResponseErrorCode]); |
| 399 response[_FileUtils.kOSErrorResponseErrorCode]); | 398 _reportError(new FileIOException(message, err)); |
| 400 _onError(new FileIOException(message, err)); | 399 break; |
| 401 break; | 400 case _FileUtils.kFileClosedResponse: |
| 402 case _FileUtils.kFileClosedResponse: | 401 _reportError(new FileIOException("File closed")); |
| 403 _onError(new FileIOException("File closed")); | 402 break; |
| 404 break; | 403 default: |
| 405 default: | 404 _reportError(new Exception("Unknown error")); |
| 406 _onError(new Exception("Unknown error")); | 405 break; |
| 407 break; | |
| 408 } | |
| 409 } | 406 } |
| 410 } | 407 } |
| 411 | 408 |
| 412 void set onError(void handler(Exception e)) { | 409 void set onError(void handler(e)) { |
| 413 _onError = handler; | 410 _onError = handler; |
| 414 } | 411 } |
| 415 | 412 |
| 416 Function _onError; | 413 Function _onError; |
| 417 } | 414 } |
| 418 | 415 |
| 419 // Class for encapsulating the native implementation of files. | 416 // Class for encapsulating the native implementation of files. |
| 420 class _File extends _FileBase implements File { | 417 class _File extends _FileBase implements File { |
| 421 // Constructor for file. | 418 // Constructor for file. |
| 422 _File(String this._name); | 419 _File(String this._name); |
| 423 | 420 |
| 424 void exists(void callback(bool exists)) { | 421 void exists(void callback(bool exists)) { |
| 425 _ensureFileService(); | 422 _ensureFileService(); |
| 426 List request = new List(2); | 423 List request = new List(2); |
| 427 request[0] = _FileUtils.kExistsRequest; | 424 request[0] = _FileUtils.kExistsRequest; |
| 428 request[1] = _name; | 425 request[1] = _name; |
| 429 _fileService.call(request).then((response) { | 426 _fileService.call(request).then((response) { |
| 430 if (_isErrorResponse(response)) { | 427 if (_isErrorResponse(response)) { |
| 431 _reportError(response, "Cannot open file"); | 428 _handleErrorResponse(response, "Cannot open file"); |
| 432 } else { | 429 } else { |
| 433 callback(response); | 430 callback(response); |
| 434 } | 431 } |
| 435 }); | 432 }); |
| 436 } | 433 } |
| 437 | 434 |
| 438 bool existsSync() { | 435 bool existsSync() { |
| 439 return _FileUtils.checkedExists(_name); | 436 return _FileUtils.checkedExists(_name); |
| 440 } | 437 } |
| 441 | 438 |
| 442 void create(void callback()) { | 439 void create(void callback()) { |
| 443 _ensureFileService(); | 440 _ensureFileService(); |
| 444 List request = new List(2); | 441 List request = new List(2); |
| 445 request[0] = _FileUtils.kCreateRequest; | 442 request[0] = _FileUtils.kCreateRequest; |
| 446 request[1] = _name; | 443 request[1] = _name; |
| 447 _fileService.call(request).then((response) { | 444 _fileService.call(request).then((response) { |
| 448 if (_isErrorResponse(response)) { | 445 if (_isErrorResponse(response)) { |
| 449 _reportError(response, "Cannot create file"); | 446 _handleErrorResponse(response, "Cannot create file"); |
| 450 } else { | 447 } else { |
| 451 callback(); | 448 callback(); |
| 452 } | 449 } |
| 453 }); | 450 }); |
| 454 } | 451 } |
| 455 | 452 |
| 456 void createSync() { | 453 void createSync() { |
| 457 bool created = _FileUtils.checkedCreate(_name); | 454 bool created = _FileUtils.checkedCreate(_name); |
| 458 if (!created) { | 455 if (!created) { |
| 459 throw new FileIOException("Cannot create file: $_name"); | 456 throw new FileIOException("Cannot create file: $_name"); |
| 460 } | 457 } |
| 461 } | 458 } |
| 462 | 459 |
| 463 void delete(void callback()) { | 460 void delete(void callback()) { |
| 464 _ensureFileService(); | 461 _ensureFileService(); |
| 465 List request = new List(2); | 462 List request = new List(2); |
| 466 request[0] = _FileUtils.kDeleteRequest; | 463 request[0] = _FileUtils.kDeleteRequest; |
| 467 request[1] = _name; | 464 request[1] = _name; |
| 468 _fileService.call(request).then((response) { | 465 _fileService.call(request).then((response) { |
| 469 if (_isErrorResponse(response)) { | 466 if (_isErrorResponse(response)) { |
| 470 _reportError(response, "Cannot delete file"); | 467 _handleErrorResponse(response, "Cannot delete file"); |
| 471 } else { | 468 } else { |
| 472 callback(); | 469 callback(); |
| 473 } | 470 } |
| 474 }); | 471 }); |
| 475 } | 472 } |
| 476 | 473 |
| 477 void deleteSync() { | 474 void deleteSync() { |
| 478 _FileUtils.checkedDelete(_name); | 475 _FileUtils.checkedDelete(_name); |
| 479 } | 476 } |
| 480 | 477 |
| 481 void directory(void callback(Directory dir)) { | 478 void directory(void callback(Directory dir)) { |
| 482 _ensureFileService(); | 479 _ensureFileService(); |
| 483 List request = new List(2); | 480 List request = new List(2); |
| 484 request[0] = _FileUtils.kDirectoryRequest; | 481 request[0] = _FileUtils.kDirectoryRequest; |
| 485 request[1] = _name; | 482 request[1] = _name; |
| 486 _fileService.call(request).then((response) { | 483 _fileService.call(request).then((response) { |
| 487 if (_isErrorResponse(response)) { | 484 if (_isErrorResponse(response)) { |
| 488 _reportError(response, "Cannot retrieve directory for file"); | 485 _handleErrorResponse(response, "Cannot retrieve directory for file"); |
| 489 } else { | 486 } else { |
| 490 callback(new Directory(response)); | 487 callback(new Directory(response)); |
| 491 } | 488 } |
| 492 }); | 489 }); |
| 493 } | 490 } |
| 494 | 491 |
| 495 Directory directorySync() { | 492 Directory directorySync() { |
| 496 _FileUtils.checkedDirectory(_name); | 493 _FileUtils.checkedDirectory(_name); |
| 497 return new Directory(_FileUtils.directory(_name)); | 494 return new Directory(_FileUtils.directory(_name)); |
| 498 } | 495 } |
| 499 | 496 |
| 500 void open(FileMode mode, void callback(RandomAccessFile file)) { | 497 void open(FileMode mode, void callback(RandomAccessFile file)) { |
| 501 _ensureFileService(); | 498 _ensureFileService(); |
| 502 if (mode != FileMode.READ && | 499 if (mode != FileMode.READ && |
| 503 mode != FileMode.WRITE && | 500 mode != FileMode.WRITE && |
| 504 mode != FileMode.APPEND) { | 501 mode != FileMode.APPEND) { |
| 505 if (_onError != null) { | 502 _reportError(new IllegalArgumentException()); |
| 506 _onError(new IllegalArgumentException()); | 503 return; |
| 507 return; | |
| 508 } | |
| 509 } | 504 } |
| 510 List request = new List(3); | 505 List request = new List(3); |
| 511 request[0] = _FileUtils.kOpenRequest; | 506 request[0] = _FileUtils.kOpenRequest; |
| 512 request[1] = _name; | 507 request[1] = _name; |
| 513 request[2] = mode._mode; // Direct int value for serialization. | 508 request[2] = mode._mode; // Direct int value for serialization. |
| 514 _fileService.call(request).then((response) { | 509 _fileService.call(request).then((response) { |
| 515 if (_isErrorResponse(response)) { | 510 if (_isErrorResponse(response)) { |
| 516 _reportError(response, "Cannot open file"); | 511 _handleErrorResponse(response, "Cannot open file"); |
| 517 } else { | 512 } else { |
| 518 callback(new _RandomAccessFile(response, _name)); | 513 callback(new _RandomAccessFile(response, _name)); |
| 519 } | 514 } |
| 520 }); | 515 }); |
| 521 } | 516 } |
| 522 | 517 |
| 523 void length(void callback(int length)) { | 518 void length(void callback(int length)) { |
| 524 _ensureFileService(); | 519 _ensureFileService(); |
| 525 List request = new List(2); | 520 List request = new List(2); |
| 526 request[0] = _FileUtils.kLengthFromNameRequest; | 521 request[0] = _FileUtils.kLengthFromNameRequest; |
| 527 request[1] = _name; | 522 request[1] = _name; |
| 528 _fileService.call(request).then((response) { | 523 _fileService.call(request).then((response) { |
| 529 if (_isErrorResponse(response)) { | 524 if (_isErrorResponse(response)) { |
| 530 _reportError(response, "Cannot retrieve length of file"); | 525 _handleErrorResponse(response, "Cannot retrieve length of file"); |
| 531 } else { | 526 } else { |
| 532 callback(response); | 527 callback(response); |
| 533 } | 528 } |
| 534 }); | 529 }); |
| 535 } | 530 } |
| 536 | 531 |
| 537 int lengthSync() { | 532 int lengthSync() { |
| 538 var result = _FileUtils.checkedLengthFromName(_name); | 533 var result = _FileUtils.checkedLengthFromName(_name); |
| 539 if (result is OSError) { | 534 if (result is OSError) { |
| 540 throw new FileIOException("Cannot retrieve length of file", result); | 535 throw new FileIOException("Cannot retrieve length of file", result); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 562 return new _RandomAccessFile(id, ""); | 557 return new _RandomAccessFile(id, ""); |
| 563 } | 558 } |
| 564 | 559 |
| 565 void fullPath(void callback(String result)) { | 560 void fullPath(void callback(String result)) { |
| 566 _ensureFileService(); | 561 _ensureFileService(); |
| 567 List request = new List(2); | 562 List request = new List(2); |
| 568 request[0] = _FileUtils.kFullPathRequest; | 563 request[0] = _FileUtils.kFullPathRequest; |
| 569 request[1] = _name; | 564 request[1] = _name; |
| 570 _fileService.call(request).then((response) { | 565 _fileService.call(request).then((response) { |
| 571 if (_isErrorResponse(response)) { | 566 if (_isErrorResponse(response)) { |
| 572 _reportError(response, "Cannot retrieve full path"); | 567 _handleErrorResponse(response, "Cannot retrieve full path"); |
| 573 } else { | 568 } else { |
| 574 callback(response); | 569 callback(response); |
| 575 } | 570 } |
| 576 }); | 571 }); |
| 577 } | 572 } |
| 578 | 573 |
| 579 String fullPathSync() { | 574 String fullPathSync() { |
| 580 return _FileUtils.checkedFullPath(_name); | 575 return _FileUtils.checkedFullPath(_name); |
| 581 } | 576 } |
| 582 | 577 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 597 _ensureFileService(); | 592 _ensureFileService(); |
| 598 var chunks = new _BufferList(); | 593 var chunks = new _BufferList(); |
| 599 var stream = openInputStream(); | 594 var stream = openInputStream(); |
| 600 stream.onClosed = () { | 595 stream.onClosed = () { |
| 601 callback(chunks.readBytes(chunks.length)); | 596 callback(chunks.readBytes(chunks.length)); |
| 602 }; | 597 }; |
| 603 stream.onData = () { | 598 stream.onData = () { |
| 604 var chunk = stream.read(); | 599 var chunk = stream.read(); |
| 605 chunks.add(chunk); | 600 chunks.add(chunk); |
| 606 }; | 601 }; |
| 607 stream.onError = (e) { | 602 stream.onError = (e) => _reportError(e); |
| 608 if (_onError != null) { | |
| 609 _onError(e); | |
| 610 } | |
| 611 }; | |
| 612 } | 603 } |
| 613 | 604 |
| 614 List<int> readAsBytesSync() { | 605 List<int> readAsBytesSync() { |
| 615 var opened = openSync(); | 606 var opened = openSync(); |
| 616 var length = opened.lengthSync(); | 607 var length = opened.lengthSync(); |
| 617 var result = new ByteArray(length); | 608 var result = new ByteArray(length); |
| 618 var read = opened.readListSync(result, 0, length); | 609 var read = opened.readListSync(result, 0, length); |
| 619 if (read != length) { | 610 if (read != length) { |
| 620 throw new FileIOException("Failed to read file"); | 611 throw new FileIOException("Failed to read file"); |
| 621 } | 612 } |
| 622 opened.closeSync(); | 613 opened.closeSync(); |
| 623 return result; | 614 return result; |
| 624 } | 615 } |
| 625 | 616 |
| 626 void readAsText(Encoding encoding, void callback(String text)) { | 617 void readAsText(Encoding encoding, void callback(String text)) { |
| 627 _ensureFileService(); | 618 _ensureFileService(); |
| 628 var decoder = _StringDecoders.decoder(encoding); | 619 var decoder = _StringDecoders.decoder(encoding); |
| 629 readAsBytes((bytes) { | 620 readAsBytes((bytes) { |
| 630 try { | 621 try { |
| 631 decoder.write(bytes); | 622 decoder.write(bytes); |
| 632 } catch (var e) { | 623 } catch (var e) { |
| 633 if (_onError != null) { | 624 _reportError(e); |
| 634 _onError(e); | 625 return; |
| 635 return; | |
| 636 } | |
| 637 } | 626 } |
| 638 callback(decoder.decoded); | 627 callback(decoder.decoded); |
| 639 }); | 628 }); |
| 640 } | 629 } |
| 641 | 630 |
| 642 String readAsTextSync([Encoding encoding = Encoding.UTF_8]) { | 631 String readAsTextSync([Encoding encoding = Encoding.UTF_8]) { |
| 643 var decoder = _StringDecoders.decoder(encoding); | 632 var decoder = _StringDecoders.decoder(encoding); |
| 644 List<int> bytes = readAsBytesSync(); | 633 List<int> bytes = readAsBytesSync(); |
| 645 decoder.write(bytes); | 634 decoder.write(bytes); |
| 646 return decoder.decoded; | 635 return decoder.decoded; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 662 return result; | 651 return result; |
| 663 } | 652 } |
| 664 | 653 |
| 665 void readAsLines(Encoding encoding, void callback(List<String> lines)) { | 654 void readAsLines(Encoding encoding, void callback(List<String> lines)) { |
| 666 _ensureFileService(); | 655 _ensureFileService(); |
| 667 var decoder = _StringDecoders.decoder(encoding); | 656 var decoder = _StringDecoders.decoder(encoding); |
| 668 readAsBytes((bytes) { | 657 readAsBytes((bytes) { |
| 669 try { | 658 try { |
| 670 decoder.write(bytes); | 659 decoder.write(bytes); |
| 671 } catch (var e) { | 660 } catch (var e) { |
| 672 if (_onError != null) { | 661 _reportError(e); |
| 673 _onError(e); | 662 return; |
| 674 return; | |
| 675 } | |
| 676 } | 663 } |
| 677 callback(_getDecodedLines(decoder)); | 664 callback(_getDecodedLines(decoder)); |
| 678 }); | 665 }); |
| 679 } | 666 } |
| 680 | 667 |
| 681 List<String> readAsLinesSync([Encoding encoding = Encoding.UTF_8]) { | 668 List<String> readAsLinesSync([Encoding encoding = Encoding.UTF_8]) { |
| 682 var decoder = _StringDecoders.decoder(encoding); | 669 var decoder = _StringDecoders.decoder(encoding); |
| 683 List<int> bytes = readAsBytesSync(); | 670 List<int> bytes = readAsBytesSync(); |
| 684 decoder.write(bytes); | 671 decoder.write(bytes); |
| 685 return _getDecodedLines(decoder); | 672 return _getDecodedLines(decoder); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 697 | 684 |
| 698 SendPort _fileService; | 685 SendPort _fileService; |
| 699 } | 686 } |
| 700 | 687 |
| 701 | 688 |
| 702 class _RandomAccessFile extends _FileBase implements RandomAccessFile { | 689 class _RandomAccessFile extends _FileBase implements RandomAccessFile { |
| 703 _RandomAccessFile(int this._id, String this._name); | 690 _RandomAccessFile(int this._id, String this._name); |
| 704 | 691 |
| 705 void close(void callback()) { | 692 void close(void callback()) { |
| 706 if (_id == 0) { | 693 if (_id == 0) { |
| 707 if (_onError != null) { | 694 _reportError(new FileIOException("Cannot close file: $_name")); |
| 708 _onError(new FileIOException("Cannot close file: $_name")); | |
| 709 } | |
| 710 return; | 695 return; |
| 711 } | 696 } |
| 712 _ensureFileService(); | 697 _ensureFileService(); |
| 713 List request = new List(2); | 698 List request = new List(2); |
| 714 request[0] = _FileUtils.kCloseRequest; | 699 request[0] = _FileUtils.kCloseRequest; |
| 715 request[1] = _id; | 700 request[1] = _id; |
| 716 // Set the id_ to 0 (NULL) to ensure the no more async requests | 701 // Set the id_ to 0 (NULL) to ensure the no more async requests |
| 717 // can be issues for this file. | 702 // can be issues for this file. |
| 718 _id = 0; | 703 _id = 0; |
| 719 _fileService.call(request).then((result) { | 704 _fileService.call(request).then((result) { |
| 720 if (result != -1) { | 705 if (result != -1) { |
| 721 _id = result; | 706 _id = result; |
| 722 callback(); | 707 callback(); |
| 723 } else if (_onError != null) { | 708 } else { |
| 724 _onError(new FileIOException("Cannot close file: $_name")); | 709 _reportError(new FileIOException("Cannot close file: $_name")); |
| 725 } | 710 } |
| 726 }); | 711 }); |
| 727 } | 712 } |
| 728 | 713 |
| 729 void closeSync() { | 714 void closeSync() { |
| 730 var id = _FileUtils.close(_id); | 715 var id = _FileUtils.close(_id); |
| 731 if (id == -1) { | 716 if (id == -1) { |
| 732 throw new FileIOException("Cannot close file: $_name"); | 717 throw new FileIOException("Cannot close file: $_name"); |
| 733 } | 718 } |
| 734 _id = id; | 719 _id = id; |
| 735 } | 720 } |
| 736 | 721 |
| 737 void readByte(void callback(int byte)) { | 722 void readByte(void callback(int byte)) { |
| 738 _ensureFileService(); | 723 _ensureFileService(); |
| 739 List request = new List(2); | 724 List request = new List(2); |
| 740 request[0] = _FileUtils.kReadByteRequest; | 725 request[0] = _FileUtils.kReadByteRequest; |
| 741 request[1] = _id; | 726 request[1] = _id; |
| 742 _fileService.call(request).then((response) { | 727 _fileService.call(request).then((response) { |
| 743 if (_isErrorResponse(response)) { | 728 if (_isErrorResponse(response)) { |
| 744 _reportError(response, "readByte failed"); | 729 _handleErrorResponse(response, "readByte failed"); |
| 745 } else { | 730 } else { |
| 746 callback(response); | 731 callback(response); |
| 747 } | 732 } |
| 748 }); | 733 }); |
| 749 } | 734 } |
| 750 | 735 |
| 751 int readByteSync() { | 736 int readByteSync() { |
| 752 _checkNotClosed(); | 737 _checkNotClosed(); |
| 753 var result = _FileUtils.readByte(_id); | 738 var result = _FileUtils.readByte(_id); |
| 754 if (result is OSError) { | 739 if (result is OSError) { |
| 755 throw new FileIOException("readByte failed", result); | 740 throw new FileIOException("readByte failed", result); |
| 756 } | 741 } |
| 757 return result; | 742 return result; |
| 758 } | 743 } |
| 759 | 744 |
| 760 void readList(List<int> buffer, int offset, int bytes, | 745 void readList(List<int> buffer, int offset, int bytes, |
| 761 void callback(int read)) { | 746 void callback(int read)) { |
| 762 _ensureFileService(); | 747 _ensureFileService(); |
| 763 if (buffer is !List || offset is !int || bytes is !int) { | 748 if (buffer is !List || offset is !int || bytes is !int) { |
| 764 if (_onError != null) { | 749 _reportError(new FileIOException("Invalid arguments to readList")); |
| 765 _onError(new FileIOException("Invalid arguments to readList")); | |
| 766 } | |
| 767 return; | 750 return; |
| 768 }; | 751 }; |
| 769 List request = new List(3); | 752 List request = new List(3); |
| 770 request[0] = _FileUtils.kReadListRequest; | 753 request[0] = _FileUtils.kReadListRequest; |
| 771 request[1] = _id; | 754 request[1] = _id; |
| 772 request[2] = bytes; | 755 request[2] = bytes; |
| 773 _fileService.call(request).then((response) { | 756 _fileService.call(request).then((response) { |
| 774 if (_isErrorResponse(response)) { | 757 if (_isErrorResponse(response)) { |
| 775 _reportError(response, "readList failed"); | 758 _handleErrorResponse(response, "readList failed"); |
| 776 } else { | 759 } else { |
| 777 var read = response[1]; | 760 var read = response[1]; |
| 778 var data = response[2]; | 761 var data = response[2]; |
| 779 buffer.setRange(offset, read, data); | 762 buffer.setRange(offset, read, data); |
| 780 callback(read); | 763 callback(read); |
| 781 } | 764 } |
| 782 }); | 765 }); |
| 783 } | 766 } |
| 784 | 767 |
| 785 int readListSync(List<int> buffer, int offset, int bytes) { | 768 int readListSync(List<int> buffer, int offset, int bytes) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 796 var result = _FileUtils.readList(_id, buffer, offset, bytes); | 779 var result = _FileUtils.readList(_id, buffer, offset, bytes); |
| 797 if (result is OSError) { | 780 if (result is OSError) { |
| 798 throw new FileIOException("readList failed", result); | 781 throw new FileIOException("readList failed", result); |
| 799 } | 782 } |
| 800 return result; | 783 return result; |
| 801 } | 784 } |
| 802 | 785 |
| 803 void writeByte(int value) { | 786 void writeByte(int value) { |
| 804 _ensureFileService(); | 787 _ensureFileService(); |
| 805 if (value is !int) { | 788 if (value is !int) { |
| 806 if (_onError != null) { | 789 _reportError(new FileIOException("Invalid argument to writeByte")); |
| 807 _onError(new FileIOException("Invalid argument to writeByte")); | |
| 808 } | |
| 809 return; | 790 return; |
| 810 } | 791 } |
| 811 List request = new List(3); | 792 List request = new List(3); |
| 812 request[0] = _FileUtils.kWriteByteRequest; | 793 request[0] = _FileUtils.kWriteByteRequest; |
| 813 request[1] = _id; | 794 request[1] = _id; |
| 814 request[2] = value; | 795 request[2] = value; |
| 815 _writeEnqueued(); | 796 _writeEnqueued(); |
| 816 _fileService.call(request).then((response) { | 797 _fileService.call(request).then((response) { |
| 817 _writeCompleted(); | 798 _writeCompleted(); |
| 818 if (_isErrorResponse(response)) { | 799 if (_isErrorResponse(response)) { |
| 819 _reportError(response, "writeByte failed"); | 800 _handleErrorResponse(response, "writeByte failed"); |
| 820 } | 801 } |
| 821 }); | 802 }); |
| 822 } | 803 } |
| 823 | 804 |
| 824 int writeByteSync(int value) { | 805 int writeByteSync(int value) { |
| 825 _checkNotClosed(); | 806 _checkNotClosed(); |
| 826 if (value is !int) { | 807 if (value is !int) { |
| 827 throw new FileIOException("Invalid argument to writeByte"); | 808 throw new FileIOException("Invalid argument to writeByte"); |
| 828 } | 809 } |
| 829 var result = _FileUtils.writeByte(_id, value); | 810 var result = _FileUtils.writeByte(_id, value); |
| 830 if (result is OSError) { | 811 if (result is OSError) { |
| 831 throw new FileIOException("writeByte failed", result); | 812 throw new FileIOException("writeByte failed", result); |
| 832 } | 813 } |
| 833 return result; | 814 return result; |
| 834 } | 815 } |
| 835 | 816 |
| 836 void writeList(List<int> buffer, int offset, int bytes) { | 817 void writeList(List<int> buffer, int offset, int bytes) { |
| 837 _ensureFileService(); | 818 _ensureFileService(); |
| 838 if (buffer is !List || offset is !int || bytes is !int) { | 819 if (buffer is !List || offset is !int || bytes is !int) { |
| 839 if (_onError != null) { | 820 _reportError(new FileIOException("Invalid arguments to writeList")); |
| 840 _onError(new FileIOException("Invalid arguments to writeList")); | |
| 841 } | |
| 842 return; | 821 return; |
| 843 } | 822 } |
| 844 | 823 |
| 845 List result = | 824 List result = |
| 846 _FileUtils.ensureFastAndSerializableBuffer(buffer, offset, bytes); | 825 _FileUtils.ensureFastAndSerializableBuffer(buffer, offset, bytes); |
| 847 List outBuffer = result[0]; | 826 List outBuffer = result[0]; |
| 848 int outOffset = result[1]; | 827 int outOffset = result[1]; |
| 849 | 828 |
| 850 List request = new List(5); | 829 List request = new List(5); |
| 851 request[0] = _FileUtils.kWriteListRequest; | 830 request[0] = _FileUtils.kWriteListRequest; |
| 852 request[1] = _id; | 831 request[1] = _id; |
| 853 request[2] = outBuffer; | 832 request[2] = outBuffer; |
| 854 request[3] = outOffset; | 833 request[3] = outOffset; |
| 855 request[4] = bytes; | 834 request[4] = bytes; |
| 856 _writeEnqueued(); | 835 _writeEnqueued(); |
| 857 _fileService.call(request).then((response) { | 836 _fileService.call(request).then((response) { |
| 858 _writeCompleted(); | 837 _writeCompleted(); |
| 859 if (_isErrorResponse(response)) { | 838 if (_isErrorResponse(response)) { |
| 860 _reportError(response, "writeList failed"); | 839 _handleErrorResponse(response, "writeList failed"); |
| 861 } | 840 } |
| 862 }); | 841 }); |
| 863 } | 842 } |
| 864 | 843 |
| 865 int writeListSync(List<int> buffer, int offset, int bytes) { | 844 int writeListSync(List<int> buffer, int offset, int bytes) { |
| 866 _checkNotClosed(); | 845 _checkNotClosed(); |
| 867 if (buffer is !List || offset is !int || bytes is !int) { | 846 if (buffer is !List || offset is !int || bytes is !int) { |
| 868 throw new FileIOException("Invalid arguments to writeList"); | 847 throw new FileIOException("Invalid arguments to writeList"); |
| 869 } | 848 } |
| 870 if (bytes == 0) return 0; | 849 if (bytes == 0) return 0; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 883 void writeString(String string, [Encoding encoding = Encoding.UTF_8]) { | 862 void writeString(String string, [Encoding encoding = Encoding.UTF_8]) { |
| 884 _ensureFileService(); | 863 _ensureFileService(); |
| 885 List request = new List(3); | 864 List request = new List(3); |
| 886 request[0] = _FileUtils.kWriteStringRequest; | 865 request[0] = _FileUtils.kWriteStringRequest; |
| 887 request[1] = _id; | 866 request[1] = _id; |
| 888 request[2] = string; | 867 request[2] = string; |
| 889 _writeEnqueued(); | 868 _writeEnqueued(); |
| 890 _fileService.call(request).then((response) { | 869 _fileService.call(request).then((response) { |
| 891 _writeCompleted(); | 870 _writeCompleted(); |
| 892 if (_isErrorResponse(response)) { | 871 if (_isErrorResponse(response)) { |
| 893 _reportError(response, "writeString failed"); | 872 _handleErrorResponse(response, "writeString failed"); |
| 894 } | 873 } |
| 895 }); | 874 }); |
| 896 } | 875 } |
| 897 | 876 |
| 898 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) { | 877 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) { |
| 899 _checkNotClosed(); | 878 _checkNotClosed(); |
| 900 var result = _FileUtils.checkedWriteString(_id, string); | 879 var result = _FileUtils.checkedWriteString(_id, string); |
| 901 if (result is OSError) { | 880 if (result is OSError) { |
| 902 throw new FileIOException("writeString failed", result); | 881 throw new FileIOException("writeString failed", result); |
| 903 } | 882 } |
| 904 return result; | 883 return result; |
| 905 } | 884 } |
| 906 | 885 |
| 907 void position(void callback(int position)) { | 886 void position(void callback(int position)) { |
| 908 _ensureFileService(); | 887 _ensureFileService(); |
| 909 List request = new List(2); | 888 List request = new List(2); |
| 910 request[0] = _FileUtils.kPositionRequest; | 889 request[0] = _FileUtils.kPositionRequest; |
| 911 request[1] = _id; | 890 request[1] = _id; |
| 912 _fileService.call(request).then((response) { | 891 _fileService.call(request).then((response) { |
| 913 if (_isErrorResponse(response)) { | 892 if (_isErrorResponse(response)) { |
| 914 _reportError(response, "position failed"); | 893 _handleErrorResponse(response, "position failed"); |
| 915 } else { | 894 } else { |
| 916 callback(response); | 895 callback(response); |
| 917 } | 896 } |
| 918 }); | 897 }); |
| 919 } | 898 } |
| 920 | 899 |
| 921 int positionSync() { | 900 int positionSync() { |
| 922 _checkNotClosed(); | 901 _checkNotClosed(); |
| 923 var result = _FileUtils.position(_id); | 902 var result = _FileUtils.position(_id); |
| 924 if (result is OSError) { | 903 if (result is OSError) { |
| 925 throw new FileIOException("position failed", result); | 904 throw new FileIOException("position failed", result); |
| 926 } | 905 } |
| 927 return result; | 906 return result; |
| 928 } | 907 } |
| 929 | 908 |
| 930 void setPosition(int position, void callback()) { | 909 void setPosition(int position, void callback()) { |
| 931 _ensureFileService(); | 910 _ensureFileService(); |
| 932 List request = new List(3); | 911 List request = new List(3); |
| 933 request[0] = _FileUtils.kSetPositionRequest; | 912 request[0] = _FileUtils.kSetPositionRequest; |
| 934 request[1] = _id; | 913 request[1] = _id; |
| 935 request[2] = position; | 914 request[2] = position; |
| 936 _fileService.call(request).then((response) { | 915 _fileService.call(request).then((response) { |
| 937 if (_isErrorResponse(response)) { | 916 if (_isErrorResponse(response)) { |
| 938 _reportError(response, "setPosition failed"); | 917 _handleErrorResponse(response, "setPosition failed"); |
| 939 } else { | 918 } else { |
| 940 callback(); | 919 callback(); |
| 941 } | 920 } |
| 942 }); | 921 }); |
| 943 } | 922 } |
| 944 | 923 |
| 945 void setPositionSync(int position) { | 924 void setPositionSync(int position) { |
| 946 _checkNotClosed(); | 925 _checkNotClosed(); |
| 947 var result = _FileUtils.setPosition(_id, position); | 926 var result = _FileUtils.setPosition(_id, position); |
| 948 if (result is OSError) { | 927 if (result is OSError) { |
| 949 throw new FileIOException("setPosition failed", result); | 928 throw new FileIOException("setPosition failed", result); |
| 950 } | 929 } |
| 951 } | 930 } |
| 952 | 931 |
| 953 void truncate(int length, void callback()) { | 932 void truncate(int length, void callback()) { |
| 954 _ensureFileService(); | 933 _ensureFileService(); |
| 955 List request = new List(3); | 934 List request = new List(3); |
| 956 request[0] = _FileUtils.kTruncateRequest; | 935 request[0] = _FileUtils.kTruncateRequest; |
| 957 request[1] = _id; | 936 request[1] = _id; |
| 958 request[2] = length; | 937 request[2] = length; |
| 959 _fileService.call(request).then((response) { | 938 _fileService.call(request).then((response) { |
| 960 if (_isErrorResponse(response)) { | 939 if (_isErrorResponse(response)) { |
| 961 _reportError(response, "truncate failed"); | 940 _handleErrorResponse(response, "truncate failed"); |
| 962 } else { | 941 } else { |
| 963 callback(); | 942 callback(); |
| 964 } | 943 } |
| 965 }); | 944 }); |
| 966 } | 945 } |
| 967 | 946 |
| 968 void truncateSync(int length) { | 947 void truncateSync(int length) { |
| 969 _checkNotClosed(); | 948 _checkNotClosed(); |
| 970 var result = _FileUtils.truncate(_id, length); | 949 var result = _FileUtils.truncate(_id, length); |
| 971 if (result is OSError) { | 950 if (result is OSError) { |
| 972 throw new FileIOException("truncate failed", result); | 951 throw new FileIOException("truncate failed", result); |
| 973 } | 952 } |
| 974 } | 953 } |
| 975 | 954 |
| 976 void length(void callback(int length)) { | 955 void length(void callback(int length)) { |
| 977 _ensureFileService(); | 956 _ensureFileService(); |
| 978 List request = new List(2); | 957 List request = new List(2); |
| 979 request[0] = _FileUtils.kLengthRequest; | 958 request[0] = _FileUtils.kLengthRequest; |
| 980 request[1] = _id; | 959 request[1] = _id; |
| 981 _fileService.call(request).then((response) { | 960 _fileService.call(request).then((response) { |
| 982 if (_isErrorResponse(response)) { | 961 if (_isErrorResponse(response)) { |
| 983 _reportError(response, "length failed"); | 962 _handleErrorResponse(response, "length failed"); |
| 984 } else { | 963 } else { |
| 985 callback(response); | 964 callback(response); |
| 986 } | 965 } |
| 987 }); | 966 }); |
| 988 } | 967 } |
| 989 | 968 |
| 990 int lengthSync() { | 969 int lengthSync() { |
| 991 _checkNotClosed(); | 970 _checkNotClosed(); |
| 992 var result = _FileUtils.length(_id); | 971 var result = _FileUtils.length(_id); |
| 993 if (result is OSError) { | 972 if (result is OSError) { |
| 994 throw new FileIOException("length failed", result); | 973 throw new FileIOException("length failed", result); |
| 995 } | 974 } |
| 996 return result; | 975 return result; |
| 997 } | 976 } |
| 998 | 977 |
| 999 void flush(void callback()) { | 978 void flush(void callback()) { |
| 1000 _ensureFileService(); | 979 _ensureFileService(); |
| 1001 List request = new List(2); | 980 List request = new List(2); |
| 1002 request[0] = _FileUtils.kFlushRequest; | 981 request[0] = _FileUtils.kFlushRequest; |
| 1003 request[1] = _id; | 982 request[1] = _id; |
| 1004 _fileService.call(request).then((response) { | 983 _fileService.call(request).then((response) { |
| 1005 if (_isErrorResponse(response)) { | 984 if (_isErrorResponse(response)) { |
| 1006 _reportError(response, "flush failed"); | 985 _handleErrorResponse(response, "flush failed"); |
| 1007 } else { | 986 } else { |
| 1008 callback(); | 987 callback(); |
| 1009 } | 988 } |
| 1010 }); | 989 }); |
| 1011 } | 990 } |
| 1012 | 991 |
| 1013 void flushSync() { | 992 void flushSync() { |
| 1014 _checkNotClosed(); | 993 _checkNotClosed(); |
| 1015 var result = _FileUtils.flush(_id); | 994 var result = _FileUtils.flush(_id); |
| 1016 if (result is OSError) { | 995 if (result is OSError) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1059 String _name; | 1038 String _name; |
| 1060 int _id; | 1039 int _id; |
| 1061 int _pendingWrites = 0; | 1040 int _pendingWrites = 0; |
| 1062 | 1041 |
| 1063 SendPort _fileService; | 1042 SendPort _fileService; |
| 1064 | 1043 |
| 1065 Timer _noPendingWriteTimer; | 1044 Timer _noPendingWriteTimer; |
| 1066 | 1045 |
| 1067 Function _onNoPendingWrites; | 1046 Function _onNoPendingWrites; |
| 1068 } | 1047 } |
| OLD | NEW |