Overview
Comment: | OFZooArchiveEntry: Support for long file names |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
88c236e709f1a18ad553e2f822fff166 |
User & Date: | js on 2024-02-28 22:34:45 |
Other Links: | manifest | tags |
Context
2024-02-28
| ||
23:08 | OFZooArchiveEntry: Support for POSIX permissions check-in: 38c16e3793 user: js tags: trunk | |
22:34 | OFZooArchiveEntry: Support for long file names check-in: 88c236e709 user: js tags: trunk | |
20:27 | OFZooArchive: Throw exception for mode `w` / `a` check-in: a22b485eaf user: js tags: trunk | |
Changes
Modified src/OFZooArchiveEntry.h from [117b15d3c1] to [17bdcfc268].
︙ | ︙ | |||
35 36 37 38 39 40 41 | unsigned long long _nextHeaderOffset, _dataOffset; @protected uint16_t _lastModifiedFileDate, _lastModifiedFileTime; uint16_t _CRC16; unsigned long long _uncompressedSize, _compressedSize; bool _deleted; OFString *_Nullable _fileComment; | | | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | unsigned long long _nextHeaderOffset, _dataOffset; @protected uint16_t _lastModifiedFileDate, _lastModifiedFileTime; uint16_t _CRC16; unsigned long long _uncompressedSize, _compressedSize; bool _deleted; OFString *_Nullable _fileComment; OFString *_fileName, *_Nullable _directoryName; OF_RESERVE_IVARS(OFZooArchiveEntry, 4) } /** * @brief The compression method of the entry. */ @property (readonly, nonatomic) uint8_t compressionMethod; |
︙ | ︙ |
Modified src/OFZooArchiveEntry.m from [01c49327d9] to [66b61bdc12].
︙ | ︙ | |||
24 25 26 27 28 29 30 | #import "OFInvalidFormatException.h" @implementation OFZooArchiveEntry @synthesize compressionMethod = _compressionMethod, CRC16 = _CRC16; @synthesize uncompressedSize = _uncompressedSize; @synthesize compressedSize = _compressedSize, deleted = _deleted; | | > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #import "OFInvalidFormatException.h" @implementation OFZooArchiveEntry @synthesize compressionMethod = _compressionMethod, CRC16 = _CRC16; @synthesize uncompressedSize = _uncompressedSize; @synthesize compressedSize = _compressedSize, deleted = _deleted; @synthesize fileComment = _fileComment; - (instancetype)init { OF_INVALID_INIT_METHOD } - (instancetype)of_initWithStream: (OF_KINDOF(OFStream *))stream encoding: (OFStringEncoding)encoding { self = [super init]; @try { void *pool = objc_autoreleasePoolPush(); uint8_t majorVersion; char fileNameBuffer[13]; uint32_t commentOffset; uint16_t commentLength; if ([stream readLittleEndianInt32] != 0xFDC4A7DC) @throw [OFInvalidFormatException exception]; /* Type seems to be always 2 */ if ([stream readInt8] != 2) @throw [OFInvalidFormatException exception]; _compressionMethod = [stream readInt8]; _nextHeaderOffset = [stream readLittleEndianInt32]; _dataOffset = [stream readLittleEndianInt32]; _lastModifiedFileDate = [stream readLittleEndianInt16]; _lastModifiedFileTime = [stream readLittleEndianInt16]; _CRC16 = [stream readLittleEndianInt16]; _uncompressedSize = [stream readLittleEndianInt32]; _compressedSize = [stream readLittleEndianInt32]; majorVersion = [stream readInt8]; /* Minor version */ [stream readInt8]; _deleted = [stream readInt8]; /* Unknown. Most likely padding to get to 2 byte alignment? */ [stream readInt8]; commentOffset = [stream readLittleEndianInt32]; commentLength = [stream readLittleEndianInt16]; [stream readIntoBuffer: fileNameBuffer exactLength: 13]; if (fileNameBuffer[12] != '\0') fileNameBuffer[12] = '\0'; if (majorVersion == 2) { uint16_t extraLength = [stream readLittleEndianInt16]; uint8_t fileNameLength, directoryNameLength; if (extraLength < 10) @throw [OFInvalidFormatException exception]; /* Time zone */ [stream readInt8]; /* CRC16 of the header */ [stream readLittleEndianInt16]; fileNameLength = [stream readInt8]; directoryNameLength = [stream readInt8]; extraLength -= 2; if (fileNameLength > 0) { if (extraLength < fileNameLength) @throw [OFInvalidFormatException exception]; _fileName = [[stream readStringWithLength: fileNameLength encoding: encoding] copy]; extraLength -= fileNameLength; } else _fileName = [[OFString alloc] initWithCString: fileNameBuffer encoding: encoding]; if (directoryNameLength > 0) { if (extraLength < directoryNameLength) @throw [OFInvalidFormatException exception]; _directoryName = [[stream readStringWithLength: directoryNameLength encoding: encoding] copy]; extraLength -= directoryNameLength; } } else _fileName = [[OFString alloc] initWithCString: fileNameBuffer encoding: encoding]; if (commentOffset != 0) { [stream seekToOffset: commentOffset whence: OFSeekSet]; _fileComment = [[stream readStringWithLength: commentLength encoding: encoding] retain]; } |
︙ | ︙ | |||
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | return self; } - (void)dealloc { [_fileComment release]; [_fileName release]; [super dealloc]; } - (id)copy { return [self retain]; } - (OFDate *)modificationDate { void *pool = objc_autoreleasePoolPush(); uint16_t year = ((_lastModifiedFileDate & 0xFE00) >> 9) + 1980; uint8_t month = (_lastModifiedFileDate & 0x1E0) >> 5; uint8_t day = (_lastModifiedFileDate & 0x1F); | > > > > > > > > > | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | return self; } - (void)dealloc { [_fileComment release]; [_fileName release]; [_directoryName release]; [super dealloc]; } - (id)copy { return [self retain]; } - (OFString *)fileName { if (_directoryName == nil) return _fileName; return [OFString stringWithFormat: @"%@/%@", _directoryName, _fileName]; } - (OFDate *)modificationDate { void *pool = objc_autoreleasePoolPush(); uint16_t year = ((_lastModifiedFileDate & 0xFE00) >> 9) + 1980; uint8_t month = (_lastModifiedFileDate & 0x1E0) >> 5; uint8_t day = (_lastModifiedFileDate & 0x1F); |
︙ | ︙ |