@@ -22,10 +22,11 @@ #import "OFZIPArchiveEntry.h" #import "OFZIPArchiveEntry+Private.h" #import "OFData.h" #import "OFArray.h" #import "OFDictionary.h" +#import "OFStream.h" #import "OFSeekableStream.h" #ifdef OF_HAVE_FILES # import "OFFile.h" #endif #import "OFInflateStream.h" @@ -134,15 +135,15 @@ } @implementation OFZIPArchive @synthesize archiveComment = _archiveComment; -+ (instancetype)archiveWithSeekableStream: (OFSeekableStream *)stream - mode: (OFString *)mode ++ (instancetype)archiveWithStream: (OF_KINDOF(OFStream *))stream + mode: (OFString *)mode { - return [[[self alloc] initWithSeekableStream: stream - mode: mode] autorelease]; + return [[[self alloc] initWithStream: stream + mode: mode] autorelease]; } #ifdef OF_HAVE_FILES + (instancetype)archiveWithPath: (OFString *)path mode: (OFString *)mode @@ -155,19 +156,22 @@ - init { OF_INVALID_INIT_METHOD } -- initWithSeekableStream: (OFSeekableStream *)stream - mode: (OFString *)mode +- initWithStream: (OF_KINDOF(OFStream *))stream + mode: (OFString *)mode { self = [super init]; @try { _stream = [stream retain]; if ([mode isEqual: @"r"]) { + if (![stream isKindOfClass: [OFSeekableStream class]]) + @throw [OFInvalidArgumentException exception]; + _mode = OF_ZIP_ARCHIVE_MODE_READ; [self of_readZIPInfo]; [self of_readEntries]; } else if ([mode isEqual: @"w"] || [mode isEqual: @"a"]) @@ -189,12 +193,12 @@ mode: (OFString *)mode { OFFile *file = [[OFFile alloc] initWithPath: path mode: mode]; @try { - self = [self initWithSeekableStream: file - mode: mode]; + self = [self initWithStream: file + mode: mode]; } @finally { [file release]; } return self;