@@ -40,12 +40,12 @@ OF_KINDOF(OFStream *) _stream; uint64_t _toRead; bool _atEndOfStream; } -- (instancetype)initWithStream: (OFStream *)stream - entry: (OFTarArchiveEntry *)entry; +- (instancetype)of_initWithStream: (OFStream *)stream + entry: (OFTarArchiveEntry *)entry; - (void)of_skip; @end @interface OFTarArchive_FileWriteStream: OFStream { @@ -52,12 +52,12 @@ OFTarArchiveEntry *_entry; OF_KINDOF(OFStream *) _stream; uint64_t _toWrite; } -- (instancetype)initWithStream: (OFStream *)stream - entry: (OFTarArchiveEntry *)entry; +- (instancetype)of_initWithStream: (OFStream *)stream + entry: (OFTarArchiveEntry *)entry; @end @implementation OFTarArchive: OFObject @synthesize encoding = _encoding; @@ -74,10 +74,15 @@ { return [[[self alloc] initWithPath: path mode: mode] autorelease]; } #endif + +- (instancetype)init +{ + OF_INVALID_INIT_METHOD +} - (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream mode: (OFString *)mode { self = [super init]; @@ -201,12 +206,12 @@ entry = [[[OFTarArchiveEntry alloc] of_initWithHeader: buffer.c encoding: _encoding] autorelease]; _lastReturnedStream = [[OFTarArchive_FileReadStream alloc] - initWithStream: _stream - entry: entry]; + of_initWithStream: _stream + entry: entry]; return entry; } - (OFStream *)streamForReadingCurrentEntry @@ -237,12 +242,12 @@ [entry of_writeToStream: _stream encoding: _encoding]; _lastReturnedStream = [[OFTarArchive_FileWriteStream alloc] - initWithStream: _stream - entry: entry]; + of_initWithStream: _stream + entry: entry]; objc_autoreleasePoolPop(pool); return [[_lastReturnedStream retain] autorelease]; } @@ -268,12 +273,12 @@ _stream = nil; } @end @implementation OFTarArchive_FileReadStream -- (instancetype)initWithStream: (OFStream *)stream - entry: (OFTarArchiveEntry *)entry +- (instancetype)of_initWithStream: (OFStream *)stream + entry: (OFTarArchiveEntry *)entry { self = [super init]; @try { _entry = [entry copy]; @@ -344,18 +349,23 @@ return [_stream fileDescriptorForReading]; } - (void)close { + [self of_skip]; + [_stream release]; _stream = nil; [super close]; } - (void)of_skip { + if (_stream == nil || _toRead == 0) + return; + if ([_stream isKindOfClass: [OFSeekableStream class]] && _toRead <= INT64_MAX && (of_offset_t)_toRead == (int64_t)_toRead) { uint64_t size; [_stream seekToOffset: (of_offset_t)_toRead @@ -392,12 +402,12 @@ } } @end @implementation OFTarArchive_FileWriteStream -- (instancetype)initWithStream: (OFStream *)stream - entry: (OFTarArchiveEntry *)entry +- (instancetype)of_initWithStream: (OFStream *)stream + entry: (OFTarArchiveEntry *)entry { self = [super init]; @try { _entry = [entry copy];