| Index: utils/archive/input_stream.dart
|
| diff --git a/utils/archive/input_stream.dart b/utils/archive/input_stream.dart
|
| deleted file mode 100644
|
| index b71be4466c53b6cb0bbf581bfd7677be91bf48f3..0000000000000000000000000000000000000000
|
| --- a/utils/archive/input_stream.dart
|
| +++ /dev/null
|
| @@ -1,162 +0,0 @@
|
| -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| -// 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.
|
| -
|
| -library input_stream;
|
| -
|
| -import 'archive.dart' as archive;
|
| -import 'entry.dart';
|
| -import 'read_request.dart';
|
| -import 'utils.dart';
|
| -
|
| -/**
|
| - * A stream of [ArchiveEntry]s being read from an archive.
|
| - *
|
| - * This is accessible via [ArchiveReader].
|
| - */
|
| -class ArchiveInputStream {
|
| - /**
|
| - * The id of the underlying archive.
|
| - *
|
| - * This will be set to null once the input stream has finished reading from
|
| - * the archive.
|
| - */
|
| - final Reference<int> _id;
|
| -
|
| - /** A [Completer] that will fire once the [_onEntry] callback is set. */
|
| - final Completer<Function> _onEntryCompleter;
|
| -
|
| - /** The callback to call when the input stream is closed. */
|
| - Function _onClosed;
|
| -
|
| - /** The callback to call when an error occurs. */
|
| - Function _onError;
|
| -
|
| - /** The entry that is currently eligible to read data from the archive. */
|
| - ArchiveEntry _currentEntry;
|
| -
|
| - ArchiveInputStream(int id)
|
| - : _id = new Reference<int>(id),
|
| - _onEntryCompleter = new Completer<Function>() {
|
| - var future = _consumeHeaders();
|
| - future.handleException((e) {
|
| - if (_onError != null) {
|
| - _onError(e, future.stackTrace);
|
| - return true;
|
| - } else {
|
| - throw e;
|
| - }
|
| - });
|
| -
|
| - future.then((_) {
|
| - close();
|
| - if (_onClosed != null) _onClosed();
|
| - });
|
| -
|
| - attachFinalizer(this, (id) {
|
| - if (id.value != null) call(FREE, id.value).then(() {});
|
| - }, _id);
|
| - }
|
| -
|
| - /** Whether this stream has finished reading entries. */
|
| - bool get closed => _id.value == null;
|
| -
|
| - /**
|
| - * Reads the entire contents of the archive at once.
|
| - *
|
| - * Note that this is mutually exclusive with reading individual entries using
|
| - * [onEntry].
|
| - */
|
| - Future<List<CompleteArchiveEntry>> readAll() {
|
| - var completer = new Completer<List<Future<CompleteArchiveEntry>>>();
|
| - var result = <Future<CompleteArchiveEntry>>[];
|
| -
|
| - this.onEntry = (entry) => result.add(entry.readAll());
|
| - this.onError = (e, stack) => completer.completeError(e, stack);
|
| - this.onClosed = () => completer.complete(result);
|
| -
|
| - return completer.future.then(Future.wait);
|
| - }
|
| -
|
| - /**
|
| - * Sets a callback to call when a new entry is read from the archive.
|
| - *
|
| - * The [ArchiveEntry] that's read from an archive initially only contains
|
| - * header information such as the filename and permissions. To get the actual
|
| - * data contained in the entry, use [ArchiveEntry.openInputStream].
|
| - *
|
| - * Since the entries are read in sequence from the archive, the data stream
|
| - * for one entry must be opened before the next entry is read from the
|
| - * archive. The next entry will not be read until the return value of
|
| - * [callback] has completed.
|
| - *
|
| - * If [callback] calls [ArchiveEntry.openInputStream] before it returns, or if
|
| - * it doesn't want to read the contents of [entry], it can return null.
|
| - */
|
| - void set onEntry(Future callback(ArchiveEntry entry)) {
|
| - _onEntryCompleter.complete(callback);
|
| - }
|
| -
|
| - /**
|
| - * Sets a callback to call when the input stream is done emitting entries.
|
| - */
|
| - void set onClosed(void callback()) {
|
| - _onClosed = callback;
|
| - }
|
| -
|
| - /**
|
| - * Sets a callback to call if an error occurs while extracting the archive.
|
| - *
|
| - * [e] is the error that occured and [stack] is the stack trace of the error.
|
| - */
|
| - void set onError(void callback(e, stack)) {
|
| - _onError = callback;
|
| - }
|
| -
|
| - /**
|
| - * Closes the input stream. No more entries will be emitted.
|
| - */
|
| - void close() {
|
| - if (closed) return;
|
| - call(FREE, _id.value).then((_) {});
|
| - _id.value = null;
|
| - if (_currentEntry != null) _currentEntry.close();
|
| - if (!_onEntryCompleter.future.isComplete) _onEntryCompleter.complete(null);
|
| - }
|
| -
|
| - /**
|
| - * Consumes and emits all [ArchiveEntries] in this archive.
|
| - */
|
| - Future _consumeHeaders() {
|
| - if (closed) return new Future.immediate(null);
|
| - var data;
|
| - return call(NEXT_HEADER, _id.value).then((_data) {
|
| - data = _data;
|
| - if (data == null) return new Future.immediate(null);
|
| - return _emit(new archive.ArchiveEntry.internal(data, _id.value)).
|
| - then((_) => _consumeHeaders());
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Emits [entry] to the [onEntry] callback. Returns a [Future] that will
|
| - * complete once the callback's return value completes and the entry's data
|
| - * has been fully consumed.
|
| - */
|
| - Future _emit(ArchiveEntry entry) {
|
| - _currentEntry = entry;
|
| - var future = _onEntryCompleter.future.then((onEntry) {
|
| - if (closed) return new Future.immediate(null);
|
| - var result = onEntry(entry);
|
| - if (result is Future) return result;
|
| - return new Future.immediate(null);
|
| - }).then((_) {
|
| - if (entry.isInputOpen) return entry.inputComplete;
|
| - return new Future.immediate(null);
|
| - }).whenComplete(() {
|
| - _currentEntry = null;
|
| - entry.close();
|
| - });
|
| - return future;
|
| - }
|
| -}
|
|
|