Chromium Code Reviews| Index: runtime/bin/file_impl.dart |
| diff --git a/runtime/bin/file_impl.dart b/runtime/bin/file_impl.dart |
| index 58da22fef157c9aa7530dcf751ccf3c543e79e32..00f801d7d9585db6bb4f933fe94497dd1ea97265 100644 |
| --- a/runtime/bin/file_impl.dart |
| +++ b/runtime/bin/file_impl.dart |
| @@ -2,65 +2,67 @@ |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| -class _FileInputStream implements FileInputStream { |
| +class _FileInputStream implements InputStream { |
| _FileInputStream(File file) { |
| _file = file; |
| } |
| - bool read(List<int> buffer, int offset, int len, void callback()) { |
| - int bytesRead = _file.readList(buffer, offset, len); |
| - |
| - if (bytesRead == len) { |
| - if (callback != null) { |
| - callback(); |
| + List<int> read([int len]) { |
| + int bytesToRead = available(); |
| + if (bytesToRead == 0) { |
| + return null; |
| + } |
| + if (len != null) { |
| + if (len <= 0) { |
| + throw new StreamException("Illegal length $len"); |
| + } else if (bytesToRead > len) { |
| + bytesToRead = len; |
| } |
| - return true; |
| + } |
| + List<int> buffer = new List<int>(bytesToRead); |
| + int bytesRead = _file.readList(buffer, 0, bytesToRead); |
| + if (bytesRead < bytesToRead) { |
| + List<int> newBuffer = new List<int>(bytesRead); |
| + newBuffer.copyFrom(buffer, 0, 0, bytesRead); |
| + return newBuffer; |
| } else { |
| - throw "FileInputStream: read error"; |
| - } |
| - } |
| - |
| - // TODO(srdjan): Reading whole file at once does not scale. Implement partial |
| - // file reading and pattern checks. |
| - void readUntil(List<int> pattern, void callback(List<int> buffer)) { |
| - List<int> buffer = new List<int>(_file.length); |
| - int result = _file.readList(buffer, 0, _file.length); |
| - if (result > 0) { |
| - int index = indexOf(buffer, pattern); |
| - if (index != -1) { |
| - int resultBufferSize = index + pattern.length; |
| - List<int> resultBuffer = new List<int>(resultBufferSize); |
| - resultBuffer.copyFrom(buffer, 0, 0, resultBufferSize); |
| - callback(resultBuffer); |
| - } |
| + return buffer; |
| } |
| } |
| - // TODO(srdjan: move this method to Lists.dart (helper method). |
| - static int indexOf(List<int> buffer, List<int> pattern) { |
| - if (pattern.length == 0) { |
| - return buffer.length; |
| - } |
| - int len = buffer.length - pattern.length + 1; |
| - for (int index = 0; index < len; index++) { |
| - bool match = true; |
| - for (int k = 0; k < pattern.length; k++) { |
| - if (buffer[index + k] != pattern[k]) { |
| - match = false; |
| - break; |
| - } |
| - } |
| - if (match) { |
| - return index; |
| - } |
| - } |
| - return -1; |
| + int readInto(List<int> buffer, int offset, int len) { |
| + if (offset == null) offset = 0; |
| + if (len == null) len = buffer.length; |
| + if (offset < 0) throw new StreamException("Illegal offset $offset"); |
| + if (len < 0) throw new StreamException("Illegal length $len"); |
| + return _file.readList(buffer, offset, len); |
| + } |
| + |
| + int available() { |
| + return _file.length - _file.position; |
| + } |
| + |
| + bool closed() { |
| + _file.position == _file.length; |
| + } |
| + |
| + void set dataHandler(void callback()) { |
|
Mads Ager (google)
2011/10/26 10:56:07
I guess a dataHandler callback is scheduled immedi
Søren Gjesse
2011/10/26 12:03:31
I will address this in a separate cl.
|
| + // TODO(sgjesse): How to handle this? |
| + } |
| + |
| + void set closeHandler(void callback()) { |
|
Mads Ager (google)
2011/10/26 10:56:07
Maybe call this end instead. That would make sense
Søren Gjesse
2011/10/26 12:03:31
Will change from close to end in a separate cl.
|
| + // TODO(sgjesse): How to handle this? |
| + } |
| + |
| + void set errorHandler(void callback()) { |
| + // TODO(sgjesse): How to handle this? |
| } |
| File _file; |
| } |
| -class _FileOutputStream implements FileOutputStream { |
| + |
| +class _FileOutputStream implements OutputStream { |
| _FileOutputStream(File file) { |
| _file = file; |
| } |
| @@ -78,6 +80,7 @@ class _FileOutputStream implements FileOutputStream { |
| File _file; |
| } |
| + |
| // Class for encapsulating the native implementation of files. |
| class _File extends FileNativeWrapper implements File { |
| // Constructor for file. |
| @@ -197,8 +200,8 @@ class _File extends FileNativeWrapper implements File { |
| // Each file has an unique InputStream. |
| InputStream get inputStream() { |
| - if (_inputStream === null) { |
| - _inputStream = new FileInputStream(this); |
| + if (_inputStream == null) { |
| + _inputStream = new _FileInputStream(this); |
| } |
| return _inputStream; |
| } |
| @@ -208,8 +211,8 @@ class _File extends FileNativeWrapper implements File { |
| if (!_writeable) { |
| throw "File is not writable"; |
| } |
| - if (_outputStream === null) { |
| - _outputStream = new FileOutputStream(this); |
| + if (_outputStream == null) { |
| + _outputStream = new _FileOutputStream(this); |
| } |
| return _outputStream; |
| } |