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

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

Issue 11023003: Clean up file implementation. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 2 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/directory_impl.dart ('k') | runtime/bin/socket_impl.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 : _data = const [], 7 : _data = const [],
8 _position = 0, 8 _position = 0,
9 _filePosition = 0 { 9 _filePosition = 0 {
10 var file = new File(name); 10 var file = new File(name);
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 int outstandingWrites = 0; 296 int outstandingWrites = 0;
297 297
298 // List of pending writes that were issued before the underlying 298 // List of pending writes that were issued before the underlying
299 // file was successfully opened. 299 // file was successfully opened.
300 List _pendingOperations; 300 List _pendingOperations;
301 301
302 Function _onNoPendingWrites; 302 Function _onNoPendingWrites;
303 Function _onClosed; 303 Function _onClosed;
304 } 304 }
305 305
306 306 const int _EXISTS_REQUEST = 0;
307 // Helper class containing static file helper methods. 307 const int _CREATE_REQUEST = 1;
308 class _FileUtils { 308 const int _DELETE_REQUEST = 2;
309 static const EXISTS_REQUEST = 0; 309 const int _OPEN_REQUEST = 3;
310 static const CREATE_REQUEST = 1; 310 const int _FULL_PATH_REQUEST = 4;
311 static const DELETE_REQUEST = 2; 311 const int _DIRECTORY_REQUEST = 5;
312 static const OPEN_REQUEST = 3; 312 const int _CLOSE_REQUEST = 6;
313 static const FULL_PATH_REQUEST = 4; 313 const int _POSITION_REQUEST = 7;
314 static const DIRECTORY_REQUEST = 5; 314 const int _SET_POSITION_REQUEST = 8;
315 static const CLOSE_REQUEST = 6; 315 const int _TRUNCATE_REQUEST = 9;
316 static const POSITION_REQUEST = 7; 316 const int _LENGTH_REQUEST = 10;
317 static const SET_POSITION_REQUEST = 8; 317 const int _LENGTH_FROM_NAME_REQUEST = 11;
318 static const TRUNCATE_REQUEST = 9; 318 const int _LAST_MODIFIED_REQUEST = 12;
319 static const LENGTH_REQUEST = 10; 319 const int _FLUSH_REQUEST = 13;
320 static const LENGTH_FROM_NAME_REQUEST = 11; 320 const int _READ_BYTE_REQUEST = 14;
321 static const LAST_MODIFIED_REQUEST = 12; 321 const int _WRITE_BYTE_REQUEST = 15;
322 static const FLUSH_REQUEST = 13; 322 const int _READ_LIST_REQUEST = 16;
323 static const READ_BYTE_REQUEST = 14; 323 const int _WRITE_LIST_REQUEST = 17;
324 static const WRITE_BYTE_REQUEST = 15; 324 const int _WRITE_STRING_REQUEST = 18;
325 static const READ_LIST_REQUEST = 16;
326 static const WRITE_LIST_REQUEST = 17;
327 static const WRITE_STRING_REQUEST = 18;
328
329 static const SUCCESS_RESPONSE = 0;
330 static const ILLEGAL_ARGUMENT_RESPONSE = 1;
331 static const OSERROR_RESPONSE = 2;
332 static const FILE_CLOSED_RESPONSE = 3;
333
334 static const ERROR_RESPONSE_ERROR_TYPE = 0;
335 static const OSERROR_RESPONSE_ERROR_CODE = 1;
336 static const OSERROR_RESPONSE_MESSAGE = 2;
337
338 static exists(String name) native "File_Exists";
339 static open(String name, int mode) native "File_Open";
340 static create(String name) native "File_Create";
341 static delete(String name) native "File_Delete";
342 static fullPath(String name) native "File_FullPath";
343 static directory(String name) native "File_Directory";
344 static lengthFromName(String name) native "File_LengthFromName";
345 static lastModified(String name) native "File_LastModified";
346 static int close(int id) native "File_Close";
347 static readByte(int id) native "File_ReadByte";
348 static readList(int id, List<int> buffer, int offset, int bytes)
349 native "File_ReadList";
350 static writeByte(int id, int value) native "File_WriteByte";
351 static writeList(int id, List<int> buffer, int offset, int bytes) {
352 List result = _ensureFastAndSerializableBuffer(buffer, offset, bytes);
353 List outBuffer = result[0];
354 int outOffset = result[1];
355 return writeListNative(id, outBuffer, outOffset, bytes);
356 }
357 static writeListNative(int id, List<int> buffer, int offset, int bytes)
358 native "File_WriteList";
359 static writeString(int id, String string) native "File_WriteString";
360 static position(int id) native "File_Position";
361 static setPosition(int id, int position) native "File_SetPosition";
362 static truncate(int id, int length) native "File_Truncate";
363 static length(int id) native "File_Length";
364 static flush(int id) native "File_Flush";
365 static int openStdio(int fd) native "File_OpenStdio";
366 static SendPort newServicePort() native "File_NewServicePort";
367
368 static bool checkedExists(String name) {
369 if (name is !String) throw new ArgumentError();
370 var result = exists(name);
371 throwIfError(result, "Cannot check existence of file '$name'");
372 return result;
373 }
374
375 static int checkedOpen(String name, int mode) {
376 if (name is !String || mode is !int) throw new ArgumentError();
377 var result = open(name, mode);
378 throwIfError(result, "Cannot open file '$name'");
379 return result;
380 }
381
382 static bool checkedCreate(String name) {
383 if (name is !String) throw new ArgumentError();
384 var result = create(name);
385 throwIfError(result, "Cannot create file '$name'");
386 return true;
387 }
388
389 static bool checkedDelete(String name) {
390 if (name is !String) throw new ArgumentError();
391 var result = delete(name);
392 throwIfError(result, "Cannot delete file '$name'");
393 return true;
394 }
395
396 static String checkedFullPath(String name) {
397 if (name is !String) throw new ArgumentError();
398 var result = fullPath(name);
399 throwIfError(result, "Cannot retrieve full path for file '$name'");
400 return result;
401 }
402
403 static String checkedDirectory(String name) {
404 if (name is !String) throw new ArgumentError();
405 var result = directory(name);
406 throwIfError(result, "Cannot retrieve directory for file '$name'");
407 return result;
408 }
409
410 static int checkedLengthFromName(String name) {
411 if (name is !String) throw new ArgumentError();
412 var result = lengthFromName(name);
413 throwIfError(result, "Cannot retrieve length of file '$name'");
414 return result;
415 }
416
417 static int checkedLastModified(String name) {
418 if (name is !String) throw new ArgumentError();
419 var result = lastModified(name);
420 throwIfError(result, "Cannot retrieve modification time for file '$name'");
421 return result;
422 }
423
424 static int checkReadWriteListArguments(int length, int offset, int bytes) {
425 if (offset < 0) return offset;
426 if (bytes < 0) return bytes;
427 if ((offset + bytes) > length) return offset + bytes;
428 return 0;
429 }
430
431 static int checkedWriteString(int id, String string) {
432 if (string is !String) throw new ArgumentError();
433 return writeString(id, string);
434 }
435
436 static throwIfError(Object result, String msg) {
437 if (result is OSError) {
438 throw new FileIOException(msg, result);
439 }
440 }
441 }
442 325
443 // Base class for _File and _RandomAccessFile with shared functions. 326 // Base class for _File and _RandomAccessFile with shared functions.
444 class _FileBase { 327 class _FileBase {
445 bool _isErrorResponse(response) { 328 bool _isErrorResponse(response) {
446 return response is List && response[0] != _FileUtils.SUCCESS_RESPONSE; 329 return response is List && response[0] != _SUCCESS_RESPONSE;
447 } 330 }
448 331
449 Exception _exceptionFromResponse(response, String message) { 332 Exception _exceptionFromResponse(response, String message) {
450 assert(_isErrorResponse(response)); 333 assert(_isErrorResponse(response));
451 switch (response[_FileUtils.ERROR_RESPONSE_ERROR_TYPE]) { 334 switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
452 case _FileUtils.ILLEGAL_ARGUMENT_RESPONSE: 335 case _ILLEGAL_ARGUMENT_RESPONSE:
453 return new ArgumentError(); 336 return new ArgumentError();
454 case _FileUtils.OSERROR_RESPONSE: 337 case _OSERROR_RESPONSE:
455 var err = new OSError(response[_FileUtils.OSERROR_RESPONSE_MESSAGE], 338 var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
456 response[_FileUtils.OSERROR_RESPONSE_ERROR_CODE]); 339 response[_OSERROR_RESPONSE_ERROR_CODE]);
457 return new FileIOException(message, err); 340 return new FileIOException(message, err);
458 case _FileUtils.FILE_CLOSED_RESPONSE: 341 case _FILE_CLOSED_RESPONSE:
459 return new FileIOException("File closed"); 342 return new FileIOException("File closed");
460 default: 343 default:
461 return new Exception("Unknown error"); 344 return new Exception("Unknown error");
462 } 345 }
463 } 346 }
464 } 347 }
465 348
349 SendPort _newServicePort() native "File_NewServicePort";
350
466 // Class for encapsulating the native implementation of files. 351 // Class for encapsulating the native implementation of files.
467 class _File extends _FileBase implements File { 352 class _File extends _FileBase implements File {
468 // Constructor for file. 353 // Constructor for file.
469 _File(String this._name) { 354 _File(String this._name) {
470 if (_name is! String) { 355 if (_name is! String) {
471 throw new ArgumentError('${NoSuchMethodError.safeToString(_name)} ' 356 throw new ArgumentError('${NoSuchMethodError.safeToString(_name)} '
472 'is not a String'); 357 'is not a String');
473 } 358 }
474 } 359 }
475 360
476 // Constructor from Path for file. 361 // Constructor from Path for file.
477 _File.fromPath(Path path) : this(path.toNativePath()); 362 _File.fromPath(Path path) : this(path.toNativePath());
478 363
479 Future<bool> exists() { 364 Future<bool> exists() {
480 _ensureFileService(); 365 _ensureFileService();
481 List request = new List(2); 366 List request = new List(2);
482 request[0] = _FileUtils.EXISTS_REQUEST; 367 request[0] = _EXISTS_REQUEST;
483 request[1] = _name; 368 request[1] = _name;
484 return _fileService.call(request).transform((response) { 369 return _fileService.call(request).transform((response) {
485 if (_isErrorResponse(response)) { 370 if (_isErrorResponse(response)) {
486 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); 371 throw _exceptionFromResponse(response, "Cannot open file '$_name'");
487 } 372 }
488 return response; 373 return response;
489 }); 374 });
490 } 375 }
491 376
377
378 static _exists(String name) native "File_Exists";
Søren Gjesse 2012/10/01 06:43:46 I assume that the removed argument checking is due
Mads Ager (google) 2012/10/01 09:21:06 It is not needed anymore because the File construc
379
492 bool existsSync() { 380 bool existsSync() {
493 return _FileUtils.checkedExists(_name); 381 var result = _exists(_name);
382 throwIfError(result, "Cannot check existence of file '$_name'");
383 return result;
494 } 384 }
495 385
496 Future<File> create() { 386 Future<File> create() {
497 _ensureFileService(); 387 _ensureFileService();
498 List request = new List(2); 388 List request = new List(2);
499 request[0] = _FileUtils.CREATE_REQUEST; 389 request[0] = _CREATE_REQUEST;
500 request[1] = _name; 390 request[1] = _name;
501 return _fileService.call(request).transform((response) { 391 return _fileService.call(request).transform((response) {
502 if (_isErrorResponse(response)) { 392 if (_isErrorResponse(response)) {
503 throw _exceptionFromResponse(response, "Cannot create file '$_name'"); 393 throw _exceptionFromResponse(response, "Cannot create file '$_name'");
504 } 394 }
505 return this; 395 return this;
506 }); 396 });
507 } 397 }
508 398
399 static _create(String name) native "File_Create";
400
509 void createSync() { 401 void createSync() {
510 bool created = _FileUtils.checkedCreate(_name); 402 var result = _create(_name);
511 if (!created) { 403 throwIfError(result, "Cannot create file '$_name'");
512 throw new FileIOException("Cannot create file '$_name'");
513 }
514 } 404 }
515 405
516 Future<File> delete() { 406 Future<File> delete() {
517 _ensureFileService(); 407 _ensureFileService();
518 List request = new List(2); 408 List request = new List(2);
519 request[0] = _FileUtils.DELETE_REQUEST; 409 request[0] = _DELETE_REQUEST;
520 request[1] = _name; 410 request[1] = _name;
521 return _fileService.call(request).transform((response) { 411 return _fileService.call(request).transform((response) {
522 if (_isErrorResponse(response)) { 412 if (_isErrorResponse(response)) {
523 throw _exceptionFromResponse(response, "Cannot delete file '$_name'"); 413 throw _exceptionFromResponse(response, "Cannot delete file '$_name'");
524 } 414 }
525 return this; 415 return this;
526 }); 416 });
527 } 417 }
528 418
419 static _delete(String name) native "File_Delete";
420
529 void deleteSync() { 421 void deleteSync() {
530 _FileUtils.checkedDelete(_name); 422 var result = _delete(_name);
423 throwIfError(result, "Cannot delete file '$_name'");
531 } 424 }
532 425
533 Future<Directory> directory() { 426 Future<Directory> directory() {
534 _ensureFileService(); 427 _ensureFileService();
535 List request = new List(2); 428 List request = new List(2);
536 request[0] = _FileUtils.DIRECTORY_REQUEST; 429 request[0] = _DIRECTORY_REQUEST;
537 request[1] = _name; 430 request[1] = _name;
538 return _fileService.call(request).transform((response) { 431 return _fileService.call(request).transform((response) {
539 if (_isErrorResponse(response)) { 432 if (_isErrorResponse(response)) {
540 throw _exceptionFromResponse(response, 433 throw _exceptionFromResponse(response,
541 "Cannot retrieve directory for " 434 "Cannot retrieve directory for "
542 "file '$_name'"); 435 "file '$_name'");
543 } 436 }
544 return new Directory(response); 437 return new Directory(response);
545 }); 438 });
546 } 439 }
547 440
441 static _directory(String name) native "File_Directory";
442
548 Directory directorySync() { 443 Directory directorySync() {
549 _FileUtils.checkedDirectory(_name); 444 var result = _directory(name);
550 return new Directory(_FileUtils.directory(_name)); 445 throwIfError(result, "Cannot retrieve directory for file '$_name'");
446 return new Directory(result);
551 } 447 }
552 448
553 Future<RandomAccessFile> open([FileMode mode = FileMode.READ]) { 449 Future<RandomAccessFile> open([FileMode mode = FileMode.READ]) {
554 _ensureFileService(); 450 _ensureFileService();
555 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 451 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
556 if (mode != FileMode.READ && 452 if (mode != FileMode.READ &&
557 mode != FileMode.WRITE && 453 mode != FileMode.WRITE &&
558 mode != FileMode.APPEND) { 454 mode != FileMode.APPEND) {
559 new Timer(0, (t) { 455 new Timer(0, (t) {
560 completer.completeException(new ArgumentError()); 456 completer.completeException(new ArgumentError());
561 }); 457 });
562 return completer.future; 458 return completer.future;
563 } 459 }
564 List request = new List(3); 460 List request = new List(3);
565 request[0] = _FileUtils.OPEN_REQUEST; 461 request[0] = _OPEN_REQUEST;
566 request[1] = _name; 462 request[1] = _name;
567 request[2] = mode._mode; // Direct int value for serialization. 463 request[2] = mode._mode; // Direct int value for serialization.
568 return _fileService.call(request).transform((response) { 464 return _fileService.call(request).transform((response) {
569 if (_isErrorResponse(response)) { 465 if (_isErrorResponse(response)) {
570 throw _exceptionFromResponse(response, "Cannot open file '$_name'"); 466 throw _exceptionFromResponse(response, "Cannot open file '$_name'");
571 } 467 }
572 return new _RandomAccessFile(response, _name); 468 return new _RandomAccessFile(response, _name);
573 }); 469 });
574 } 470 }
575 471
576 Future<int> length() { 472 Future<int> length() {
577 _ensureFileService(); 473 _ensureFileService();
578 List request = new List(2); 474 List request = new List(2);
579 request[0] = _FileUtils.LENGTH_FROM_NAME_REQUEST; 475 request[0] = _LENGTH_FROM_NAME_REQUEST;
580 request[1] = _name; 476 request[1] = _name;
581 return _fileService.call(request).transform((response) { 477 return _fileService.call(request).transform((response) {
582 if (_isErrorResponse(response)) { 478 if (_isErrorResponse(response)) {
583 throw _exceptionFromResponse(response, 479 throw _exceptionFromResponse(response,
584 "Cannot retrieve length of " 480 "Cannot retrieve length of "
585 "file '$_name'"); 481 "file '$_name'");
586 } 482 }
587 return response; 483 return response;
588 }); 484 });
589 } 485 }
590 486
487
488 static _lengthFromName(String name) native "File_LengthFromName";
489
591 int lengthSync() { 490 int lengthSync() {
592 return _FileUtils.checkedLengthFromName(_name); 491 var result = _lengthFromName(_name);
492 throwIfError(result, "Cannot retrieve length of file '$_name'");
493 return result;
593 } 494 }
594 495
595 Future<Date> lastModified() { 496 Future<Date> lastModified() {
596 _ensureFileService(); 497 _ensureFileService();
597 List request = new List(2); 498 List request = new List(2);
598 request[0] = _FileUtils.LAST_MODIFIED_REQUEST; 499 request[0] = _LAST_MODIFIED_REQUEST;
599 request[1] = _name; 500 request[1] = _name;
600 return _fileService.call(request).transform((response) { 501 return _fileService.call(request).transform((response) {
601 if (_isErrorResponse(response)) { 502 if (_isErrorResponse(response)) {
602 throw _exceptionFromResponse(response, 503 throw _exceptionFromResponse(response,
603 "Cannot retrieve modification time " 504 "Cannot retrieve modification time "
604 "for file '$_name'"); 505 "for file '$_name'");
605 } 506 }
606 return new Date.fromMillisecondsSinceEpoch(response); 507 return new Date.fromMillisecondsSinceEpoch(response);
607 }); 508 });
608 } 509 }
609 510
511 static _lastModified(String name) native "File_LastModified";
512
610 Date lastModifiedSync() { 513 Date lastModifiedSync() {
611 int ms = _FileUtils.checkedLastModified(_name); 514 var ms = _lastModified(name);
515 throwIfError(ms, "Cannot retrieve modification time for file '$_name'");
612 return new Date.fromMillisecondsSinceEpoch(ms); 516 return new Date.fromMillisecondsSinceEpoch(ms);
613 } 517 }
614 518
519 static _open(String name, int mode) native "File_Open";
520
615 RandomAccessFile openSync([FileMode mode = FileMode.READ]) { 521 RandomAccessFile openSync([FileMode mode = FileMode.READ]) {
616 if (mode != FileMode.READ && 522 if (mode != FileMode.READ &&
617 mode != FileMode.WRITE && 523 mode != FileMode.WRITE &&
618 mode != FileMode.APPEND) { 524 mode != FileMode.APPEND) {
619 throw new FileIOException("Unknown file mode. Use FileMode.READ, " 525 throw new FileIOException("Unknown file mode. Use FileMode.READ, "
620 "FileMode.WRITE or FileMode.APPEND."); 526 "FileMode.WRITE or FileMode.APPEND.");
621 } 527 }
622 var id = _FileUtils.checkedOpen(_name, mode._mode); 528 var id = _open(_name, mode._mode);
623 assert(id != 0); 529 throwIfError(id, "Cannot open file '$_name'");
624 return new _RandomAccessFile(id, _name); 530 return new _RandomAccessFile(id, _name);
625 } 531 }
626 532
533 static int _openStdio(int fd) native "File_OpenStdio";
534
627 static RandomAccessFile _openStdioSync(int fd) { 535 static RandomAccessFile _openStdioSync(int fd) {
628 var id = _FileUtils.openStdio(fd); 536 var id = _openStdio(fd);
629 if (id == 0) { 537 if (id == 0) {
630 throw new FileIOException("Cannot open stdio file for: $fd"); 538 throw new FileIOException("Cannot open stdio file for: $fd");
631 } 539 }
632 return new _RandomAccessFile(id, ""); 540 return new _RandomAccessFile(id, "");
633 } 541 }
634 542
635 Future<String> fullPath() { 543 Future<String> fullPath() {
636 _ensureFileService(); 544 _ensureFileService();
637 List request = new List(2); 545 List request = new List(2);
638 request[0] = _FileUtils.FULL_PATH_REQUEST; 546 request[0] = _FULL_PATH_REQUEST;
639 request[1] = _name; 547 request[1] = _name;
640 return _fileService.call(request).transform((response) { 548 return _fileService.call(request).transform((response) {
641 if (_isErrorResponse(response)) { 549 if (_isErrorResponse(response)) {
642 throw _exceptionFromResponse(response, 550 throw _exceptionFromResponse(response,
643 "Cannot retrieve full path" 551 "Cannot retrieve full path"
644 " for '$_name'"); 552 " for '$_name'");
645 } 553 }
646 return response; 554 return response;
647 }); 555 });
648 } 556 }
649 557
558 static _fullPath(String name) native "File_FullPath";
559
650 String fullPathSync() { 560 String fullPathSync() {
651 return _FileUtils.checkedFullPath(_name); 561 var result = _fullPath(_name);
562 throwIfError(result, "Cannot retrieve full path for file '$_name'");
563 return result;
652 } 564 }
653 565
654 InputStream openInputStream() { 566 InputStream openInputStream() {
655 return new _FileInputStream(_name); 567 return new _FileInputStream(_name);
656 } 568 }
657 569
658 OutputStream openOutputStream([FileMode mode = FileMode.WRITE]) { 570 OutputStream openOutputStream([FileMode mode = FileMode.WRITE]) {
659 if (mode != FileMode.WRITE && 571 if (mode != FileMode.WRITE &&
660 mode != FileMode.APPEND) { 572 mode != FileMode.APPEND) {
661 throw new FileIOException( 573 throw new FileIOException(
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 var decoder = _StringDecoders.decoder(encoding); 654 var decoder = _StringDecoders.decoder(encoding);
743 List<int> bytes = readAsBytesSync(); 655 List<int> bytes = readAsBytesSync();
744 decoder.write(bytes); 656 decoder.write(bytes);
745 return _getDecodedLines(decoder); 657 return _getDecodedLines(decoder);
746 } 658 }
747 659
748 String get name => _name; 660 String get name => _name;
749 661
750 void _ensureFileService() { 662 void _ensureFileService() {
751 if (_fileService == null) { 663 if (_fileService == null) {
752 _fileService = _FileUtils.newServicePort(); 664 _fileService = _newServicePort();
753 } 665 }
754 } 666 }
755 667
668 static throwIfError(Object result, String msg) {
669 if (result is OSError) {
670 throw new FileIOException(msg, result);
671 }
672 }
673
756 final String _name; 674 final String _name;
757 675
758 SendPort _fileService; 676 SendPort _fileService;
759 } 677 }
760 678
761 679
762 class _RandomAccessFile extends _FileBase implements RandomAccessFile { 680 class _RandomAccessFile extends _FileBase implements RandomAccessFile {
763 _RandomAccessFile(int this._id, String this._name); 681 _RandomAccessFile(int this._id, String this._name);
764 682
765 Future<RandomAccessFile> close() { 683 Future<RandomAccessFile> close() {
766 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 684 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
767 if (closed) return _completeWithClosedException(completer); 685 if (closed) return _completeWithClosedException(completer);
768 _ensureFileService(); 686 _ensureFileService();
769 List request = new List(2); 687 List request = new List(2);
770 request[0] = _FileUtils.CLOSE_REQUEST; 688 request[0] = _CLOSE_REQUEST;
771 request[1] = _id; 689 request[1] = _id;
772 // Set the id_ to 0 (NULL) to ensure the no more async requests 690 // Set the id_ to 0 (NULL) to ensure the no more async requests
773 // can be issued for this file. 691 // can be issued for this file.
774 _id = 0; 692 _id = 0;
775 return _fileService.call(request).transform((result) { 693 return _fileService.call(request).transform((result) {
776 if (result != -1) { 694 if (result != -1) {
777 _id = result; 695 _id = result;
778 return this; 696 return this;
779 } else { 697 } else {
780 throw new FileIOException("Cannot close file '$_name'"); 698 throw new FileIOException("Cannot close file '$_name'");
781 } 699 }
782 }); 700 });
783 } 701 }
784 702
703 static int _close(int id) native "File_Close";
704
785 void closeSync() { 705 void closeSync() {
786 _checkNotClosed(); 706 _checkNotClosed();
787 var id = _FileUtils.close(_id); 707 var id = _close(_id);
788 if (id == -1) { 708 if (id == -1) {
789 throw new FileIOException("Cannot close file '$_name'"); 709 throw new FileIOException("Cannot close file '$_name'");
790 } 710 }
791 _id = id; 711 _id = id;
792 } 712 }
793 713
794 Future<int> readByte() { 714 Future<int> readByte() {
795 _ensureFileService(); 715 _ensureFileService();
796 Completer<int> completer = new Completer<int>(); 716 Completer<int> completer = new Completer<int>();
797 if (closed) return _completeWithClosedException(completer); 717 if (closed) return _completeWithClosedException(completer);
798 List request = new List(2); 718 List request = new List(2);
799 request[0] = _FileUtils.READ_BYTE_REQUEST; 719 request[0] = _READ_BYTE_REQUEST;
800 request[1] = _id; 720 request[1] = _id;
801 return _fileService.call(request).transform((response) { 721 return _fileService.call(request).transform((response) {
802 if (_isErrorResponse(response)) { 722 if (_isErrorResponse(response)) {
803 throw _exceptionFromResponse(response, 723 throw _exceptionFromResponse(response,
804 "readByte failed for file '$_name'"); 724 "readByte failed for file '$_name'");
805 } 725 }
806 return response; 726 return response;
807 }); 727 });
808 } 728 }
809 729
730 static _readByte(int id) native "File_ReadByte";
731
810 int readByteSync() { 732 int readByteSync() {
811 _checkNotClosed(); 733 _checkNotClosed();
812 var result = _FileUtils.readByte(_id); 734 var result = _readByte(_id);
813 if (result is OSError) { 735 if (result is OSError) {
814 throw new FileIOException("readByte failed for file '$_name'", result); 736 throw new FileIOException("readByte failed for file '$_name'", result);
815 } 737 }
816 return result; 738 return result;
817 } 739 }
818 740
819 Future<int> readList(List<int> buffer, int offset, int bytes) { 741 Future<int> readList(List<int> buffer, int offset, int bytes) {
820 _ensureFileService(); 742 _ensureFileService();
821 Completer<int> completer = new Completer<int>(); 743 Completer<int> completer = new Completer<int>();
822 if (buffer is !List || offset is !int || bytes is !int) { 744 if (buffer is !List || offset is !int || bytes is !int) {
823 // Complete asynchronously so the user has a chance to setup 745 // Complete asynchronously so the user has a chance to setup
824 // handlers without getting exceptions when registering the 746 // handlers without getting exceptions when registering the
825 // then handler. 747 // then handler.
826 new Timer(0, (t) { 748 new Timer(0, (t) {
827 completer.completeException(new FileIOException( 749 completer.completeException(new FileIOException(
828 "Invalid arguments to readList for file '$_name'")); 750 "Invalid arguments to readList for file '$_name'"));
829 }); 751 });
830 return completer.future; 752 return completer.future;
831 }; 753 };
832 if (closed) return _completeWithClosedException(completer); 754 if (closed) return _completeWithClosedException(completer);
833 List request = new List(3); 755 List request = new List(3);
834 request[0] = _FileUtils.READ_LIST_REQUEST; 756 request[0] = _READ_LIST_REQUEST;
835 request[1] = _id; 757 request[1] = _id;
836 request[2] = bytes; 758 request[2] = bytes;
837 return _fileService.call(request).transform((response) { 759 return _fileService.call(request).transform((response) {
838 if (_isErrorResponse(response)) { 760 if (_isErrorResponse(response)) {
839 throw _exceptionFromResponse(response, 761 throw _exceptionFromResponse(response,
840 "readList failed for file '$_name'"); 762 "readList failed for file '$_name'");
841 } 763 }
842 var read = response[1]; 764 var read = response[1];
843 var data = response[2]; 765 var data = response[2];
844 buffer.setRange(offset, read, data); 766 buffer.setRange(offset, read, data);
845 return read; 767 return read;
846 }); 768 });
847 } 769 }
848 770
771 static int _checkReadWriteListArguments(int length, int offset, int bytes) {
772 if (offset < 0) return offset;
773 if (bytes < 0) return bytes;
774 if ((offset + bytes) > length) return offset + bytes;
775 return 0;
776 }
777
778 static _readList(int id, List<int> buffer, int offset, int bytes)
779 native "File_ReadList";
780
849 int readListSync(List<int> buffer, int offset, int bytes) { 781 int readListSync(List<int> buffer, int offset, int bytes) {
850 _checkNotClosed(); 782 _checkNotClosed();
851 if (buffer is !List || offset is !int || bytes is !int) { 783 if (buffer is !List || offset is !int || bytes is !int) {
852 throw new FileIOException( 784 throw new FileIOException(
853 "Invalid arguments to readList for file '$_name'"); 785 "Invalid arguments to readList for file '$_name'");
854 } 786 }
855 if (bytes == 0) return 0; 787 if (bytes == 0) return 0;
856 int index = 788 int index = _checkReadWriteListArguments(buffer.length, offset, bytes);
Søren Gjesse 2012/10/01 06:43:46 Wouldn't it be better to have _checkReadWriteListA
Mads Ager (google) 2012/10/01 09:21:06 Absolutely, thanks!
857 _FileUtils.checkReadWriteListArguments(buffer.length, offset, bytes);
858 if (index != 0) { 789 if (index != 0) {
859 throw new IndexOutOfRangeException(index); 790 throw new IndexOutOfRangeException(index);
860 } 791 }
861 var result = _FileUtils.readList(_id, buffer, offset, bytes); 792 var result = _readList(_id, buffer, offset, bytes);
862 if (result is OSError) { 793 if (result is OSError) {
863 throw new FileIOException("readList failed for file '$_name'", 794 throw new FileIOException("readList failed for file '$_name'",
864 result); 795 result);
865 } 796 }
866 return result; 797 return result;
867 } 798 }
868 799
869 Future<RandomAccessFile> writeByte(int value) { 800 Future<RandomAccessFile> writeByte(int value) {
870 _ensureFileService(); 801 _ensureFileService();
871 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 802 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
872 if (value is !int) { 803 if (value is !int) {
873 // Complete asynchronously so the user has a chance to setup 804 // Complete asynchronously so the user has a chance to setup
874 // handlers without getting exceptions when registering the 805 // handlers without getting exceptions when registering the
875 // then handler. 806 // then handler.
876 new Timer(0, (t) { 807 new Timer(0, (t) {
877 completer.completeException(new FileIOException( 808 completer.completeException(new FileIOException(
878 "Invalid argument to writeByte for file '$_name'")); 809 "Invalid argument to writeByte for file '$_name'"));
879 }); 810 });
880 return completer.future; 811 return completer.future;
881 } 812 }
882 if (closed) return _completeWithClosedException(completer); 813 if (closed) return _completeWithClosedException(completer);
883 List request = new List(3); 814 List request = new List(3);
884 request[0] = _FileUtils.WRITE_BYTE_REQUEST; 815 request[0] = _WRITE_BYTE_REQUEST;
885 request[1] = _id; 816 request[1] = _id;
886 request[2] = value; 817 request[2] = value;
887 return _fileService.call(request).transform((response) { 818 return _fileService.call(request).transform((response) {
888 if (_isErrorResponse(response)) { 819 if (_isErrorResponse(response)) {
889 throw _exceptionFromResponse(response, 820 throw _exceptionFromResponse(response,
890 "writeByte failed for file '$_name'"); 821 "writeByte failed for file '$_name'");
891 } 822 }
892 return this; 823 return this;
893 }); 824 });
894 } 825 }
895 826
827 static _writeByte(int id, int value) native "File_WriteByte";
828
896 int writeByteSync(int value) { 829 int writeByteSync(int value) {
897 _checkNotClosed(); 830 _checkNotClosed();
898 if (value is !int) { 831 if (value is !int) {
899 throw new FileIOException( 832 throw new FileIOException(
900 "Invalid argument to writeByte for file '$_name'"); 833 "Invalid argument to writeByte for file '$_name'");
901 } 834 }
902 var result = _FileUtils.writeByte(_id, value); 835 var result = _writeByte(_id, value);
903 if (result is OSError) { 836 if (result is OSError) {
904 throw new FileIOException("writeByte failed for file '$_name'", 837 throw new FileIOException("writeByte failed for file '$_name'",
905 result); 838 result);
906 } 839 }
907 return result; 840 return result;
908 } 841 }
909 842
910 Future<RandomAccessFile> writeList(List<int> buffer, int offset, int bytes) { 843 Future<RandomAccessFile> writeList(List<int> buffer, int offset, int bytes) {
911 _ensureFileService(); 844 _ensureFileService();
912 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 845 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
913 if (buffer is !List || offset is !int || bytes is !int) { 846 if (buffer is !List || offset is !int || bytes is !int) {
914 // Complete asynchronously so the user has a chance to setup 847 // Complete asynchronously so the user has a chance to setup
915 // handlers without getting exceptions when registering the 848 // handlers without getting exceptions when registering the
916 // then handler. 849 // then handler.
917 new Timer(0, (t) { 850 new Timer(0, (t) {
918 completer.completeException(new FileIOException( 851 completer.completeException(new FileIOException(
919 "Invalid arguments to writeList for file '$_name'")); 852 "Invalid arguments to writeList for file '$_name'"));
920 }); 853 });
921 return completer.future; 854 return completer.future;
922 } 855 }
923 if (closed) return _completeWithClosedException(completer); 856 if (closed) return _completeWithClosedException(completer);
924 857
925 List result; 858 _BufferAndOffset result;
926 try { 859 try {
927 result = _ensureFastAndSerializableBuffer(buffer, offset, bytes); 860 result = _ensureFastAndSerializableBuffer(buffer, offset, bytes);
928 } catch (e) { 861 } catch (e) {
929 // Complete asynchronously so the user has a chance to setup 862 // Complete asynchronously so the user has a chance to setup
930 // handlers without getting exceptions when registering the 863 // handlers without getting exceptions when registering the
931 // then handler. 864 // then handler.
932 new Timer(0, (t) => completer.completeException(e)); 865 new Timer(0, (t) => completer.completeException(e));
933 return completer.future; 866 return completer.future;
934 } 867 }
935 List outBuffer = result[0];
936 int outOffset = result[1];
937 868
938 List request = new List(5); 869 List request = new List(5);
939 request[0] = _FileUtils.WRITE_LIST_REQUEST; 870 request[0] = _WRITE_LIST_REQUEST;
940 request[1] = _id; 871 request[1] = _id;
941 request[2] = outBuffer; 872 request[2] = result.buffer;
942 request[3] = outOffset; 873 request[3] = result.offset;
943 request[4] = bytes; 874 request[4] = bytes;
944 return _fileService.call(request).transform((response) { 875 return _fileService.call(request).transform((response) {
945 if (_isErrorResponse(response)) { 876 if (_isErrorResponse(response)) {
946 throw _exceptionFromResponse(response, 877 throw _exceptionFromResponse(response,
947 "writeList failed for file '$_name'"); 878 "writeList failed for file '$_name'");
948 } 879 }
949 return this; 880 return this;
950 }); 881 });
951 } 882 }
952 883
884 static _writeList(int id, List<int> buffer, int offset, int bytes)
885 native "File_WriteList";
886
953 int writeListSync(List<int> buffer, int offset, int bytes) { 887 int writeListSync(List<int> buffer, int offset, int bytes) {
954 _checkNotClosed(); 888 _checkNotClosed();
955 if (buffer is !List || offset is !int || bytes is !int) { 889 if (buffer is !List || offset is !int || bytes is !int) {
956 throw new FileIOException( 890 throw new FileIOException(
957 "Invalid arguments to writeList for file '$_name'"); 891 "Invalid arguments to writeList for file '$_name'");
958 } 892 }
959 if (bytes == 0) return 0; 893 if (bytes == 0) return 0;
960 int index = 894 int index = _checkReadWriteListArguments(buffer.length, offset, bytes);
961 _FileUtils.checkReadWriteListArguments(buffer.length, offset, bytes);
962 if (index != 0) { 895 if (index != 0) {
963 throw new IndexOutOfRangeException(index); 896 throw new IndexOutOfRangeException(index);
964 } 897 }
965 var result = _FileUtils.writeList(_id, buffer, offset, bytes); 898 _BufferAndOffset bufferAndOffset =
899 _ensureFastAndSerializableBuffer(buffer, offset, bytes);
900 var result =
901 _writeList(_id, bufferAndOffset.buffer, bufferAndOffset.offset, bytes);
966 if (result is OSError) { 902 if (result is OSError) {
967 throw new FileIOException("writeList failed for file '$_name'", result); 903 throw new FileIOException("writeList failed for file '$_name'", result);
968 } 904 }
969 return result; 905 return result;
970 } 906 }
971 907
972 Future<RandomAccessFile> writeString(String string, 908 Future<RandomAccessFile> writeString(String string,
973 [Encoding encoding = Encoding.UTF_8]) { 909 [Encoding encoding = Encoding.UTF_8]) {
974 _ensureFileService(); 910 _ensureFileService();
975 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 911 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
976 if (closed) return _completeWithClosedException(completer); 912 if (closed) return _completeWithClosedException(completer);
977 List request = new List(3); 913 List request = new List(3);
978 request[0] = _FileUtils.WRITE_STRING_REQUEST; 914 request[0] = _WRITE_STRING_REQUEST;
979 request[1] = _id; 915 request[1] = _id;
980 request[2] = string; 916 request[2] = string;
981 return _fileService.call(request).transform((response) { 917 return _fileService.call(request).transform((response) {
982 if (_isErrorResponse(response)) { 918 if (_isErrorResponse(response)) {
983 throw _exceptionFromResponse(response, 919 throw _exceptionFromResponse(response,
984 "writeString failed for file '$_name'"); 920 "writeString failed for file '$_name'");
985 } 921 }
986 return this; 922 return this;
987 }); 923 });
988 } 924 }
989 925
926 static _writeString(int id, String string) native "File_WriteString";
927
990 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) { 928 int writeStringSync(String string, [Encoding encoding = Encoding.UTF_8]) {
991 _checkNotClosed(); 929 _checkNotClosed();
992 var result = _FileUtils.checkedWriteString(_id, string); 930 if (string is !String) throw new ArgumentError();
931 var result = _writeString(_id, string);
993 if (result is OSError) { 932 if (result is OSError) {
994 throw new FileIOException("writeString failed for file '$_name'"); 933 throw new FileIOException("writeString failed for file '$_name'");
995 } 934 }
996 return result; 935 return result;
997 } 936 }
998 937
999 Future<int> position() { 938 Future<int> position() {
1000 _ensureFileService(); 939 _ensureFileService();
1001 Completer<int> completer = new Completer<int>(); 940 Completer<int> completer = new Completer<int>();
1002 if (closed) return _completeWithClosedException(completer); 941 if (closed) return _completeWithClosedException(completer);
1003 List request = new List(2); 942 List request = new List(2);
1004 request[0] = _FileUtils.POSITION_REQUEST; 943 request[0] = _POSITION_REQUEST;
1005 request[1] = _id; 944 request[1] = _id;
1006 return _fileService.call(request).transform((response) { 945 return _fileService.call(request).transform((response) {
1007 if (_isErrorResponse(response)) { 946 if (_isErrorResponse(response)) {
1008 throw _exceptionFromResponse(response, 947 throw _exceptionFromResponse(response,
1009 "position failed for file '$_name'"); 948 "position failed for file '$_name'");
1010 } 949 }
1011 return response; 950 return response;
1012 }); 951 });
1013 } 952 }
1014 953
954 static _position(int id) native "File_Position";
955
1015 int positionSync() { 956 int positionSync() {
1016 _checkNotClosed(); 957 _checkNotClosed();
1017 var result = _FileUtils.position(_id); 958 var result = _position(_id);
1018 if (result is OSError) { 959 if (result is OSError) {
1019 throw new FileIOException("position failed for file '$_name'", result); 960 throw new FileIOException("position failed for file '$_name'", result);
1020 } 961 }
1021 return result; 962 return result;
1022 } 963 }
1023 964
1024 Future<RandomAccessFile> setPosition(int position) { 965 Future<RandomAccessFile> setPosition(int position) {
1025 _ensureFileService(); 966 _ensureFileService();
1026 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 967 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
1027 if (closed) return _completeWithClosedException(completer); 968 if (closed) return _completeWithClosedException(completer);
1028 List request = new List(3); 969 List request = new List(3);
1029 request[0] = _FileUtils.SET_POSITION_REQUEST; 970 request[0] = _SET_POSITION_REQUEST;
1030 request[1] = _id; 971 request[1] = _id;
1031 request[2] = position; 972 request[2] = position;
1032 return _fileService.call(request).transform((response) { 973 return _fileService.call(request).transform((response) {
1033 if (_isErrorResponse(response)) { 974 if (_isErrorResponse(response)) {
1034 throw _exceptionFromResponse(response, 975 throw _exceptionFromResponse(response,
1035 "setPosition failed for file '$_name'"); 976 "setPosition failed for file '$_name'");
1036 } 977 }
1037 return this; 978 return this;
1038 }); 979 });
1039 } 980 }
1040 981
982 static _setPosition(int id, int position) native "File_SetPosition";
983
1041 void setPositionSync(int position) { 984 void setPositionSync(int position) {
1042 _checkNotClosed(); 985 _checkNotClosed();
1043 var result = _FileUtils.setPosition(_id, position); 986 var result = _setPosition(_id, position);
1044 if (result is OSError) { 987 if (result is OSError) {
1045 throw new FileIOException("setPosition failed for file '$_name'", result); 988 throw new FileIOException("setPosition failed for file '$_name'", result);
1046 } 989 }
1047 } 990 }
1048 991
1049 Future<RandomAccessFile> truncate(int length) { 992 Future<RandomAccessFile> truncate(int length) {
1050 _ensureFileService(); 993 _ensureFileService();
1051 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 994 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
1052 if (closed) return _completeWithClosedException(completer); 995 if (closed) return _completeWithClosedException(completer);
1053 List request = new List(3); 996 List request = new List(3);
1054 request[0] = _FileUtils.TRUNCATE_REQUEST; 997 request[0] = _TRUNCATE_REQUEST;
1055 request[1] = _id; 998 request[1] = _id;
1056 request[2] = length; 999 request[2] = length;
1057 return _fileService.call(request).transform((response) { 1000 return _fileService.call(request).transform((response) {
1058 if (_isErrorResponse(response)) { 1001 if (_isErrorResponse(response)) {
1059 throw _exceptionFromResponse(response, 1002 throw _exceptionFromResponse(response,
1060 "truncate failed for file '$_name'"); 1003 "truncate failed for file '$_name'");
1061 } 1004 }
1062 return this; 1005 return this;
1063 }); 1006 });
1064 } 1007 }
1065 1008
1009 static _truncate(int id, int length) native "File_Truncate";
1010
1066 void truncateSync(int length) { 1011 void truncateSync(int length) {
1067 _checkNotClosed(); 1012 _checkNotClosed();
1068 var result = _FileUtils.truncate(_id, length); 1013 var result = _truncate(_id, length);
1069 if (result is OSError) { 1014 if (result is OSError) {
1070 throw new FileIOException("truncate failed for file '$_name'", result); 1015 throw new FileIOException("truncate failed for file '$_name'", result);
1071 } 1016 }
1072 } 1017 }
1073 1018
1074 Future<int> length() { 1019 Future<int> length() {
1075 _ensureFileService(); 1020 _ensureFileService();
1076 Completer<int> completer = new Completer<int>(); 1021 Completer<int> completer = new Completer<int>();
1077 if (closed) return _completeWithClosedException(completer); 1022 if (closed) return _completeWithClosedException(completer);
1078 List request = new List(2); 1023 List request = new List(2);
1079 request[0] = _FileUtils.LENGTH_REQUEST; 1024 request[0] = _LENGTH_REQUEST;
1080 request[1] = _id; 1025 request[1] = _id;
1081 return _fileService.call(request).transform((response) { 1026 return _fileService.call(request).transform((response) {
1082 if (_isErrorResponse(response)) { 1027 if (_isErrorResponse(response)) {
1083 throw _exceptionFromResponse(response, 1028 throw _exceptionFromResponse(response,
1084 "length failed for file '$_name'"); 1029 "length failed for file '$_name'");
1085 } 1030 }
1086 return response; 1031 return response;
1087 }); 1032 });
1088 } 1033 }
1089 1034
1035 static _length(int id) native "File_Length";
1036
1090 int lengthSync() { 1037 int lengthSync() {
1091 _checkNotClosed(); 1038 _checkNotClosed();
1092 var result = _FileUtils.length(_id); 1039 var result = _length(_id);
1093 if (result is OSError) { 1040 if (result is OSError) {
1094 throw new FileIOException("length failed for file '$_name'", result); 1041 throw new FileIOException("length failed for file '$_name'", result);
1095 } 1042 }
1096 return result; 1043 return result;
1097 } 1044 }
1098 1045
1099 Future<RandomAccessFile> flush() { 1046 Future<RandomAccessFile> flush() {
1100 _ensureFileService(); 1047 _ensureFileService();
1101 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); 1048 Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>();
1102 if (closed) return _completeWithClosedException(completer); 1049 if (closed) return _completeWithClosedException(completer);
1103 List request = new List(2); 1050 List request = new List(2);
1104 request[0] = _FileUtils.FLUSH_REQUEST; 1051 request[0] = _FLUSH_REQUEST;
1105 request[1] = _id; 1052 request[1] = _id;
1106 return _fileService.call(request).transform((response) { 1053 return _fileService.call(request).transform((response) {
1107 if (_isErrorResponse(response)) { 1054 if (_isErrorResponse(response)) {
1108 throw _exceptionFromResponse(response, 1055 throw _exceptionFromResponse(response,
1109 "flush failed for file '$_name'"); 1056 "flush failed for file '$_name'");
1110 } 1057 }
1111 return this; 1058 return this;
1112 }); 1059 });
1113 } 1060 }
1114 1061
1062 static _flush(int id) native "File_Flush";
1063
1115 void flushSync() { 1064 void flushSync() {
1116 _checkNotClosed(); 1065 _checkNotClosed();
1117 var result = _FileUtils.flush(_id); 1066 var result = _flush(_id);
1118 if (result is OSError) { 1067 if (result is OSError) {
1119 throw new FileIOException("flush failed for file '$_name'", result); 1068 throw new FileIOException("flush failed for file '$_name'", result);
1120 } 1069 }
1121 } 1070 }
1122 1071
1123 String get name => _name; 1072 String get name => _name;
1124 1073
1125 void _ensureFileService() { 1074 void _ensureFileService() {
1126 if (_fileService == null) { 1075 if (_fileService == null) {
1127 _fileService = _FileUtils.newServicePort(); 1076 _fileService = _newServicePort();
1128 } 1077 }
1129 } 1078 }
1130 1079
1131 bool get closed => _id == 0; 1080 bool get closed => _id == 0;
1132 1081
1133 void _checkNotClosed() { 1082 void _checkNotClosed() {
1134 if (closed) { 1083 if (closed) {
1135 throw new FileIOException("File closed '$_name'"); 1084 throw new FileIOException("File closed '$_name'");
1136 } 1085 }
1137 } 1086 }
1138 1087
1139 Future _completeWithClosedException(Completer completer) { 1088 Future _completeWithClosedException(Completer completer) {
1140 new Timer(0, (t) { 1089 new Timer(0, (t) {
1141 completer.completeException( 1090 completer.completeException(
1142 new FileIOException("File closed '$_name'")); 1091 new FileIOException("File closed '$_name'"));
1143 }); 1092 });
1144 return completer.future; 1093 return completer.future;
1145 } 1094 }
1146 1095
1147 final String _name; 1096 final String _name;
1148 int _id; 1097 int _id;
1149 1098
1150 SendPort _fileService; 1099 SendPort _fileService;
1151 } 1100 }
OLDNEW
« no previous file with comments | « runtime/bin/directory_impl.dart ('k') | runtime/bin/socket_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698