@@ -74,12 +74,12 @@ - (bool)matchesEntry: (OFZIPArchiveEntry *)entry; @end @interface OFZIPArchive_FileReadStream: OFStream { - OF_KINDOF(OFStream *) _stream; - OF_KINDOF(OFStream *) _decompressedStream; + OFStream *_stream; + OFStream *_decompressedStream; OFZIPArchiveEntry *_entry; uint64_t _toRead; uint32_t _CRC32; bool _atEndOfStream; } @@ -141,21 +141,21 @@ { @try { [stream seekToOffset: offset whence: whence]; } @catch (OFSeekFailedException *e) { - if ([e errNo] == EINVAL) + if (e.errNo == EINVAL) @throw [OFInvalidFormatException exception]; @throw e; } } @implementation OFZIPArchive @synthesize archiveComment = _archiveComment; -+ (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream ++ (instancetype)archiveWithStream: (OFStream *)stream mode: (OFString *)mode { return [[[self alloc] initWithStream: stream mode: mode] autorelease]; } @@ -172,11 +172,11 @@ - (instancetype)init { OF_INVALID_INIT_METHOD } -- (instancetype)initWithStream: (OF_KINDOF(OFStream *))stream +- (instancetype)initWithStream: (OFStream *)stream mode: (OFString *)mode { self = [super init]; @try { @@ -202,11 +202,11 @@ [self of_readEntries]; } if (_mode == OF_ZIP_ARCHIVE_MODE_APPEND) { _offset = _centralDirectoryOffset; - seekOrThrowInvalidFormat(_stream, + seekOrThrowInvalidFormat((OFSeekableStream *)_stream, (of_offset_t)_offset, SEEK_SET); } } @catch (id e) { /* * If we are in write or append mode, we do not want -[close] @@ -266,11 +266,12 @@ uint16_t commentLength; of_offset_t offset = -22; bool valid = false; do { - seekOrThrowInvalidFormat(_stream, offset, SEEK_END); + seekOrThrowInvalidFormat((OFSeekableStream *)_stream, + offset, SEEK_END); if ([_stream readLittleEndianInt32] == 0x06054B50) { valid = true; break; } @@ -298,11 +299,12 @@ _centralDirectorySize == 0xFFFFFFFF || _centralDirectoryOffset == 0xFFFFFFFF) { int64_t offset64; uint64_t size; - seekOrThrowInvalidFormat(_stream, offset - 20, SEEK_END); + seekOrThrowInvalidFormat((OFSeekableStream *)_stream, + offset - 20, SEEK_END); if ([_stream readLittleEndianInt32] != 0x07064B50) { objc_autoreleasePoolPop(pool); return; } @@ -315,11 +317,11 @@ offset64 = [_stream readLittleEndianInt64]; if (offset64 < 0 || (of_offset_t)offset64 != offset64) @throw [OFOutOfRangeException exception]; - seekOrThrowInvalidFormat(_stream, + seekOrThrowInvalidFormat((OFSeekableStream *)_stream, (of_offset_t)offset64, SEEK_SET); if ([_stream readLittleEndianInt32] != 0x06064B50) @throw [OFInvalidFormatException exception]; @@ -355,23 +357,23 @@ if (_centralDirectoryOffset < 0 || (of_offset_t)_centralDirectoryOffset != _centralDirectoryOffset) @throw [OFOutOfRangeException exception]; - seekOrThrowInvalidFormat(_stream, + seekOrThrowInvalidFormat((OFSeekableStream *)_stream, (of_offset_t)_centralDirectoryOffset, SEEK_SET); for (size_t i = 0; i < _centralDirectoryEntries; i++) { OFZIPArchiveEntry *entry = [[[OFZIPArchiveEntry alloc] of_initWithStream: _stream] autorelease]; - if ([_pathToEntryMap objectForKey: [entry fileName]] != nil) + if ([_pathToEntryMap objectForKey: entry.fileName] != nil) @throw [OFInvalidFormatException exception]; [_entries addObject: entry]; [_pathToEntryMap setObject: entry - forKey: [entry fileName]]; + forKey: entry.fileName]; } objc_autoreleasePoolPop(pool); } @@ -388,11 +390,11 @@ - (void)setArchiveComment: (OFString *)comment { void *pool = objc_autoreleasePoolPush(); OFString *old; - if ([comment UTF8StringLength] > UINT16_MAX) + if (comment.UTF8StringLength > UINT16_MAX) @throw [OFOutOfRangeException exception]; old = _archiveComment; _archiveComment = [comment copy]; [old release]; @@ -442,15 +444,16 @@ mode: @"r" errNo: ENOENT]; [self of_closeLastReturnedStream]; - offset64 = [entry of_localFileHeaderOffset]; + offset64 = entry.of_localFileHeaderOffset; if (offset64 < 0 || (of_offset_t)offset64 != offset64) @throw [OFOutOfRangeException exception]; - seekOrThrowInvalidFormat(_stream, (of_offset_t)offset64, SEEK_SET); + seekOrThrowInvalidFormat((OFSeekableStream *)_stream, + (of_offset_t)offset64, SEEK_SET); localFileHeader = [[[OFZIPArchive_LocalFileHeader alloc] initWithStream: _stream] autorelease]; if (![localFileHeader matchesEntry: entry]) @throw [OFInvalidFormatException exception]; @@ -488,46 +491,45 @@ @throw [OFInvalidArgumentException exception]; pool = objc_autoreleasePoolPush(); entry = [[entry_ mutableCopy] autorelease]; - if ([_pathToEntryMap objectForKey: [entry fileName]] != nil) + if ([_pathToEntryMap objectForKey: entry.fileName] != nil) @throw [OFOpenItemFailedException - exceptionWithPath: [entry fileName] + exceptionWithPath: entry.fileName mode: @"w" errNo: EEXIST]; - if ([entry compressionMethod] != + if (entry.compressionMethod != OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE) @throw [OFNotImplementedException exceptionWithSelector: _cmd object: self]; [self of_closeLastReturnedStream]; - fileName = [entry fileName]; - fileNameLength = [fileName UTF8StringLength]; - extraField = [entry extraField]; - extraFieldLength = [extraField count]; + fileName = entry.fileName; + fileNameLength = fileName.UTF8StringLength; + extraField = entry.extraField; + extraFieldLength = extraField.count; if (UINT16_MAX - extraFieldLength < 20) @throw [OFOutOfRangeException exception]; - [entry setVersionMadeBy: ([entry versionMadeBy] & 0xFF00) | 45]; - [entry setMinVersionNeeded: ([entry minVersionNeeded] & 0xFF00) | 45]; - [entry setCompressedSize: 0]; - [entry setUncompressedSize: 0]; - [entry setCRC32: 0]; - [entry setGeneralPurposeBitFlag: - [entry generalPurposeBitFlag] | (1 << 3) | (1 << 11)]; - [entry of_setLocalFileHeaderOffset: _offset]; + entry.versionMadeBy = (entry.versionMadeBy & 0xFF00) | 45; + entry.minVersionNeeded = (entry.minVersionNeeded & 0xFF00) | 45; + entry.compressedSize = 0; + entry.uncompressedSize = 0; + entry.CRC32 = 0; + entry.generalPurposeBitFlag |= (1 << 3) | (1 << 11); + entry.of_localFileHeaderOffset = _offset; [_stream writeLittleEndianInt32: 0x04034B50]; - [_stream writeLittleEndianInt16: [entry minVersionNeeded]]; - [_stream writeLittleEndianInt16: [entry generalPurposeBitFlag]]; - [_stream writeLittleEndianInt16: [entry compressionMethod]]; - [_stream writeLittleEndianInt16: [entry of_lastModifiedFileTime]]; - [_stream writeLittleEndianInt16: [entry of_lastModifiedFileDate]]; + [_stream writeLittleEndianInt16: entry.minVersionNeeded]; + [_stream writeLittleEndianInt16: entry.generalPurposeBitFlag]; + [_stream writeLittleEndianInt16: entry.compressionMethod]; + [_stream writeLittleEndianInt16: entry.of_lastModifiedFileTime]; + [_stream writeLittleEndianInt16: entry.of_lastModifiedFileDate]; /* We use the data descriptor */ [_stream writeLittleEndianInt32: 0]; /* We use ZIP64 */ [_stream writeLittleEndianInt32: 0xFFFFFFFF]; [_stream writeLittleEndianInt32: 0xFFFFFFFF]; @@ -604,11 +606,11 @@ [_stream writeLittleEndianInt16: 0xFFFF]; /* CD disk */ [_stream writeLittleEndianInt16: 0xFFFF]; /* CD entries in disk */ [_stream writeLittleEndianInt16: 0xFFFF]; /* CD entries */ [_stream writeLittleEndianInt32: 0xFFFFFFFF]; /* CD size */ [_stream writeLittleEndianInt32: 0xFFFFFFFF]; /* CD offset */ - [_stream writeLittleEndianInt16: [_archiveComment UTF8StringLength]]; + [_stream writeLittleEndianInt16: _archiveComment.UTF8StringLength]; if (_archiveComment != nil) [_stream writeString: _archiveComment]; objc_autoreleasePoolPop(pool); } @@ -685,11 +687,11 @@ @throw [OFInvalidFormatException exception]; [extraField removeItemsInRange: range]; } - if ([extraField count] > 0) { + if (extraField.count > 0) { [extraField makeImmutable]; _extraField = [extraField copy]; } objc_autoreleasePoolPop(pool); @@ -709,22 +711,22 @@ [super dealloc]; } - (bool)matchesEntry: (OFZIPArchiveEntry *)entry { - if (_compressionMethod != [entry compressionMethod] || - _lastModifiedFileTime != [entry of_lastModifiedFileTime] || - _lastModifiedFileDate != [entry of_lastModifiedFileDate]) + if (_compressionMethod != entry.compressionMethod || + _lastModifiedFileTime != entry.of_lastModifiedFileTime || + _lastModifiedFileDate != entry.of_lastModifiedFileDate) return false; if (!(_generalPurposeBitFlag & (1 << 3))) - if (_CRC32 != [entry CRC32] || - _compressedSize != [entry compressedSize] || - _uncompressedSize != [entry uncompressedSize]) + if (_CRC32 != entry.CRC32 || + _compressedSize != entry.compressedSize || + _uncompressedSize != entry.uncompressedSize) return false; - if (![_fileName isEqual: [entry fileName]]) + if (![_fileName isEqual: entry.fileName]) return false; return true; } @end @@ -736,11 +738,11 @@ self = [super init]; @try { _stream = [stream retain]; - switch ([entry compressionMethod]) { + switch (entry.compressionMethod) { case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_NONE: _decompressedStream = [stream retain]; break; case OF_ZIP_ARCHIVE_ENTRY_COMPRESSION_METHOD_DEFLATE: _decompressedStream = [[OFInflateStream alloc] @@ -755,11 +757,11 @@ exceptionWithSelector: _cmd object: self]; } _entry = [entry copy]; - _toRead = [entry uncompressedSize]; + _toRead = entry.uncompressedSize; _CRC32 = ~0; } @catch (id e) { [self release]; @throw e; } @@ -795,12 +797,11 @@ @throw [OFNotOpenException exceptionWithObject: self]; if (_atEndOfStream) return 0; - if ([_stream isAtEndOfStream] && - ![_decompressedStream hasDataInReadBuffer]) + if (_stream.atEndOfStream && !_decompressedStream.hasDataInReadBuffer) @throw [OFTruncatedDataException exception]; #if SIZE_MAX >= UINT64_MAX if (length > UINT64_MAX) @throw [OFOutOfRangeException exception]; @@ -816,15 +817,15 @@ _CRC32 = of_crc32(_CRC32, buffer, ret); if (_toRead == 0) { _atEndOfStream = true; - if (~_CRC32 != [_entry CRC32]) { + if (~_CRC32 != _entry.CRC32) { OFString *actualChecksum = [OFString stringWithFormat: @"%08" PRIX32, ~_CRC32]; OFString *expectedChecksum = [OFString stringWithFormat: - @"%08" PRIX32, [_entry CRC32]]; + @"%08" PRIX32, _entry.CRC32]; @throw [OFChecksumMismatchException exceptionWithActualChecksum: actualChecksum expectedChecksum: expectedChecksum]; } @@ -833,17 +834,18 @@ return ret; } - (bool)hasDataInReadBuffer { - return ([super hasDataInReadBuffer] || - [_decompressedStream hasDataInReadBuffer]); + return (super.hasDataInReadBuffer || + _decompressedStream.hasDataInReadBuffer); } - (int)fileDescriptorForReading { - return [_decompressedStream fileDescriptorForReading]; + return ((id )_decompressedStream) + .fileDescriptorForReading; } - (void)close { [_stream release]; @@ -912,13 +914,13 @@ [_stream writeLittleEndianInt64: _bytesWritten]; [_stream release]; _stream = nil; - [_entry setCRC32: ~_CRC32]; - [_entry setCompressedSize: _bytesWritten]; - [_entry setUncompressedSize: _bytesWritten]; + _entry.CRC32 = ~_CRC32; + _entry.compressedSize = _bytesWritten; + _entry.uncompressedSize = _bytesWritten; [_entry makeImmutable]; _bytesWritten += (2 * 4 + 2 * 8); } @end