blob: 9d8eebe386dc4e4fc8c62b03b16c0c84eaf61dd4 [file] [log] [blame]
part of archive;
/**
* A file contained in an Archive.
*/
class ArchiveFile {
static const int STORE = 0;
static const int DEFLATE = 8;
String name;
/// The uncompressed size of the file
int size;
int mode;
int ownerId = 0;
int groupId = 0;
int lastModTime;
bool isFile = true;
/// The unix permissions of the file stored in base 8. Use .toRadixString(8)
/// to convert to the chmod format (e.g. 777).
int unixPermissions;
/// The crc32 checksum of the uncompressed content.
int crc32;
String comment;
/// If false, this file will not be compressed when encoded to an archive
/// format such as zip.
bool compress = true;
ArchiveFile(this.name, this.size, content,
[this._compressionType = STORE]) {
if (content is List<int>) {
_content = content;
_rawContent = new InputStream(_content);
} else if (content is InputStream) {
_rawContent = new InputStream.from(content);
}
}
ArchiveFile.noCompress(this.name, this.size, content) {
compress = false;
if (content is List<int>) {
_content = content;
_rawContent = new InputStream(_content);
} else if (content is InputStream) {
_rawContent = new InputStream.from(content);
}
}
ArchiveFile.stream(this.name, this.size, content_stream) {
compress = false;
_content = content_stream;
//_rawContent = content_stream;
_compressionType = STORE;
}
/**
* Get the content of the file, decompressing on demand as necessary.
*/
dynamic get content {
if (_content == null) {
decompress();
}
return _content;
}
/**
* If the file data is compressed, decompress it.
*/
void decompress() {
if (_content == null && _rawContent != null) {
if (_compressionType == DEFLATE) {
_content = new Inflate.buffer(_rawContent, size).getBytes();
} else {
_content = _rawContent.toUint8List();
}
_compressionType = STORE;
}
}
/**
* Is the data stored by this file currently compressed?
*/
bool get isCompressed => _compressionType != STORE;
/**
* What type of compression is the raw data stored in
*/
int get compressionType => _compressionType;
/**
* Get the content without decompressing it first.
*/
InputStream get rawContent => _rawContent;
String toString() => name;
int _compressionType;
InputStream _rawContent;
dynamic _content;
}