@@ -14,26 +14,29 @@ */ #include "config.h" #import "OFApplication.h" +#import "OFArray.h" +#import "OFFile.h" #import "OFFileManager.h" -#import "OFStdIOStream.h" +#import "OFIRI.h" #import "OFLocale.h" +#import "OFStdIOStream.h" #import "GZIPArchive.h" #import "OFArc.h" static OFArc *app; static void -setPermissions(OFString *destination, OFString *source) +setPermissions(OFString *destination, OFIRI *source) { #ifdef OF_FILE_MANAGER_SUPPORTS_PERMISSIONS OFFileManager *fileManager = [OFFileManager defaultManager]; OFFileAttributes attributes = [fileManager - attributesOfItemAtPath: source]; + attributesOfItemAtIRI: source]; OFFileAttributeKey key = OFFilePOSIXPermissions; OFFileAttributes destinationAttributes = [OFDictionary dictionaryWithObject: [attributes objectForKey: key] forKey: key]; @@ -63,31 +66,32 @@ { if (self == [GZIPArchive 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 { _stream = [[OFGZIPStream alloc] initWithStream: stream mode: mode]; + _archiveIRI = [IRI copy]; } @catch (id e) { [self release]; @throw e; } @@ -95,10 +99,11 @@ } - (void)dealloc { [_stream release]; + [_archiveIRI release]; [super dealloc]; } - (void)listFiles @@ -119,12 +124,12 @@ @"Cannot extract a specific file of a .gz archive!")]; app->_exitStatus = 1; return; } - fileName = app->_archivePath.lastPathComponent - .stringByDeletingPathExtension; + /* FIXME: Should use IRI-specific path extension deletion. */ + fileName = _archiveIRI.lastPathComponent.stringByDeletingPathExtension; if (app->_outputLevel >= 0) [OFStdOut writeString: OF_LOCALIZED(@"extracting_file", @"Extracting %[file]...", @"file", fileName)]; @@ -131,11 +136,11 @@ if (![app shouldExtractFile: fileName outFileName: fileName]) return; output = [OFFile fileWithPath: fileName mode: @"w"]; - setPermissions(fileName, app->_archivePath); + setPermissions(fileName, _archiveIRI); while (!_stream.atEndOfStream) { ssize_t length = [app copyBlockFromStream: _stream toStream: output fileName: fileName]; @@ -157,11 +162,12 @@ } } - (void)printFiles: (OFArray OF_GENERIC(OFString *) *)files { - OFString *fileName = app->_archivePath.lastPathComponent + /* FIXME: Should use IRI-specific path extension deletion. */ + OFString *fileName = _archiveIRI.lastPathComponent .stringByDeletingPathExtension; if (files.count > 0) { [OFStdErr writeLine: OF_LOCALIZED( @"cannot_print_specific_file_from_gz",