| Index: utils/archive/entry.dart
|
| diff --git a/utils/archive/entry.dart b/utils/archive/entry.dart
|
| deleted file mode 100644
|
| index f851959d6158d15ed8d22ab24db6311d0ee50c78..0000000000000000000000000000000000000000
|
| --- a/utils/archive/entry.dart
|
| +++ /dev/null
|
| @@ -1,337 +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 entry;
|
| -
|
| -import 'dart:io';
|
| -import 'archive.dart' as archive;
|
| -import 'entry_request.dart';
|
| -import 'read_request.dart' as read;
|
| -import 'utils.dart';
|
| -
|
| -/**
|
| - * A single file in an archive.
|
| - *
|
| - * This is accessible via [ArchiveInputStream.onEntry].
|
| - */
|
| -class ArchiveEntry {
|
| - /**
|
| - * The various properties of this archive entry, as sent over from the C
|
| - * extension.
|
| - */
|
| - final List _properties;
|
| -
|
| - /**
|
| - * The id of the archive to which this entry belongs. Used to read the entry
|
| - * data. This will be set to null once there's no longer data available to be
|
| - * read for this entry.
|
| - */
|
| - int _archiveId;
|
| -
|
| - /**
|
| - * The input stream being used to read data from this entry. This is null
|
| - * until [openInputStream] is called.
|
| - */
|
| - InputStream _input;
|
| -
|
| - // TODO(nweiz): Get rid of this once issue 4202 is fixed.
|
| - /**
|
| - * A future that only exists once [openInputStream] is called, and completes
|
| - * once the input stream is closed.
|
| - *
|
| - * For internal use only.
|
| - */
|
| - Future inputComplete;
|
| -
|
| - ArchiveEntry.internal(this._properties, this._archiveId) {
|
| - attachFinalizer(this, (id) => call(FREE, id), _id);
|
| - }
|
| -
|
| - /** Create a new [ArchiveEntry] with default values for all of its fields. */
|
| - static Future<ArchiveEntry> create() {
|
| - return call(NEW).then((properties) {
|
| - return new archive.ArchiveEntry.internal(properties, null);
|
| - });
|
| - }
|
| -
|
| - /** The id of the underlying archive entry. */
|
| - int get _id => _properties[0];
|
| -
|
| - /** If this entry is a hardlink, this is the destination. Otherwise, null. */
|
| - String get hardlink => _properties[1];
|
| - set hardlink(String value) => _set(SET_HARDLINK, 1, value);
|
| -
|
| - /** The path to this entry in the archive. */
|
| - String get pathname => _properties[2];
|
| - set pathname(String value) => _set(SET_PATHNAME, 2, value);
|
| -
|
| - /** The path to this entry on disk, */
|
| - String get sourcepath => _properties[3];
|
| -
|
| - /** If this entry is a symlink, this is the destination. Otherwise, null. */
|
| - String get symlink => _properties[4];
|
| - set symlink(String value) => _set(SET_SYMLINK, 4, value);
|
| -
|
| - /** The group identifier for this entry. */
|
| - int get gid => _properties[5];
|
| - set gid(int value) => _set(SET_GID, 5, value);
|
| -
|
| - /** The user identifier for this entry. */
|
| - int get uid => _properties[6];
|
| - set uid(int value) => _set(SET_UID, 6, value);
|
| -
|
| - /** The permissions bitmask for this entry. */
|
| - int get perm_mask => _properties[7];
|
| - set perm_mask(int value) => _set(SET_PERM, 7, value);
|
| -
|
| - /**
|
| - * The String representation of the permissions for this entry.
|
| - *
|
| - * Note that if you set [perm_mask], this value will not change.
|
| - */
|
| - String get strmode => _properties[8];
|
| -
|
| - /** The name of the group this entry belongs to. */
|
| - String get gname => _properties[9];
|
| - set gname(String value) => _set(SET_GNAME, 9, value);
|
| -
|
| - /** The name of the user this entry belongs to. */
|
| - String get uname => _properties[10];
|
| - set uname(String value) => _set(SET_UNAME, 10, value);
|
| -
|
| - /**
|
| - * The file flag bits that should be set for this entry.
|
| - *
|
| - * Note that if you set [fflags_text], this value will not change, and vice
|
| - * versa.
|
| - */
|
| - int get fflags_set => _properties[11];
|
| - set fflags_set(int value) => _set(SET_FFLAGS_SET, 11, value);
|
| -
|
| - /**
|
| - * The file flag bits that should be cleared for this entry.
|
| - *
|
| - * Note that if you set [fflags_text], this value will not change, and vice
|
| - * versa.
|
| - */
|
| - int get fflags_clear => _properties[12];
|
| - set fflags_clear(int value) => _set(SET_FFLAGS_CLEAR, 12, value);
|
| -
|
| - /**
|
| - * The textual representation of the file flags for this entry.
|
| - *
|
| - * Note that if you set [fflags_set] or [fflags_clear], this value will not
|
| - * change, and vice versa.
|
| - */
|
| - String get fflags_text => _properties[13];
|
| -
|
| - /** The filetype bitmask for this entry. */
|
| - int get filetype_mask => _properties[14];
|
| - set filetype_mask(int value) => _set(SET_FILETYPE, 14, value);
|
| -
|
| - /** The filetype and permissions bitmask for this entry. */
|
| - int get mode_mask => _properties[15];
|
| - set mode_mask(int value) => _set(SET_MODE, 15, value);
|
| -
|
| - /** The size of this entry in bytes, or null if it's unset. */
|
| - int get size => _properties[16];
|
| - set size(int value) => _set(SET_SIZE, 16, value);
|
| -
|
| - /** The ID of the device containing this entry, or null if it's unset. */
|
| - int get dev => _properties[17];
|
| - set dev(int value) => _set(SET_DEV, 17, value);
|
| -
|
| - /** The major number of the ID of the device containing this entry. */
|
| - int get devmajor => _properties[18];
|
| - set devmajor(int value) => _set(SET_DEVMAJOR, 18, value);
|
| -
|
| - /** The minor number of the ID of the device containing this entry. */
|
| - int get devminor => _properties[19];
|
| - set devminor(int value) => _set(SET_DEVMINOR, 19, value);
|
| -
|
| - /** The inode number of this entry, or null if it's unset. */
|
| - int get ino => _properties[20];
|
| - set ino(int value) => _set(SET_INO, 20, value);
|
| -
|
| - /** The number of references to this entry. */
|
| - int get nlink => _properties[21];
|
| - set nlink(int value) => _set(SET_NLINK, 21, value);
|
| -
|
| - /** The device ID of this entry. */
|
| - int get rdev => _properties[22];
|
| - set rdev(int value) => _set(SET_RDEV, 22, value);
|
| -
|
| - /** The major number of the device ID of this entry. */
|
| - int get rdevmajor => _properties[23];
|
| - set rdevmajor(int value) => _set(SET_RDEVMAJOR, 23, value);
|
| -
|
| - /** The minor number of the device ID of this entry. */
|
| - int get rdevminor => _properties[24];
|
| - set rdevminor(int value) => _set(SET_RDEVMINOR, 24, value);
|
| -
|
| - /** The last time this entry was accessed, or null if it's unset. */
|
| - Date get atime => _fromMs(_properties[25]);
|
| - set atime(Date value) => _set(SET_ATIME, 25, _toMs(value));
|
| -
|
| - /** The time this entry was created, or null if it's unset. */
|
| - Date get birthtime => _fromMs(_properties[26]);
|
| - set birthtime(Date value) => _set(SET_BIRTHTIME, 26, _toMs(value));
|
| -
|
| - /**
|
| - * The last time an inode property of this entry was changed, or null if it's
|
| - * unset.
|
| - */
|
| - Date get ctime => _fromMs(_properties[27]);
|
| - set ctime(Date value) => _set(SET_CTIME, 27, _toMs(value));
|
| -
|
| - /** The last time this entry was modified, or null if it's unset. */
|
| - Date get mtime => _fromMs(_properties[28]);
|
| - set mtime(Date value) => _set(SET_MTIME, 28, _toMs(value));
|
| -
|
| - /** Whether [openInputStream] has been called. */
|
| - bool get isInputOpen => _input != null;
|
| -
|
| - /** Create a deep copy of this [ArchiveEntry]. */
|
| - Future<ArchiveEntry> clone() {
|
| - return call(CLONE, _id).
|
| - transform((array) => new archive.ArchiveEntry.internal(array, null));
|
| - }
|
| -
|
| - /**
|
| - * Consumes the entire contents of this entry at once and returns it wrapped
|
| - * in a [CompleteArchiveEntry]. All metadata fields in the returned entry are
|
| - * copies of the fields in this entry.
|
| - *
|
| - * This may not be called if [openInputStream] is called, and vice versa.
|
| - */
|
| - Future<CompleteArchiveEntry> readAll() {
|
| - var stream = openInputStream();
|
| - var buffer = <int>[];
|
| - var completer = new Completer<List<int>>();
|
| -
|
| - stream.onData = () => buffer.addAll(stream.read());
|
| - stream.onError = completer.completeError;
|
| - stream.onClosed = () => completer.complete(buffer);
|
| -
|
| - return Future.wait([call(CLONE, _id), completer.future])
|
| - .then((list) => new CompleteArchiveEntry._(list[0], list[1]));
|
| - }
|
| -
|
| - /**
|
| - * Set a property value with index [value] on the local representation of the
|
| - * archive entry and on the native representation.
|
| - */
|
| - void _set(int requestType, int index, value) {
|
| - _properties[index] = value;
|
| - // Since the native code processes messages in order, the SET_* messages
|
| - // will be received and processed before any further messages.
|
| - call(requestType, _id, [value]).then((_) {});
|
| - }
|
| -
|
| - /**
|
| - * Converts [ms], the (possibly null) number of milliseconds since the epoch
|
| - * into a Date object (which may also be null).
|
| - */
|
| - Date _fromMs(int ms) {
|
| - if (ms == null) return null;
|
| - return new Date.fromMillisecondsSinceEpoch(ms);
|
| - }
|
| -
|
| - /**
|
| - * Converts [date], which may be null, into the number of milliseconds since
|
| - * the epoch (which may also be null).
|
| - */
|
| - int _toMs(Date date) {
|
| - if (date == null) return null;
|
| - return date.millisecondsSinceEpoch;
|
| - }
|
| -
|
| - /**
|
| - * Creates a new input stream for reading the contents of this entry.
|
| - *
|
| - * The contents of an entry must be consumed before the next entry is read
|
| - * from the parent [ArchiveInputStream]. This means that [openInputStream]
|
| - * must be called from the [ArchiveInputStream.onEntry] callback, or before
|
| - * the future returned by that callback completes. Once the next entry has
|
| - * been read, calling [openInputStream] will throw an [ArchiveException].
|
| - *
|
| - * Only one input stream may be opened per entry.
|
| - */
|
| - InputStream openInputStream() {
|
| - if (_archiveId == null) {
|
| - throw new UnsupportedError("Cannot open input stream for "
|
| - "archive entry $pathname.");
|
| - } else if (_input != null) {
|
| - throw new UnsupportedError("An input stream has already been"
|
| - "opened for archive entry $pathname.");
|
| - }
|
| -
|
| - var inputCompleter = new Completer();
|
| - inputComplete = inputCompleter.future;
|
| -
|
| - _input = new ListInputStream();
|
| - // TODO(nweiz): Report errors once issue 3657 is fixed
|
| - var future = _consumeInput().then((_) {
|
| - if (!_input.closed) _input.markEndOfStream();
|
| - // Asynchronously complete to give the InputStream callbacks a chance to
|
| - // fire.
|
| - return async();
|
| - }).then((_) => inputCompleter.complete(null));
|
| -
|
| - future.handleException((e) {
|
| - print(e);
|
| - print(future.stackTrace);
|
| - });
|
| - return _input;
|
| - }
|
| -
|
| - /**
|
| - * Close this entry so that its input stream no longer produces data.
|
| - *
|
| - * In addition to closing the associated input stream, this will prevent new
|
| - * input streams from being opened.
|
| - */
|
| - void close() {
|
| - _archiveId = null;
|
| - if (_input != null) _input.close();
|
| - }
|
| -
|
| - /**
|
| - * Read all data from the archive and write it to [_input]. Returns a future
|
| - * that completes once this is done.
|
| - *
|
| - * This assumes that both [_input] and [_archiveId] are non-null and that
|
| - * [_input] is open, although if that changes before this completes it will
|
| - * handle it gracefully.
|
| - */
|
| - Future _consumeInput() {
|
| - var data;
|
| - return call(read.DATA_BLOCK, _archiveId).then((_data) {
|
| - data = _data;
|
| - // TODO(nweiz): This async() call is only necessary because of issue 4222.
|
| - return async();
|
| - }).then((_) {
|
| - if (_input.closed || _archiveId == null || data == null) {
|
| - return new Future.immediate(null);
|
| - }
|
| - _input.write(data);
|
| - return _consumeInput();
|
| - });
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * An [ArchiveEntry] that contains the complete decompressed contents of the
|
| - * file.
|
| - */
|
| -class CompleteArchiveEntry extends ArchiveEntry {
|
| - /** The contents of the entry as bytes. */
|
| - final List<int> contentBytes;
|
| -
|
| - /** The contents of the entry as a string. */
|
| - String get contents => new String.fromCharCodes(contentBytes);
|
| -
|
| - CompleteArchiveEntry._(List properties, this.contentBytes)
|
| - : super.internal(properties, null);
|
| -}
|
|
|