Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(144)

Side by Side Diff: runtime/bin/file_impl.dart

Issue 10173024: Change the error handling in dart:io (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/file.dart ('k') | runtime/bin/http.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « runtime/bin/file.dart ('k') | runtime/bin/http.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698