@@ -19,11 +19,14 @@ #import "OFApplication.h" #import "OFArray.h" #import "OFData.h" #import "OFDate.h" +#import "OFFile.h" #import "OFFileManager.h" +#import "OFIRI.h" +#import "OFIRIHandler.h" #import "OFLocale.h" #import "OFNumber.h" #import "OFPair.h" #import "OFSet.h" #import "OFStdIOStream.h" @@ -83,30 +86,30 @@ { if (self == [ZIPArchive class]) app = (OFArc *)[OFApplication sharedApplication].delegate; } -+ (instancetype)archiveWithPath: (OFString *)path - stream: (OF_KINDOF(OFStream *))stream - mode: (OFString *)mode - encoding: (OFStringEncoding)encoding -{ - return [[[self alloc] initWithPath: path - stream: stream - mode: mode - encoding: encoding] autorelease]; -} - -- (instancetype)initWithPath: (OFString *)path - stream: (OF_KINDOF(OFStream *))stream - mode: (OFString *)mode - encoding: (OFStringEncoding)encoding ++ (instancetype)archiveWithIRI: (OFIRI *)IRI + stream: (OF_KINDOF(OFStream *))stream + mode: (OFString *)mode + encoding: (OFStringEncoding)encoding +{ + return [[[self alloc] initWithIRI: IRI + stream: stream + mode: mode + encoding: encoding] autorelease]; +} + +- (instancetype)initWithIRI: (OFIRI *)IRI + stream: (OF_KINDOF(OFStream *))stream + mode: (OFString *)mode + encoding: (OFStringEncoding)encoding { self = [super init]; @try { - _path = [path copy]; + _archiveIRI = [IRI copy]; _archive = [[OFZIPArchive alloc] initWithStream: stream mode: mode]; _archive.delegate = self; } @catch (id e) { [self release]; @@ -116,36 +119,40 @@ return self; } - (void)dealloc { - [_path release]; + [_archiveIRI release]; [_archive release]; [super dealloc]; } - (OFSeekableStream *)archive: (OFZIPArchive *)archive wantsPartNumbered: (unsigned int)partNumber lastPartNumber: (unsigned int)lastPartNumber { - OFString *path; + OFIRI *IRI; - if ([_path.pathExtension caseInsensitiveCompare: @"zip"] != + if ([_archiveIRI.path.pathExtension caseInsensitiveCompare: @"zip"] != OFOrderedSame) return nil; if (partNumber > 98) return nil; if (partNumber == lastPartNumber) - path = _path; - else - path = [_path.stringByDeletingPathExtension + IRI = _archiveIRI; + else { + OFMutableIRI *copy = [[_archiveIRI mutableCopy] autorelease]; + copy.path = [_archiveIRI.path.stringByDeletingPathExtension stringByAppendingFormat: @".z%02u", partNumber + 1]; + [copy makeImmutable]; + IRI = copy; + } - return [OFFile fileWithPath: path mode: @"r"]; + return (OFSeekableStream *)[OFIRIHandler openItemAtIRI: IRI mode: @"r"]; } - (void)listFiles { for (OFZIPArchiveEntry *entry in _archive.entries) {