Overview
Comment: | OFLHAArchiveEntry: Parse more extensions |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
56d02a1ac5636fc49795789b86fff897 |
User & Date: | js on 2018-05-27 00:21:18 |
Other Links: | manifest | tags |
Context
2018-05-27
| ||
00:48 | OFLHAArchiveEntry: Improve directory name parsing check-in: 5c4470fb42 user: js tags: trunk | |
00:21 | OFLHAArchiveEntry: Parse more extensions check-in: 56d02a1ac5 user: js tags: trunk | |
2018-05-26
| ||
23:04 | Add OFLHAArchive check-in: 790b5344d6 user: js tags: trunk | |
Changes
Modified src/OFLHAArchiveEntry.h from [a130af009d] to [d20f4f4531].
︙ | ︙ | |||
18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #import "OFObject.h" OF_ASSUME_NONNULL_BEGIN @class OFArray OF_GENERIC(ObjectType); @class OFData; @class OFDate; /*! @file */ /*! * @brief The compression method of the archive entry. */ typedef enum of_lha_archive_method_t { | > | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #import "OFObject.h" OF_ASSUME_NONNULL_BEGIN @class OFArray OF_GENERIC(ObjectType); @class OFData; @class OFDate; @class OFNumber; /*! @file */ /*! * @brief The compression method of the archive entry. */ typedef enum of_lha_archive_method_t { |
︙ | ︙ | |||
53 54 55 56 57 58 59 | */ @interface OFLHAArchiveEntry: OFObject <OFCopying> { #ifdef OF_LHA_ARCHIVE_ENTRY_M @public #endif of_lha_archive_method_t _method; | | > > > > | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | */ @interface OFLHAArchiveEntry: OFObject <OFCopying> { #ifdef OF_LHA_ARCHIVE_ENTRY_M @public #endif of_lha_archive_method_t _method; OFString *_fileName, *_Nullable _directoryName; uint32_t _compressedSize, _uncompressedSize; OFDate *_date; uint8_t _level; uint16_t _CRC16; uint8_t _operatingSystemIdentifier; OFString *_Nullable _fileComment; OFNumber *_Nullable _mode, *_Nullable _UID, *_Nullable _GID; OFString *_Nullable _owner, *_Nullable _group; OFDate *_Nullable _modificationDate; OFArray OF_GENERIC(OFData *) *_extensions; } /*! * @brief The method of the entry. */ @property (readonly, nonatomic) of_lha_archive_method_t method; |
︙ | ︙ | |||
88 89 90 91 92 93 94 | /*! * @brief The date of the file. */ @property (readonly, retain, nonatomic) OFDate *date; /*! | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | /*! * @brief The date of the file. */ @property (readonly, retain, nonatomic) OFDate *date; /*! * @brief The LHA level of the file. */ @property (readonly, nonatomic) uint8_t level; /*! * @brief The CRC16 of the file. */ @property (readonly, nonatomic) uint16_t CRC16; /*! * @brief The operating system identifier of the file. */ @property (readonly, nonatomic) uint8_t operatingSystemIdentifier; /*! * @brief The comment of the file. */ @property OF_NULLABLE_PROPERTY (readonly, copy, nonatomic) OFString *fileComment; /*! * @brief The LHA extensions of the file. */ @property (readonly, copy, nonatomic) OFArray OF_GENERIC(OFData *) *extensions; /*! * @brief The mode of the entry. */ @property OF_NULLABLE_PROPERTY (readonly, retain, nonatomic) OFNumber *mode; /*! * @brief The UID of the owner. */ @property OF_NULLABLE_PROPERTY (readonly, retain, nonatomic) OFNumber *UID; /*! * @brief The GID of the group. */ @property OF_NULLABLE_PROPERTY (readonly, retain, nonatomic) OFNumber *GID; /*! * @brief The owner of the file. */ @property OF_NULLABLE_PROPERTY (readonly, copy, nonatomic) OFString *owner; /*! * @brief The group of the file. */ @property OF_NULLABLE_PROPERTY (readonly, copy, nonatomic) OFString *group; /*! * @brief The date of the last modification of the file. */ @property OF_NULLABLE_PROPERTY (readonly, retain, nonatomic) OFDate *modificationDate; - (instancetype)init OF_UNAVAILABLE; @end OF_ASSUME_NONNULL_END |
Modified src/OFLHAArchiveEntry.m from [70e652d7fb] to [62cdc3890f].
︙ | ︙ | |||
20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #define OF_LHA_ARCHIVE_ENTRY_M #import "OFLHAArchiveEntry.h" #import "OFLHAArchiveEntry+Private.h" #import "OFArray.h" #import "OFData.h" #import "OFDate.h" #import "OFStream.h" #import "OFString.h" #import "OFInvalidFormatException.h" #import "OFUnsupportedVersionException.h" static void | > | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #define OF_LHA_ARCHIVE_ENTRY_M #import "OFLHAArchiveEntry.h" #import "OFLHAArchiveEntry+Private.h" #import "OFArray.h" #import "OFData.h" #import "OFDate.h" #import "OFNumber.h" #import "OFStream.h" #import "OFString.h" #import "OFInvalidFormatException.h" #import "OFUnsupportedVersionException.h" static void |
︙ | ︙ | |||
67 68 69 70 71 72 73 74 75 76 77 78 | entry->_directoryName = [tmp copy]; objc_autoreleasePoolPop(pool); } static void parseExtension(OFLHAArchiveEntry *entry, OFData *extension, of_string_encoding_t encoding) { switch (*(char *)[extension itemAtIndex: 0]) { case 0x01: | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > | | 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 129 130 131 132 133 134 135 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 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | entry->_directoryName = [tmp copy]; objc_autoreleasePoolPop(pool); } static void parseCommentExtension(OFLHAArchiveEntry *entry, OFData *extension, of_string_encoding_t encoding) { [entry->_fileComment release]; entry->_fileComment = nil; entry->_fileComment = [[OFString alloc] initWithCString: (char *)[extension items] + 1 encoding: encoding length: [extension count] - 1]; } static void parsePermissionsExtension(OFLHAArchiveEntry *entry, OFData *extension, of_string_encoding_t encoding) { uint16_t mode; if ([extension count] != 3) @throw [OFInvalidFormatException exception]; memcpy(&mode, (char *)[extension items] + 1, 2); mode = OF_BSWAP16_IF_BE(mode); [entry->_mode release]; entry->_mode = nil; entry->_mode = [[OFNumber alloc] initWithUInt16: mode]; } static void parseGIDUIDExtension(OFLHAArchiveEntry *entry, OFData *extension, of_string_encoding_t encoding) { uint16_t UID, GID; if ([extension count] != 5) @throw [OFInvalidFormatException exception]; memcpy(&GID, (char *)[extension items] + 1, 2); GID = OF_BSWAP16_IF_BE(GID); memcpy(&UID, (char *)[extension items] + 3, 2); UID = OF_BSWAP16_IF_BE(UID); [entry->_GID release]; entry->_GID = nil; [entry->_UID release]; entry->_UID = nil; entry->_GID = [[OFNumber alloc] initWithUInt16: GID]; entry->_UID = [[OFNumber alloc] initWithUInt16: UID]; } static void parseGroupExtension(OFLHAArchiveEntry *entry, OFData *extension, of_string_encoding_t encoding) { [entry->_group release]; entry->_group = nil; entry->_group = [[OFString alloc] initWithCString: (char *)[extension items] + 1 encoding: encoding length: [extension count] - 1]; } static void parseOwnerExtension(OFLHAArchiveEntry *entry, OFData *extension, of_string_encoding_t encoding) { [entry->_owner release]; entry->_owner = nil; entry->_owner = [[OFString alloc] initWithCString: (char *)[extension items] + 1 encoding: encoding length: [extension count] - 1]; } static void parseModificationDateExtension(OFLHAArchiveEntry *entry, OFData *extension, of_string_encoding_t encoding) { uint32_t modificationDate; if ([extension count] != 5) @throw [OFInvalidFormatException exception]; memcpy(&modificationDate, (char *)[extension items] + 1, 4); modificationDate = OF_BSWAP32_IF_BE(modificationDate); [entry->_modificationDate release]; entry->_modificationDate = nil; entry->_modificationDate = [[OFDate alloc] initWithTimeIntervalSince1970: modificationDate]; } static bool parseExtension(OFLHAArchiveEntry *entry, OFData *extension, of_string_encoding_t encoding) { void (*function)(OFLHAArchiveEntry *, OFData *, of_string_encoding_t) = NULL; switch (*(char *)[extension itemAtIndex: 0]) { case 0x01: function = parseFileNameExtension; break; case 0x02: function = parseDirectoryNameExtension; break; case 0x3F: function = parseCommentExtension; break; case 0x50: function = parsePermissionsExtension; break; case 0x51: function = parseGIDUIDExtension; break; case 0x52: function = parseGroupExtension; break; case 0x53: function = parseOwnerExtension; break; case 0x54: function = parseModificationDateExtension; break; } if (function == NULL) return false; function(entry, extension, encoding); return true; } @implementation OFLHAArchiveEntry @synthesize method = _method, compressedSize = _compressedSize; @synthesize uncompressedSize = _uncompressedSize, date = _date; @synthesize level = _level, CRC16 = _CRC16; @synthesize operatingSystemIdentifier = _operatingSystemIdentifier; @synthesize fileComment = _fileComment, mode = _mode, UID = _UID, GID = _GID; @synthesize owner = _owner, group = _group; @synthesize modificationDate = _modificationDate, extensions = _extensions; - (instancetype)init { OF_INVALID_INIT_METHOD } - (instancetype)of_initWithHeaderSize: (uint8_t)headerSize |
︙ | ︙ | |||
178 179 180 181 182 183 184 | while ((nextSize = [stream readLittleEndianInt16]) > 0) { OFData *extension; if (nextSize < 2) @throw [OFInvalidFormatException exception]; extension = [stream readDataWithCount: nextSize - 2]; | < | > > > > > > > | 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 | while ((nextSize = [stream readLittleEndianInt16]) > 0) { OFData *extension; if (nextSize < 2) @throw [OFInvalidFormatException exception]; extension = [stream readDataWithCount: nextSize - 2]; if (!parseExtension(self, extension, encoding)) [extensions addObject: extension]; } [extensions makeImmutable]; } @catch (id e) { [self release]; @throw e; } return self; } - (void)dealloc { [_fileName release]; [_directoryName release]; [_date release]; [_fileComment release]; [_mode release]; [_UID release]; [_GID release]; [_owner release]; [_group release]; [_extensions release]; [super dealloc]; } - (id)copy { |
︙ | ︙ | |||
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | return [_directoryName stringByAppendingString: _fileName]; } - (OFString *)description { void *pool = objc_autoreleasePoolPush(); OFString *extensions = [[_extensions description] stringByReplacingOccurrencesOfString: @"\n" withString: @"\n\t"]; OFString *ret = [OFString stringWithFormat: @"<%@:\n" @"\tFile name = %@\n" @"\tCompressed size = %" @PRIu32 "\n" @"\tUncompressed size = %" @PRIu32 "\n" @"\tDate = %@\n" @"\tLevel = %u\n" @"\tCRC16 = %04" @PRIX16 @"\n" @"\tOperating system identifier = %c\n" @"\tExtensions: %@" @">", [self class], [self fileName], _compressedSize, _uncompressedSize, | > > > > > > > > > > | > | 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 | return [_directoryName stringByAppendingString: _fileName]; } - (OFString *)description { void *pool = objc_autoreleasePoolPush(); OFString *mode = (_mode == nil ? @"(nil)" : [OFString stringWithFormat: @"%" PRIo16, [_mode uInt16Value]]); OFString *extensions = [[_extensions description] stringByReplacingOccurrencesOfString: @"\n" withString: @"\n\t"]; OFString *ret = [OFString stringWithFormat: @"<%@:\n" @"\tFile name = %@\n" @"\tCompressed size = %" @PRIu32 "\n" @"\tUncompressed size = %" @PRIu32 "\n" @"\tDate = %@\n" @"\tLevel = %u\n" @"\tCRC16 = %04" @PRIX16 @"\n" @"\tOperating system identifier = %c\n" @"\tComment = %@\n" @"\tMode = %@\n" @"\tUID = %@\n" @"\tGID = %@\n" @"\tOwner = %@\n" @"\tGroup = %@\n" @"\tModification date = %@\n" @"\tExtensions: %@" @">", [self class], [self fileName], _compressedSize, _uncompressedSize, _date, _level, _CRC16, _operatingSystemIdentifier, _fileComment, mode, _UID, _GID, _owner, _group, _modificationDate, extensions]; [ret retain]; objc_autoreleasePoolPop(pool); return [ret autorelease]; } @end |