Index: src/OFGZIPStream.h ================================================================== --- src/OFGZIPStream.h +++ src/OFGZIPStream.h @@ -18,10 +18,31 @@ @class OFInflateStream; OF_ASSUME_NONNULL_BEGIN +/** + * @brief The operating system on which compressed the data. + */ +typedef enum OFGZIPStreamOperatingSystem { + OFGZIPStreamOperatingSystemFAT = 0, + OFGZIPStreamOperatingSystemAmiga = 1, + OFGZIPStreamOperatingSystemVMS = 2, + OFGZIPStreamOperatingSystemUNIX = 3, + OFGZIPStreamOperatingSystemVM_CMS = 4, + OFGZIPStreamOperatingSystemAtariTOS = 5, + OFGZIPStreamOperatingSystemHPFS = 6, + OFGZIPStreamOperatingSystemMacintosh = 7, + OFGZIPStreamOperatingSystemZSystem = 8, + OFGZIPStreamOperatingSystemCP_M = 9, + OFGZIPStreamOperatingSystemTOPS20 = 10, + OFGZIPStreamOperatingSystemNTFS = 11, + OFGZIPStreamOperatingSystemQDO = 12, + OFGZIPStreamOperatingSystemAcornRISCOS = 13, + OFGZIPStreamOperatingSystemUnknown = 255 +} OFGZIPStreamOperatingSystem; + /** * @class OFGZIPStream OFGZIPStream.h ObjFW/OFGZIPStream.h * * @brief A class that handles GZIP compression and decompression transparently * for an underlying stream. @@ -29,52 +50,36 @@ OF_SUBCLASSING_RESTRICTED @interface OFGZIPStream: OFStream { OFStream *_stream; OFInflateStream *_Nullable _inflateStream; - enum of_gzip_stream_state { - OF_GZIP_STREAM_ID1, - OF_GZIP_STREAM_ID2, - OF_GZIP_STREAM_COMPRESSION_METHOD, - OF_GZIP_STREAM_FLAGS, - OF_GZIP_STREAM_MODIFICATION_TIME, - OF_GZIP_STREAM_EXTRA_FLAGS, - OF_GZIP_STREAM_OPERATING_SYSTEM, - OF_GZIP_STREAM_EXTRA_LENGTH, - OF_GZIP_STREAM_EXTRA, - OF_GZIP_STREAM_NAME, - OF_GZIP_STREAM_COMMENT, - OF_GZIP_STREAM_HEADER_CRC16, - OF_GZIP_STREAM_DATA, - OF_GZIP_STREAM_CRC32, - OF_GZIP_STREAM_UNCOMPRESSED_SIZE + enum { + OFGZIPStreamStateID1, + OFGZIPStreamStateID2, + OFGZIPStreamStateCompressionMethod, + OFGZIPStreamStateFlags, + OFGZIPStreamStateModificationDate, + OFGZIPStreamStateExtraFlags, + OFGZIPStreamStateOperatingSystem, + OFGZIPStreamStateExtraLength, + OFGZIPStreamStateExtra, + OFGZIPStreamStateName, + OFGZIPStreamStateComment, + OFGZIPStreamStateHeaderCRC16, + OFGZIPStreamStateData, + OFGZIPStreamStateCRC32, + OFGZIPStreamStateUncompressedSize } _state; - enum of_gzip_stream_flags { - OF_GZIP_STREAM_FLAG_TEXT = 0x01, - OF_GZIP_STREAM_FLAG_HEADER_CRC16 = 0x02, - OF_GZIP_STREAM_FLAG_EXTRA = 0x04, - OF_GZIP_STREAM_FLAG_NAME = 0x08, - OF_GZIP_STREAM_FLAG_COMMENT = 0x10 + enum { + OFGZIPStreamFlagText = 0x01, + OFGZIPStreamFlagHeaderCRC16 = 0x02, + OFGZIPStreamFlagExtra = 0x04, + OFGZIPStreamFlagName = 0x08, + OFGZIPStreamFlagComment = 0x10 } _flags; uint8_t _extraFlags; - enum of_gzip_stream_operating_system { - OF_GZIP_STREAM_OPERATING_SYSTEM_FAT = 0, - OF_GZIP_STREAM_OPERATING_SYSTEM_AMIGA = 1, - OF_GZIP_STREAM_OPERATING_SYSTEM_VMS = 2, - OF_GZIP_STREAM_OPERATING_SYSTEM_UNIX = 3, - OF_GZIP_STREAM_OPERATING_SYSTEM_VM_CMS = 4, - OF_GZIP_STREAM_OPERATING_SYSTEM_ATARI_TOS = 5, - OF_GZIP_STREAM_OPERATING_SYSTEM_HPFS = 6, - OF_GZIP_STREAM_OPERATING_SYSTEM_MACINTOSH = 7, - OF_GZIP_STREAM_OPERATING_SYSTEM_Z_SYSTEM = 8, - OF_GZIP_STREAM_OPERATING_SYSTEM_CP_M = 9, - OF_GZIP_STREAM_OPERATING_SYSTEM_TOPS_20 = 10, - OF_GZIP_STREAM_OPERATING_SYSTEM_NTFS = 11, - OF_GZIP_STREAM_OPERATING_SYSTEM_QDO = 12, - OF_GZIP_STREAM_OPERATING_SYSTEM_ACORN_RISC_OS = 13, - OF_GZIP_STREAM_OPERATING_SYSTEM_UNKNOWN = 255 - } _operatingSystemMadeOn; + OFGZIPStreamOperatingSystem _operatingSystemMadeOn; size_t _bytesRead; uint8_t _buffer[4]; OFDate *_Nullable _modificationDate; uint16_t _extraLength; uint32_t _CRC32, _uncompressedSize; @@ -85,11 +90,11 @@ * * This property is only guaranteed to be available once @ref atEndOfStream is * true. */ @property (readonly, nonatomic) - enum of_gzip_stream_operating_system operatingSystemMadeOn; + OFGZIPStreamOperatingSystem operatingSystemMadeOn; /** * @brief The modification date of the original file. * * This property is only guaranteed to be available once @ref atEndOfStream is Index: src/OFGZIPStream.m ================================================================== --- src/OFGZIPStream.m +++ src/OFGZIPStream.m @@ -50,12 +50,11 @@ @throw [OFNotImplementedException exceptionWithSelector: _cmd object: nil]; _stream = [stream retain]; - _operatingSystemMadeOn = - OF_GZIP_STREAM_OPERATING_SYSTEM_UNKNOWN; + _operatingSystemMadeOn = OFGZIPStreamOperatingSystemUnknown; _CRC32 = ~0; } @catch (id e) { [self release]; @throw e; } @@ -82,39 +81,39 @@ for (;;) { uint8_t byte; uint32_t CRC32, uncompressedSize; if (_stream.atEndOfStream) { - if (_state != OF_GZIP_STREAM_ID1) + if (_state != OFGZIPStreamStateID1) @throw [OFTruncatedDataException exception]; return 0; } switch (_state) { - case OF_GZIP_STREAM_ID1: - case OF_GZIP_STREAM_ID2: - case OF_GZIP_STREAM_COMPRESSION_METHOD: + case OFGZIPStreamStateID1: + case OFGZIPStreamStateID2: + case OFGZIPStreamStateCompressionMethod: if ([_stream readIntoBuffer: &byte length: 1] < 1) return 0; - if ((_state == OF_GZIP_STREAM_ID1 && byte != 0x1F) || - (_state == OF_GZIP_STREAM_ID2 && byte != 0x8B) || - (_state == OF_GZIP_STREAM_COMPRESSION_METHOD && + if ((_state == OFGZIPStreamStateID1 && byte != 0x1F) || + (_state == OFGZIPStreamStateID2 && byte != 0x8B) || + (_state == OFGZIPStreamStateCompressionMethod && byte != 8)) @throw [OFInvalidFormatException exception]; _state++; break; - case OF_GZIP_STREAM_FLAGS: + case OFGZIPStreamStateFlags: if ([_stream readIntoBuffer: &byte length: 1] < 1) return 0; _flags = byte; _state++; break; - case OF_GZIP_STREAM_MODIFICATION_TIME: + case OFGZIPStreamStateModificationDate: _bytesRead += [_stream readIntoBuffer: _buffer + _bytesRead length: 4 - _bytesRead]; if (_bytesRead < 4) @@ -129,26 +128,26 @@ (_buffer[1] << 8) | _buffer[0]]; _bytesRead = 0; _state++; break; - case OF_GZIP_STREAM_EXTRA_FLAGS: + case OFGZIPStreamStateExtraFlags: if ([_stream readIntoBuffer: &byte length: 1] < 1) return 0; _extraFlags = byte; _state++; break; - case OF_GZIP_STREAM_OPERATING_SYSTEM: + case OFGZIPStreamStateOperatingSystem: if ([_stream readIntoBuffer: &byte length: 1] < 1) return 0; _operatingSystemMadeOn = byte; _state++; break; - case OF_GZIP_STREAM_EXTRA_LENGTH: - if (!(_flags & OF_GZIP_STREAM_FLAG_EXTRA)) { + case OFGZIPStreamStateExtraLength: + if (!(_flags & OFGZIPStreamFlagExtra)) { _state += 2; break; } _bytesRead += [_stream @@ -160,11 +159,11 @@ _extraLength = (_buffer[1] << 8) | _buffer[0]; _bytesRead = 0; _state++; break; - case OF_GZIP_STREAM_EXTRA: + case OFGZIPStreamStateExtra: { char tmp[512]; size_t toRead = _extraLength - _bytesRead; if (toRead > 512) @@ -178,12 +177,12 @@ return 0; _bytesRead = 0; _state++; break; - case OF_GZIP_STREAM_NAME: - if (!(_flags & OF_GZIP_STREAM_FLAG_NAME)) { + case OFGZIPStreamStateName: + if (!(_flags & OFGZIPStreamFlagName)) { _state++; break; } do { @@ -192,12 +191,12 @@ return 0; } while (byte != 0); _state++; break; - case OF_GZIP_STREAM_COMMENT: - if (!(_flags & OF_GZIP_STREAM_FLAG_COMMENT)) { + case OFGZIPStreamStateComment: + if (!(_flags & OFGZIPStreamFlagComment)) { _state++; break; } do { @@ -206,12 +205,12 @@ return 0; } while (byte != 0); _state++; break; - case OF_GZIP_STREAM_HEADER_CRC16: - if (!(_flags & OF_GZIP_STREAM_FLAG_HEADER_CRC16)) { + case OFGZIPStreamStateHeaderCRC16: + if (!(_flags & OFGZIPStreamFlagHeaderCRC16)) { _state++; break; } _bytesRead += [_stream @@ -228,11 +227,11 @@ */ _bytesRead = 0; _state++; break; - case OF_GZIP_STREAM_DATA: + case OFGZIPStreamStateData: if (_inflateStream == nil) _inflateStream = [[OFInflateStream alloc] initWithStream: _stream]; if (!_inflateStream.atEndOfStream) { @@ -249,11 +248,11 @@ [_inflateStream release]; _inflateStream = nil; _state++; break; - case OF_GZIP_STREAM_CRC32: + case OFGZIPStreamStateCRC32: _bytesRead += [_stream readIntoBuffer: _buffer length: 4 - _bytesRead]; if (_bytesRead < 4) return 0; @@ -273,11 +272,11 @@ _bytesRead = 0; _CRC32 = ~0; _state++; break; - case OF_GZIP_STREAM_UNCOMPRESSED_SIZE: + case OFGZIPStreamStateUncompressedSize: _bytesRead += [_stream readIntoBuffer: _buffer length: 4 - _bytesRead]; uncompressedSize = ((uint32_t)_buffer[3] << 24) | (_buffer[2] << 16) | (_buffer[1] << 8) | _buffer[0]; @@ -292,11 +291,11 @@ expectedChecksum: expected]; } _bytesRead = 0; _uncompressedSize = 0; - _state = OF_GZIP_STREAM_ID1; + _state = OFGZIPStreamStateID1; break; } } } @@ -308,11 +307,11 @@ return _stream.atEndOfStream; } - (bool)hasDataInReadBuffer { - if (_state == OF_GZIP_STREAM_DATA) + if (_state == OFGZIPStreamStateData) return (super.hasDataInReadBuffer || _inflateStream.hasDataInReadBuffer); return (super.hasDataInReadBuffer || _stream.hasDataInReadBuffer); }