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

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

Issue 10054005: Remove check whether async has been used from File objects. (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 | « no previous file | tests/standalone/src/io/FileTest.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 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 _onError(new Exception("Unknown error")); 393 _onError(new Exception("Unknown error"));
394 break; 394 break;
395 } 395 }
396 } 396 }
397 } 397 }
398 398
399 void set onError(void handler(Exception e)) { 399 void set onError(void handler(Exception e)) {
400 _onError = handler; 400 _onError = handler;
401 } 401 }
402 402
403 _checkNotAsync() {
404 if (_asyncUsed) {
405 throw new FileIOException(
406 "Mixed use of synchronous and asynchronous API");
407 }
408 }
409
410 bool _asyncUsed = false;
411 Function _onError; 403 Function _onError;
412 } 404 }
413 405
414 // Class for encapsulating the native implementation of files. 406 // Class for encapsulating the native implementation of files.
415 class _File extends _FileBase implements File { 407 class _File extends _FileBase implements File {
416 // Constructor for file. 408 // Constructor for file.
417 _File(String this._name); 409 _File(String this._name);
418 410
419 void exists(void callback(bool exists)) { 411 void exists(void callback(bool exists)) {
420 _ensureFileService(); 412 _ensureFileService();
421 _asyncUsed = true;
422 List request = new List(2); 413 List request = new List(2);
423 request[0] = _FileUtils.kExistsRequest; 414 request[0] = _FileUtils.kExistsRequest;
424 request[1] = _name; 415 request[1] = _name;
425 _fileService.call(request).then((response) { 416 _fileService.call(request).then((response) {
426 if (_isErrorResponse(response)) { 417 if (_isErrorResponse(response)) {
427 _reportError(response, "Cannot open file"); 418 _reportError(response, "Cannot open file");
428 } else { 419 } else {
429 callback(response); 420 callback(response);
430 } 421 }
431 }); 422 });
432 } 423 }
433 424
434 bool existsSync() { 425 bool existsSync() {
435 _checkNotAsync();
436 return _FileUtils.checkedExists(_name); 426 return _FileUtils.checkedExists(_name);
437 } 427 }
438 428
439 void create(void callback()) { 429 void create(void callback()) {
440 _ensureFileService(); 430 _ensureFileService();
441 _asyncUsed = true;
442 List request = new List(2); 431 List request = new List(2);
443 request[0] = _FileUtils.kCreateRequest; 432 request[0] = _FileUtils.kCreateRequest;
444 request[1] = _name; 433 request[1] = _name;
445 _fileService.call(request).then((response) { 434 _fileService.call(request).then((response) {
446 if (_isErrorResponse(response)) { 435 if (_isErrorResponse(response)) {
447 _reportError(response, "Cannot create file"); 436 _reportError(response, "Cannot create file");
448 } else { 437 } else {
449 callback(); 438 callback();
450 } 439 }
451 }); 440 });
452 } 441 }
453 442
454 void createSync() { 443 void createSync() {
455 _checkNotAsync();
456 bool created = _FileUtils.checkedCreate(_name); 444 bool created = _FileUtils.checkedCreate(_name);
457 if (!created) { 445 if (!created) {
458 throw new FileIOException("Cannot create file: $_name"); 446 throw new FileIOException("Cannot create file: $_name");
459 } 447 }
460 } 448 }
461 449
462 void delete(void callback()) { 450 void delete(void callback()) {
463 _ensureFileService(); 451 _ensureFileService();
464 _asyncUsed = true;
465 List request = new List(2); 452 List request = new List(2);
466 request[0] = _FileUtils.kDeleteRequest; 453 request[0] = _FileUtils.kDeleteRequest;
467 request[1] = _name; 454 request[1] = _name;
468 _fileService.call(request).then((response) { 455 _fileService.call(request).then((response) {
469 if (_isErrorResponse(response)) { 456 if (_isErrorResponse(response)) {
470 _reportError(response, "Cannot delete file"); 457 _reportError(response, "Cannot delete file");
471 } else { 458 } else {
472 callback(); 459 callback();
473 } 460 }
474 }); 461 });
475 } 462 }
476 463
477 void deleteSync() { 464 void deleteSync() {
478 _checkNotAsync();
479 _FileUtils.checkedDelete(_name); 465 _FileUtils.checkedDelete(_name);
480 } 466 }
481 467
482 void directory(void callback(Directory dir)) { 468 void directory(void callback(Directory dir)) {
483 _ensureFileService(); 469 _ensureFileService();
484 _asyncUsed = true;
485 List request = new List(2); 470 List request = new List(2);
486 request[0] = _FileUtils.kDirectoryRequest; 471 request[0] = _FileUtils.kDirectoryRequest;
487 request[1] = _name; 472 request[1] = _name;
488 _fileService.call(request).then((response) { 473 _fileService.call(request).then((response) {
489 if (_isErrorResponse(response)) { 474 if (_isErrorResponse(response)) {
490 _reportError(response, "Cannot retrieve directory for file"); 475 _reportError(response, "Cannot retrieve directory for file");
491 } else { 476 } else {
492 callback(new Directory(response)); 477 callback(new Directory(response));
493 } 478 }
494 }); 479 });
495 } 480 }
496 481
497 Directory directorySync() { 482 Directory directorySync() {
498 _checkNotAsync();
499 _FileUtils.checkedDirectory(_name); 483 _FileUtils.checkedDirectory(_name);
500 return new Directory(_FileUtils.directory(_name)); 484 return new Directory(_FileUtils.directory(_name));
501 } 485 }
502 486
503 void open(FileMode mode, void callback(RandomAccessFile file)) { 487 void open(FileMode mode, void callback(RandomAccessFile file)) {
504 _ensureFileService(); 488 _ensureFileService();
505 _asyncUsed = true;
506 if (mode != FileMode.READ && 489 if (mode != FileMode.READ &&
507 mode != FileMode.WRITE && 490 mode != FileMode.WRITE &&
508 mode != FileMode.APPEND) { 491 mode != FileMode.APPEND) {
509 if (_onError != null) { 492 if (_onError != null) {
510 _onError(new IllegalArgumentException()); 493 _onError(new IllegalArgumentException());
511 return; 494 return;
512 } 495 }
513 } 496 }
514 List request = new List(3); 497 List request = new List(3);
515 request[0] = _FileUtils.kOpenRequest; 498 request[0] = _FileUtils.kOpenRequest;
516 request[1] = _name; 499 request[1] = _name;
517 request[2] = mode._mode; // Direct int value for serialization. 500 request[2] = mode._mode; // Direct int value for serialization.
518 _fileService.call(request).then((response) { 501 _fileService.call(request).then((response) {
519 if (_isErrorResponse(response)) { 502 if (_isErrorResponse(response)) {
520 _reportError(response, "Cannot open file"); 503 _reportError(response, "Cannot open file");
521 } else { 504 } else {
522 callback(new _RandomAccessFile(response, _name)); 505 callback(new _RandomAccessFile(response, _name));
523 } 506 }
524 }); 507 });
525 } 508 }
526 509
527 RandomAccessFile openSync([FileMode mode = FileMode.READ]) { 510 RandomAccessFile openSync([FileMode mode = FileMode.READ]) {
528 _checkNotAsync();
529 if (mode != FileMode.READ && 511 if (mode != FileMode.READ &&
530 mode != FileMode.WRITE && 512 mode != FileMode.WRITE &&
531 mode != FileMode.APPEND) { 513 mode != FileMode.APPEND) {
532 throw new FileIOException("Unknown file mode. Use FileMode.READ, " 514 throw new FileIOException("Unknown file mode. Use FileMode.READ, "
533 "FileMode.WRITE or FileMode.APPEND."); 515 "FileMode.WRITE or FileMode.APPEND.");
534 } 516 }
535 var id = _FileUtils.checkedOpen(_name, mode._mode); 517 var id = _FileUtils.checkedOpen(_name, mode._mode);
536 assert(id != 0); 518 assert(id != 0);
537 return new _RandomAccessFile(id, _name); 519 return new _RandomAccessFile(id, _name);
538 } 520 }
539 521
540 static RandomAccessFile _openStdioSync(int fd) { 522 static RandomAccessFile _openStdioSync(int fd) {
541 var id = _FileUtils.openStdio(fd); 523 var id = _FileUtils.openStdio(fd);
542 if (id == 0) { 524 if (id == 0) {
543 throw new FileIOException("Cannot open stdio file for: $fd"); 525 throw new FileIOException("Cannot open stdio file for: $fd");
544 } 526 }
545 return new _RandomAccessFile(id, ""); 527 return new _RandomAccessFile(id, "");
546 } 528 }
547 529
548 void fullPath(void callback(String result)) { 530 void fullPath(void callback(String result)) {
549 _ensureFileService(); 531 _ensureFileService();
550 _asyncUsed = true;
551 List request = new List(2); 532 List request = new List(2);
552 request[0] = _FileUtils.kFullPathRequest; 533 request[0] = _FileUtils.kFullPathRequest;
553 request[1] = _name; 534 request[1] = _name;
554 _fileService.call(request).then((response) { 535 _fileService.call(request).then((response) {
555 if (_isErrorResponse(response)) { 536 if (_isErrorResponse(response)) {
556 _reportError(response, "Cannot retrieve full path"); 537 _reportError(response, "Cannot retrieve full path");
557 } else { 538 } else {
558 callback(response); 539 callback(response);
559 } 540 }
560 }); 541 });
561 } 542 }
562 543
563 String fullPathSync() { 544 String fullPathSync() {
564 _checkNotAsync();
565 return _FileUtils.checkedFullPath(_name); 545 return _FileUtils.checkedFullPath(_name);
566 } 546 }
567 547
568 InputStream openInputStream() { 548 InputStream openInputStream() {
569 return new _FileInputStream(_name); 549 return new _FileInputStream(_name);
570 } 550 }
571 551
572 OutputStream openOutputStream([FileMode mode = FileMode.WRITE]) { 552 OutputStream openOutputStream([FileMode mode = FileMode.WRITE]) {
573 if (mode != FileMode.WRITE && 553 if (mode != FileMode.WRITE &&
574 mode != FileMode.APPEND) { 554 mode != FileMode.APPEND) {
575 throw new FileIOException( 555 throw new FileIOException(
576 "Wrong FileMode. Use FileMode.WRITE or FileMode.APPEND"); 556 "Wrong FileMode. Use FileMode.WRITE or FileMode.APPEND");
577 } 557 }
578 return new _FileOutputStream(_name, mode); 558 return new _FileOutputStream(_name, mode);
579 } 559 }
580 560
581 void readAsBytes(void callback(List<int> bytes)) { 561 void readAsBytes(void callback(List<int> bytes)) {
582 _ensureFileService(); 562 _ensureFileService();
583 _asyncUsed = true;
584 var chunks = new _BufferList(); 563 var chunks = new _BufferList();
585 var stream = openInputStream(); 564 var stream = openInputStream();
586 stream.onClosed = () { 565 stream.onClosed = () {
587 callback(chunks.readBytes(chunks.length)); 566 callback(chunks.readBytes(chunks.length));
588 }; 567 };
589 stream.onData = () { 568 stream.onData = () {
590 var chunk = stream.read(); 569 var chunk = stream.read();
591 chunks.add(chunk); 570 chunks.add(chunk);
592 }; 571 };
593 stream.onError = (e) { 572 stream.onError = (e) {
594 if (_onError != null) { 573 if (_onError != null) {
595 _onError(e); 574 _onError(e);
596 } 575 }
597 }; 576 };
598 } 577 }
599 578
600 List<int> readAsBytesSync() { 579 List<int> readAsBytesSync() {
601 _checkNotAsync();
602 var opened = openSync(); 580 var opened = openSync();
603 var length = opened.lengthSync(); 581 var length = opened.lengthSync();
604 var result = new ByteArray(length); 582 var result = new ByteArray(length);
605 var read = opened.readListSync(result, 0, length); 583 var read = opened.readListSync(result, 0, length);
606 if (read != length) { 584 if (read != length) {
607 throw new FileIOException("Failed to read file"); 585 throw new FileIOException("Failed to read file");
608 } 586 }
609 opened.closeSync(); 587 opened.closeSync();
610 return result; 588 return result;
611 } 589 }
612 590
613 void readAsText(Encoding encoding, void callback(String text)) { 591 void readAsText(Encoding encoding, void callback(String text)) {
614 _ensureFileService(); 592 _ensureFileService();
615 _asyncUsed = true;
616 var decoder = _StringDecoders.decoder(encoding); 593 var decoder = _StringDecoders.decoder(encoding);
617 readAsBytes((bytes) { 594 readAsBytes((bytes) {
618 try { 595 try {
619 decoder.write(bytes); 596 decoder.write(bytes);
620 } catch (var e) { 597 } catch (var e) {
621 if (_onError != null) { 598 if (_onError != null) {
622 _onError(e); 599 _onError(e);
623 return; 600 return;
624 } 601 }
625 } 602 }
626 callback(decoder.decoded); 603 callback(decoder.decoded);
627 }); 604 });
628 } 605 }
629 606
630 String readAsTextSync([Encoding encoding = Encoding.UTF_8]) { 607 String readAsTextSync([Encoding encoding = Encoding.UTF_8]) {
631 _checkNotAsync();
632 var decoder = _StringDecoders.decoder(encoding); 608 var decoder = _StringDecoders.decoder(encoding);
633 List<int> bytes = readAsBytesSync(); 609 List<int> bytes = readAsBytesSync();
634 decoder.write(bytes); 610 decoder.write(bytes);
635 return decoder.decoded; 611 return decoder.decoded;
636 } 612 }
637 613
638 List<String> _getDecodedLines(_StringDecoder decoder) { 614 List<String> _getDecodedLines(_StringDecoder decoder) {
639 List<String> result = []; 615 List<String> result = [];
640 var line = decoder.decodedLine; 616 var line = decoder.decodedLine;
641 while (line != null) { 617 while (line != null) {
642 result.add(line); 618 result.add(line);
643 line = decoder.decodedLine; 619 line = decoder.decodedLine;
644 } 620 }
645 // If there is more data with no terminating line break we treat 621 // If there is more data with no terminating line break we treat
646 // it as the last line. 622 // it as the last line.
647 var data = decoder.decoded; 623 var data = decoder.decoded;
648 if (data != null) { 624 if (data != null) {
649 result.add(data); 625 result.add(data);
650 } 626 }
651 return result; 627 return result;
652 } 628 }
653 629
654 void readAsLines(Encoding encoding, void callback(List<String> lines)) { 630 void readAsLines(Encoding encoding, void callback(List<String> lines)) {
655 _ensureFileService(); 631 _ensureFileService();
656 _asyncUsed = true;
657 var decoder = _StringDecoders.decoder(encoding); 632 var decoder = _StringDecoders.decoder(encoding);
658 readAsBytes((bytes) { 633 readAsBytes((bytes) {
659 try { 634 try {
660 decoder.write(bytes); 635 decoder.write(bytes);
661 } catch (var e) { 636 } catch (var e) {
662 if (_onError != null) { 637 if (_onError != null) {
663 _onError(e); 638 _onError(e);
664 return; 639 return;
665 } 640 }
666 } 641 }
667 callback(_getDecodedLines(decoder)); 642 callback(_getDecodedLines(decoder));
668 }); 643 });
669 } 644 }
670 645
671 List<String> readAsLinesSync([Encoding encoding = Encoding.UTF_8]) { 646 List<String> readAsLinesSync([Encoding encoding = Encoding.UTF_8]) {
672 _checkNotAsync();
673 var decoder = _StringDecoders.decoder(encoding); 647 var decoder = _StringDecoders.decoder(encoding);
674 List<int> bytes = readAsBytesSync(); 648 List<int> bytes = readAsBytesSync();
675 decoder.write(bytes); 649 decoder.write(bytes);
676 return _getDecodedLines(decoder); 650 return _getDecodedLines(decoder);
677 } 651 }
678 652
679 String get name() => _name; 653 String get name() => _name;
680 654
681 void _ensureFileService() { 655 void _ensureFileService() {
682 if (_fileService == null) { 656 if (_fileService == null) {
683 _fileService = _FileUtils.newServicePort(); 657 _fileService = _FileUtils.newServicePort();
684 } 658 }
685 } 659 }
686 660
687 String _name; 661 String _name;
688 662
689 SendPort _fileService; 663 SendPort _fileService;
690 } 664 }
691 665
692 666
693 class _RandomAccessFile extends _FileBase implements RandomAccessFile { 667 class _RandomAccessFile extends _FileBase implements RandomAccessFile {
694 _RandomAccessFile(int this._id, String this._name); 668 _RandomAccessFile(int this._id, String this._name);
695 669
696 void close(void callback()) { 670 void close(void callback()) {
697 if (_id == 0) return; 671 if (_id == 0) return;
698 _ensureFileService(); 672 _ensureFileService();
699 _asyncUsed = true;
700 List request = new List(2); 673 List request = new List(2);
701 request[0] = _FileUtils.kCloseRequest; 674 request[0] = _FileUtils.kCloseRequest;
702 request[1] = _id; 675 request[1] = _id;
703 // Set the id_ to 0 (NULL) to ensure the no more async requests 676 // Set the id_ to 0 (NULL) to ensure the no more async requests
704 // can be issues for this file. 677 // can be issues for this file.
705 _id = 0; 678 _id = 0;
706 _fileService.call(request).then((result) { 679 _fileService.call(request).then((result) {
707 if (result != -1) { 680 if (result != -1) {
708 _id = result; 681 _id = result;
709 callback(); 682 callback();
710 } else if (_onError != null) { 683 } else if (_onError != null) {
711 _onError("Cannot close file: $_name"); 684 _onError("Cannot close file: $_name");
712 } 685 }
713 }); 686 });
714 } 687 }
715 688
716 void closeSync() { 689 void closeSync() {
717 _checkNotAsync();
718 var id = _FileUtils.close(_id); 690 var id = _FileUtils.close(_id);
719 if (id == -1) { 691 if (id == -1) {
720 throw new FileIOException("Cannot close file: $_name"); 692 throw new FileIOException("Cannot close file: $_name");
721 } 693 }
722 _id = id; 694 _id = id;
723 } 695 }
724 696
725 void readByte(void callback(int byte)) { 697 void readByte(void callback(int byte)) {
726 _ensureFileService(); 698 _ensureFileService();
727 _asyncUsed = true;
728 List request = new List(2); 699 List request = new List(2);
729 request[0] = _FileUtils.kReadByteRequest; 700 request[0] = _FileUtils.kReadByteRequest;
730 request[1] = _id; 701 request[1] = _id;
731 _fileService.call(request).then((response) { 702 _fileService.call(request).then((response) {
732 if (_isErrorResponse(response)) { 703 if (_isErrorResponse(response)) {
733 _reportError(response, "readByte failed"); 704 _reportError(response, "readByte failed");
734 } else { 705 } else {
735 callback(response); 706 callback(response);
736 } 707 }
737 }); 708 });
738 } 709 }
739 710
740 int readByteSync() { 711 int readByteSync() {
741 _checkNotAsyncAndNotClosed(); 712 _checkNotClosed();
742 var result = _FileUtils.readByte(_id); 713 var result = _FileUtils.readByte(_id);
743 if (result is OSError) { 714 if (result is OSError) {
744 throw new FileIOException("readByte failed", result); 715 throw new FileIOException("readByte failed", result);
745 } 716 }
746 return result; 717 return result;
747 } 718 }
748 719
749 void readList(List<int> buffer, int offset, int bytes, 720 void readList(List<int> buffer, int offset, int bytes,
750 void callback(int read)) { 721 void callback(int read)) {
751 _ensureFileService(); 722 _ensureFileService();
752 _asyncUsed = true;
753 if (buffer is !List || offset is !int || bytes is !int) { 723 if (buffer is !List || offset is !int || bytes is !int) {
754 if (_onError != null) { 724 if (_onError != null) {
755 _onError("Invalid arguments to readList"); 725 _onError("Invalid arguments to readList");
756 } 726 }
757 return; 727 return;
758 }; 728 };
759 List request = new List(3); 729 List request = new List(3);
760 request[0] = _FileUtils.kReadListRequest; 730 request[0] = _FileUtils.kReadListRequest;
761 request[1] = _id; 731 request[1] = _id;
762 request[2] = bytes; 732 request[2] = bytes;
763 _fileService.call(request).then((response) { 733 _fileService.call(request).then((response) {
764 if (_isErrorResponse(response)) { 734 if (_isErrorResponse(response)) {
765 _reportError(response, "readList failed"); 735 _reportError(response, "readList failed");
766 } else { 736 } else {
767 var read = response[1]; 737 var read = response[1];
768 var data = response[2]; 738 var data = response[2];
769 buffer.setRange(offset, read, data); 739 buffer.setRange(offset, read, data);
770 callback(read); 740 callback(read);
771 } 741 }
772 }); 742 });
773 } 743 }
774 744
775 int readListSync(List<int> buffer, int offset, int bytes) { 745 int readListSync(List<int> buffer, int offset, int bytes) {
776 _checkNotAsyncAndNotClosed(); 746 _checkNotClosed();
777 if (buffer is !List || offset is !int || bytes is !int) { 747 if (buffer is !List || offset is !int || bytes is !int) {
778 throw new FileIOException("Invalid arguments to readList"); 748 throw new FileIOException("Invalid arguments to readList");
779 } 749 }
780 if (bytes == 0) return 0; 750 if (bytes == 0) return 0;
781 int index = 751 int index =
782 _FileUtils.checkReadWriteListArguments(buffer.length, offset, bytes); 752 _FileUtils.checkReadWriteListArguments(buffer.length, offset, bytes);
783 if (index != 0) { 753 if (index != 0) {
784 throw new IndexOutOfRangeException(index); 754 throw new IndexOutOfRangeException(index);
785 } 755 }
786 var result = _FileUtils.readList(_id, buffer, offset, bytes); 756 var result = _FileUtils.readList(_id, buffer, offset, bytes);
787 if (result is OSError) { 757 if (result is OSError) {
788 throw new FileIOException("readList failed", result); 758 throw new FileIOException("readList failed", result);
789 } 759 }
790 return result; 760 return result;
791 } 761 }
792 762
793 void writeByte(int value) { 763 void writeByte(int value) {
794 _ensureFileService(); 764 _ensureFileService();
795 _asyncUsed = true;
796 if (value is !int) { 765 if (value is !int) {
797 if (_onError != null) { 766 if (_onError != null) {
798 _onError("Invalid argument to writeByte"); 767 _onError("Invalid argument to writeByte");
799 } 768 }
800 return; 769 return;
801 } 770 }
802 List request = new List(3); 771 List request = new List(3);
803 request[0] = _FileUtils.kWriteByteRequest; 772 request[0] = _FileUtils.kWriteByteRequest;
804 request[1] = _id; 773 request[1] = _id;
805 request[2] = value; 774 request[2] = value;
806 _writeEnqueued(); 775 _writeEnqueued();
807 _fileService.call(request).then((response) { 776 _fileService.call(request).then((response) {
808 _writeCompleted(); 777 _writeCompleted();
809 if (_isErrorResponse(response)) { 778 if (_isErrorResponse(response)) {
810 _reportError(response, "writeByte failed"); 779 _reportError(response, "writeByte failed");
811 } 780 }
812 }); 781 });
813 } 782 }
814 783
815 int writeByteSync(int value) { 784 int writeByteSync(int value) {
816 _checkNotAsyncAndNotClosed(); 785 _checkNotClosed();
817 if (value is !int) { 786 if (value is !int) {
818 throw new FileIOException("Invalid argument to writeByte"); 787 throw new FileIOException("Invalid argument to writeByte");
819 } 788 }
820 var result = _FileUtils.writeByte(_id, value); 789 var result = _FileUtils.writeByte(_id, value);
821 if (result is OSError) { 790 if (result is OSError) {
822 throw new FileIOException("writeByte failed", result); 791 throw new FileIOException("writeByte failed", result);
823 } 792 }
824 return result; 793 return result;
825 } 794 }
826 795
827 void writeList(List<int> buffer, int offset, int bytes) { 796 void writeList(List<int> buffer, int offset, int bytes) {
828 _ensureFileService(); 797 _ensureFileService();
829 _asyncUsed = true;
830 if (buffer is !List || offset is !int || bytes is !int) { 798 if (buffer is !List || offset is !int || bytes is !int) {
831 if (_onError != null) { 799 if (_onError != null) {
832 _onError("Invalid arguments to writeList"); 800 _onError("Invalid arguments to writeList");
833 } 801 }
834 return; 802 return;
835 } 803 }
836 804
837 List result = 805 List result =
838 _FileUtils.ensureFastAndSerializableBuffer(buffer, offset, bytes); 806 _FileUtils.ensureFastAndSerializableBuffer(buffer, offset, bytes);
839 List outBuffer = result[0]; 807 List outBuffer = result[0];
840 int outOffset = result[1]; 808 int outOffset = result[1];
841 809
842 List request = new List(5); 810 List request = new List(5);
843 request[0] = _FileUtils.kWriteListRequest; 811 request[0] = _FileUtils.kWriteListRequest;
844 request[1] = _id; 812 request[1] = _id;
845 request[2] = outBuffer; 813 request[2] = outBuffer;
846 request[3] = outOffset; 814 request[3] = outOffset;
847 request[4] = bytes; 815 request[4] = bytes;
848 _writeEnqueued(); 816 _writeEnqueued();
849 _fileService.call(request).then((response) { 817 _fileService.call(request).then((response) {
850 _writeCompleted(); 818 _writeCompleted();
851 if (_isErrorResponse(response)) { 819 if (_isErrorResponse(response)) {
852 _reportError(response, "writeList failed"); 820 _reportError(response, "writeList failed");
853 } 821 }
854 }); 822 });
855 } 823 }
856 824
857 int writeListSync(List<int> buffer, int offset, int bytes) { 825 int writeListSync(List<int> buffer, int offset, int bytes) {
858 _checkNotAsyncAndNotClosed(); 826 _checkNotClosed();
859 if (buffer is !List || offset is !int || bytes is !int) { 827 if (buffer is !List || offset is !int || bytes is !int) {
860 throw new FileIOException("Invalid arguments to writeList"); 828 throw new FileIOException("Invalid arguments to writeList");
861 } 829 }
862 if (bytes == 0) return 0; 830 if (bytes == 0) return 0;
863 int index = 831 int index =
864 _FileUtils.checkReadWriteListArguments(buffer.length, offset, bytes); 832 _FileUtils.checkReadWriteListArguments(buffer.length, offset, bytes);
865 if (index != 0) { 833 if (index != 0) {
866 throw new IndexOutOfRangeException(index); 834 throw new IndexOutOfRangeException(index);
867 } 835 }
868 var result = _FileUtils.writeList(_id, buffer, offset, bytes); 836 var result = _FileUtils.writeList(_id, buffer, offset, bytes);
869 if (result is OSError) { 837 if (result is OSError) {
870 throw new FileIOException("writeList failed", result); 838 throw new FileIOException("writeList failed", result);
871 } 839 }
872 return result; 840 return result;
873 } 841 }
874 842
875 void writeString(String string, [Encoding encoding = Encoding.UTF_8]) { 843 void writeString(String string, [Encoding encoding = Encoding.UTF_8]) {
876 _ensureFileService(); 844 _ensureFileService();
877 _asyncUsed = true;
878 List request = new List(3); 845 List request = new List(3);
879 request[0] = _FileUtils.kWriteStringRequest; 846 request[0] = _FileUtils.kWriteStringRequest;
880 request[1] = _id; 847 request[1] = _id;
881 request[2] = string; 848 request[2] = string;
882 _writeEnqueued(); 849 _writeEnqueued();
883 _fileService.call(request).then((response) { 850 _fileService.call(request).then((response) {
884 _writeCompleted(); 851 _writeCompleted();
885 if (_isErrorResponse(response)) { 852 if (_isErrorResponse(response)) {
886 _reportError(response, "writeString failed"); 853 _reportError(response, "writeString failed");
887 } 854 }
888 }); 855 });
889 } 856 }
890 857
891 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) { 858 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) {
892 _checkNotAsyncAndNotClosed(); 859 _checkNotClosed();
893 var result = _FileUtils.checkedWriteString(_id, string); 860 var result = _FileUtils.checkedWriteString(_id, string);
894 if (result is OSError) { 861 if (result is OSError) {
895 throw new FileIOException("writeString failed", result); 862 throw new FileIOException("writeString failed", result);
896 } 863 }
897 return result; 864 return result;
898 } 865 }
899 866
900 void position(void callback(int position)) { 867 void position(void callback(int position)) {
901 _ensureFileService(); 868 _ensureFileService();
902 _asyncUsed = true;
903 List request = new List(2); 869 List request = new List(2);
904 request[0] = _FileUtils.kPositionRequest; 870 request[0] = _FileUtils.kPositionRequest;
905 request[1] = _id; 871 request[1] = _id;
906 _fileService.call(request).then((response) { 872 _fileService.call(request).then((response) {
907 if (_isErrorResponse(response)) { 873 if (_isErrorResponse(response)) {
908 _reportError(response, "position failed"); 874 _reportError(response, "position failed");
909 } else { 875 } else {
910 callback(response); 876 callback(response);
911 } 877 }
912 }); 878 });
913 } 879 }
914 880
915 int positionSync() { 881 int positionSync() {
916 _checkNotAsyncAndNotClosed(); 882 _checkNotClosed();
917 var result = _FileUtils.position(_id); 883 var result = _FileUtils.position(_id);
918 if (result is OSError) { 884 if (result is OSError) {
919 throw new FileIOException("position failed", result); 885 throw new FileIOException("position failed", result);
920 } 886 }
921 return result; 887 return result;
922 } 888 }
923 889
924 void setPosition(int position, void callback()) { 890 void setPosition(int position, void callback()) {
925 _ensureFileService(); 891 _ensureFileService();
926 _asyncUsed = true;
927 List request = new List(3); 892 List request = new List(3);
928 request[0] = _FileUtils.kSetPositionRequest; 893 request[0] = _FileUtils.kSetPositionRequest;
929 request[1] = _id; 894 request[1] = _id;
930 request[2] = position; 895 request[2] = position;
931 _fileService.call(request).then((response) { 896 _fileService.call(request).then((response) {
932 if (_isErrorResponse(response)) { 897 if (_isErrorResponse(response)) {
933 _reportError(response, "setPosition failed"); 898 _reportError(response, "setPosition failed");
934 } else { 899 } else {
935 callback(); 900 callback();
936 } 901 }
937 }); 902 });
938 } 903 }
939 904
940 void setPositionSync(int position) { 905 void setPositionSync(int position) {
941 _checkNotAsyncAndNotClosed(); 906 _checkNotClosed();
942 var result = _FileUtils.setPosition(_id, position); 907 var result = _FileUtils.setPosition(_id, position);
943 if (result is OSError) { 908 if (result is OSError) {
944 throw new FileIOException("setPosition failed", result); 909 throw new FileIOException("setPosition failed", result);
945 } 910 }
946 } 911 }
947 912
948 void truncate(int length, void callback()) { 913 void truncate(int length, void callback()) {
949 _ensureFileService(); 914 _ensureFileService();
950 _asyncUsed = true;
951 List request = new List(3); 915 List request = new List(3);
952 request[0] = _FileUtils.kTruncateRequest; 916 request[0] = _FileUtils.kTruncateRequest;
953 request[1] = _id; 917 request[1] = _id;
954 request[2] = length; 918 request[2] = length;
955 _fileService.call(request).then((response) { 919 _fileService.call(request).then((response) {
956 if (_isErrorResponse(response)) { 920 if (_isErrorResponse(response)) {
957 _reportError(response, "truncate failed"); 921 _reportError(response, "truncate failed");
958 } else { 922 } else {
959 callback(); 923 callback();
960 } 924 }
961 }); 925 });
962 } 926 }
963 927
964 void truncateSync(int length) { 928 void truncateSync(int length) {
965 _checkNotAsyncAndNotClosed(); 929 _checkNotClosed();
966 var result = _FileUtils.truncate(_id, length); 930 var result = _FileUtils.truncate(_id, length);
967 if (result is OSError) { 931 if (result is OSError) {
968 throw new FileIOException("truncate failed", result); 932 throw new FileIOException("truncate failed", result);
969 } 933 }
970 } 934 }
971 935
972 void length(void callback(int length)) { 936 void length(void callback(int length)) {
973 _ensureFileService(); 937 _ensureFileService();
974 _asyncUsed = true;
975 List request = new List(2); 938 List request = new List(2);
976 request[0] = _FileUtils.kLengthRequest; 939 request[0] = _FileUtils.kLengthRequest;
977 request[1] = _id; 940 request[1] = _id;
978 _fileService.call(request).then((response) { 941 _fileService.call(request).then((response) {
979 if (_isErrorResponse(response)) { 942 if (_isErrorResponse(response)) {
980 _reportError(response, "length failed"); 943 _reportError(response, "length failed");
981 } else { 944 } else {
982 callback(response); 945 callback(response);
983 } 946 }
984 }); 947 });
985 } 948 }
986 949
987 int lengthSync() { 950 int lengthSync() {
988 _checkNotAsyncAndNotClosed(); 951 _checkNotClosed();
989 var result = _FileUtils.length(_id); 952 var result = _FileUtils.length(_id);
990 if (result is OSError) { 953 if (result is OSError) {
991 throw new FileIOException("length failed", result); 954 throw new FileIOException("length failed", result);
992 } 955 }
993 return result; 956 return result;
994 } 957 }
995 958
996 void flush(void callback()) { 959 void flush(void callback()) {
997 _ensureFileService(); 960 _ensureFileService();
998 _asyncUsed = true;
999 List request = new List(2); 961 List request = new List(2);
1000 request[0] = _FileUtils.kFlushRequest; 962 request[0] = _FileUtils.kFlushRequest;
1001 request[1] = _id; 963 request[1] = _id;
1002 _fileService.call(request).then((response) { 964 _fileService.call(request).then((response) {
1003 if (_isErrorResponse(response)) { 965 if (_isErrorResponse(response)) {
1004 _reportError(response, "flush failed"); 966 _reportError(response, "flush failed");
1005 } else { 967 } else {
1006 callback(); 968 callback();
1007 } 969 }
1008 }); 970 });
1009 } 971 }
1010 972
1011 void flushSync() { 973 void flushSync() {
1012 _checkNotAsyncAndNotClosed(); 974 _checkNotClosed();
1013 var result = _FileUtils.flush(_id); 975 var result = _FileUtils.flush(_id);
1014 if (result is OSError) { 976 if (result is OSError) {
1015 throw new FileIOException("flush failed", result); 977 throw new FileIOException("flush failed", result);
1016 } 978 }
1017 } 979 }
1018 980
1019 String get name() => _name; 981 String get name() => _name;
1020 982
1021 void set onNoPendingWrites(void handler()) { 983 void set onNoPendingWrites(void handler()) {
1022 _onNoPendingWrites = handler; 984 _onNoPendingWrites = handler;
(...skipping 18 matching lines...) Expand all
1041 } 1003 }
1042 } 1004 }
1043 1005
1044 void _writeCompleted() { 1006 void _writeCompleted() {
1045 _pendingWrites--; 1007 _pendingWrites--;
1046 if (_pendingWrites == 0 && _onNoPendingWrites != null) { 1008 if (_pendingWrites == 0 && _onNoPendingWrites != null) {
1047 _onNoPendingWrites(); 1009 _onNoPendingWrites();
1048 } 1010 }
1049 } 1011 }
1050 1012
1051 _checkNotAsyncAndNotClosed() { 1013 void _checkNotClosed() {
1052 _checkNotAsync();
1053 if (_id == 0) { 1014 if (_id == 0) {
1054 throw new FileIOException("File closed"); 1015 throw new FileIOException("File closed");
1055 } 1016 }
1056 } 1017 }
1057 1018
1058 String _name; 1019 String _name;
1059 int _id; 1020 int _id;
1060 int _pendingWrites = 0; 1021 int _pendingWrites = 0;
1061 1022
1062 SendPort _fileService; 1023 SendPort _fileService;
1063 1024
1064 Timer _noPendingWriteTimer; 1025 Timer _noPendingWriteTimer;
1065 1026
1066 Function _onNoPendingWrites; 1027 Function _onNoPendingWrites;
1067 } 1028 }
OLDNEW
« no previous file with comments | « no previous file | tests/standalone/src/io/FileTest.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698