Index: sdk/lib/io/file_impl.dart |
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart |
index 75ecab6a4bd12f7b3c20b0f1617918f573b81dea..23ce711f06898ec9b7189956871da28aa232708a 100644 |
--- a/sdk/lib/io/file_impl.dart |
+++ b/sdk/lib/io/file_impl.dart |
@@ -168,7 +168,7 @@ class _FileStreamConsumer extends StreamConsumer<List<int>> { |
_subscription = stream.listen( |
(d) { |
_subscription.pause(); |
- openedFile.writeList(d, 0, d.length) |
+ openedFile.writeFrom(d, 0, d.length) |
.then((_) => _subscription.resume()) |
.catchError((e) { |
openedFile.close(); |
@@ -563,7 +563,7 @@ class _File extends _FileBase implements File { |
void writeAsBytesSync(List<int> bytes, {FileMode mode: FileMode.WRITE}) { |
RandomAccessFile opened = openSync(mode: mode); |
- opened.writeListSync(bytes, 0, bytes.length); |
+ opened.writeFromSync(bytes, 0, bytes.length); |
opened.closeSync(); |
} |
@@ -711,57 +711,59 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile { |
return result; |
} |
- Future<int> readList(List<int> buffer, int offset, int bytes) { |
+ Future<int> readInto(List<int> buffer, [int start, int end]) { |
_ensureFileService(); |
- Completer<int> completer = new Completer<int>(); |
- if (buffer is !List || offset is !int || bytes is !int) { |
- // Complete asynchronously so the user has a chance to setup |
- // handlers without getting exceptions when registering the |
- // then handler. |
- Timer.run(() { |
- completer.completeError(new FileIOException( |
- "Invalid arguments to readList for file '$_path'")); |
- }); |
- return completer.future; |
+ if (buffer is !List || |
+ (start != null && start is !int) || |
+ (end != null && end is !int)) { |
+ return new Future.immediateError(new FileIOException( |
+ "Invalid arguments to readInto for file '$_path'")); |
}; |
+ Completer<int> completer = new Completer<int>(); |
if (closed) return _completeWithClosedException(completer); |
List request = new List(3); |
+ if (start == null) start = 0; |
+ if (end == null) end = buffer.length; |
request[0] = _READ_LIST_REQUEST; |
request[1] = _id; |
- request[2] = bytes; |
+ request[2] = end - start; |
return _fileService.call(request).then((response) { |
if (_isErrorResponse(response)) { |
throw _exceptionFromResponse(response, |
- "readList failed for file '$_path'"); |
+ "readInto failed for file '$_path'"); |
} |
var read = response[1]; |
var data = response[2]; |
- buffer.setRange(offset, offset + read, data); |
+ buffer.setRange(start, start + read, data); |
return read; |
}); |
} |
- static void _checkReadWriteListArguments(int length, int offset, int bytes) { |
- if (offset < 0) throw new RangeError.value(offset); |
- if (bytes < 0) throw new RangeError.value(bytes); |
- if ((offset + bytes) > length) { |
- throw new RangeError.value(offset + bytes); |
+ static void _checkReadWriteListArguments(int length, int start, int end) { |
+ if (start < 0) throw new RangeError.value(start); |
+ if (end < start) throw new RangeError.value(end); |
+ if (end > length) { |
+ throw new RangeError.value(end); |
} |
} |
- external static _readList(int id, List<int> buffer, int offset, int bytes); |
+ external static _readInto(int id, List<int> buffer, int start, int end); |
- int readListSync(List<int> buffer, int offset, int bytes) { |
+ int readIntoSync(List<int> buffer, [int start, int end]) { |
_checkNotClosed(); |
- if (buffer is !List || offset is !int || bytes is !int) { |
+ if (buffer is !List || |
+ (start != null && start is !int) || |
+ (end != null && end is !int)) { |
throw new FileIOException( |
- "Invalid arguments to readList for file '$_path'"); |
+ "Invalid arguments to readInto for file '$_path'"); |
} |
- if (bytes == 0) return 0; |
- _checkReadWriteListArguments(buffer.length, offset, bytes); |
- var result = _readList(_id, buffer, offset, bytes); |
+ if (start == null) start = 0; |
+ if (end == null) end = buffer.length; |
+ if (end == start) return 0; |
+ _checkReadWriteListArguments(buffer.length, start, end); |
+ var result = _readInto(_id, buffer, start, end); |
if (result is OSError) { |
- throw new FileIOException("readList failed for file '$_path'", |
+ throw new FileIOException("readInto failed for file '$_path'", |
result); |
} |
return result; |
@@ -810,67 +812,63 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile { |
return result; |
} |
- Future<RandomAccessFile> writeList(List<int> buffer, int offset, int bytes) { |
+ Future<RandomAccessFile> writeFrom(List<int> buffer, [int start, int end]) { |
_ensureFileService(); |
- Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
if ((buffer is !List && buffer is !ByteData) || |
- offset is !int || |
- bytes is !int) { |
- // Complete asynchronously so the user has a chance to setup |
- // handlers without getting exceptions when registering the |
- // then handler. |
- Timer.run(() { |
- completer.completeError(new FileIOException( |
- "Invalid arguments to writeList for file '$_path'")); |
- }); |
- return completer.future; |
+ (start != null && start is !int) || |
+ (end != null && end is !int)) { |
+ return new Future.immediateError(new FileIOException( |
+ "Invalid arguments to writeFrom for file '$_path'")); |
} |
+ Completer<RandomAccessFile> completer = new Completer<RandomAccessFile>(); |
+ |
if (closed) return _completeWithClosedException(completer); |
- _BufferAndOffset result; |
+ _BufferAndStart result; |
try { |
- result = _ensureFastAndSerializableBuffer(buffer, offset, bytes); |
+ result = _ensureFastAndSerializableBuffer(buffer, start, end); |
} catch (e) { |
- // Complete asynchronously so the user has a chance to setup |
- // handlers without getting exceptions when registering the |
- // then handler. |
- Timer.run(() => completer.completeError(e)); |
- return completer.future; |
+ return new Future.immediateError(e); |
} |
List request = new List(5); |
request[0] = _WRITE_LIST_REQUEST; |
request[1] = _id; |
request[2] = result.buffer; |
- request[3] = result.offset; |
- request[4] = bytes; |
+ request[3] = result.start; |
+ request[4] = end - (start - result.start); |
return _fileService.call(request).then((response) { |
if (_isErrorResponse(response)) { |
throw _exceptionFromResponse(response, |
- "writeList failed for file '$_path'"); |
+ "writeFrom failed for file '$_path'"); |
} |
return this; |
}); |
} |
- external static _writeList(int id, List<int> buffer, int offset, int bytes); |
+ external static _writeFrom(int id, List<int> buffer, int start, int end); |
- int writeListSync(List<int> buffer, int offset, int bytes) { |
+ void writeFromSync(List<int> buffer, [int start, int end]) { |
_checkNotClosed(); |
- if (buffer is !List || offset is !int || bytes is !int) { |
+ if (buffer is !List || |
+ (start != null && start is !int) || |
+ (end != null && end is !int)) { |
throw new FileIOException( |
- "Invalid arguments to writeList for file '$_path'"); |
+ "Invalid arguments to writeFrom for file '$_path'"); |
} |
- if (bytes == 0) return 0; |
- _checkReadWriteListArguments(buffer.length, offset, bytes); |
- _BufferAndOffset bufferAndOffset = |
- _ensureFastAndSerializableBuffer(buffer, offset, bytes); |
- var result = |
- _writeList(_id, bufferAndOffset.buffer, bufferAndOffset.offset, bytes); |
+ if (start == null) start = 0; |
+ if (end == null) end = buffer.length; |
+ if (end == start) return; |
+ _checkReadWriteListArguments(buffer.length, start, end); |
+ _BufferAndStart bufferAndStart = |
+ _ensureFastAndSerializableBuffer(buffer, start, end); |
+ var result = _writeFrom(_id, |
+ bufferAndStart.buffer, |
+ bufferAndStart.start, |
+ end - (start - bufferAndStart.start)); |
if (result is OSError) { |
- throw new FileIOException("writeList failed for file '$_path'", result); |
+ throw new FileIOException("writeFrom failed for file '$_path'", result); |
} |
- return result; |
} |
Future<RandomAccessFile> writeString(String string, |
@@ -884,16 +882,16 @@ class _RandomAccessFile extends _FileBase implements RandomAccessFile { |
return completer.future; |
} |
var data = _encodeString(string, encoding); |
- return writeList(data, 0, data.length); |
+ return writeFrom(data, 0, data.length); |
} |
- int writeStringSync(String string, {Encoding encoding: Encoding.UTF_8}) { |
+ void writeStringSync(String string, {Encoding encoding: Encoding.UTF_8}) { |
if (encoding is! Encoding) { |
throw new FileIOException( |
"Invalid encoding in writeStringSync: $encoding"); |
} |
var data = _encodeString(string, encoding); |
- return writeListSync(data, 0, data.length); |
+ writeFromSync(data, 0, data.length); |
} |
Future<int> position() { |