@@ -20,10 +20,11 @@ #import "OFZIPArchive.h" #import "OFZIPArchiveEntry.h" #import "OFZIPArchiveEntry+Private.h" #import "OFDataArray.h" +#import "OFArray.h" #import "OFDictionary.h" #import "OFFile.h" #import "OFDeflateStream.h" #import "OFChecksumFailedException.h" @@ -141,10 +142,11 @@ { [_file release]; [_path release]; [_archiveComment release]; [_entries release]; + [_pathToEntryMap release]; [super dealloc]; } - (void)OF_readZIPInfo @@ -190,29 +192,33 @@ size_t i; [_file seekToOffset: _centralDirectoryOffset whence: SEEK_SET]; - _entries = [[OFMutableDictionary alloc] init]; + _entries = [[OFMutableArray alloc] init]; + _pathToEntryMap = [[OFMutableDictionary alloc] init]; for (i = 0; i < _centralDirectoryEntries; i++) { OFZIPArchiveEntry *entry = [[[OFZIPArchiveEntry alloc] OF_initWithFile: _file] autorelease]; - if ([_entries objectForKey: [entry fileName]] != nil) + if ([_pathToEntryMap objectForKey: [entry fileName]] != nil) @throw [OFInvalidFormatException exception]; - [_entries setObject: entry - forKey: [entry fileName]]; + [_entries addObject: entry]; + [_pathToEntryMap setObject: entry + forKey: [entry fileName]]; } + [_entries sort]; [_entries makeImmutable]; + [_pathToEntryMap makeImmutable]; objc_autoreleasePoolPop(pool); } -- (OFDictionary*)entries +- (OFArray*)entries { OF_GETTER(_entries, true) } - (OFString*)archiveComment @@ -222,11 +228,11 @@ - (OFStream*)streamForReadingFile: (OFString*)path { OFStream *ret; void *pool = objc_autoreleasePoolPush(); - OFZIPArchiveEntry *entry = [_entries objectForKey: path]; + OFZIPArchiveEntry *entry = [_pathToEntryMap objectForKey: path]; OFZIPArchive_LocalFileHeader *localFileHeader; if (entry == nil) { errno = ENOENT; @throw [OFOpenFileFailedException exceptionWithPath: path