diff --git a/CSCommandLineParser.m b/CSCommandLineParser.m index 224770eb..c3527b06 100644 --- a/CSCommandLineParser.m +++ b/CSCommandLineParser.m @@ -27,27 +27,27 @@ -static NSString *NamesKey=@"NamesKey"; -static NSString *AllowedValuesKey=@"AllowedValuesKey"; -static NSString *DefaultValueKey=@"DefaultValueKey"; -static NSString *OptionTypeKey=@"OptionType"; -static NSString *DescriptionKey=@"DescriptionKey"; -static NSString *ArgumentDescriptionKey=@"ArgumentDescriptionKey"; -static NSString *AliasTargetKey=@"AliasTargetKey"; -static NSString *RequiredOptionsKey=@"RequiredOptionsKey"; - -static NSString *NumberValueKey=@"NumberValue"; -static NSString *StringValueKey=@"StringValue"; -static NSString *ArrayValueKey=@"ArrayValue"; - -static NSString *StringOptionType=@"StringOptionType"; -static NSString *MultipleChoiceOptionType=@"MultipleChoiceOptionType"; -static NSString *IntegerOptionType=@"IntegerOptionType"; -static NSString *FloatingPointOptionType=@"FloatingPointOptionType"; -static NSString *SwitchOptionType=@"SwitchOptionType"; -static NSString *HelpOptionType=@"HelpOptionType"; -static NSString *VersionOptionType=@"VersionOptionType"; -static NSString *AliasOptionType=@"AliasOptionType"; +static NSString *const NamesKey=@"NamesKey"; +static NSString *const AllowedValuesKey=@"AllowedValuesKey"; +static NSString *const DefaultValueKey=@"DefaultValueKey"; +static NSString *const OptionTypeKey=@"OptionType"; +static NSString *const DescriptionKey=@"DescriptionKey"; +static NSString *const ArgumentDescriptionKey=@"ArgumentDescriptionKey"; +static NSString *const AliasTargetKey=@"AliasTargetKey"; +static NSString *const RequiredOptionsKey=@"RequiredOptionsKey"; + +static NSString *const NumberValueKey=@"NumberValue"; +static NSString *const StringValueKey=@"StringValue"; +static NSString *const ArrayValueKey=@"ArrayValue"; + +static NSString *const StringOptionType=@"StringOptionType"; +static NSString *const MultipleChoiceOptionType=@"MultipleChoiceOptionType"; +static NSString *const IntegerOptionType=@"IntegerOptionType"; +static NSString *const FloatingPointOptionType=@"FloatingPointOptionType"; +static NSString *const SwitchOptionType=@"SwitchOptionType"; +static NSString *const HelpOptionType=@"HelpOptionType"; +static NSString *const VersionOptionType=@"VersionOptionType"; +static NSString *const AliasOptionType=@"AliasOptionType"; #if MAC_OS_X_VERSION_MAX_ALLOWED<1050 @interface NSScanner (BuildKludge) @@ -388,9 +388,7 @@ -(void)addRequiredOption:(NSString *)requiredoption -(void)addRequiredOptionsArray:(NSArray *)requiredoptions { - NSEnumerator *enumerator=[requiredoptions objectEnumerator]; - NSString *requiredoption; - while((requiredoption=[enumerator nextObject])) [self addRequiredOption:requiredoption]; + for(NSString *requiredoption in requiredoptions) [self addRequiredOption:requiredoption]; } -(void)addRequiredOption:(NSString *)requiredoption forOption:(NSString *)option @@ -409,9 +407,7 @@ -(void)addRequiredOption:(NSString *)requiredoption forOption:(NSString *)option -(void)addRequiredOptionsArray:(NSArray *)requiredoptions forOption:(NSString *)option { - NSEnumerator *enumerator=[requiredoptions objectEnumerator]; - NSString *requiredoption; - while((requiredoption=[enumerator nextObject])) [self addRequiredOption:requiredoption forOption:option]; + for(NSString *requiredoption in requiredoptions) [self addRequiredOption:requiredoption forOption:option]; } @@ -620,9 +616,7 @@ -(void)_parseOptionWithDictionary:(NSMutableDictionary *)dict type:(NSString *)t -(void)_setDefaultValues { - NSEnumerator *enumerator=[options objectEnumerator]; - NSMutableDictionary *dict; - while((dict=[enumerator nextObject])) + for(NSMutableDictionary *dict in [options objectEnumerator]) { id defaultvalue=[dict objectForKey:DefaultValueKey]; if(!defaultvalue) continue; @@ -660,9 +654,7 @@ -(void)_enforceRequirementsWithErrors:(NSMutableArray *)errors { if([alwaysrequiredoptions count]) [self _requireOptionsInArray:alwaysrequiredoptions when:@"" errors:errors]; - NSEnumerator *enumerator=[options objectEnumerator]; - NSDictionary *dict; - while((dict=[enumerator nextObject])) + for(NSDictionary *dict in [options objectEnumerator]) { NSArray *names=[dict objectForKey:NamesKey]; NSString *name=[names objectAtIndex:0]; @@ -682,9 +674,7 @@ -(void)_requireOptionsInArray:(NSArray *)requiredoptions when:(NSString *)when e { NSMutableSet *set=[NSMutableSet set]; - NSEnumerator *enumerator=[requiredoptions objectEnumerator]; - NSString *requiredoption; - while((requiredoption=[enumerator nextObject])) + for(NSString *requiredoption in requiredoptions) { if(![self _isOptionDefined:requiredoption]) [set addObject:requiredoption]; } @@ -693,9 +683,7 @@ -(void)_requireOptionsInArray:(NSArray *)requiredoptions when:(NSString *)when e NSMutableArray *array=[NSMutableArray array]; - enumerator=[optionordering objectEnumerator]; - NSString *option; - while((option=[enumerator nextObject])) + for(NSString *option in optionordering) { if([set containsObject:option]) [array addObject:[self _describeOption:option]]; } @@ -737,9 +725,7 @@ -(NSString *)_describeOptionAndArgument:(NSString *)name -(void)_reportErrors:(NSArray *)errors { - NSEnumerator *enumerator=[errors objectEnumerator]; - NSString *error; - while((error=[enumerator nextObject])) + for(NSString *error in errors) { [error print]; [@"\n" print]; diff --git a/CSFileHandle.h b/CSFileHandle.h index 8e1c0aa2..2f541148 100644 --- a/CSFileHandle.h +++ b/CSFileHandle.h @@ -24,8 +24,8 @@ #define CSFileHandle XADFileHandle -extern NSString *CSCannotOpenFileException; -extern NSString *CSFileErrorException; +extern NSExceptionName const CSCannotOpenFileException; +extern NSExceptionName const CSFileErrorException; @interface CSFileHandle:CSHandle { @@ -41,6 +41,12 @@ extern NSString *CSFileErrorException; +(CSFileHandle *)fileHandleForReadingAtPath:(NSString *)path; +(CSFileHandle *)fileHandleForWritingAtPath:(NSString *)path; +(CSFileHandle *)fileHandleForPath:(NSString *)path modes:(NSString *)modes; ++(CSFileHandle *)fileHandleForReadingAtFileURL:(NSURL *)path NS_SWIFT_UNAVAILABLE("Use throwing methods instead"); ++(CSFileHandle *)fileHandleForWritingAtFileURL:(NSURL *)path NS_SWIFT_UNAVAILABLE("Use throwing methods instead"); ++(CSFileHandle *)fileHandleForFileURL:(NSURL *)path modes:(NSString *)modes NS_SWIFT_UNAVAILABLE("Use throwing methods instead"); ++(CSFileHandle *)fileHandleForReadingAtFileURL:(NSURL *)path error:(NSError**)outErr; ++(CSFileHandle *)fileHandleForWritingAtFileURL:(NSURL *)path error:(NSError**)outErr; ++(CSFileHandle *)fileHandleForFileURL:(NSURL *)path modes:(NSString *)modes error:(NSError**)outErr; +(CSFileHandle *)fileHandleForStandardInput; +(CSFileHandle *)fileHandleForStandardOutput; +(CSFileHandle *)fileHandleForStandardError; @@ -52,12 +58,12 @@ extern NSString *CSFileErrorException; -(void)close; // Public methods --(FILE *)filePointer; +@property (readonly) FILE *filePointer NS_RETURNS_INNER_POINTER; // Implemented by this class --(off_t)fileSize; --(off_t)offsetInFile; --(BOOL)atEndOfFile; +@property (readonly) off_t fileSize; +@property (readonly) off_t offsetInFile; +@property (readonly) BOOL atEndOfFile; -(void)seekToFileOffset:(off_t)offs; -(void)seekToEndOfFile; diff --git a/CSFileHandle.m b/CSFileHandle.m index e13c1773..960fffc0 100644 --- a/CSFileHandle.m +++ b/CSFileHandle.m @@ -19,18 +19,93 @@ * MA 02110-1301 USA */ #import "CSFileHandle.h" +#import "XADException.h" #include -NSString *CSCannotOpenFileException=@"CSCannotOpenFileException"; -NSString *CSFileErrorException=@"CSFileErrorException"; +NSString *const CSCannotOpenFileException=@"CSCannotOpenFileException"; +NSString *const CSFileErrorException=@"CSFileErrorException"; @implementation CSFileHandle +@synthesize filePointer = fh; + ++(CSFileHandle *)fileHandleForReadingAtFileURL:(NSURL *)path +{ return [self fileHandleForFileURL:path modes:@"rb"]; } + ++(CSFileHandle *)fileHandleForWritingAtFileURL:(NSURL *)path +{ return [self fileHandleForFileURL:path modes:@"wb"]; } + ++(CSFileHandle *)fileHandleForFileURL:(NSURL *)path modes:(NSString *)modes +{ + if(!path) return nil; + +#if defined(__COCOTRON__) // Cocotron + FILE *fileh=_wfopen([path fileSystemRepresentationW], + (const wchar_t *)[modes cStringUsingEncoding:NSUnicodeStringEncoding]); +#elif defined(__MINGW32__) // GNUstep under mingw32 - sort of untested + FILE *fileh=_wfopen((const wchar_t *)[path fileSystemRepresentation], + (const wchar_t *)[modes cStringUsingEncoding:NSUnicodeStringEncoding]); +#else // Cocoa or GNUstep under Linux + FILE *fileh=fopen([path fileSystemRepresentation],modes.UTF8String); +#endif + + if(!fileh) [[NSException exceptionWithName:CSCannotOpenFileException + reason: [NSString stringWithFormat:@"Error attempting to open file \"%@\" in mode \"%@\" (%d).",path,modes, (int)errno] + userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil], NSUnderlyingErrorKey, path, NSURLErrorKey, nil]] raise]; + + CSFileHandle *handle=[[CSFileHandle alloc] initWithFilePointer:fileh closeOnDealloc:YES path:path.path]; + if(handle) return handle; + + fclose(fileh); + return nil; +} + ++(CSFileHandle *)fileHandleForReadingAtFileURL:(NSURL *)path error:(NSError **)outErr +{ return [self fileHandleForFileURL:path modes:@"rb" error:outErr]; } + ++(CSFileHandle *)fileHandleForWritingAtFileURL:(NSURL *)path error:(NSError **)outErr +{ return [self fileHandleForFileURL:path modes:@"wb" error:outErr]; } + ++(CSFileHandle *)fileHandleForFileURL:(NSURL *)path modes:(NSString *)modes error:(NSError **)outErr +{ + if(!path) { + if (outErr) { + *outErr = [NSError errorWithDomain:XADErrorDomain code:XADErrorBadParameters userInfo:nil]; + } + return nil; + } + +#if defined(__COCOTRON__) // Cocotron + FILE *fileh=_wfopen([path fileSystemRepresentationW], + (const wchar_t *)[modes cStringUsingEncoding:NSUnicodeStringEncoding]); +#elif defined(__MINGW32__) // GNUstep under mingw32 - sort of untested + FILE *fileh=_wfopen((const wchar_t *)[path fileSystemRepresentation], + (const wchar_t *)[modes cStringUsingEncoding:NSUnicodeStringEncoding]); +#else // Cocoa or GNUstep under Linux + FILE *fileh=fopen([path fileSystemRepresentation],modes.UTF8String); +#endif + + if(!fileh) { + if (outErr) { + *outErr = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:[NSDictionary dictionaryWithObjectsAndKeys:path, NSURLErrorKey, nil]]; + } + return nil; + } + + CSFileHandle *handle=[[CSFileHandle alloc] initWithFilePointer:fileh closeOnDealloc:YES path:path.path]; + if(handle) return handle; + + fclose(fileh); + if (outErr) { + *outErr = [NSError errorWithDomain:XADErrorDomain code:XADErrorUnknown userInfo:[NSDictionary dictionaryWithObjectsAndKeys:path, NSURLErrorKey, nil]]; + } + return nil; +} +(CSFileHandle *)fileHandleForReadingAtPath:(NSString *)path { return [self fileHandleForPath:path modes:@"rb"]; } diff --git a/CSHandle.h b/CSHandle.h index 03df28d4..a999c8fe 100644 --- a/CSHandle.h +++ b/CSHandle.h @@ -20,6 +20,10 @@ */ #import #import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" +#import "XADTypes.h" +#pragma clang diagnostic pop @@ -38,13 +42,13 @@ #endif -extern NSString *CSOutOfMemoryException; -extern NSString *CSEndOfFileException; -extern NSString *CSNotImplementedException; -extern NSString *CSNotSupportedException; - +XADEXTERN NSExceptionName const CSOutOfMemoryException; +XADEXTERN NSExceptionName const CSEndOfFileException; +XADEXTERN NSExceptionName const CSNotImplementedException; +XADEXTERN NSExceptionName const CSNotSupportedException; +XADEXPORT @interface CSHandle:NSObject { CSHandle *parent; diff --git a/CSHandle.m b/CSHandle.m index 8a37f78f..8af654b1 100644 --- a/CSHandle.m +++ b/CSHandle.m @@ -24,10 +24,10 @@ #include -NSString *CSOutOfMemoryException=@"CSOutOfMemoryException"; -NSString *CSEndOfFileException=@"CSEndOfFileException"; -NSString *CSNotImplementedException=@"CSNotImplementedException"; -NSString *CSNotSupportedException=@"CSNotSupportedException"; +NSString *const CSOutOfMemoryException=@"CSOutOfMemoryException"; +NSString *const CSEndOfFileException=@"CSEndOfFileException"; +NSString *const CSNotImplementedException=@"CSNotImplementedException"; +NSString *const CSNotSupportedException=@"CSNotSupportedException"; diff --git a/CSInputBuffer.h b/CSInputBuffer.h index dae2319a..f96d5267 100644 --- a/CSInputBuffer.h +++ b/CSInputBuffer.h @@ -19,7 +19,10 @@ * MA 02110-1301 USA */ #import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "CSHandle.h" +#pragma clang diagnostic pop typedef struct CSInputBuffer { @@ -38,12 +41,12 @@ typedef struct CSInputBuffer // Allocation and management -CSInputBuffer *CSInputBufferAlloc(CSHandle *parent,int size); -CSInputBuffer *CSInputBufferAllocWithBuffer(const uint8_t *buffer,int length,off_t startoffs); -CSInputBuffer *CSInputBufferAllocEmpty(void); -void CSInputBufferFree(CSInputBuffer *self); +XADEXPORT CSInputBuffer *CSInputBufferAlloc(CSHandle *parent,int size); +XADEXPORT CSInputBuffer *CSInputBufferAllocWithBuffer(const uint8_t *buffer,int length,off_t startoffs); +XADEXPORT CSInputBuffer *CSInputBufferAllocEmpty(void); +XADEXPORT void CSInputBufferFree(CSInputBuffer *self); -void CSInputSetMemoryBuffer(CSInputBuffer *self,uint8_t *buffer,int length,off_t startoffs); +XADEXPORT void CSInputSetMemoryBuffer(CSInputBuffer *self,uint8_t *buffer,int length,off_t startoffs); static inline CSHandle *CSInputHandle(CSInputBuffer *self) { @@ -54,18 +57,18 @@ static inline CSHandle *CSInputHandle(CSInputBuffer *self) // Buffer and file positioning -void CSInputRestart(CSInputBuffer *self); -void CSInputFlush(CSInputBuffer *self); +XADEXPORT void CSInputRestart(CSInputBuffer *self); +XADEXPORT void CSInputFlush(CSInputBuffer *self); -void CSInputSynchronizeFileOffset(CSInputBuffer *self); -void CSInputSeekToFileOffset(CSInputBuffer *self,off_t offset); -void CSInputSeekToBufferOffset(CSInputBuffer *self,off_t offset); -void CSInputSetStartOffset(CSInputBuffer *self,off_t offset); -off_t CSInputBufferOffset(CSInputBuffer *self); -off_t CSInputFileOffset(CSInputBuffer *self); -off_t CSInputBufferBitOffset(CSInputBuffer *self); +XADEXPORT void CSInputSynchronizeFileOffset(CSInputBuffer *self); +XADEXPORT void CSInputSeekToFileOffset(CSInputBuffer *self,off_t offset); +XADEXPORT void CSInputSeekToBufferOffset(CSInputBuffer *self,off_t offset); +XADEXPORT void CSInputSetStartOffset(CSInputBuffer *self,off_t offset); +XADEXPORT off_t CSInputBufferOffset(CSInputBuffer *self); +XADEXPORT off_t CSInputFileOffset(CSInputBuffer *self); +XADEXPORT off_t CSInputBufferBitOffset(CSInputBuffer *self); -void _CSInputFillBuffer(CSInputBuffer *self); +XADEXPORT void _CSInputFillBuffer(CSInputBuffer *self); @@ -126,21 +129,21 @@ static inline BOOL CSInputAtEOF(CSInputBuffer *self) // Bitstream reading -void _CSInputFillBits(CSInputBuffer *self); -void _CSInputFillBitsLE(CSInputBuffer *self); +XADEXPORT void _CSInputFillBits(CSInputBuffer *self); +XADEXPORT void _CSInputFillBitsLE(CSInputBuffer *self); -unsigned int CSInputNextBit(CSInputBuffer *self); -unsigned int CSInputNextBitLE(CSInputBuffer *self); -unsigned int CSInputNextBitString(CSInputBuffer *self,int numbits); -unsigned int CSInputNextBitStringLE(CSInputBuffer *self,int numbits); -unsigned int CSInputNextLongBitString(CSInputBuffer *self,int numbits); -unsigned int CSInputNextLongBitStringLE(CSInputBuffer *self,int numbits); +XADEXPORT unsigned int CSInputNextBit(CSInputBuffer *self); +XADEXPORT unsigned int CSInputNextBitLE(CSInputBuffer *self); +XADEXPORT unsigned int CSInputNextBitString(CSInputBuffer *self,int numbits); +XADEXPORT unsigned int CSInputNextBitStringLE(CSInputBuffer *self,int numbits); +XADEXPORT unsigned int CSInputNextLongBitString(CSInputBuffer *self,int numbits); +XADEXPORT unsigned int CSInputNextLongBitStringLE(CSInputBuffer *self,int numbits); -void CSInputSkipBits(CSInputBuffer *self,int numbits); -void CSInputSkipBitsLE(CSInputBuffer *self,int numbits); -BOOL CSInputOnByteBoundary(CSInputBuffer *self); -void CSInputSkipToByteBoundary(CSInputBuffer *self); -void CSInputSkipTo16BitBoundary(CSInputBuffer *self); +XADEXPORT void CSInputSkipBits(CSInputBuffer *self,int numbits); +XADEXPORT void CSInputSkipBitsLE(CSInputBuffer *self,int numbits); +XADEXPORT BOOL CSInputOnByteBoundary(CSInputBuffer *self); +XADEXPORT void CSInputSkipToByteBoundary(CSInputBuffer *self); +XADEXPORT void CSInputSkipTo16BitBoundary(CSInputBuffer *self); static inline unsigned int CSInputBitsLeftInBuffer(CSInputBuffer *self) { @@ -208,14 +211,14 @@ static inline type name(CSInputBuffer *self) \ return val; \ } -CSInputNextValueImpl(int16_t,CSInputNextInt16LE,CSInt16LE) -CSInputNextValueImpl(int32_t,CSInputNextInt32LE,CSInt32LE) -CSInputNextValueImpl(uint16_t,CSInputNextUInt16LE,CSUInt16LE) -CSInputNextValueImpl(uint32_t,CSInputNextUInt32LE,CSUInt32LE) -CSInputNextValueImpl(int16_t,CSInputNextInt16BE,CSInt16BE) -CSInputNextValueImpl(int32_t,CSInputNextInt32BE,CSInt32BE) -CSInputNextValueImpl(uint16_t,CSInputNextUInt16BE,CSUInt16BE) -CSInputNextValueImpl(uint32_t,CSInputNextUInt32BE,CSUInt32BE) +XADEXPORT CSInputNextValueImpl(int16_t,CSInputNextInt16LE,CSInt16LE) +XADEXPORT CSInputNextValueImpl(int32_t,CSInputNextInt32LE,CSInt32LE) +XADEXPORT CSInputNextValueImpl(uint16_t,CSInputNextUInt16LE,CSUInt16LE) +XADEXPORT CSInputNextValueImpl(uint32_t,CSInputNextUInt32LE,CSUInt32LE) +XADEXPORT CSInputNextValueImpl(int16_t,CSInputNextInt16BE,CSInt16BE) +XADEXPORT CSInputNextValueImpl(int32_t,CSInputNextInt32BE,CSInt32BE) +XADEXPORT CSInputNextValueImpl(uint16_t,CSInputNextUInt16BE,CSUInt16BE) +XADEXPORT CSInputNextValueImpl(uint32_t,CSInputNextUInt32BE,CSUInt32BE) diff --git a/CSJSONPrinter.m b/CSJSONPrinter.m index b4759629..9cb3b6fe 100644 --- a/CSJSONPrinter.m +++ b/CSJSONPrinter.m @@ -177,9 +177,7 @@ -(void)endPrintingArray -(void)printArrayObjects:(NSArray *)array { - NSEnumerator *enumerator=[array objectEnumerator]; - id object; - while((object=[enumerator nextObject])) [self printArrayObject:object]; + for(id object in array) [self printArrayObject:object]; } @@ -219,9 +217,7 @@ -(void)endPrintingDictionary -(void)printDictionaryKeysAndObjects:(NSDictionary *)dictionary { - NSEnumerator *enumerator=[dictionary keyEnumerator]; - id key; - while((key=[enumerator nextObject])) { + for(id key in dictionary) { if (excludedKeys && [excludedKeys containsObject:key]) continue; [self printDictionaryObject:[dictionary objectForKey:key] forKey:key]; } diff --git a/CSMemoryHandle.h b/CSMemoryHandle.h index e04eefb4..e586588e 100644 --- a/CSMemoryHandle.h +++ b/CSMemoryHandle.h @@ -18,10 +18,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "CSHandle.h" +#pragma clang diagnostic pop #define CSMemoryHandle XADMemoryHandle +XADEXPORT @interface CSMemoryHandle:CSHandle { NSData *backingdata; diff --git a/CSMultiFileHandle.h b/CSMultiFileHandle.h index 6435961b..11a3bd6c 100644 --- a/CSMultiFileHandle.h +++ b/CSMultiFileHandle.h @@ -28,7 +28,7 @@ } +(CSHandle *)handleWithPathArray:(NSArray *)patharray; -+(CSHandle *)handleWithPaths:(CSHandle *)firstpath,...; ++(CSHandle *)handleWithPaths:(CSHandle *)firstpath,... NS_REQUIRES_NIL_TERMINATION; // Initializers -(id)initWithPaths:(NSArray *)patharray; diff --git a/CSMultiHandle.m b/CSMultiHandle.m index cc3245c6..b0eeabff 100644 --- a/CSMultiHandle.m +++ b/CSMultiHandle.m @@ -60,9 +60,7 @@ -(id)initAsCopyOf:(CSMultiHandle *)other if(self=[super initAsCopyOf:other]) { NSMutableArray *handlearray=[NSMutableArray arrayWithCapacity:[other->handles count]]; - NSEnumerator *enumerator=[other->handles objectEnumerator]; - CSHandle *handle; - while((handle=[enumerator nextObject])) [handlearray addObject:[[handle copy] autorelease]]; + for(CSHandle *handle in other->handles) [handlearray addObject:[[handle copy] autorelease]]; handles=[[NSArray arrayWithArray:handlearray] retain]; } diff --git a/CSStreamHandle.h b/CSStreamHandle.h index bb853220..e415e21b 100644 --- a/CSStreamHandle.h +++ b/CSStreamHandle.h @@ -18,11 +18,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "CSHandle.h" #import "CSInputBuffer.h" +#pragma clang diagnostic pop #define CSStreamHandle XADStreamHandle +XADEXPORT @interface CSStreamHandle:CSHandle { off_t streampos,streamlength; diff --git a/CSSubHandle.h b/CSSubHandle.h index dc74f673..731e4ca3 100644 --- a/CSSubHandle.h +++ b/CSSubHandle.h @@ -18,10 +18,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "CSHandle.h" +#pragma clang diagnostic pop #define CSSubHandle XADSubHandle +XADEXPORT @interface CSSubHandle:CSHandle { off_t start,end; diff --git a/Checksums.h b/Checksums.h index 64eba9dd..f55d0c0f 100644 --- a/Checksums.h +++ b/Checksums.h @@ -18,14 +18,17 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "CSHandle.h" #import "CSSubHandle.h" #import "CSStreamHandle.h" +#pragma clang diagnostic pop @interface CSHandle (Checksums) --(BOOL)hasChecksum; --(BOOL)isChecksumCorrect; +@property (nonatomic, readonly) BOOL hasChecksum; +@property (nonatomic, readonly, getter=isChecksumCorrect) BOOL checksumCorrect; @end diff --git a/CommandLineCommon.m b/CommandLineCommon.m index 3f091672..65cc9724 100644 --- a/CommandLineCommon.m +++ b/CommandLineCommon.m @@ -41,9 +41,7 @@ BOOL IsListRequest(NSString *encoding) void PrintEncodingList() { - NSEnumerator *enumerator=[[XADString availableEncodingNames] objectEnumerator]; - NSArray *encodingarray; - while((encodingarray=[enumerator nextObject])) + for(NSArray *encodingarray in [XADString availableEncodingNames]) { NSString *description=[encodingarray objectAtIndex:0]; if((id)description==[NSNull null]||[description length]==0) description=nil; @@ -344,9 +342,8 @@ void PrintEncodingList() { NSMutableString *res=nil; - NSEnumerator *enumerator=[[[codeforname allKeys] sortedArrayUsingSelector:@selector(compare:)] objectEnumerator]; - NSString *compname; - while((compname=[enumerator nextObject])) + NSArray *sortArray=[[codeforname allKeys] sortedArrayUsingSelector:@selector(compare:)]; + for(NSString *compname in sortArray) { NSString *code=[codeforname objectForKey:compname]; if([code isEqualToString:compname]) continue; diff --git a/PDF/PDFEncryptionHandler.m b/PDF/PDFEncryptionHandler.m index ee1f3970..d85e70a0 100644 --- a/PDF/PDFEncryptionHandler.m +++ b/PDF/PDFEncryptionHandler.m @@ -76,9 +76,7 @@ -(id)initWithEncryptDictionary:(NSDictionary *)encryptdict permanentID:(NSData * algorithms=[[NSMutableDictionary dictionary] retain]; NSDictionary *filters=[encrypt objectForKey:@"CF"]; - NSEnumerator *enumerator=[filters keyEnumerator]; - NSString *key; - while(key=[enumerator nextObject]) + for(NSString *key in filters) { NSDictionary *dict=[filters objectForKey:key]; NSString *cfm=[dict objectForKey:@"CFM"]; diff --git a/PDF/PDFParser.m b/PDF/PDFParser.m index 224a491c..cab892dd 100644 --- a/PDF/PDFParser.m +++ b/PDF/PDFParser.m @@ -408,9 +408,7 @@ -(NSDictionary *)parsePDFXrefStream // Parse any object streams that were encountered earlier, now that encryption // should be properly set up. - NSEnumerator *enumerator=[objstreams objectEnumerator]; - PDFStream *objstream; - while((objstream=[enumerator nextObject])) + for(PDFStream *objstream in objstreams) { off_t curroffs=[mainhandle offsetInFile]; [self parsePDFCompressedObjectStream:objstream]; @@ -935,16 +933,12 @@ -(NSDictionary *)parsePDFDictionaryWithParent:(PDFObjectReference *)parent -(void)resolveIndirectObjects { - NSEnumerator *enumerator=[unresolved objectEnumerator]; - id obj; - while(obj=[enumerator nextObject]) + for(id obj in unresolved) { if([obj isKindOfClass:[NSDictionary class]]) { NSMutableDictionary *dict=obj; - NSEnumerator *keyenum=[[dict allKeys] objectEnumerator]; - NSString *key; - while(key=[keyenum nextObject]) + for(NSString *key in [dict allKeys]) { id value=[dict objectForKey:key]; if([value isKindOfClass:[PDFObjectReference class]]) diff --git a/XAD7ZipParser.m b/XAD7ZipParser.m index 589b90b4..415bff80 100644 --- a/XAD7ZipParser.m +++ b/XAD7ZipParser.m @@ -914,8 +914,7 @@ -(off_t)compressedSizeForFolder:(NSDictionary *)folder { off_t totalsize=0; NSEnumerator *enumerator=[[folder objectForKey:@"InStreams"] objectEnumerator]; - NSDictionary *instream; - while((instream=[enumerator nextObject])) + for(NSDictionary *instream in enumerator) { NSDictionary *packedstream=[instream objectForKey:@"PackedStream"]; if(packedstream) totalsize+=[[packedstream objectForKey:@"Size"] longLongValue]; diff --git a/XADAppleDouble.m b/XADAppleDouble.m index b6a57000..df7f90c7 100644 --- a/XADAppleDouble.m +++ b/XADAppleDouble.m @@ -175,9 +175,7 @@ +(void)writeAppleDoubleHeaderToHandle:(CSHandle *)fh resourceForkSize:(int)ressi // Sort keys and iterate over them. NSArray *keys=[[extattrs allKeys] sortedArrayUsingSelector:@selector(compare:)]; - NSEnumerator *enumerator=[keys objectEnumerator]; - NSString *key; - while((key=[enumerator nextObject])) + for(NSString *key in keys) { // Ignore FinderInfo. if([key isEqual:@"com.apple.FinderInfo"]) continue; @@ -253,9 +251,7 @@ +(void)writeAppleDoubleHeaderToHandle:(CSHandle *)fh resourceForkSize:(int)ressi // Write attribute entries. int currdataoffset=datastart; - NSEnumerator *enumerator=[keys objectEnumerator]; - NSString *key; - while((key=[enumerator nextObject])) + for(NSString *key in keys) { NSData *data=[extattrs objectForKey:key]; NSData *keydata=[encodedkeys objectForKey:key]; @@ -293,8 +289,7 @@ +(void)writeAppleDoubleHeaderToHandle:(CSHandle *)fh resourceForkSize:(int)ressi } // Write attribute data. - enumerator=[keys objectEnumerator]; - while((key=[enumerator nextObject])) + for(NSString *key in keys) { NSData *data=[extattrs objectForKey:key]; NSData *keydata=[encodedkeys objectForKey:key]; diff --git a/XADArchive.h b/XADArchive.h index 4f16868a..5083e0ef 100644 --- a/XADArchive.h +++ b/XADArchive.h @@ -20,32 +20,72 @@ */ #import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "XADArchiveParser.h" #import "XADUnarchiver.h" #import "XADException.h" +#pragma clang diagnostic pop -typedef int XADAction; -//typedef off_t xadSize; // deprecated +#if __has_feature(modules) +# define XAD_NO_DEPRECATED +#endif -#define XADAbortAction 0 -#define XADRetryAction 1 -#define XADSkipAction 2 -#define XADOverwriteAction 3 -#define XADRenameAction 4 +typedef NS_ENUM(int, XADAction) { + XADActionAbort = 0, + XADActionRetry = 1, + XADActionSkip = 2, + XADActionOverwrite = 3, + XADActionRename = 4 +}; +//typedef off_t xadSize; // deprecated -extern NSString *XADResourceDataKey; -extern NSString *XADResourceForkData; -extern NSString *XADFinderFlags; +XADEXTERN NSString *const XADResourceDataKey; +XADEXTERN NSString *const XADFinderFlags; @class UniversalDetector; +@class XADArchive; +@protocol XADArchiveDelegate +@optional + +-(NSStringEncoding)archive:(XADArchive *)archive encodingForData:(NSData *)data guess:(NSStringEncoding)guess confidence:(float)confidence; +-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(NSInteger)n data:(NSData *)data; + +-(BOOL)archiveExtractionShouldStop:(XADArchive *)archive; +-(BOOL)archive:(XADArchive *)archive shouldCreateDirectory:(NSString *)directory; +-(void)archive:(XADArchive *)archive didCreateDirectory:(NSString *)directory; +-(XADAction)archive:(XADArchive *)archive entry:(NSInteger)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname; +-(XADAction)archive:(XADArchive *)archive entry:(NSInteger)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname; +-(XADAction)archive:(XADArchive *)archive creatingDirectoryDidFailForEntry:(NSInteger)n; + +-(void)archiveNeedsPassword:(XADArchive *)archive; + +-(void)archive:(XADArchive *)archive extractionOfEntryWillStart:(NSInteger)n; +-(void)archive:(XADArchive *)archive extractionProgressForEntry:(NSInteger)n bytes:(off_t)bytes of:(off_t)total; +-(void)archive:(XADArchive *)archive extractionOfEntryDidSucceed:(NSInteger)n; +-(XADAction)archive:(XADArchive *)archive extractionOfEntryDidFail:(NSInteger)n error:(XADError)error; +-(XADAction)archive:(XADArchive *)archive extractionOfResourceForkForEntryDidFail:(NSInteger)n error:(XADError)error; -@interface XADArchive:NSObject +-(void)archive:(XADArchive *)archive extractionProgressBytes:(off_t)bytes of:(off_t)total; + +@optional +-(void)archive:(XADArchive *)archive extractionProgressFiles:(NSInteger)files of:(NSInteger)total; + +@optional +// Deprecated +-(NSStringEncoding)archive:(XADArchive *)archive encodingForName:(const char *)bytes guess:(NSStringEncoding)guess confidence:(float)confidence DEPRECATED_ATTRIBUTE; +-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(NSInteger)n bytes:(const char *)bytes DEPRECATED_ATTRIBUTE; + +@end + +XADEXPORT +@interface XADArchive:NSObject { XADArchiveParser *parser; XADUnarchiver *unarchiver; - id delegate; + id delegate; NSTimeInterval update_interval; XADError lasterror; @@ -69,19 +109,32 @@ extern NSString *XADFinderFlags; -(id)init; -(id)initWithFile:(NSString *)file; -(id)initWithFile:(NSString *)file error:(XADError *)error; --(id)initWithFile:(NSString *)file delegate:(id)del error:(XADError *)error; +-(id)initWithFile:(NSString *)file delegate:(id)del error:(XADError *)error; -(id)initWithData:(NSData *)data; -(id)initWithData:(NSData *)data error:(XADError *)error; --(id)initWithData:(NSData *)data delegate:(id)del error:(XADError *)error; --(id)initWithArchive:(XADArchive *)archive entry:(int)n; --(id)initWithArchive:(XADArchive *)archive entry:(int)n error:(XADError *)error; --(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n delegate:(id)del error:(XADError *)error; --(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n +-(id)initWithData:(NSData *)data delegate:(id)del error:(XADError *)error; +-(id)initWithArchive:(XADArchive *)archive entry:(NSInteger)n; +-(id)initWithArchive:(XADArchive *)archive entry:(NSInteger)n error:(XADError *)error; +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n delegate:(id)del error:(XADError *)error; +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n immediateExtractionTo:(NSString *)destination error:(XADError *)error; --(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n immediateExtractionTo:(NSString *)destination subArchives:(BOOL)sub error:(XADError *)error; -(void)dealloc; +-(id)initWithFile:(NSString *)file nserror:(NSError **)error; +-(id)initWithFile:(NSString *)file delegate:(id)del nserror:(NSError **)error; +-(id)initWithData:(NSData *)data nserror:(NSError **)error; +-(id)initWithData:(NSData *)data delegate:(id)del nserror:(NSError **)error; +-(id)initWithArchive:(XADArchive *)archive entry:(NSInteger)n nserror:(NSError **)error; +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n delegate:(id)del nserror:(NSError **)error; +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n +immediateExtractionTo:(NSString *)destination nserror:(NSError **)error; +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n +immediateExtractionTo:(NSString *)destination subArchives:(BOOL)sub nserror:(NSError **)error; + +-(id)initWithFileURL:(NSURL *)file delegate:(id)del error:(NSError **)error; + -(BOOL)_parseWithErrorPointer:(XADError *)error; -(NSString *)filename; @@ -90,13 +143,12 @@ extern NSString *XADFinderFlags; -(BOOL)isEncrypted; -(BOOL)isSolid; -(BOOL)isCorrupted; --(int)numberOfEntries; --(BOOL)immediateExtractionFailed; +-(NSInteger)numberOfEntries; +@property (readonly) BOOL immediateExtractionFailed; -(NSString *)commonTopDirectory; -(NSString *)comment; --(void)setDelegate:(id)delegate; --(id)delegate; +@property (assign) id delegate; -(NSString *)password; -(void)setPassword:(NSString *)newpassword; @@ -104,106 +156,74 @@ extern NSString *XADFinderFlags; -(NSStringEncoding)nameEncoding; -(void)setNameEncoding:(NSStringEncoding)encoding; --(XADError)lastError; +@property (readonly) XADError lastError; -(void)clearLastError; -(NSString *)describeLastError; -(NSString *)describeError:(XADError)error; --(NSString *)description; - - - --(NSDictionary *)dataForkParserDictionaryForEntry:(int)n; --(NSDictionary *)resourceForkParserDictionaryForEntry:(int)n; --(NSDictionary *)combinedParserDictionaryForEntry:(int)n; - --(NSString *)nameOfEntry:(int)n; --(BOOL)entryHasSize:(int)n; --(off_t)uncompressedSizeOfEntry:(int)n; --(off_t)compressedSizeOfEntry:(int)n; --(off_t)representativeSizeOfEntry:(int)n; --(BOOL)entryIsDirectory:(int)n; --(BOOL)entryIsLink:(int)n; --(BOOL)entryIsEncrypted:(int)n; --(BOOL)entryIsArchive:(int)n; --(BOOL)entryHasResourceFork:(int)n; --(NSString *)commentForEntry:(int)n; --(NSDictionary *)attributesOfEntry:(int)n; --(NSDictionary *)attributesOfEntry:(int)n withResourceFork:(BOOL)resfork; --(CSHandle *)handleForEntry:(int)n; --(CSHandle *)handleForEntry:(int)n error:(XADError *)error; --(CSHandle *)resourceHandleForEntry:(int)n; --(CSHandle *)resourceHandleForEntry:(int)n error:(XADError *)error; --(NSData *)contentsOfEntry:(int)n; + + +-(NSDictionary *)dataForkParserDictionaryForEntry:(NSInteger)n; +-(NSDictionary *)resourceForkParserDictionaryForEntry:(NSInteger)n; +-(NSDictionary *)combinedParserDictionaryForEntry:(NSInteger)n; + +-(NSString *)nameOfEntry:(NSInteger)n; +-(BOOL)entryHasSize:(NSInteger)n; +-(off_t)uncompressedSizeOfEntry:(NSInteger)n; +-(off_t)compressedSizeOfEntry:(NSInteger)n; +-(off_t)representativeSizeOfEntry:(NSInteger)n; +-(BOOL)entryIsDirectory:(NSInteger)n; +-(BOOL)entryIsLink:(NSInteger)n; +-(BOOL)entryIsEncrypted:(NSInteger)n; +-(BOOL)entryIsArchive:(NSInteger)n; +-(BOOL)entryHasResourceFork:(NSInteger)n; +-(NSString *)commentForEntry:(NSInteger)n; +-(NSDictionary *)attributesOfEntry:(NSInteger)n; +-(NSDictionary *)attributesOfEntry:(NSInteger)n withResourceFork:(BOOL)resfork; +-(CSHandle *)handleForEntry:(NSInteger)n; +-(CSHandle *)handleForEntry:(NSInteger)n error:(XADError *)error; +-(CSHandle *)resourceHandleForEntry:(NSInteger)n; +-(CSHandle *)resourceHandleForEntry:(NSInteger)n error:(XADError *)error; +-(NSData *)contentsOfEntry:(NSInteger)n; //-(NSData *)resourceContentsOfEntry:(int)n; -(BOOL)extractTo:(NSString *)destination; -(BOOL)extractTo:(NSString *)destination subArchives:(BOOL)sub; -(BOOL)extractEntries:(NSIndexSet *)entryset to:(NSString *)destination; -(BOOL)extractEntries:(NSIndexSet *)entryset to:(NSString *)destination subArchives:(BOOL)sub; --(BOOL)extractEntry:(int)n to:(NSString *)destination; --(BOOL)extractEntry:(int)n to:(NSString *)destination deferDirectories:(BOOL)defer; --(BOOL)extractEntry:(int)n to:(NSString *)destination deferDirectories:(BOOL)defer +-(BOOL)extractEntry:(NSInteger)n to:(NSString *)destination; +-(BOOL)extractEntry:(NSInteger)n to:(NSString *)destination deferDirectories:(BOOL)defer; +-(BOOL)extractEntry:(NSInteger)n to:(NSString *)destination deferDirectories:(BOOL)defer resourceFork:(BOOL)resfork; --(BOOL)extractEntry:(int)n to:(NSString *)destination deferDirectories:(BOOL)defer +-(BOOL)extractEntry:(NSInteger)n to:(NSString *)destination deferDirectories:(BOOL)defer dataFork:(BOOL)datafork resourceFork:(BOOL)resfork; --(BOOL)extractArchiveEntry:(int)n to:(NSString *)destination; +-(BOOL)extractArchiveEntry:(NSInteger)n to:(NSString *)destination; --(BOOL)_extractEntry:(int)n as:(NSString *)destfile deferDirectories:(BOOL)defer +-(BOOL)_extractEntry:(NSInteger)n as:(NSString *)destfile deferDirectories:(BOOL)defer dataFork:(BOOL)datafork resourceFork:(BOOL)resfork; -(void)updateAttributesForDeferredDirectories; // Deprecated -+(NSArray *)volumesForFile:(NSString *)filename; - --(int)sizeOfEntry:(int)n; --(void *)xadFileInfoForEntry:(int)n; --(BOOL)extractEntry:(int)n to:(NSString *)destination overrideWritePermissions:(BOOL)override; --(BOOL)extractEntry:(int)n to:(NSString *)destination overrideWritePermissions:(BOOL)override resourceFork:(BOOL)resfork; --(void)fixWritePermissions; - -@end - - - -@interface NSObject (XADArchiveDelegate) - --(NSStringEncoding)archive:(XADArchive *)archive encodingForData:(NSData *)data guess:(NSStringEncoding)guess confidence:(float)confidence; --(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n data:(NSData *)data; - --(BOOL)archiveExtractionShouldStop:(XADArchive *)archive; --(BOOL)archive:(XADArchive *)archive shouldCreateDirectory:(NSString *)directory; --(XADAction)archive:(XADArchive *)archive entry:(int)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname; --(XADAction)archive:(XADArchive *)archive entry:(int)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname; --(XADAction)archive:(XADArchive *)archive creatingDirectoryDidFailForEntry:(int)n; - --(void)archiveNeedsPassword:(XADArchive *)archive; - --(void)archive:(XADArchive *)archive extractionOfEntryWillStart:(int)n; --(void)archive:(XADArchive *)archive extractionProgressForEntry:(int)n bytes:(off_t)bytes of:(off_t)total; --(void)archive:(XADArchive *)archive extractionOfEntryDidSucceed:(int)n; --(XADAction)archive:(XADArchive *)archive extractionOfEntryDidFail:(int)n error:(XADError)error; --(XADAction)archive:(XADArchive *)archive extractionOfResourceForkForEntryDidFail:(int)n error:(XADError)error; ++(NSArray *)volumesForFile:(NSString *)filename DEPRECATED_ATTRIBUTE; --(void)archive:(XADArchive *)archive extractionProgressBytes:(off_t)bytes of:(off_t)total; --(void)archive:(XADArchive *)archive extractionProgressFiles:(int)files of:(int)total; - -// Deprecated --(NSStringEncoding)archive:(XADArchive *)archive encodingForName:(const char *)bytes guess:(NSStringEncoding)guess confidence:(float)confidence; --(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n bytes:(const char *)bytes; +-(int)sizeOfEntry:(int)n DEPRECATED_ATTRIBUTE; +-(void *)xadFileInfoForEntry:(int)n DEPRECATED_ATTRIBUTE; +-(BOOL)extractEntry:(int)n to:(NSString *)destination overrideWritePermissions:(BOOL)override DEPRECATED_ATTRIBUTE; +-(BOOL)extractEntry:(int)n to:(NSString *)destination overrideWritePermissions:(BOOL)override resourceFork:(BOOL)resfork DEPRECATED_ATTRIBUTE; +-(void)fixWritePermissions DEPRECATED_ATTRIBUTE; @end #ifndef XAD_NO_DEPRECATED -#define XADAbort XADAbortAction -#define XADRetry XADRetryAction -#define XADSkip XADSkipAction -#define XADOverwrite XADOverwriteAction -#define XADRename XADRenameAction +static const XADAction XADAbort API_DEPRECATED_WITH_REPLACEMENT("XADActionAbort", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionAbort; +static const XADAction XADRetry API_DEPRECATED_WITH_REPLACEMENT("XADActionRetry", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionRetry; +static const XADAction XADSkip API_DEPRECATED_WITH_REPLACEMENT("XADActionSkip", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionSkip; +static const XADAction XADOverwrite API_DEPRECATED_WITH_REPLACEMENT("XADActionOverwrite", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionOverwrite; +static const XADAction XADRename API_DEPRECATED_WITH_REPLACEMENT("XADActionRename", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionRename; typedef XADError xadERROR; typedef off_t xadSize; @@ -237,10 +257,10 @@ typedef off_t xadSize; #define XADEncodingError 0x0019 /* text encoding was defective */ #endif -#define XADAbort XADAbortAction -#define XADRetry XADRetryAction -#define XADSkip XADSkipAction -#define XADOverwrite XADOverwriteAction -#define XADRename XADRenameAction - #endif + +static const XADAction XADAbortAction API_DEPRECATED_WITH_REPLACEMENT("XADActionAbort", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionAbort; +static const XADAction XADRetryAction API_DEPRECATED_WITH_REPLACEMENT("XADActionRetry", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionRetry; +static const XADAction XADSkipAction API_DEPRECATED_WITH_REPLACEMENT("XADActionSkip", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionSkip; +static const XADAction XADOverwriteAction API_DEPRECATED_WITH_REPLACEMENT("XADActionOverwrite", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionOverwrite; +static const XADAction XADRenameAction API_DEPRECATED_WITH_REPLACEMENT("XADActionRename", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADActionRename; diff --git a/XADArchive.m b/XADArchive.m index 142455b0..1f6b194d 100644 --- a/XADArchive.m +++ b/XADArchive.m @@ -30,8 +30,8 @@ #import -NSString *XADResourceDataKey=@"XADResourceData"; -NSString *XADFinderFlags=@"XADFinderFlags"; +NSString *const XADResourceDataKey=@"XADResourceData"; +NSString *const XADFinderFlags=@"XADFinderFlags"; @@ -75,14 +75,14 @@ -(id)init parser=nil; unarchiver=nil; delegate=nil; - lasterror=XADNoError; + lasterror=XADErrorNone; immediatedestination=nil; immediatefailed=NO; immediatesize=0; parentarchive=nil; - dataentries=[[NSMutableArray array] retain]; - resourceentries=[[NSMutableArray array] retain]; + dataentries=[[NSMutableArray alloc] init]; + resourceentries=[[NSMutableArray alloc] init]; namedict=nil; } return self; @@ -103,7 +103,7 @@ -(id)initWithFile:(NSString *)file delegate:(id)del error:(XADError *)error { if([self _parseWithErrorPointer:error]) return self; } - else if(error) *error=XADDataFormatError; + else if(error) *error=XADErrorDataFormat; [self release]; } @@ -112,6 +112,23 @@ -(id)initWithFile:(NSString *)file delegate:(id)del error:(XADError *)error } +-(id)initWithFileURL:(NSURL *)file delegate:(id)del error:(NSError **)error +{ + if (self = [self init]) { + delegate = del; + + parser=[[XADArchiveParser archiveParserForFileURL:file error:error] retain]; + if (parser) { + if ([self _parseWithNSErrorPointer:error]) { + return self; + } + } + [self release]; + } + + return nil; +} + -(id)initWithData:(NSData *)data { return [self initWithData:data delegate:nil error:NULL]; } @@ -128,7 +145,7 @@ -(id)initWithData:(NSData *)data delegate:(id)del error:(XADError *)error { if([self _parseWithErrorPointer:error]) return self; } - else if(error) *error=XADDataFormatError; + else if(error) *error=XADErrorDataFormat; [self release]; } @@ -137,26 +154,28 @@ -(id)initWithData:(NSData *)data delegate:(id)del error:(XADError *)error --(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n { return [self initWithArchive:otherarchive entry:n delegate:nil error:NULL]; } +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n { return [self initWithArchive:otherarchive entry:n delegate:nil error:NULL]; } --(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n error:(XADError *)error { return [self initWithArchive:otherarchive entry:n delegate:nil error:error]; } +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n error:(XADError *)error { return [self initWithArchive:otherarchive entry:n delegate:nil error:error]; } --(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n delegate:(id)del error:(XADError *)error +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n nserror:(NSError **)error { return [self initWithArchive:otherarchive entry:n delegate:nil nserror:error]; } + +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n delegate:(id)del nserror:(NSError **)error { if((self=[self init])) { parentarchive=[otherarchive retain]; delegate=del; - CSHandle *handle=[otherarchive handleForEntry:n error:error]; + CSHandle *handle=[otherarchive handleForEntry:n nserror:error]; if(handle) { parser=[[XADArchiveParser archiveParserForHandle:handle name:[otherarchive nameOfEntry:n]] retain]; if(parser) { - if([self _parseWithErrorPointer:error]) return self; + if([self _parseWithNSErrorPointer:error]) return self; } - else if(error) *error=XADDataFormatError; + else if(error) *error=[NSError errorWithDomain:XADErrorDomain code:XADErrorDataFormat userInfo:nil]; } [self release]; @@ -165,14 +184,16 @@ -(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n delegate:(id)del er return nil; } --(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n + +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n immediateExtractionTo:(NSString *)destination error:(XADError *)error { return [self initWithArchive:otherarchive entry:n immediateExtractionTo:destination subArchives:NO error:error]; } --(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n + +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n immediateExtractionTo:(NSString *)destination subArchives:(BOOL)sub error:(XADError *)error { if((self=[self init])) @@ -207,8 +228,78 @@ -(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n return self; } } - else if(error) *error=XADSubArchiveError; + else if(error) *error=XADErrorSubArchive; + + [self release]; + } + + return nil; +} + +-(instancetype)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n delegate:(id)del error:(XADError *)error +{ + if((self=[self init])) + { + parentarchive=[otherarchive retain]; + delegate=del; + + CSHandle *handle=[otherarchive handleForEntry:n error:error]; + if(handle) + { + parser=[[XADArchiveParser archiveParserForHandle:handle name:[otherarchive nameOfEntry:n]] retain]; + if(parser) + { + if([self _parseWithErrorPointer:error]) return self; + } + else if(error) *error=XADErrorDataFormat; + } + } + + return nil; +} + + +-(id)initWithArchive:(XADArchive *)otherarchive entry:(NSInteger)n + immediateExtractionTo:(NSString *)destination subArchives:(BOOL)sub nserror:(NSError **)error +{ + if((self=[self init])) + { + parentarchive=[otherarchive retain]; + immediatedestination=destination; + immediatesubarchives=sub; + delegate=otherarchive; + + immediatesize=[otherarchive representativeSizeOfEntry:n]; + + parser=[[XADArchiveParser archiveParserForEntryWithDictionary: + [otherarchive dataForkParserDictionaryForEntry:n] + archiveParser:otherarchive->parser wantChecksum:YES nserror:error] retain]; + if(parser) + { + if([self _parseWithNSErrorPointer:error]) + { + if(!immediatefailed) + { + NSError *tmpErr = nil; + BOOL checksumerror=[parser testChecksumWithError:&tmpErr]; + if(checksumerror) + { + if ([[tmpErr domain] isEqualToString:XADErrorDomain]) { + lasterror=(XADError)tmpErr.code; + } else { + lasterror=XADErrorChecksum; + } + if(error) *error=tmpErr; + immediatefailed=YES; + } + } + [self updateAttributesForDeferredDirectories]; + immediatedestination=nil; + return self; + } + } + else if(error && *error == nil) *error=[NSError errorWithDomain:XADErrorDomain code:XADErrorSubArchive userInfo:nil]; [self release]; } @@ -232,12 +323,12 @@ -(void)dealloc -(BOOL)_parseWithErrorPointer:(XADError *)error { - unarchiver=[[XADUnarchiver unarchiverForArchiveParser:parser] retain]; + unarchiver=[[XADUnarchiver alloc] initWithArchiveParser:parser]; [parser setDelegate:self]; [unarchiver setDelegate:self]; - namedict=[[NSMutableDictionary dictionary] retain]; + namedict=[[NSMutableDictionary alloc] init]; XADError parseerror=[parser parseWithoutExceptions]; if(parseerror) @@ -251,7 +342,38 @@ -(BOOL)_parseWithErrorPointer:(XADError *)error [namedict release]; namedict=nil; - return lasterror==XADNoError||[dataentries count]!=0; + return lasterror==XADErrorNone||[dataentries count]!=0; +} + +-(BOOL)_parseWithNSErrorPointer:(NSError **)error +{ + NSError *tmpErr; + unarchiver=[[XADUnarchiver alloc] initWithArchiveParser:parser]; + + parser.delegate = self; + unarchiver.delegate = self; + + namedict=[[NSMutableDictionary alloc] init]; + + BOOL parseerror=[parser parseWithError:&tmpErr]; + if(!parseerror) + { + if ([tmpErr.domain isEqualToString:XADErrorDomain]) { + lasterror = (XADError)tmpErr.code; + } else { + lasterror = XADErrorUnknown; + } + if(error) *error=tmpErr; + } + + if (immediatefailed && error && !parseerror) { + *error=[NSError errorWithDomain:XADErrorDomain code:lasterror userInfo:nil]; + } + + [namedict release]; + namedict=nil; + + return lasterror==XADErrorNone||[dataentries count]!=0; } -(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDictionary *)dict @@ -298,7 +420,7 @@ -(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDict @try { res=[self extractArchiveEntry:n to:immediatedestination]; } @catch(id e) { res=NO; } - if(!res&&lasterror==XADDataFormatError) + if(!res&&lasterror==XADErrorDataFormat) { if(![self extractEntry:n to:immediatedestination deferDirectories:YES dataFork:YES resourceFork:NO]) @@ -332,11 +454,11 @@ -(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDict [resourceentries addObject:[NSNull null]]; } - [namedict setObject:[NSNumber numberWithInt:[dataentries count]-1] forKey:name]; + [namedict setObject:[NSNumber numberWithInteger:[dataentries count]-1] forKey:name]; if(immediatedestination) { - int n=[dataentries count]-1; + NSInteger n=[dataentries count]-1; if(immediatesubarchives&&[self entryIsArchive:n]) { // Try to extract as archive, if the format is unknown, extract as regular file @@ -346,7 +468,7 @@ -(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDict if(!res) { - if(lasterror==XADDataFormatError) + if(lasterror==XADErrorDataFormat) { if(![self extractEntry:n to:immediatedestination deferDirectories:YES dataFork:YES resourceFork:YES]) @@ -371,7 +493,9 @@ -(BOOL)archiveParsingShouldStop:(XADArchiveParser *)parser -(void)archiveParserNeedsPassword:(XADArchiveParser *)parser { - [delegate archiveNeedsPassword:self]; + if ([delegate respondsToSelector:@selector(archiveNeedsPassword:)]) { + [delegate archiveNeedsPassword:self]; + } } @@ -408,9 +532,9 @@ -(BOOL)isCorrupted return [iscorrupted boolValue]; } --(int)numberOfEntries { return [dataentries count]; } +-(NSInteger)numberOfEntries { return [dataentries count]; } --(BOOL)immediateExtractionFailed { return immediatefailed; } +@synthesize immediateExtractionFailed = immediatefailed; -(NSString *)commonTopDirectory { @@ -424,8 +548,8 @@ -(NSString *)commonTopDirectory NSString *dirprefix=[directory stringByAppendingString:@"/"]; - int numentries=[self numberOfEntries]; - for(int i=1;i +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" +#import "XADTypes.h" #import "XADException.h" #import "XADString.h" #import "XADPath.h" @@ -27,81 +30,87 @@ #import "XADSkipHandle.h" #import "XADResourceFork.h" #import "Checksums.h" - -extern NSString *XADFileNameKey; -extern NSString *XADCommentKey; -extern NSString *XADFileSizeKey; -extern NSString *XADCompressedSizeKey; -extern NSString *XADCompressionNameKey; - -extern NSString *XADLastModificationDateKey; -extern NSString *XADLastAccessDateKey; -extern NSString *XADLastAttributeChangeDateKey; -extern NSString *XADLastBackupDateKey; -extern NSString *XADCreationDateKey; - -extern NSString *XADIsDirectoryKey; -extern NSString *XADIsResourceForkKey; -extern NSString *XADIsArchiveKey; -extern NSString *XADIsHiddenKey; -extern NSString *XADIsLinkKey; -extern NSString *XADIsHardLinkKey; -extern NSString *XADLinkDestinationKey; -extern NSString *XADIsCharacterDeviceKey; -extern NSString *XADIsBlockDeviceKey; -extern NSString *XADDeviceMajorKey; -extern NSString *XADDeviceMinorKey; -extern NSString *XADIsFIFOKey; -extern NSString *XADIsEncryptedKey; -extern NSString *XADIsCorruptedKey; - -extern NSString *XADExtendedAttributesKey; -extern NSString *XADFileTypeKey; -extern NSString *XADFileCreatorKey; -extern NSString *XADFinderFlagsKey; -extern NSString *XADFinderInfoKey; -extern NSString *XADPosixPermissionsKey; -extern NSString *XADPosixUserKey; -extern NSString *XADPosixGroupKey; -extern NSString *XADPosixUserNameKey; -extern NSString *XADPosixGroupNameKey; -extern NSString *XADDOSFileAttributesKey; -extern NSString *XADWindowsFileAttributesKey; -extern NSString *XADAmigaProtectionBitsKey; - -extern NSString *XADIndexKey; -extern NSString *XADDataOffsetKey; -extern NSString *XADDataLengthKey; -extern NSString *XADSkipOffsetKey; -extern NSString *XADSkipLengthKey; - -extern NSString *XADIsSolidKey; -extern NSString *XADFirstSolidIndexKey; -extern NSString *XADFirstSolidEntryKey; -extern NSString *XADNextSolidIndexKey; -extern NSString *XADNextSolidEntryKey; -extern NSString *XADSolidObjectKey; -extern NSString *XADSolidOffsetKey; -extern NSString *XADSolidLengthKey; +#pragma clang diagnostic pop + +typedef NSString *XADArchiveKeys NS_TYPED_EXTENSIBLE_ENUM NS_SWIFT_NAME(XADArchiveParser.Keys); + +XADEXTERN XADArchiveKeys const XADFileNameKey NS_SWIFT_NAME(fileName); +XADEXTERN XADArchiveKeys const XADCommentKey NS_SWIFT_NAME(comment); +XADEXTERN XADArchiveKeys const XADFileSizeKey NS_SWIFT_NAME(fileSize); +XADEXTERN XADArchiveKeys const XADCompressedSizeKey NS_SWIFT_NAME(compressedSize); +XADEXTERN XADArchiveKeys const XADCompressionNameKey NS_SWIFT_NAME(compressionName); + +XADEXTERN XADArchiveKeys const XADLastModificationDateKey NS_SWIFT_NAME(lastModificationDate); +XADEXTERN XADArchiveKeys const XADLastAccessDateKey NS_SWIFT_NAME(lastAccessDate); +XADEXTERN XADArchiveKeys const XADLastAttributeChangeDateKey NS_SWIFT_NAME(lastAttributeChangeDate); +XADEXTERN XADArchiveKeys const XADLastBackupDateKey NS_SWIFT_NAME(lastBackupDate); +XADEXTERN XADArchiveKeys const XADCreationDateKey NS_SWIFT_NAME(creationDate); + +XADEXTERN XADArchiveKeys const XADIsDirectoryKey NS_SWIFT_NAME(isDirectory); +XADEXTERN XADArchiveKeys const XADIsResourceForkKey NS_SWIFT_NAME(isResourceFork); +XADEXTERN XADArchiveKeys const XADIsArchiveKey NS_SWIFT_NAME(isArchive); +XADEXTERN XADArchiveKeys const XADIsHiddenKey NS_SWIFT_NAME(isHidden); +XADEXTERN XADArchiveKeys const XADIsLinkKey NS_SWIFT_NAME(isLink); +XADEXTERN XADArchiveKeys const XADIsHardLinkKey NS_SWIFT_NAME(isHardLink); +XADEXTERN XADArchiveKeys const XADLinkDestinationKey NS_SWIFT_NAME(linkDestination); +XADEXTERN XADArchiveKeys const XADIsCharacterDeviceKey NS_SWIFT_NAME(isCharacterDevice); +XADEXTERN XADArchiveKeys const XADIsBlockDeviceKey NS_SWIFT_NAME(isBlockDevice); +XADEXTERN XADArchiveKeys const XADDeviceMajorKey NS_SWIFT_NAME(deviceMajor); +XADEXTERN XADArchiveKeys const XADDeviceMinorKey NS_SWIFT_NAME(deviceMinor); +XADEXTERN XADArchiveKeys const XADIsFIFOKey NS_SWIFT_NAME(isFIFO); +XADEXTERN XADArchiveKeys const XADIsEncryptedKey NS_SWIFT_NAME(isEncrypted); +XADEXTERN XADArchiveKeys const XADIsCorruptedKey NS_SWIFT_NAME(isCorrupted); + +XADEXTERN XADArchiveKeys const XADExtendedAttributesKey NS_SWIFT_NAME(extendedAttributes); +XADEXTERN XADArchiveKeys const XADFileTypeKey NS_SWIFT_NAME(fileType); +XADEXTERN XADArchiveKeys const XADFileCreatorKey NS_SWIFT_NAME(fileCreator); +XADEXTERN XADArchiveKeys const XADFinderFlagsKey NS_SWIFT_NAME(finderFlags); +XADEXTERN XADArchiveKeys const XADFinderInfoKey NS_SWIFT_NAME(finderInfo); +XADEXTERN XADArchiveKeys const XADPosixPermissionsKey NS_SWIFT_NAME(posixPermissions); +XADEXTERN XADArchiveKeys const XADPosixUserKey NS_SWIFT_NAME(posixUser); +XADEXTERN XADArchiveKeys const XADPosixGroupKey NS_SWIFT_NAME(posixGroup); +XADEXTERN XADArchiveKeys const XADPosixUserNameKey NS_SWIFT_NAME(posixUserName); +XADEXTERN XADArchiveKeys const XADPosixGroupNameKey NS_SWIFT_NAME(posixGroupName); +XADEXTERN XADArchiveKeys const XADDOSFileAttributesKey NS_SWIFT_NAME(dosFileAttributes); +XADEXTERN XADArchiveKeys const XADWindowsFileAttributesKey NS_SWIFT_NAME(windowsFileAttributes); +XADEXTERN XADArchiveKeys const XADAmigaProtectionBitsKey NS_SWIFT_NAME(amigaProtectionBits); + +XADEXTERN XADArchiveKeys const XADIndexKey NS_SWIFT_NAME(index); +XADEXTERN XADArchiveKeys const XADDataOffsetKey NS_SWIFT_NAME(dataOffset); +XADEXTERN XADArchiveKeys const XADDataLengthKey NS_SWIFT_NAME(dataLength); +XADEXTERN XADArchiveKeys const XADSkipOffsetKey NS_SWIFT_NAME(skipOffset); +XADEXTERN XADArchiveKeys const XADSkipLengthKey NS_SWIFT_NAME(skipLength); + +XADEXTERN XADArchiveKeys const XADIsSolidKey NS_SWIFT_NAME(isSolid); +XADEXTERN XADArchiveKeys const XADFirstSolidIndexKey NS_SWIFT_NAME(firstSolidIndex); +XADEXTERN XADArchiveKeys const XADFirstSolidEntryKey NS_SWIFT_NAME(firstSolidEntry); +XADEXTERN XADArchiveKeys const XADNextSolidIndexKey NS_SWIFT_NAME(nextSolidIndex); +XADEXTERN XADArchiveKeys const XADNextSolidEntryKey NS_SWIFT_NAME(nextSolidEntry); +XADEXTERN XADArchiveKeys const XADSolidObjectKey NS_SWIFT_NAME(solidObject); +XADEXTERN XADArchiveKeys const XADSolidOffsetKey NS_SWIFT_NAME(solidOffset); +XADEXTERN XADArchiveKeys const XADSolidLengthKey NS_SWIFT_NAME(solidLength); // Archive properties only -extern NSString *XADArchiveNameKey; -extern NSString *XADVolumesKey; -extern NSString *XADVolumeScanningFailedKey; -extern NSString *XADDiskLabelKey; +XADEXTERN XADArchiveKeys const XADArchiveNameKey NS_SWIFT_NAME(archiveName); +XADEXTERN XADArchiveKeys const XADVolumesKey NS_SWIFT_NAME(volumes); +XADEXTERN XADArchiveKeys const XADVolumeScanningFailedKey NS_SWIFT_NAME(volumeScanningFailed); +XADEXTERN XADArchiveKeys const XADDiskLabelKey NS_SWIFT_NAME(diskLabel); + +XADEXTERN XADArchiveKeys const XADSignatureOffset; +XADEXTERN XADArchiveKeys const XADParserClass; -extern NSString *XADSignatureOffset; -extern NSString *XADParserClass; +@protocol XADArchiveParserDelegate; +XADEXPORT @interface XADArchiveParser:NSObject { CSHandle *sourcehandle; XADSkipHandle *skiphandle; XADResourceFork *resourcefork; - id delegate; + id delegate; NSString *password; - NSString *passwordencodingname; + XADStringEncodingName passwordencodingname; BOOL caresaboutpasswordencoding; NSMutableDictionary *properties; @@ -139,49 +148,66 @@ resourceFork:(XADResourceFork *)fork name:(NSString *)name propertiesToAdd:(NSMu +(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry resourceForkDictionary:(NSDictionary *)forkentry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum; +(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry resourceForkDictionary:(NSDictionary *)forkentry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum error:(XADError *)errorptr; +#pragma mark NSError functions ++(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle name:(NSString *)name nserror:(NSError **)errorptr NS_SWIFT_NAME(archiveParser(for:name:)); ++(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry +archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr +NS_SWIFT_NAME(archiveParser(with:archiveParser:wantChecksum:)); ++(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry +resourceForkDictionary:(NSDictionary *)forkentry archiveParser:(XADArchiveParser *)parser +wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr +NS_SWIFT_NAME(archiveParser(with:resourceForkDictionary:archiveParser:wantChecksum:)); ++(XADArchiveParser *)archiveParserForPath:(NSString *)filename nserror:(NSError **)errorptr +NS_SWIFT_NAME(archiveParser(forPath:)); ++(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header +resourceFork:(XADResourceFork *)fork name:(NSString *)name nserror:(NSError **)errorptr +NS_SWIFT_NAME(archiveParser(for:firstBytes:resourceFork:name:)); ++(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle resourceFork:(XADResourceFork *)fork +name:(NSString *)name nserror:(NSError **)errorptr +NS_SWIFT_NAME(archiveParser(for:resourceFork:name:)); ++(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header +name:(NSString *)name nserror:(NSError **)errorptr +NS_SWIFT_NAME(archiveParser(for:firstBytes:name:)); ++(XADArchiveParser *)archiveParserForFileURL:(NSURL *)filename error:(NSError **)errorptr +NS_SWIFT_NAME(archiveParser(for:)); + -(id)init; -(void)dealloc; --(CSHandle *)handle; --(void)setHandle:(CSHandle *)newhandle; --(XADResourceFork *)resourceFork; --(void)setResourceFork:(XADResourceFork *)newfork; --(NSString *)name; --(void)setName:(NSString *)newname; +@property (nonatomic, retain) CSHandle *handle; +@property (retain) XADResourceFork *resourceFork; +@property (nonatomic, copy) NSString *name; -(NSString *)filename; -(void)setFilename:(NSString *)filename; -(NSArray *)allFilenames; -(void)setAllFilenames:(NSArray *)newnames; --(id)delegate; --(void)setDelegate:(id)newdelegate; +@property (assign) id delegate; --(NSDictionary *)properties; --(NSString *)currentFilename; +@property (readonly, copy) NSDictionary *properties; +@property (nonatomic, readonly, copy) NSString *currentFilename; --(BOOL)isEncrypted; --(NSString *)password; --(BOOL)hasPassword; --(void)setPassword:(NSString *)newpassword; +@property (readonly, nonatomic, getter=isEncrypted) BOOL encrypted; +@property (nonatomic, copy) NSString *password; +@property (nonatomic, readonly) BOOL hasPassword; --(NSString *)encodingName; --(float)encodingConfidence; --(void)setEncodingName:(NSString *)encodingname; --(BOOL)caresAboutPasswordEncoding; --(NSString *)passwordEncodingName; --(void)setPasswordEncodingName:(NSString *)encodingname; --(XADStringSource *)stringSource; +@property (nonatomic, copy) XADStringEncodingName encodingName; +@property (nonatomic, readonly) float encodingConfidence; +@property (readonly) BOOL caresAboutPasswordEncoding; +@property (nonatomic, retain) XADStringEncodingName passwordEncodingName; +@property (readonly, retain) XADStringSource *stringSource; -(XADString *)linkDestinationForDictionary:(NSDictionary *)dict; -(XADString *)linkDestinationForDictionary:(NSDictionary *)dict error:(XADError *)errorptr; -(NSDictionary *)extendedAttributesForDictionary:(NSDictionary *)dict; -(NSData *)finderInfoForDictionary:(NSDictionary *)dict; --(BOOL)wasStopped; +@property (readonly) BOOL wasStopped; --(BOOL)hasChecksum; --(BOOL)testChecksum; +@property (nonatomic, readonly) BOOL hasChecksum; +-(BOOL)testChecksum NS_SWIFT_UNAVAILABLE("throws exception"); -(XADError)testChecksumWithoutExceptions; +-(BOOL)testChecksumWithError:(NSError**)error NS_REFINED_FOR_SWIFT; @@ -194,15 +220,15 @@ regex:(XADRegex *)regex firstFileExtension:(NSString *)firstext; -(BOOL)shouldKeepParsing; -(CSHandle *)handleAtDataOffsetForDictionary:(NSDictionary *)dict; --(XADSkipHandle *)skipHandle; +@property (readonly, retain) XADSkipHandle *skipHandle; -(CSHandle *)zeroLengthHandleWithChecksum:(BOOL)checksum; -(CSHandle *)subHandleFromSolidStreamForEntryWithDictionary:(NSDictionary *)dict; --(BOOL)hasVolumes; --(NSArray *)volumeSizes; --(CSHandle *)currentHandle; +@property (readonly) BOOL hasVolumes; +@property (readonly, copy) NSArray *volumeSizes; +@property (readonly, retain) CSHandle *currentHandle; --(void)setObject:(id)object forPropertyKey:(NSString *)key; +-(void)setObject:(id)object forPropertyKey:(XADArchiveKeys)key; -(void)addPropertiesFromDictionary:(NSDictionary *)dict; -(void)setIsMacArchive:(BOOL)ismac; @@ -211,31 +237,34 @@ regex:(XADRegex *)regex firstFileExtension:(NSString *)firstext; -(XADString *)XADStringWithString:(NSString *)string; -(XADString *)XADStringWithData:(NSData *)data; --(XADString *)XADStringWithData:(NSData *)data encodingName:(NSString *)encoding; --(XADString *)XADStringWithBytes:(const void *)bytes length:(int)length; --(XADString *)XADStringWithBytes:(const void *)bytes length:(int)length encodingName:(NSString *)encoding; +-(XADString *)XADStringWithData:(NSData *)data encodingName:(XADStringEncodingName)encoding; +-(XADString *)XADStringWithBytes:(const void *)bytes length:(NSInteger)length; +-(XADString *)XADStringWithBytes:(const void *)bytes length:(NSInteger)length encodingName:(XADStringEncodingName)encoding; -(XADString *)XADStringWithCString:(const char *)cstring; --(XADString *)XADStringWithCString:(const char *)cstring encodingName:(NSString *)encoding; +-(XADString *)XADStringWithCString:(const char *)cstring encodingName:(XADStringEncodingName)encoding; --(XADPath *)XADPath; +@property (readonly, copy) XADPath *XADPath; -(XADPath *)XADPathWithString:(NSString *)string; -(XADPath *)XADPathWithUnseparatedString:(NSString *)string; -(XADPath *)XADPathWithData:(NSData *)data separators:(const char *)separators; --(XADPath *)XADPathWithData:(NSData *)data encodingName:(NSString *)encoding separators:(const char *)separators; --(XADPath *)XADPathWithBytes:(const void *)bytes length:(int)length separators:(const char *)separators; --(XADPath *)XADPathWithBytes:(const void *)bytes length:(int)length encodingName:(NSString *)encoding separators:(const char *)separators; +-(XADPath *)XADPathWithData:(NSData *)data encodingName:(XADStringEncodingName)encoding separators:(const char *)separators; +-(XADPath *)XADPathWithBytes:(const void *)bytes length:(NSInteger)length separators:(const char *)separators; +-(XADPath *)XADPathWithBytes:(const void *)bytes length:(NSInteger)length encodingName:(XADStringEncodingName)encoding separators:(const char *)separators; -(XADPath *)XADPathWithCString:(const char *)cstring separators:(const char *)separators; --(XADPath *)XADPathWithCString:(const char *)cstring encodingName:(NSString *)encoding separators:(const char *)separators; +-(XADPath *)XADPathWithCString:(const char *)cstring encodingName:(XADStringEncodingName)encoding separators:(const char *)separators; -(NSData *)encodedPassword; -(const char *)encodedCStringPassword; --(void)reportInterestingFileWithReason:(NSString *)reason,...; +-(void)reportInterestingFileWithReason:(NSString *)reason,... NS_FORMAT_FUNCTION(1,2); +-(void)reportInterestingFileWithReason:(NSString *)reason format:(va_list)args NS_FORMAT_FUNCTION(1,0); // Subclasses implement these: - +#if __has_feature(objc_class_property) +@property (class, readonly) int requiredHeaderSize; +#endif +(int)requiredHeaderSize; +(BOOL)recognizeFileWithHandle:(CSHandle *)handle firstBytes:(NSData *)data name:(NSString *)name; @@ -257,9 +286,17 @@ name:(NSString *)name; -(XADError)parseWithoutExceptions; -(CSHandle *)handleForEntryWithDictionary:(NSDictionary *)dict wantChecksum:(BOOL)checksum error:(XADError *)errorptr; +//! Exception-free wrapper for subclass method.
+//! Will, in addition, pass `XADErrorBreak` and return `NO` if the delegate +//! requested parsing to stop. +-(BOOL)parseWithError:(NSError**)error; +//! Exception-free wrapper for subclass method. +-(CSHandle *)handleForEntryWithDictionary:(NSDictionary *)dict wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr ; + @end -@interface NSObject (XADArchiveParserDelegate) +@protocol XADArchiveParserDelegate +@optional -(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDictionary *)dict; -(BOOL)archiveParsingShouldStop:(XADArchiveParser *)parser; @@ -267,5 +304,3 @@ name:(NSString *)name; -(void)archiveParser:(XADArchiveParser *)parser findsFileInterestingForReason:(NSString *)reason; @end - -NSMutableArray *XADSortVolumes(NSMutableArray *volumes,NSString *firstfileextension); diff --git a/XADArchiveParser.m b/XADArchiveParser.m index 9842f267..19675c82 100644 --- a/XADArchiveParser.m +++ b/XADArchiveParser.m @@ -79,69 +79,69 @@ #include -NSString *XADFileNameKey=@"XADFileName"; -NSString *XADCommentKey=@"XADComment"; -NSString *XADFileSizeKey=@"XADFileSize"; -NSString *XADCompressedSizeKey=@"XADCompressedSize"; -NSString *XADCompressionNameKey=@"XADCompressionName"; - -NSString *XADIsDirectoryKey=@"XADIsDirectory"; -NSString *XADIsResourceForkKey=@"XADIsResourceFork"; -NSString *XADIsArchiveKey=@"XADIsArchive"; -NSString *XADIsHiddenKey=@"XADIsHidden"; -NSString *XADIsLinkKey=@"XADIsLink"; -NSString *XADIsHardLinkKey=@"XADIsHardLink"; -NSString *XADLinkDestinationKey=@"XADLinkDestination"; -NSString *XADIsCharacterDeviceKey=@"XADIsCharacterDevice"; -NSString *XADIsBlockDeviceKey=@"XADIsBlockDevice"; -NSString *XADDeviceMajorKey=@"XADDeviceMajor"; -NSString *XADDeviceMinorKey=@"XADDeviceMinor"; -NSString *XADIsFIFOKey=@"XADIsFIFO"; -NSString *XADIsEncryptedKey=@"XADIsEncrypted"; -NSString *XADIsCorruptedKey=@"XADIsCorrupted"; - -NSString *XADLastModificationDateKey=@"XADLastModificationDate"; -NSString *XADLastAccessDateKey=@"XADLastAccessDate"; -NSString *XADLastAttributeChangeDateKey=@"XADLastAttributeChangeDate"; -NSString *XADLastBackupDateKey=@"XADLastBackupDate"; -NSString *XADCreationDateKey=@"XADCreationDate"; - -NSString *XADExtendedAttributesKey=@"XADExtendedAttributes"; -NSString *XADFileTypeKey=@"XADFileType"; -NSString *XADFileCreatorKey=@"XADFileCreator"; -NSString *XADFinderFlagsKey=@"XADFinderFlags"; -NSString *XADFinderInfoKey=@"XADFinderInfo"; -NSString *XADPosixPermissionsKey=@"XADPosixPermissions"; -NSString *XADPosixUserKey=@"XADPosixUser"; -NSString *XADPosixGroupKey=@"XADPosixGroup"; -NSString *XADPosixUserNameKey=@"XADPosixUserName"; -NSString *XADPosixGroupNameKey=@"XADPosixGroupName"; -NSString *XADDOSFileAttributesKey=@"XADDOSFileAttributes"; -NSString *XADWindowsFileAttributesKey=@"XADWindowsFileAttributes"; -NSString *XADAmigaProtectionBitsKey=@"XADAmigaProtectionBits"; - -NSString *XADIndexKey=@"XADIndex"; -NSString *XADDataOffsetKey=@"XADDataOffset"; -NSString *XADDataLengthKey=@"XADDataLength"; -NSString *XADSkipOffsetKey=@"XADSkipOffset"; -NSString *XADSkipLengthKey=@"XADSkipLength"; - -NSString *XADIsSolidKey=@"XADIsSolid"; -NSString *XADFirstSolidIndexKey=@"XADFirstSolidIndex"; -NSString *XADFirstSolidEntryKey=@"XADFirstSolidEntry"; -NSString *XADNextSolidIndexKey=@"XADNextSolidIndex"; -NSString *XADNextSolidEntryKey=@"XADNextSolidEntry"; -NSString *XADSolidObjectKey=@"XADSolidObject"; -NSString *XADSolidOffsetKey=@"XADSolidOffset"; -NSString *XADSolidLengthKey=@"XADSolidLength"; - -NSString *XADArchiveNameKey=@"XADArchiveName"; -NSString *XADVolumesKey=@"XADVolumes"; -NSString *XADVolumeScanningFailedKey=@"XADVolumeScanningFailed"; -NSString *XADDiskLabelKey=@"XADDiskLabel"; - -NSString *XADSignatureOffset=@"XADFoundSignatureOffset"; -NSString *XADParserClass=@"XADParserClass"; +NSString *const XADFileNameKey=@"XADFileName"; +NSString *const XADCommentKey=@"XADComment"; +NSString *const XADFileSizeKey=@"XADFileSize"; +NSString *const XADCompressedSizeKey=@"XADCompressedSize"; +NSString *const XADCompressionNameKey=@"XADCompressionName"; + +NSString *const XADIsDirectoryKey=@"XADIsDirectory"; +NSString *const XADIsResourceForkKey=@"XADIsResourceFork"; +NSString *const XADIsArchiveKey=@"XADIsArchive"; +NSString *const XADIsHiddenKey=@"XADIsHidden"; +NSString *const XADIsLinkKey=@"XADIsLink"; +NSString *const XADIsHardLinkKey=@"XADIsHardLink"; +NSString *const XADLinkDestinationKey=@"XADLinkDestination"; +NSString *const XADIsCharacterDeviceKey=@"XADIsCharacterDevice"; +NSString *const XADIsBlockDeviceKey=@"XADIsBlockDevice"; +NSString *const XADDeviceMajorKey=@"XADDeviceMajor"; +NSString *const XADDeviceMinorKey=@"XADDeviceMinor"; +NSString *const XADIsFIFOKey=@"XADIsFIFO"; +NSString *const XADIsEncryptedKey=@"XADIsEncrypted"; +NSString *const XADIsCorruptedKey=@"XADIsCorrupted"; + +NSString *const XADLastModificationDateKey=@"XADLastModificationDate"; +NSString *const XADLastAccessDateKey=@"XADLastAccessDate"; +NSString *const XADLastAttributeChangeDateKey=@"XADLastAttributeChangeDate"; +NSString *const XADLastBackupDateKey=@"XADLastBackupDate"; +NSString *const XADCreationDateKey=@"XADCreationDate"; + +NSString *const XADExtendedAttributesKey=@"XADExtendedAttributes"; +NSString *const XADFileTypeKey=@"XADFileType"; +NSString *const XADFileCreatorKey=@"XADFileCreator"; +NSString *const XADFinderFlagsKey=@"XADFinderFlags"; +NSString *const XADFinderInfoKey=@"XADFinderInfo"; +NSString *const XADPosixPermissionsKey=@"XADPosixPermissions"; +NSString *const XADPosixUserKey=@"XADPosixUser"; +NSString *const XADPosixGroupKey=@"XADPosixGroup"; +NSString *const XADPosixUserNameKey=@"XADPosixUserName"; +NSString *const XADPosixGroupNameKey=@"XADPosixGroupName"; +NSString *const XADDOSFileAttributesKey=@"XADDOSFileAttributes"; +NSString *const XADWindowsFileAttributesKey=@"XADWindowsFileAttributes"; +NSString *const XADAmigaProtectionBitsKey=@"XADAmigaProtectionBits"; + +NSString *const XADIndexKey=@"XADIndex"; +NSString *const XADDataOffsetKey=@"XADDataOffset"; +NSString *const XADDataLengthKey=@"XADDataLength"; +NSString *const XADSkipOffsetKey=@"XADSkipOffset"; +NSString *const XADSkipLengthKey=@"XADSkipLength"; + +NSString *const XADIsSolidKey=@"XADIsSolid"; +NSString *const XADFirstSolidIndexKey=@"XADFirstSolidIndex"; +NSString *const XADFirstSolidEntryKey=@"XADFirstSolidEntry"; +NSString *const XADNextSolidIndexKey=@"XADNextSolidIndex"; +NSString *const XADNextSolidEntryKey=@"XADNextSolidEntry"; +NSString *const XADSolidObjectKey=@"XADSolidObject"; +NSString *const XADSolidOffsetKey=@"XADSolidOffset"; +NSString *const XADSolidLengthKey=@"XADSolidLength"; + +NSString *const XADArchiveNameKey=@"XADArchiveName"; +NSString *const XADVolumesKey=@"XADVolumes"; +NSString *const XADVolumeScanningFailedKey=@"XADVolumeScanningFailed"; +NSString *const XADDiskLabelKey=@"XADDiskLabel"; + +NSString *const XADSignatureOffset=@"XADFoundSignatureOffset"; +NSString *const XADParserClass=@"XADParserClass"; static NSComparisonResult CompareParserSignaturesLocations(id first,id second,void *context) { @@ -151,6 +151,10 @@ static NSComparisonResult CompareParserSignaturesLocations(id first,id second,vo return [offset1 compare:offset2]; } +@interface XADArchiveParser () ++ (void)throwExceptionFromError:(NSError*)error CLANG_ANALYZER_NORETURN; +@end + @implementation XADArchiveParser static NSMutableArray *parserclasses=nil; @@ -164,7 +168,7 @@ +(void)initialize if(hasinitialized) return; hasinitialized=YES; - parserclasses=[[NSMutableArray arrayWithObjects: + parserclasses=[[NSMutableArray alloc] initWithObjects: // Common formats [XADZipParser class], [XADRARParser class], @@ -238,19 +242,17 @@ +(void)initialize // LibXAD [XADLibXADParser class], - nil] retain]; + nil]; // These classes can detect themselves incorrectly if one archive is placed in another - parsersWithFloatingSignaturesClasses = [[NSArray arrayWithObjects: + parsersWithFloatingSignaturesClasses = [[NSArray alloc] initWithObjects: [XADZipSFXParser class], [XADEmbeddedRARParser class], [XADEmbeddedRAR5Parser class], nil - ] retain]; + ]; - NSEnumerator *enumerator=[parserclasses objectEnumerator]; - Class class; - while((class=[enumerator nextObject])) + for(Class class in parserclasses) { int header=[class requiredHeaderSize]; if(header>maxheader) maxheader=header; @@ -345,7 +347,7 @@ +(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle name:(NSString *) +(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle name:(NSString *)name error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { return [self archiveParserForHandle:handle resourceFork:nil name:name]; } @catch(id exception) { if(errorptr) *errorptr=[XADException parseException:exception]; } return nil; @@ -359,7 +361,7 @@ +(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle resourceFork:(XAD +(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle resourceFork:(XADResourceFork *)fork name:(NSString *)name error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { return [self archiveParserForHandle:handle resourceFork:fork name:name]; } @catch(id exception) { if(errorptr) *errorptr=[XADException parseException:exception]; } return nil; @@ -372,7 +374,7 @@ +(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSDat +(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header name:(NSString *)name error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { return [self archiveParserForHandle:handle firstBytes:header resourceFork:nil name:name]; } @catch(id exception) { if(errorptr) *errorptr=[XADException parseException:exception]; } return nil; @@ -397,7 +399,7 @@ +(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSDat +(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header resourceFork:(XADResourceFork *)fork name:(NSString *)name error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { return [self archiveParserForHandle:handle firstBytes:header resourceFork:fork name:name]; } @catch(id exception) { if(errorptr) *errorptr=[XADException parseException:exception]; } return nil; @@ -461,7 +463,7 @@ +(XADArchiveParser *)archiveParserForPath:(NSString *)filename +(XADArchiveParser *)archiveParserForPath:(NSString *)filename error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { return [self archiveParserForPath:filename]; } @catch(id exception) { if(errorptr) *errorptr=[XADException parseException:exception]; } return nil; @@ -474,7 +476,7 @@ +(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry a +(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { return [self archiveParserForEntryWithDictionary:entry resourceForkDictionary:nil archiveParser:parser wantChecksum:checksum]; } @catch(id exception) { if(errorptr) *errorptr=[XADException parseException:exception]; } return nil; @@ -513,14 +515,67 @@ +(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry r +(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry resourceForkDictionary:(NSDictionary *)forkentry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { return [self archiveParserForEntryWithDictionary:entry resourceForkDictionary:forkentry archiveParser:parser wantChecksum:checksum]; } @catch(id exception) { if(errorptr) *errorptr=[XADException parseException:exception]; } return nil; } - ++(XADArchiveParser *)archiveParserForFileURL:(NSURL *)filename +{ + CSHandle *handle=[CSFileHandle fileHandleForReadingAtFileURL:filename]; + NSData *header=[handle readDataOfLengthAtMost:maxheader]; + + CSHandle *forkhandle=[XADPlatform handleForReadingResourceForkAtFileURL:filename]; + XADResourceFork *fork=[XADResourceFork resourceForkWithHandle:forkhandle error:NULL]; + + NSMutableDictionary *props=[NSMutableDictionary dictionary]; + + Class parserclass=[self archiveParserClassForHandle:handle + firstBytes:header resourceFork:fork name:filename.path propertiesToAdd:props]; + if(!parserclass) return nil; + + // Attempt to create a multi-volume parser, if we can find the volumes. + @try + { + NSArray *volumes=[parserclass volumesForHandle:handle firstBytes:header name:filename.path]; + [handle seekToFileOffset:0]; + + if(volumes) + { + if(volumes.count>1) + { + CSHandle *multihandle=[CSMultiFileHandle handleWithPathArray:volumes]; + + XADArchiveParser *parser=[parserclass new]; + parser.handle = multihandle; + parser.resourceFork = fork; + parser.allFilenames = volumes; + [parser addPropertiesFromDictionary:props]; + + return [parser autorelease]; + } + else if(volumes) + { + // An empty array means scanning failed. Set a flag to + // warn the caller, and fall through to single-file mode. + [props setValue:[NSNumber numberWithBool:YES] forKey:XADVolumeScanningFailedKey]; + } + } + } + @catch(id e) { } // Fall through to a single file instead. + + XADArchiveParser *parser=[[parserclass alloc] init]; + parser.handle = handle; + parser.resourceFork = fork; + parser.filename = filename.path; + + [props setValue:[NSArray arrayWithObject:filename.path] forKey:XADVolumesKey]; + [parser addPropertiesFromDictionary:props]; + + return [parser autorelease]; +} -(id)init @@ -566,13 +621,14 @@ -(void)dealloc [currsolidhandle release]; [firstsoliddict release]; [prevsoliddict release]; + [resourcefork release]; [super dealloc]; } --(CSHandle *)handle { return sourcehandle; } +@synthesize handle = sourcehandle; -(void)setHandle:(CSHandle *)newhandle { @@ -589,13 +645,7 @@ -(void)setHandle:(CSHandle *)newhandle else forcesolid=NO; } --(XADResourceFork *)resourceFork { return resourcefork; } - --(void)setResourceFork:(XADResourceFork *)newfork -{ - [resourcefork autorelease]; - resourcefork=[newfork retain]; -} +@synthesize resourceFork = resourcefork; -(NSString *)name { return [properties objectForKey:XADArchiveNameKey]; } @@ -620,11 +670,9 @@ -(void)setAllFilenames:(NSArray *)newnames [self setName:[newnames objectAtIndex:0]]; } --(id)delegate { return delegate; } +@synthesize delegate; --(void)setDelegate:(id)newdelegate { delegate=newdelegate; } - --(NSDictionary *)properties { return properties; } +-(NSDictionary *)properties { return [[properties copy] autorelease]; } -(NSString *)currentFilename { @@ -648,7 +696,9 @@ -(NSString *)password { if(!password) { - [delegate archiveParserNeedsPassword:self]; + if([delegate respondsToSelector:@selector(archiveParserNeedsPassword:)]) { + [delegate archiveParserNeedsPassword:self]; + } if(!password) return @""; } return password; @@ -662,7 +712,7 @@ -(BOOL)hasPassword -(void)setPassword:(NSString *)newpassword { [password autorelease]; - password=[newpassword retain]; + password=[newpassword copy]; // Make sure to invalidate any remaining solid handles, as they will need to change // for the new password. @@ -687,10 +737,8 @@ -(void)setEncodingName:(NSString *)encodingname [stringsource setFixedEncodingName:encodingname]; } --(BOOL)caresAboutPasswordEncoding -{ - return caresaboutpasswordencoding; -} +@synthesize caresAboutPasswordEncoding = caresaboutpasswordencoding; +@synthesize passwordEncodingName = passwordencodingname; -(NSString *)passwordEncodingName { @@ -707,7 +755,7 @@ -(void)setPasswordEncodingName:(NSString *)encodingname } } --(XADStringSource *)stringSource { return stringsource; } +@synthesize stringSource = stringsource; @@ -734,7 +782,7 @@ -(XADString *)linkDestinationForDictionary:(NSDictionary *)dict -(XADString *)linkDestinationForDictionary:(NSDictionary *)dict error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { return [self linkDestinationForDictionary:dict]; } @catch(id exception) { if(errorptr) *errorptr=[XADException parseException:exception]; } return nil; @@ -816,7 +864,7 @@ -(NSData *)finderInfoForDictionary:(NSDictionary *)dict } } --(BOOL)wasStopped { return shouldstop; } +@synthesize wasStopped = shouldstop; -(BOOL)hasChecksum { return [sourcehandle hasChecksum]; } @@ -829,12 +877,30 @@ -(BOOL)testChecksum -(XADError)testChecksumWithoutExceptions { - @try { if(![self testChecksum]) return XADChecksumError; } + @try { if(![self testChecksum]) return XADErrorChecksum; } @catch(id exception) { return [XADException parseException:exception]; } - return XADNoError; + return XADErrorNone; } - +-(BOOL)testChecksumWithError:(NSError**)error +{ + @try { + if(![self testChecksum]) { + if (error) { + *error = [NSError errorWithDomain:XADErrorDomain code:XADErrorChecksum userInfo:nil]; + } + return NO; + } + + } @catch(id exception) { + if (error) { + *error = [XADException parseExceptionReturningNSError:exception]; + } + return NO; + + } + return YES; +} // Internal functions @@ -872,10 +938,7 @@ +(NSArray *)scanForVolumesWithFilename:(NSString *)filename NSArray *dircontents=[XADPlatform contentsOfDirectoryAtPath:dirpath]; if(!dircontents) return [NSArray array]; - NSEnumerator *enumerator=[dircontents objectEnumerator]; - - NSString *direntry; - while((direntry=[enumerator nextObject])) + for(NSString *direntry in dircontents) { NSString *filename; if(directory) filename=[directory stringByAppendingPathComponent:direntry]; @@ -896,7 +959,9 @@ -(BOOL)shouldKeepParsing if(!delegate) return YES; if(shouldstop) return NO; - shouldstop=[delegate archiveParsingShouldStop:self]; + if ([delegate respondsToSelector:@selector(archiveParsingShouldStop:)]) { + shouldstop=[delegate archiveParsingShouldStop:self]; + } return !shouldstop; } @@ -905,12 +970,12 @@ -(BOOL)shouldKeepParsing -(CSHandle *)handleAtDataOffsetForDictionary:(NSDictionary *)dict { NSNumber *skipoffs=[dict objectForKey:XADSkipOffsetKey]; - if(skipoffs) + if(skipoffs != nil) { [skiphandle seekToFileOffset:[skipoffs longLongValue]]; NSNumber *length=[dict objectForKey:XADSkipLengthKey]; - if(length) return [skiphandle nonCopiedSubHandleOfLength:[length longLongValue]]; + if(length != nil) return [skiphandle nonCopiedSubHandleOfLength:[length longLongValue]]; else return skiphandle; } else @@ -918,11 +983,12 @@ -(CSHandle *)handleAtDataOffsetForDictionary:(NSDictionary *)dict [sourcehandle seekToFileOffset:[[dict objectForKey:XADDataOffsetKey] longLongValue]]; NSNumber *length=[dict objectForKey:XADDataLengthKey]; - if(length) return [sourcehandle nonCopiedSubHandleOfLength:[length longLongValue]]; + if(length != nil) return [sourcehandle nonCopiedSubHandleOfLength:[length longLongValue]]; else return sourcehandle; } } +@synthesize skipHandle = skiphandle; -(XADSkipHandle *)skipHandle { if(!skiphandle) skiphandle=[[XADSkipHandle alloc] initWithHandle:sourcehandle]; @@ -992,7 +1058,20 @@ -(void)addPropertiesFromDictionary:(NSDictionary *)dict { [properties addEntries -(void)setIsMacArchive:(BOOL)ismac { [stringsource setPrefersMacEncodings:ismac]; } +// Hack: the current XADArchiveParser expects exceptions, and it'll take awhile to rewrite ALL the subclasses to work with NSErrors instead. +// So we repackage the error as an exception. ++ (void)throwExceptionFromError:(NSError *)error +{ + if (![error.domain isEqualToString:XADErrorDomain]) { + [XADException raiseExceptionWithXADError:XADErrorDecrunch underlyingError:error]; + return; + } + NSMutableDictionary *exceptionUserInfo = [error.userInfo mutableCopy]; + [exceptionUserInfo setValue:[NSNumber numberWithInt:(XADError)error.code] forKey:@"XADError"]; + [[[NSException alloc] initWithName:XADExceptionName reason:[XADException describeXADError:(XADError)error.code] + userInfo:exceptionUserInfo] raise]; +} -(void)addEntryWithDictionary:(NSMutableDictionary *)dict { @@ -1127,13 +1206,14 @@ -(void)addEntryWithDictionary:(NSMutableDictionary *)dict retainPosition:(BOOL)r NSAutoreleasePool *delegatepool=[NSAutoreleasePool new]; - if(retainpos) - { - off_t pos=[sourcehandle offsetInFile]; - [delegate archiveParser:self foundEntryWithDictionary:dict]; - [sourcehandle seekToFileOffset:pos]; + if ([delegate respondsToSelector:@selector(archiveParser:foundEntryWithDictionary:)]) { + if (retainpos) { + off_t pos=sourcehandle.offsetInFile; + [delegate archiveParser:self foundEntryWithDictionary:dict]; + [sourcehandle seekToFileOffset:pos]; + } else + [delegate archiveParser:self foundEntryWithDictionary:dict]; } - else [delegate archiveParser:self foundEntryWithDictionary:dict]; [delegatepool release]; } @@ -1155,13 +1235,13 @@ -(XADString *)XADStringWithData:(NSData *)data encodingName:(NSString *)encoding return [XADString decodedXADStringWithData:data encodingName:encoding]; } --(XADString *)XADStringWithBytes:(const void *)bytes length:(int)length +-(XADString *)XADStringWithBytes:(const void *)bytes length:(NSInteger)length { NSData *data=[NSData dataWithBytes:bytes length:length]; return [XADString analyzedXADStringWithData:data source:stringsource]; } --(XADString *)XADStringWithBytes:(const void *)bytes length:(int)length encodingName:(NSString *)encoding +-(XADString *)XADStringWithBytes:(const void *)bytes length:(NSInteger)length encodingName:(NSString *)encoding { NSData *data=[NSData dataWithBytes:bytes length:length]; return [XADString decodedXADStringWithData:data encodingName:encoding]; @@ -1206,13 +1286,13 @@ -(XADPath *)XADPathWithData:(NSData *)data encodingName:(NSString *)encoding sep return [XADPath decodedPathWithData:data encodingName:encoding separators:separators]; } --(XADPath *)XADPathWithBytes:(const void *)bytes length:(int)length separators:(const char *)separators +-(XADPath *)XADPathWithBytes:(const void *)bytes length:(NSInteger)length separators:(const char *)separators { NSData *data=[NSData dataWithBytes:bytes length:length]; return [XADPath analyzedPathWithData:data source:stringsource separators:separators]; } --(XADPath *)XADPathWithBytes:(const void *)bytes length:(int)length encodingName:(NSString *)encoding separators:(const char *)separators +-(XADPath *)XADPathWithBytes:(const void *)bytes length:(NSInteger)length encodingName:(NSString *)encoding separators:(const char *)separators { NSData *data=[NSData dataWithBytes:bytes length:length]; return [XADPath decodedPathWithData:data encodingName:encoding separators:separators]; @@ -1255,14 +1335,20 @@ -(void)reportInterestingFileWithReason:(NSString *)reason,... { va_list args; va_start(args,reason); - NSString *fullreason=[[[NSString alloc] initWithFormat:reason arguments:args] autorelease]; + [self reportInterestingFileWithReason:reason format:args]; va_end(args); - - [delegate archiveParser:self findsFileInterestingForReason:[NSString stringWithFormat: - @"%@: %@",[self formatName],fullreason]]; } - +-(void)reportInterestingFileWithReason:(NSString *)reason format:(va_list)args +{ + NSString *fullreason=[[NSString alloc] initWithFormat:reason arguments:args]; + + if ([delegate respondsToSelector:@selector(archiveParser:findsFileInterestingForReason:)]) { + [delegate archiveParser:self findsFileInterestingForReason:[NSString stringWithFormat: + @"%@: %@", self.formatName, fullreason]]; + } + [fullreason release]; +} +(int)requiredHeaderSize { return 0; } @@ -1292,17 +1378,36 @@ -(XADError)parseWithoutExceptions { @try { [self parse]; } @catch(id exception) { return [XADException parseException:exception]; } - if(shouldstop) return XADBreakError; - return XADNoError; + if(shouldstop) return XADErrorBreak; + return XADErrorNone; +} + +-(BOOL)parseWithError:(NSError**)error +{ + @try { + [self parse]; + } @catch(id exception) { + if (error) { + *error = [XADException parseExceptionReturningNSError:exception]; + } + return NO; + } + if(shouldstop) { + if (error) { + *error = [NSError errorWithDomain:XADErrorDomain code:XADErrorBreak userInfo:nil]; + } + return NO; + } + return YES; } -(CSHandle *)handleForEntryWithDictionary:(NSDictionary *)dict wantChecksum:(BOOL)checksum error:(XADError *)errorptr { - if(errorptr) *errorptr=XADNoError; + if(errorptr) *errorptr=XADErrorNone; @try { CSHandle *handle=[self handleForEntryWithDictionary:dict wantChecksum:checksum]; - if(!handle&&errorptr) *errorptr=XADNotSupportedError; + if(!handle&&errorptr) *errorptr=XADErrorNotSupported; return handle; } @catch(id exception) @@ -1313,14 +1418,195 @@ -(CSHandle *)handleForEntryWithDictionary:(NSDictionary *)dict wantChecksum:(BOO return nil; } -@end +#pragma mark - NSError functions ++(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry +resourceForkDictionary:(NSDictionary *)forkentry archiveParser:(XADArchiveParser *)parser +wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr +{ + @try { + XADArchiveParser *tmpParse = [self archiveParserForEntryWithDictionary:entry resourceForkDictionary:forkentry archiveParser:parser wantChecksum:checksum]; + if (tmpParse) { + return tmpParse; + } + } @catch(id exception) { + if(errorptr) { + *errorptr=[XADException parseExceptionReturningNSError:exception]; + } + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:nil]; + } + return nil; +} -@implementation NSObject (XADArchiveParserDelegate) +-(XADString *)linkDestinationForDictionary:(NSDictionary *)dict nserror:(NSError **)errorptr +{ + @try { + XADString *tmpParse = [self linkDestinationForDictionary:dict]; + if (tmpParse) { + return tmpParse; + } + } @catch(id exception) { + if(errorptr) { + *errorptr=[XADException parseExceptionReturningNSError:exception]; + } + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:nil]; + } + return nil; +} + ++(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr +{ + @try { + XADArchiveParser *tmpParse = [self archiveParserForEntryWithDictionary:entry resourceForkDictionary:nil archiveParser:parser wantChecksum:checksum]; + if (tmpParse) { + return tmpParse; + } + } @catch(id exception) { + if(errorptr) { + *errorptr=[XADException parseExceptionReturningNSError:exception]; + } + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:nil]; + } + return nil; +} + ++(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle name:(NSString *)name nserror:(NSError **)errorptr +{ + @try { + XADArchiveParser *tmpParse = [self archiveParserForHandle:handle resourceFork:nil name:name]; + if (tmpParse) { + return tmpParse; + } + } @catch(id exception) { + if(errorptr) { + *errorptr=[XADException parseExceptionReturningNSError:exception]; + } + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:nil]; + } + return nil; +} + ++(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header resourceFork:(XADResourceFork *)fork name:(NSString *)name nserror:(NSError **)errorptr +{ + @try { + XADArchiveParser *tmpParse = [self archiveParserForHandle:handle firstBytes:header resourceFork:fork name:name]; + if (tmpParse) { + return tmpParse; + } + } @catch(id exception) { + if(errorptr) { + *errorptr=[XADException parseExceptionReturningNSError:exception]; + } + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:nil]; + } + return nil; +} + ++(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header name:(NSString *)name nserror:(NSError **)errorptr +{ + @try { + XADArchiveParser *tmpParse = [self archiveParserForHandle:handle firstBytes:header resourceFork:nil name:name]; + if (tmpParse) { + return tmpParse; + } + } @catch(id exception) { + if(errorptr) { + *errorptr=[XADException parseExceptionReturningNSError:exception]; + } + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:nil]; + } + return nil; +} + ++(XADArchiveParser *)archiveParserForFileURL:(NSURL *)filename error:(NSError **)errorptr +{ + @try { + XADArchiveParser *tmpParse = [self archiveParserForFileURL:filename]; + if (tmpParse) { + return tmpParse; + } + } @catch(id exception) { + if(errorptr) + *errorptr=[XADException parseExceptionReturningNSError:exception]; + + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:[NSDictionary dictionaryWithObjectsAndKeys:filename, NSURLErrorKey, nil]]; + } + return nil; +} --(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDictionary *)dict {} --(BOOL)archiveParsingShouldStop:(XADArchiveParser *)parser { return NO; } --(void)archiveParserNeedsPassword:(XADArchiveParser *)parser {} --(void)archiveParser:(XADArchiveParser *)parser findsFileInterestingForReason:(NSString *)reason {} ++(XADArchiveParser *)archiveParserForPath:(NSString *)filename nserror:(NSError **)errorptr +{ + @try { + XADArchiveParser *tmpParse = [self archiveParserForPath:filename]; + if (tmpParse) { + return tmpParse; + } + } @catch(id exception) { + if(errorptr) + *errorptr=[XADException parseExceptionReturningNSError:exception]; + + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:[NSDictionary dictionaryWithObjectsAndKeys:filename, NSFilePathErrorKey, nil]]; + } + return nil; +} + ++(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle resourceFork:(XADResourceFork *)fork name:(NSString *)name nserror:(NSError **)errorptr +{ + @try { + XADArchiveParser *parser = [self archiveParserForHandle:handle resourceFork:fork name:name]; + if (parser) { + return parser; + } + } @catch(id exception) { + if(errorptr) { + *errorptr=[XADException parseExceptionReturningNSError:exception]; + } + return nil; + } + if (errorptr) { + *errorptr = [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:nil]; + } + return nil; +} + +-(XADHandle *)handleForEntryWithDictionary:(NSDictionary *)dict wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr +{ + @try + { + CSHandle *handle=[self handleForEntryWithDictionary:dict wantChecksum:checksum]; + if(!handle&&errorptr) *errorptr=[NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:nil]; + return handle; + } + @catch(id exception) + { + if(errorptr) *errorptr=[XADException parseExceptionReturningNSError:exception]; + } + + return nil; +} @end diff --git a/XADArchiveParserDescriptions.h b/XADArchiveParserDescriptions.h index 826f611f..6ce7511b 100644 --- a/XADArchiveParserDescriptions.h +++ b/XADArchiveParserDescriptions.h @@ -18,30 +18,33 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "XADArchiveParser.h" +#pragma clang diagnostic pop @interface XADArchiveParser (Descriptions) --(NSString *)descriptionOfValueInDictionary:(NSDictionary *)dict key:(NSString *)key; --(NSString *)descriptionOfKey:(NSString *)key; +-(NSString *)descriptionOfValueInDictionary:(NSDictionary *)dict key:(XADArchiveKeys)key; +-(NSString *)descriptionOfKey:(XADArchiveKeys)key; -(NSArray *)descriptiveOrderingOfKeysInDictionary:(NSDictionary *)dict; @end -NSString *XADHumanReadableFileSize(uint64_t size); -NSString *XADShortHumanReadableFileSize(uint64_t size); -NSString *XADHumanReadableBoolean(uint64_t boolean); -NSString *XADHumanReadablePOSIXPermissions(uint64_t permissions); -NSString *XADHumanReadableAmigaProtectionBits(uint64_t protection); -NSString *XADHumanReadableDOSFileAttributes(uint64_t attributes); -NSString *XADHumanReadableWindowsFileAttributes(uint64_t attributes); -NSString *XADHumanReadableOSType(uint64_t ostype); -NSString *XADHumanReadableEntryWithDictionary(NSDictionary *dict,XADArchiveParser *parser); +XADEXTERN NSString *XADHumanReadableFileSize(uint64_t size); +XADEXTERN NSString *XADShortHumanReadableFileSize(uint64_t size); +XADEXTERN NSString *XADHumanReadableBoolean(uint64_t boolean); +XADEXTERN NSString *XADHumanReadablePOSIXPermissions(uint64_t permissions); +XADEXTERN NSString *XADHumanReadableAmigaProtectionBits(uint64_t protection); +XADEXTERN NSString *XADHumanReadableDOSFileAttributes(uint64_t attributes); +XADEXTERN NSString *XADHumanReadableWindowsFileAttributes(uint64_t attributes); +XADEXTERN NSString *XADHumanReadableOSType(uint64_t ostype); +XADEXTERN NSString *XADHumanReadableEntryWithDictionary(NSDictionary *dict,XADArchiveParser *parser); -NSString *XADHumanReadableObject(id object); -NSString *XADHumanReadableDate(NSDate *date); -NSString *XADHumanReadableData(NSData *data); -NSString *XADHumanReadableArray(NSArray *array); -NSString *XADHumanReadableDictionary(NSDictionary *dict); -NSString *XADHumanReadableList(NSArray *labels,NSArray *values); -NSString *XADIndentTextWithSpaces(NSString *text,int spaces); +XADEXTERN NSString *XADHumanReadableObject(id object); +XADEXTERN NSString *XADHumanReadableDate(NSDate *date); +XADEXTERN NSString *XADHumanReadableData(NSData *data); +XADEXTERN NSString *XADHumanReadableArray(NSArray *array); +XADEXTERN NSString *XADHumanReadableDictionary(NSDictionary *dict); +XADEXTERN NSString *XADHumanReadableList(NSArray *labels,NSArray *values); +XADEXTERN NSString *XADIndentTextWithSpaces(NSString *text,int spaces); diff --git a/XADArchiveParserDescriptions.m b/XADArchiveParserDescriptions.m index e8b682a5..ba3956ef 100644 --- a/XADArchiveParserDescriptions.m +++ b/XADArchiveParserDescriptions.m @@ -350,9 +350,7 @@ static NSComparisonResult OrderKeys(id first,id second,void *context) NSMutableArray *labels=[NSMutableArray array]; NSMutableArray *values=[NSMutableArray array]; - NSEnumerator *enumerator=[keys objectEnumerator]; - NSString *key; - while((key=[enumerator nextObject])) + for(NSString *key in keys) { NSString *label=[parser descriptionOfKey:key]; NSString *value=[parser descriptionOfValueInDictionary:dict key:key]; @@ -440,9 +438,7 @@ static NSComparisonResult OrderKeys(id first,id second,void *context) NSMutableArray *labels=[NSMutableArray array]; NSMutableArray *values=[NSMutableArray array]; - NSEnumerator *enumerator=[keys objectEnumerator]; - NSString *key; - while((key=[enumerator nextObject])) + for(NSString *key in keys) { id value=[dict objectForKey:key]; [labels addObject:key]; diff --git a/XADCABParser.m b/XADCABParser.m index 3a81f8fb..f03292a1 100644 --- a/XADCABParser.m +++ b/XADCABParser.m @@ -467,9 +467,7 @@ static void SkipCString(CSHandle *fh) } @catch(id e) { } - NSEnumerator *enumerator=[dircontents objectEnumerator]; - NSString *direntry; - while((direntry=[enumerator nextObject])) + for(NSString *direntry in dircontents) { if([filepart caseInsensitiveCompare:direntry]==NSOrderedSame) { diff --git a/XADCompactProParser.m b/XADCompactProParser.m index 2cbab843..f03751ac 100644 --- a/XADCompactProParser.m +++ b/XADCompactProParser.m @@ -114,9 +114,7 @@ -(void)parse // and send all of them out at once. [self parseDirectoryWithPath:[self XADPath] numberOfEntries:numentries entryArray:entries]; - NSEnumerator *enumerator=[entries objectEnumerator]; - NSMutableDictionary *dict; - while((dict=[enumerator nextObject])) [self addEntryWithDictionary:dict]; + for(NSMutableDictionary *dict in entries) [self addEntryWithDictionary:dict]; } -(BOOL)parseDirectoryWithPath:(XADPath *)parent numberOfEntries:(int)numentries entryArray:(NSMutableArray *)entries diff --git a/XADException.h b/XADException.h index eb1e13b0..0cd00b0c 100644 --- a/XADException.h +++ b/XADException.h @@ -20,42 +20,56 @@ */ #import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" +#import "XADTypes.h" #import "ClangAnalyser.h" +#pragma clang diagnostic pop -typedef int XADError; +XADEXTERN NSErrorDomain const XADErrorDomain; -#define XADNoError 0x0000 /* no error */ -#define XADUnknownError 0x0001 /* unknown error */ -#define XADInputError 0x0002 /* input data buffers border exceeded */ -#define XADOutputError 0x0003 /* failed to write to file */ -#define XADBadParametersError 0x0004 /* function called with illegal parameters */ -#define XADOutOfMemoryError 0x0005 /* not enough memory available */ -#define XADIllegalDataError 0x0006 /* data is corrupted */ -#define XADNotSupportedError 0x0007 /* file not fully supported */ -#define XADResourceError 0x0008 /* required resource missing */ -#define XADDecrunchError 0x0009 /* error on decrunching */ -#define XADFiletypeError 0x000A /* unknown file type */ -#define XADOpenFileError 0x000B /* opening file failed */ -#define XADSkipError 0x000C /* file, disk has been skipped */ -#define XADBreakError 0x000D /* user break in progress hook */ -#define XADFileExistsError 0x000E /* file already exists */ -#define XADPasswordError 0x000F /* missing or wrong password */ -#define XADMakeDirectoryError 0x0010 /* could not create directory */ -#define XADChecksumError 0x0011 /* wrong checksum */ -#define XADVerifyError 0x0012 /* verify failed (disk hook) */ -#define XADGeometryError 0x0013 /* wrong drive geometry */ -#define XADDataFormatError 0x0014 /* unknown data format */ -#define XADEmptyError 0x0015 /* source contains no files */ -#define XADFileSystemError 0x0016 /* unknown filesystem */ -#define XADFileDirectoryError 0x0017 /* name of file exists as directory */ -#define XADShortBufferError 0x0018 /* buffer was too short */ -#define XADEncodingError 0x0019 /* text encoding was defective */ -#define XADLinkError 0x001a /* could not create link */ +#if ((__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))) && __has_attribute(ns_error_domain) +#define XAD_ERROR_ENUM(_domain, _name) enum _name : int _name; enum __attribute__((ns_error_domain(_domain))) _name : int +#else +#define XAD_ERROR_ENUM(_domain, _name) NS_ENUM(int, _name) +#endif -#define XADSubArchiveError 0x10000 +typedef XAD_ERROR_ENUM(XADErrorDomain, XADError) { + XADErrorNone = 0x0000, /*!< no error */ + XADErrorUnknown = 0x0001, /*!< unknown error */ + XADErrorInput = 0x0002, /*!< input data buffers border exceeded */ + XADErrorOutput = 0x0003, /*!< failed to write to file */ + XADErrorBadParameters = 0x0004, /*!< function called with illegal parameters */ + XADErrorOutOfMemory = 0x0005, /*!< not enough memory available */ + XADErrorIllegalData = 0x0006, /*!< data is corrupted */ + XADErrorNotSupported = 0x0007, /*!< file not fully supported */ + XADErrorResource = 0x0008, /*!< required resource missing */ + XADErrorDecrunch = 0x0009, /*!< error on decrunching */ + XADErrorFiletype = 0x000A, /*!< unknown file type */ + XADErrorOpenFile = 0x000B, /*!< opening file failed */ + XADErrorSkip = 0x000C, /*!< file, disk has been skipped */ + XADErrorBreak = 0x000D, /*!< user break in progress hook */ + XADErrorFileExists = 0x000E, /*!< file already exists */ + XADErrorPassword = 0x000F, /*!< missing or wrong password */ + XADErrorMakeDirectory = 0x0010, /*!< could not create directory */ + XADErrorChecksum = 0x0011, /*!< wrong checksum */ + XADErrorVerify = 0x0012, /*!< verify failed (disk hook) */ + XADErrorGeometry = 0x0013, /*!< wrong drive geometry */ + XADErrorDataFormat = 0x0014, /*!< unknown data format */ + XADErrorEmpty = 0x0015, /*!< source contains no files */ + XADErrorFileSystem = 0x0016, /*!< unknown filesystem */ + XADErrorFileDirectory = 0x0017, /*!< name of file exists as directory */ + XADErrorShortBuffer = 0x0018, /*!< buffer was too short */ + XADErrorEncoding = 0x0019, /*!< text encoding was defective */ + XADErrorLink = 0x001a, /*!< could not create link */ -extern NSString *XADExceptionName; + XADErrorSubArchive = 0x10000 +}; +XADEXTERN NSExceptionName const XADExceptionName; +XADEXTERN NSErrorUserInfoKey const XADExceptionReasonKey; + +XADEXPORT @interface XADException:NSObject { } @@ -71,8 +85,40 @@ extern NSString *XADExceptionName; +(void)raiseDataFormatException CLANG_ANALYZER_NORETURN; +(void)raiseOutOfMemoryException CLANG_ANALYZER_NORETURN; +(void)raiseExceptionWithXADError:(XADError)errnum CLANG_ANALYZER_NORETURN; ++(void)raiseExceptionWithXADError:(XADError)errnum underlyingError:(NSError*)nsErr CLANG_ANALYZER_NORETURN; +(XADError)parseException:(id)exception; ++(NSError*)parseExceptionReturningNSError:(id)exception; +(NSString *)describeXADError:(XADError)errnum; @end + +static const XADError XADNoError API_DEPRECATED_WITH_REPLACEMENT("XADErrorNone", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorNone; +static const XADError XADUnknownError API_DEPRECATED_WITH_REPLACEMENT("XADErrorUnknown", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorUnknown; +static const XADError XADInputError API_DEPRECATED_WITH_REPLACEMENT("XADErrorInput", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorInput; +static const XADError XADOutputError API_DEPRECATED_WITH_REPLACEMENT("XADErrorOutput", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorOutput; +static const XADError XADBadParametersError API_DEPRECATED_WITH_REPLACEMENT("XADErrorBadParameters", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorBadParameters; +static const XADError XADOutOfMemoryError API_DEPRECATED_WITH_REPLACEMENT("XADErrorOutOfMemory", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorOutOfMemory; +static const XADError XADIllegalDataError API_DEPRECATED_WITH_REPLACEMENT("XADErrorIllegalData", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorIllegalData; +static const XADError XADNotSupportedError API_DEPRECATED_WITH_REPLACEMENT("XADErrorNotSupported", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorNotSupported; +static const XADError XADResourceError API_DEPRECATED_WITH_REPLACEMENT("XADErrorResource", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorResource; +static const XADError XADDecrunchError API_DEPRECATED_WITH_REPLACEMENT("XADErrorDecrunch", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorDecrunch; +static const XADError XADFiletypeError API_DEPRECATED_WITH_REPLACEMENT("XADErrorFiletype", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorFiletype; +static const XADError XADOpenFileError API_DEPRECATED_WITH_REPLACEMENT("XADErrorOpenFile", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorOpenFile; +static const XADError XADSkipError API_DEPRECATED_WITH_REPLACEMENT("XADErrorSkip", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorSkip; +static const XADError XADBreakError API_DEPRECATED_WITH_REPLACEMENT("XADErrorBreak", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorBreak; +static const XADError XADFileExistsError API_DEPRECATED_WITH_REPLACEMENT("XADErrorFileExists", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorFileExists; +static const XADError XADPasswordError API_DEPRECATED_WITH_REPLACEMENT("XADErrorPassword", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorPassword; +static const XADError XADMakeDirectoryError API_DEPRECATED_WITH_REPLACEMENT("XADErrorMakeDirectory", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorMakeDirectory; +static const XADError XADChecksumError API_DEPRECATED_WITH_REPLACEMENT("XADErrorChecksum", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorChecksum; +static const XADError XADVerifyError API_DEPRECATED_WITH_REPLACEMENT("XADErrorVerify", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorVerify; +static const XADError XADGeometryError API_DEPRECATED_WITH_REPLACEMENT("XADErrorGeometry", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorGeometry; +static const XADError XADDataFormatError API_DEPRECATED_WITH_REPLACEMENT("XADErrorDataFormat", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorDataFormat; +static const XADError XADEmptyError API_DEPRECATED_WITH_REPLACEMENT("XADErrorEmpty", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorEmpty; +static const XADError XADFileSystemError API_DEPRECATED_WITH_REPLACEMENT("XADErrorFileSystem", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorFileSystem; +static const XADError XADFileDirectoryError API_DEPRECATED_WITH_REPLACEMENT("XADErrorFileDirectory", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorFileDirectory; +static const XADError XADShortBufferError API_DEPRECATED_WITH_REPLACEMENT("XADErrorShortBuffer", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorShortBuffer; +static const XADError XADEncodingError API_DEPRECATED_WITH_REPLACEMENT("XADErrorEncoding", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorEncoding; +static const XADError XADLinkError API_DEPRECATED_WITH_REPLACEMENT("XADErrorLink", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorLink; + +static const XADError XADSubArchiveError API_DEPRECATED_WITH_REPLACEMENT("XADErrorSubArchive", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADErrorSubArchive; diff --git a/XADException.m b/XADException.m index fa86488b..4e6e4d97 100644 --- a/XADException.m +++ b/XADException.m @@ -24,20 +24,22 @@ #import "CSZlibHandle.h" #import "CSBzip2Handle.h" -NSString *XADExceptionName=@"XADException"; +NSString *const XADExceptionName=@"XADException"; +NSString *const XADErrorDomain=@"de.dstoecker.xadmaster.error"; +NSString *const XADExceptionReasonKey=@"XADExceptionReason"; @implementation XADException -+(void)raiseUnknownException { [self raiseExceptionWithXADError:XADUnknownError]; } -+(void)raiseInputException { [self raiseExceptionWithXADError:XADInputError]; } -+(void)raiseOutputException { [self raiseExceptionWithXADError:XADOutputError]; } -+(void)raiseIllegalDataException { [self raiseExceptionWithXADError:XADIllegalDataError]; } -+(void)raiseNotSupportedException { [self raiseExceptionWithXADError:XADNotSupportedError]; } -+(void)raisePasswordException { [self raiseExceptionWithXADError:XADPasswordError]; } -+(void)raiseDecrunchException { [self raiseExceptionWithXADError:XADDecrunchError]; } -+(void)raiseChecksumException { [self raiseExceptionWithXADError:XADChecksumError]; } -+(void)raiseDataFormatException { [self raiseExceptionWithXADError:XADDataFormatError]; } -+(void)raiseOutOfMemoryException { [self raiseExceptionWithXADError:XADOutOfMemoryError]; } ++(void)raiseUnknownException { [self raiseExceptionWithXADError:XADErrorUnknown]; } ++(void)raiseInputException { [self raiseExceptionWithXADError:XADErrorInput]; } ++(void)raiseOutputException { [self raiseExceptionWithXADError:XADErrorOutput]; } ++(void)raiseIllegalDataException { [self raiseExceptionWithXADError:XADErrorIllegalData]; } ++(void)raiseNotSupportedException { [self raiseExceptionWithXADError:XADErrorNotSupported]; } ++(void)raisePasswordException { [self raiseExceptionWithXADError:XADErrorPassword]; } ++(void)raiseDecrunchException { [self raiseExceptionWithXADError:XADErrorDecrunch]; } ++(void)raiseChecksumException { [self raiseExceptionWithXADError:XADErrorChecksum]; } ++(void)raiseDataFormatException { [self raiseExceptionWithXADError:XADErrorDataFormat]; } ++(void)raiseOutOfMemoryException { [self raiseExceptionWithXADError:XADErrorOutOfMemory]; } +(void)raiseExceptionWithXADError:(XADError)errnum { @@ -47,6 +49,11 @@ +(void)raiseExceptionWithXADError:(XADError)errnum forKey:@"XADError"]] autorelease] raise]; } ++(void)raiseExceptionWithXADError:(XADError)errnum underlyingError:(NSError*)nsErr +{ + [[[[NSException alloc] initWithName:XADExceptionName reason:[self describeXADError:errnum] + userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:errnum], @"XADError", nsErr, NSUnderlyingErrorKey, nil]] autorelease] raise]; +} +(XADError)parseException:(id)exception @@ -59,50 +66,90 @@ +(XADError)parseException:(id)exception { return [[[e userInfo] objectForKey:@"XADError"] intValue]; } - else if([name isEqual:CSCannotOpenFileException]) return XADOpenFileError; - else if([name isEqual:CSFileErrorException]) return XADUnknownError; // TODO: use ErrNo in userInfo to figure out better error - else if([name isEqual:CSOutOfMemoryException]) return XADOutOfMemoryError; - else if([name isEqual:CSEndOfFileException]) return XADInputError; - else if([name isEqual:CSNotImplementedException]) return XADNotSupportedError; - else if([name isEqual:CSNotSupportedException]) return XADNotSupportedError; - else if([name isEqual:CSZlibException]) return XADDecrunchError; - else if([name isEqual:CSBzip2Exception]) return XADDecrunchError; + else if([name isEqual:CSCannotOpenFileException]) return XADErrorOpenFile; + else if([name isEqual:CSFileErrorException]) return XADErrorUnknown; // TODO: use ErrNo in userInfo to figure out better error + else if([name isEqual:CSOutOfMemoryException]) return XADErrorOutOfMemory; + else if([name isEqual:CSEndOfFileException]) return XADErrorInput; + else if([name isEqual:CSNotImplementedException]) return XADErrorNotSupported; + else if([name isEqual:CSNotSupportedException]) return XADErrorNotSupported; + else if([name isEqual:CSZlibException]) return XADErrorDecrunch; + else if([name isEqual:CSBzip2Exception]) return XADErrorDecrunch; } - return XADUnknownError; + return XADErrorUnknown; +} + ++(NSError*)parseExceptionReturningNSError:(id)exception +{ + if([exception isKindOfClass:[NSException class]]) + { + NSException *e=exception; + NSString *name=[e name]; + NSMutableDictionary *usrInfo = [NSMutableDictionary dictionaryWithDictionary:e.userInfo ?: [NSDictionary dictionary]]; + [usrInfo setValue:e.reason forKey:XADExceptionReasonKey]; + if ([name isEqualToString:XADExceptionName]) { + XADError errVal = [[[e userInfo] objectForKey:@"XADError"] intValue]; + return [NSError errorWithDomain:XADErrorDomain code:errVal userInfo:usrInfo]; + } else if([name isEqualToString:CSCannotOpenFileException]) { + return [NSError errorWithDomain:XADErrorDomain code:XADErrorOpenFile userInfo:usrInfo]; + } else if([name isEqualToString:CSFileErrorException]) { + if (usrInfo && [usrInfo objectForKey:@"ErrNo"]) { + int errNo = [[usrInfo objectForKey:@"ErrNo"] intValue]; + [usrInfo removeObjectForKey:@"ErrNo"]; + return [NSError errorWithDomain:NSPOSIXErrorDomain code:errNo userInfo:usrInfo]; + } + return [NSError errorWithDomain:XADErrorDomain code:XADErrorUnknown userInfo:usrInfo]; + } else if([name isEqualToString:CSOutOfMemoryException]) { + return [NSError errorWithDomain:XADErrorDomain code:XADErrorOutOfMemory userInfo:usrInfo]; + } else if([name isEqualToString:CSEndOfFileException]) { + return [NSError errorWithDomain:XADErrorDomain code:XADErrorInput userInfo:usrInfo]; + } else if([name isEqualToString:CSNotImplementedException]) { + return [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:usrInfo]; + } else if([name isEqualToString:CSNotSupportedException]) { + return [NSError errorWithDomain:XADErrorDomain code:XADErrorNotSupported userInfo:usrInfo]; + } else if([name isEqualToString:CSZlibException]) { + return [NSError errorWithDomain:XADErrorDomain code:XADErrorDecrunch userInfo:usrInfo]; + } else if([name isEqualToString:CSBzip2Exception]) { + return [NSError errorWithDomain:XADErrorDomain code:XADErrorDecrunch userInfo:usrInfo]; + } else { + return [NSError errorWithDomain:XADErrorDomain code:XADErrorUnknown userInfo:usrInfo]; + } + } + + return [NSError errorWithDomain:XADErrorDomain code:XADErrorUnknown userInfo:nil]; } +(NSString *)describeXADError:(XADError)error { switch(error) { - case XADNoError: return nil; - case XADUnknownError: return @"Unknown error"; - case XADInputError: return @"Attempted to read more data than was available"; - case XADOutputError: return @"Failed to write to file"; - case XADBadParametersError: return @"Function called with illegal parameters"; - case XADOutOfMemoryError: return @"Not enough memory available"; - case XADIllegalDataError: return @"Data is corrupted"; - case XADNotSupportedError: return @"File is not fully supported"; - case XADResourceError: return @"Required resource missing"; - case XADDecrunchError: return @"Error on decrunching"; - case XADFiletypeError: return @"Unknown file type"; - case XADOpenFileError: return @"Opening file failed"; - case XADSkipError: return @"File, disk has been skipped"; - case XADBreakError: return @"User cancelled extraction"; - case XADFileExistsError: return @"File already exists"; - case XADPasswordError: return @"Missing or wrong password"; - case XADMakeDirectoryError: return @"Could not create directory"; - case XADChecksumError: return @"Wrong checksum"; - case XADVerifyError: return @"Verify failed (disk hook)"; - case XADGeometryError: return @"Wrong drive geometry"; - case XADDataFormatError: return @"Unknown data format"; - case XADEmptyError: return @"Source contains no files"; - case XADFileSystemError: return @"Unknown filesystem"; - case XADFileDirectoryError: return @"Name of file exists as directory"; - case XADShortBufferError: return @"Buffer was too short"; - case XADEncodingError: return @"Text encoding was defective"; - case XADLinkError: return @"Could not create symlink"; + case XADErrorNone: return nil; + case XADErrorUnknown: return @"Unknown error"; + case XADErrorInput: return @"Attempted to read more data than was available"; + case XADErrorOutput: return @"Failed to write to file"; + case XADErrorBadParameters: return @"Function called with illegal parameters"; + case XADErrorOutOfMemory: return @"Not enough memory available"; + case XADErrorIllegalData: return @"Data is corrupted"; + case XADErrorNotSupported: return @"File is not fully supported"; + case XADErrorResource: return @"Required resource missing"; + case XADErrorDecrunch: return @"Error on decrunching"; + case XADErrorFiletype: return @"Unknown file type"; + case XADErrorOpenFile: return @"Opening file failed"; + case XADErrorSkip: return @"File, disk has been skipped"; + case XADErrorBreak: return @"User cancelled extraction"; + case XADErrorFileExists: return @"File already exists"; + case XADErrorPassword: return @"Missing or wrong password"; + case XADErrorMakeDirectory: return @"Could not create directory"; + case XADErrorChecksum: return @"Wrong checksum"; + case XADErrorVerify: return @"Verify failed (disk hook)"; + case XADErrorGeometry: return @"Wrong drive geometry"; + case XADErrorDataFormat: return @"Unknown data format"; + case XADErrorEmpty: return @"Source contains no files"; + case XADErrorFileSystem: return @"Unknown filesystem"; + case XADErrorFileDirectory: return @"Name of file exists as directory"; + case XADErrorShortBuffer: return @"Buffer was too short"; + case XADErrorEncoding: return @"Text encoding was defective"; + case XADErrorLink: return @"Could not create symlink"; default: return [NSString stringWithFormat:@"Error %d",error]; } } diff --git a/XADLZXParser.m b/XADLZXParser.m index c0ae2adc..8e893e36 100644 --- a/XADLZXParser.m +++ b/XADLZXParser.m @@ -149,9 +149,7 @@ -(void)parse [NSNumber numberWithInt:method],@"Method", nil]; - NSEnumerator *enumerator=[solidfiles objectEnumerator]; - NSMutableDictionary *dict; - while((dict=[enumerator nextObject])) + for(NSMutableDictionary *dict in solidfiles) { off_t compsize=0; if(solidsize!=0) compsize=([[dict objectForKey:XADFileSizeKey] longLongValue]*(off_t)compsize)/solidsize; diff --git a/XADMacArchiveParser.h b/XADMacArchiveParser.h index 5c9a966c..bbfa4972 100644 --- a/XADMacArchiveParser.h +++ b/XADMacArchiveParser.h @@ -21,9 +21,9 @@ #import "XADArchiveParser.h" #import "CSStreamHandle.h" -extern NSString *XADIsMacBinaryKey; -extern NSString *XADMightBeMacBinaryKey; -extern NSString *XADDisableMacForkExpansionKey; +extern NSString *const XADIsMacBinaryKey; +extern NSString *const XADMightBeMacBinaryKey; +extern NSString *const XADDisableMacForkExpansionKey; @interface XADMacArchiveParser:XADArchiveParser { diff --git a/XADMacArchiveParser.m b/XADMacArchiveParser.m index 6e28aef7..1a7f7913 100644 --- a/XADMacArchiveParser.m +++ b/XADMacArchiveParser.m @@ -25,9 +25,9 @@ #import "NSDateXAD.h" #import "CRC.h" -NSString *XADIsMacBinaryKey=@"XADIsMacBinary"; -NSString *XADMightBeMacBinaryKey=@"XADMightBeMacBinary"; -NSString *XADDisableMacForkExpansionKey=@"XADDisableMacForkExpansionKey"; +NSString *const XADIsMacBinaryKey=@"XADIsMacBinary"; +NSString *const XADMightBeMacBinaryKey=@"XADMightBeMacBinary"; +NSString *const XADDisableMacForkExpansionKey=@"XADDisableMacForkExpansionKey"; @implementation XADMacArchiveParser diff --git a/XADMaster.h b/XADMaster.h index 5fedd487..267a48eb 100644 --- a/XADMaster.h +++ b/XADMaster.h @@ -26,6 +26,7 @@ FOUNDATION_EXPORT double XADMasterVersionNumber; //! Project version string for XADMaster. FOUNDATION_EXPORT const unsigned char XADMasterVersionString[]; +#import #import #import #import diff --git a/XADMaster.xcodeproj/project.pbxproj b/XADMaster.xcodeproj/project.pbxproj index 0917b2cd..c9b409fc 100644 --- a/XADMaster.xcodeproj/project.pbxproj +++ b/XADMaster.xcodeproj/project.pbxproj @@ -279,7 +279,7 @@ 1B34AA4111C3088700396C26 /* CSStreamHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3FAAF90EC3859F006D2F06 /* CSStreamHandle.m */; }; 1B34AA4211C3088700396C26 /* CSSubHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3FAAF10EC3859F006D2F06 /* CSSubHandle.m */; }; 1B34AA4311C3088900396C26 /* CSZlibHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3FAAFF0EC3859F006D2F06 /* CSZlibHandle.m */; }; - 1B34AA7211C30B3600396C26 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BBCC54C0EE73B7F006C3AE2 /* libbz2.dylib */; }; + 1B34AA7211C30B3600396C26 /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BBCC54C0EE73B7F006C3AE2 /* libbz2.tbd */; }; 1B34AA7411C30B3A00396C26 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FAC5C0EC5255A006D2F06 /* Foundation.framework */; }; 1B34AA7511C30B3D00396C26 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B216A7F0F8E9D9E001207C9 /* Carbon.framework */; }; 1B34AA7611C30B5200396C26 /* libUniversalDetector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B23E1B11190F8CC00620319 /* libUniversalDetector.a */; }; @@ -288,7 +288,7 @@ 1B34AAAD11C30DFF00396C26 /* clients.c in Sources */ = {isa = PBXBuildFile; fileRef = 1B06D52E0DDA623800D9C000 /* clients.c */; }; 1B34AAAE11C30E0200396C26 /* emulation.c in Sources */ = {isa = PBXBuildFile; fileRef = 1B06D54F0DDA623800D9C000 /* emulation.c */; }; 1B34AAB111C30E6A00396C26 /* RARBug.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BCD65510EF8164900D86C43 /* RARBug.c */; }; - 1B34AAB811C30EDB00396C26 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FABA70EC52532006D2F06 /* libz.dylib */; }; + 1B34AAB811C30EDB00396C26 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FABA70EC52532006D2F06 /* libz.tbd */; }; 1B34AAC711C30F9A00396C26 /* BraIA64.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BCD61550EF349EE00D86C43 /* BraIA64.c */; }; 1B34AB2D11C3196800396C26 /* StuffItXEnglishDictionary.c in Sources */ = {isa = PBXBuildFile; fileRef = 1B34AB2C11C3196800396C26 /* StuffItXEnglishDictionary.c */; }; 1B34AB2E11C3196800396C26 /* StuffItXEnglishDictionary.c in Sources */ = {isa = PBXBuildFile; fileRef = 1B34AB2C11C3196800396C26 /* StuffItXEnglishDictionary.c */; }; @@ -385,7 +385,7 @@ 1B3FAB100EC3859F006D2F06 /* CSZlibHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B3FAAFE0EC3859F006D2F06 /* CSZlibHandle.h */; }; 1B3FAB110EC3859F006D2F06 /* CSZlibHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3FAAFF0EC3859F006D2F06 /* CSZlibHandle.m */; }; 1B3FAB2C0EC3D5E7006D2F06 /* XADException.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B578C330DDBC8BF005B0F68 /* XADException.m */; }; - 1B3FABA80EC52532006D2F06 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FABA70EC52532006D2F06 /* libz.dylib */; }; + 1B3FABA80EC52532006D2F06 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FABA70EC52532006D2F06 /* libz.tbd */; }; 1B3FAC5D0EC5255A006D2F06 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FAC5C0EC5255A006D2F06 /* Foundation.framework */; }; 1B3FAD680EC5D4E8006D2F06 /* XADMacArchiveParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3FAD660EC5D4E8006D2F06 /* XADMacArchiveParser.m */; }; 1B3FAD810EC6826E006D2F06 /* NSDateXAD.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B3FAD7F0EC6826E006D2F06 /* NSDateXAD.m */; }; @@ -1028,13 +1028,12 @@ 1B91D10B11E0F1160081E40A /* XADStringCFString.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B91D0AC11DFC0480081E40A /* XADStringCFString.m */; }; 1B91D18011E1677B0081E40A /* NSStringPrinting.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B34A10111BBD2B100396C26 /* NSStringPrinting.m */; }; 1B91D18111E1677B0081E40A /* CSCommandLineParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B34AC0E11CED29A00396C26 /* CSCommandLineParser.m */; }; - 1B91D18411E1677B0081E40A /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BBCC54C0EE73B7F006C3AE2 /* libbz2.dylib */; }; + 1B91D18411E1677B0081E40A /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BBCC54C0EE73B7F006C3AE2 /* libbz2.tbd */; }; 1B91D18611E1677B0081E40A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FAC5C0EC5255A006D2F06 /* Foundation.framework */; }; 1B91D18711E1677B0081E40A /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B216A7F0F8E9D9E001207C9 /* Carbon.framework */; }; 1B91D18811E1677B0081E40A /* libUniversalDetector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B23E1B11190F8CC00620319 /* libUniversalDetector.a */; }; 1B91D18911E1677B0081E40A /* libXADMaster.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B34A97511C2FD0500396C26 /* libXADMaster.a */; }; - 1B91D18A11E1677B0081E40A /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FABA70EC52532006D2F06 /* libz.dylib */; }; - 1B91D18B11E1677B0081E40A /* libstdc++.6.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B34AABB11C30F5400396C26 /* libstdc++.6.dylib */; }; + 1B91D18A11E1677B0081E40A /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B3FABA70EC52532006D2F06 /* libz.tbd */; }; 1B91D19511E167B60081E40A /* lsar.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B91D17711E167720081E40A /* lsar.m */; }; 1B91D1A111E237AD0081E40A /* CommandLineCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B91D1A011E237AD0081E40A /* CommandLineCommon.m */; }; 1B91D1A211E237AD0081E40A /* CommandLineCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B91D1A011E237AD0081E40A /* CommandLineCommon.m */; }; @@ -1132,7 +1131,7 @@ 1BBC416010B85B6600A05E29 /* XADQuantumHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BBC415E10B85B6600A05E29 /* XADQuantumHandle.m */; }; 1BBC42E110BA065D00A05E29 /* XADCABBlockHandle.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BBC42DF10BA065D00A05E29 /* XADCABBlockHandle.m */; }; 1BBCC4FA0EE73AC9006C3AE2 /* CSBzip2Handle.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BC8A0F00EE61C42006B47FE /* CSBzip2Handle.m */; }; - 1BBCC54D0EE73B7F006C3AE2 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BBCC54C0EE73B7F006C3AE2 /* libbz2.dylib */; }; + 1BBCC54D0EE73B7F006C3AE2 /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BBCC54C0EE73B7F006C3AE2 /* libbz2.tbd */; }; 1BBCC5790EE747F6006C3AE2 /* XADBzip2Parser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B578C5B0DDCFFE0005B0F68 /* XADBzip2Parser.m */; }; 1BBEF8B014D8A31800790E4B /* XADArchiveParserDescriptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BBEF8AE14D8A31700790E4B /* XADArchiveParserDescriptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1BBEF8B114D8A31800790E4B /* XADArchiveParserDescriptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BBEF8AF14D8A31700790E4B /* XADArchiveParserDescriptions.m */; }; @@ -1367,6 +1366,12 @@ 1BF3BA9013EE08A300BE7400 /* XADPlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BF3BA8F13EE08A300BE7400 /* XADPlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1BF3BA9113EE08A300BE7400 /* XADPlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BF3BA8F13EE08A300BE7400 /* XADPlatform.h */; }; 1BF3BA9213EE08A300BE7400 /* XADPlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BF3BA8F13EE08A300BE7400 /* XADPlatform.h */; }; + 5530A4AF2D4CCC3800CBD82D /* XADTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 5530A4AE2D4CCC3800CBD82D /* XADTypes.h */; }; + 5530A4B02D4CCC3800CBD82D /* XADTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 5530A4AE2D4CCC3800CBD82D /* XADTypes.h */; }; + 5530A4B12D4CCC3800CBD82D /* XADTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 5530A4AE2D4CCC3800CBD82D /* XADTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5530A4B22D4CCC3800CBD82D /* XADTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 5530A4AE2D4CCC3800CBD82D /* XADTypes.h */; }; + 55E7B1EE2D6BCCAD00064932 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 55E7B1EB2D6BCCAD00064932 /* libc++.tbd */; }; + 55E7B1EF2D6BCCBC00064932 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 55E7B1EB2D6BCCAD00064932 /* libc++.tbd */; }; 73032E6C2626D3DD000C2751 /* XADWARCParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 73032E6B2626D3DD000C2751 /* XADWARCParserTests.m */; }; 73032E6E2626DB7C000C2751 /* WARCFixtures in Resources */ = {isa = PBXBuildFile; fileRef = 73032E6D2626DB7C000C2751 /* WARCFixtures */; }; 7318A41D248C67E400D327B9 /* XADRARParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7318A41C248C67E400D327B9 /* XADRARParserTests.m */; }; @@ -1415,7 +1420,7 @@ 734C13B921C79C8500917EAA /* unpack_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 734C13B621C79C8400917EAA /* unpack_utils.c */; }; 734C13BA21C79C8500917EAA /* unpack_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 734C13B621C79C8400917EAA /* unpack_utils.c */; }; 7378D98B21CCD04000A4B11F /* CRCCalculationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7378D98A21CCD04000A4B11F /* CRCCalculationTests.m */; }; - 7398C7AE2059248700D7B977 /* UniversalDetector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B06D3770DDA5C2600D9C000 /* UniversalDetector.framework */; }; + 7398C7AE2059248700D7B977 /* UniversalDetector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1B06D3770DDA5C2600D9C000 /* UniversalDetector.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 73A91A542ADC64DE0059C423 /* StuffitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 73A91A4F2ADC64DE0059C423 /* StuffitTests.m */; }; 73A91A562ADC64EB0059C423 /* StuffitFixtures in Resources */ = {isa = PBXBuildFile; fileRef = 73A91A552ADC64EB0059C423 /* StuffitFixtures */; }; 73DA3468206B6BF1006ADB42 /* XADPlatformOSXTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 73DA3467206B6BF1006ADB42 /* XADPlatformOSXTests.m */; }; @@ -1682,7 +1687,7 @@ 1B216A740F8E8ADE001207C9 /* Progress.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Progress.m; sourceTree = ""; }; 1B216A770F8E9064001207C9 /* CRC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CRC.m; sourceTree = ""; }; 1B216A780F8E9064001207C9 /* CRC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRC.h; sourceTree = ""; }; - 1B216A7F0F8E9D9E001207C9 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 1B216A7F0F8E9D9E001207C9 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; 1B23DA9D1177C99900620319 /* Scanning.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scanning.h; sourceTree = ""; }; 1B23DA9E1177C99900620319 /* Scanning.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Scanning.m; sourceTree = ""; }; 1B23DB8C117BA91D00620319 /* XADNowCompressParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADNowCompressParser.h; sourceTree = ""; }; @@ -1751,8 +1756,7 @@ 1B34A7E911C2E0E800396C26 /* XADRAR13CryptHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADRAR13CryptHandle.h; sourceTree = ""; }; 1B34A7EA11C2E0E800396C26 /* XADRAR13CryptHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADRAR13CryptHandle.m; sourceTree = ""; }; 1B34A97511C2FD0500396C26 /* libXADMaster.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXADMaster.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 1B34AA8411C30BC100396C26 /* UniversalDetector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UniversalDetector.framework; path = ../../Build/Debug/UniversalDetector.framework; sourceTree = SOURCE_ROOT; }; - 1B34AABB11C30F5400396C26 /* libstdc++.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.6.dylib"; path = "/usr/lib/libstdc++.6.dylib"; sourceTree = ""; }; + 1B34AA8411C30BC100396C26 /* UniversalDetector.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UniversalDetector.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1B34AB2C11C3196800396C26 /* StuffItXEnglishDictionary.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = StuffItXEnglishDictionary.c; sourceTree = ""; }; 1B34AC0D11CED29A00396C26 /* CSCommandLineParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSCommandLineParser.h; sourceTree = ""; }; 1B34AC0E11CED29A00396C26 /* CSCommandLineParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSCommandLineParser.m; sourceTree = ""; }; @@ -1774,8 +1778,8 @@ 1B3581E415A7AC020002A4C9 /* PDFParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PDFParser.m; sourceTree = ""; }; 1B3581E515A7AC020002A4C9 /* PDFStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PDFStream.h; sourceTree = ""; }; 1B3581E615A7AC020002A4C9 /* PDFStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PDFStream.m; sourceTree = ""; }; - 1B375D1C16ED72CB00773BB8 /* unar.bash_completion */ = {isa = PBXFileReference; lastKnownFileType = text; name = unar.bash_completion; path = ../Extra/unar.bash_completion; sourceTree = ""; }; - 1B375D1F16ED72D100773BB8 /* lsar.bash_completion */ = {isa = PBXFileReference; lastKnownFileType = text; name = lsar.bash_completion; path = ../Extra/lsar.bash_completion; sourceTree = ""; }; + 1B375D1C16ED72CB00773BB8 /* unar.bash_completion */ = {isa = PBXFileReference; lastKnownFileType = text; name = unar.bash_completion; path = Extra/unar.bash_completion; sourceTree = ""; }; + 1B375D1F16ED72D100773BB8 /* lsar.bash_completion */ = {isa = PBXFileReference; lastKnownFileType = text; name = lsar.bash_completion; path = Extra/lsar.bash_completion; sourceTree = ""; }; 1B3A64B41015030700AE25A8 /* XADLZHSFXParsers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADLZHSFXParsers.h; sourceTree = ""; }; 1B3A64B51015030700AE25A8 /* XADLZHSFXParsers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADLZHSFXParsers.m; sourceTree = ""; }; 1B3A64C610150DB600AE25A8 /* XADLZHOldHandles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADLZHOldHandles.h; sourceTree = ""; }; @@ -1824,8 +1828,8 @@ 1B3FAAFD0EC3859F006D2F06 /* CSByteStreamHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSByteStreamHandle.m; sourceTree = ""; }; 1B3FAAFE0EC3859F006D2F06 /* CSZlibHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSZlibHandle.h; sourceTree = ""; }; 1B3FAAFF0EC3859F006D2F06 /* CSZlibHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSZlibHandle.m; sourceTree = ""; }; - 1B3FABA70EC52532006D2F06 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = ""; }; - 1B3FAC5C0EC5255A006D2F06 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 1B3FABA70EC52532006D2F06 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 1B3FAC5C0EC5255A006D2F06 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 1B3FAD650EC5D4E8006D2F06 /* XADMacArchiveParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADMacArchiveParser.h; sourceTree = ""; }; 1B3FAD660EC5D4E8006D2F06 /* XADMacArchiveParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADMacArchiveParser.m; sourceTree = ""; }; 1B3FAD7E0EC6826E006D2F06 /* NSDateXAD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDateXAD.h; sourceTree = ""; }; @@ -1963,7 +1967,7 @@ 1BBC415E10B85B6600A05E29 /* XADQuantumHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADQuantumHandle.m; sourceTree = ""; }; 1BBC42DE10BA065D00A05E29 /* XADCABBlockHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADCABBlockHandle.h; sourceTree = ""; }; 1BBC42DF10BA065D00A05E29 /* XADCABBlockHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADCABBlockHandle.m; sourceTree = ""; }; - 1BBCC54C0EE73B7F006C3AE2 /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = /usr/lib/libbz2.dylib; sourceTree = ""; }; + 1BBCC54C0EE73B7F006C3AE2 /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; }; 1BBEF8AE14D8A31700790E4B /* XADArchiveParserDescriptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADArchiveParserDescriptions.h; sourceTree = ""; }; 1BBEF8AF14D8A31700790E4B /* XADArchiveParserDescriptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADArchiveParserDescriptions.m; sourceTree = ""; }; 1BBEFA5914EF375400790E4B /* XADStuffItSplitParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADStuffItSplitParser.h; sourceTree = ""; }; @@ -2075,8 +2079,8 @@ 1BD3832E125610C200FE08BD /* XADDiskDoublerMethod2Handle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADDiskDoublerMethod2Handle.m; sourceTree = ""; }; 1BD3842A125A351400FE08BD /* XADNowCompressHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADNowCompressHandle.h; sourceTree = ""; }; 1BD3842B125A351400FE08BD /* XADNowCompressHandle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADNowCompressHandle.m; sourceTree = ""; }; - 1BDDC79513DE3D4200A8C079 /* lsar.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; name = lsar.1; path = ../Extra/lsar.1; sourceTree = ""; }; - 1BDDC79613DE3D4200A8C079 /* unar.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; name = unar.1; path = ../Extra/unar.1; sourceTree = ""; }; + 1BDDC79513DE3D4200A8C079 /* lsar.1 */ = {isa = PBXFileReference; explicitFileType = text.man; name = lsar.1; path = Extra/lsar.1; sourceTree = ""; }; + 1BDDC79613DE3D4200A8C079 /* unar.1 */ = {isa = PBXFileReference; explicitFileType = text.man; name = unar.1; path = Extra/unar.1; sourceTree = ""; }; 1BDDC7EB13E0E78C00A8C079 /* XADSimpleUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADSimpleUnarchiver.h; sourceTree = ""; }; 1BDDC7EC13E0E78C00A8C079 /* XADSimpleUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XADSimpleUnarchiver.m; sourceTree = ""; }; 1BE07E6810C9953400B17F91 /* XADCABBlockReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADCABBlockReader.h; sourceTree = ""; }; @@ -2127,6 +2131,8 @@ 1BF0EE9D14031860007B8CF8 /* VariantI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariantI.h; sourceTree = ""; }; 1BF3BA8F13EE08A300BE7400 /* XADPlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADPlatform.h; sourceTree = ""; }; 32DBCF5E0370ADEE00C91783 /* XADMaster_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XADMaster_Prefix.pch; sourceTree = ""; }; + 5530A4AE2D4CCC3800CBD82D /* XADTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XADTypes.h; sourceTree = ""; }; + 55E7B1EB2D6BCCAD00064932 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; 56FBC8DC0A57531D00BE98CF /* UniversalDetector.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = UniversalDetector.xcodeproj; path = ../UniversalDetector/UniversalDetector.xcodeproj; sourceTree = SOURCE_ROOT; }; 56FBC92B0A57541300BE98CF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; 73032E6B2626D3DD000C2751 /* XADWARCParserTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XADWARCParserTests.m; sourceTree = ""; }; @@ -2164,12 +2170,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1B34AA7211C30B3600396C26 /* libbz2.dylib in Frameworks */, + 55E7B1EE2D6BCCAD00064932 /* libc++.tbd in Frameworks */, + 1B34AA7211C30B3600396C26 /* libbz2.tbd in Frameworks */, 1B34AA7411C30B3A00396C26 /* Foundation.framework in Frameworks */, 1B34AA7511C30B3D00396C26 /* Carbon.framework in Frameworks */, 1B34AA7611C30B5200396C26 /* libUniversalDetector.a in Frameworks */, 1B34AAA811C30DA400396C26 /* libXADMaster.a in Frameworks */, - 1B34AAB811C30EDB00396C26 /* libz.dylib in Frameworks */, + 1B34AAB811C30EDB00396C26 /* libz.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2213,13 +2220,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1B91D18411E1677B0081E40A /* libbz2.dylib in Frameworks */, + 55E7B1EF2D6BCCBC00064932 /* libc++.tbd in Frameworks */, + 1B91D18411E1677B0081E40A /* libbz2.tbd in Frameworks */, 1B91D18611E1677B0081E40A /* Foundation.framework in Frameworks */, 1B91D18711E1677B0081E40A /* Carbon.framework in Frameworks */, 1B91D18811E1677B0081E40A /* libUniversalDetector.a in Frameworks */, 1B91D18911E1677B0081E40A /* libXADMaster.a in Frameworks */, - 1B91D18A11E1677B0081E40A /* libz.dylib in Frameworks */, - 1B91D18B11E1677B0081E40A /* libstdc++.6.dylib in Frameworks */, + 1B91D18A11E1677B0081E40A /* libz.tbd in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2250,9 +2257,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1B3FABA80EC52532006D2F06 /* libz.dylib in Frameworks */, + 1B3FABA80EC52532006D2F06 /* libz.tbd in Frameworks */, 1B3FAC5D0EC5255A006D2F06 /* Foundation.framework in Frameworks */, - 1BBCC54D0EE73B7F006C3AE2 /* libbz2.dylib in Frameworks */, + 1BBCC54D0EE73B7F006C3AE2 /* libbz2.tbd in Frameworks */, 1B216A800F8E9D9E001207C9 /* Carbon.framework in Frameworks */, 7398C7AE2059248700D7B977 /* UniversalDetector.framework in Frameworks */, ); @@ -2293,28 +2300,28 @@ 1B91CBA911D803920081E40A /* Windows Sources */, 32C88DFF0371C24200C91783 /* Other Sources */, 089C1665FE841158C02AAC07 /* Resources */, - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 0867D69AFE84028FC02AAC07 /* Frameworks */, 1BDDC79413DE3D2800A8C079 /* Man Pages */, 73DA3466206B6BF1006ADB42 /* XADMasterTests */, 034768DFFF38A50411DB9C8B /* Products */, 56FBC8DC0A57531D00BE98CF /* UniversalDetector.xcodeproj */, - 7398C7AD2059248700D7B977 /* Frameworks */, ); name = XADMaster; sourceTree = ""; }; - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + 0867D69AFE84028FC02AAC07 /* Frameworks */ = { isa = PBXGroup; children = ( - 1B3FABA70EC52532006D2F06 /* libz.dylib */, - 1BBCC54C0EE73B7F006C3AE2 /* libbz2.dylib */, + 55E7B1EB2D6BCCAD00064932 /* libc++.tbd */, + 1B3FABA70EC52532006D2F06 /* libz.tbd */, + 1BBCC54C0EE73B7F006C3AE2 /* libbz2.tbd */, 1B3FAC5C0EC5255A006D2F06 /* Foundation.framework */, 1B216A7F0F8E9D9E001207C9 /* Carbon.framework */, 1B34AA8411C30BC100396C26 /* UniversalDetector.framework */, 1B34AACA11C30FC500396C26 /* Static Linking */, 1B34A03A11BB1CC300396C26 /* Windows Libraries */, ); - name = "External Frameworks and Libraries"; + name = Frameworks; sourceTree = ""; }; 089C1665FE841158C02AAC07 /* Resources */ = { @@ -2354,6 +2361,7 @@ 1B349EF711BACA4F00396C26 /* XADPlatformWindows.m */, 1B349EF511BACA3C00396C26 /* XADPlatformLinux.m */, 1B83727C15CEA27000B0DC9D /* XADPlatformiOS.m */, + 5530A4AE2D4CCC3800CBD82D /* XADTypes.h */, ); name = Classes; sourceTree = ""; @@ -2626,7 +2634,6 @@ isa = PBXGroup; children = ( 1B23E1B11190F8CC00620319 /* libUniversalDetector.a */, - 1B34AABB11C30F5400396C26 /* libstdc++.6.dylib */, ); name = "Static Linking"; sourceTree = ""; @@ -3251,13 +3258,6 @@ path = RAR; sourceTree = ""; }; - 7398C7AD2059248700D7B977 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; 73A91A4B2ADC64DE0059C423 /* Stuffit */ = { isa = PBXGroup; children = ( @@ -3311,6 +3311,7 @@ 1B7451AD13081B89008D80FE /* XADISO9660Parser.h in Headers */, 1B7F3CB413147CD6008238BF /* XADPaddedBlockHandle.h in Headers */, 1B3443D913A6EAF800C89872 /* XADWinZipWavPackHandle.h in Headers */, + 5530A4B02D4CCC3800CBD82D /* XADTypes.h in Headers */, 1B34443913A978AC00C89872 /* wavpack_local.h in Headers */, 1B34443B13A978AF00C89872 /* wavpack_version.h in Headers */, 1B31CB6013C2305100ED119E /* XADArParser.h in Headers */, @@ -3389,6 +3390,7 @@ 1B467A0815CD9A73001AB1DD /* XADISO9660Parser.h in Headers */, 1B467A0915CD9A73001AB1DD /* XADPaddedBlockHandle.h in Headers */, 1B467A0A15CD9A73001AB1DD /* XADWinZipWavPackHandle.h in Headers */, + 5530A4AF2D4CCC3800CBD82D /* XADTypes.h in Headers */, 1B467A0C15CD9A73001AB1DD /* wavpack_local.h in Headers */, 1B467A0D15CD9A73001AB1DD /* wavpack_version.h in Headers */, 1B467A0E15CD9A73001AB1DD /* XADArParser.h in Headers */, @@ -3467,6 +3469,7 @@ 1B7451A913081B89008D80FE /* XADISO9660Parser.h in Headers */, 1B7F3CB613147CD6008238BF /* XADPaddedBlockHandle.h in Headers */, 1B3443DA13A6EAF800C89872 /* XADWinZipWavPackHandle.h in Headers */, + 5530A4B22D4CCC3800CBD82D /* XADTypes.h in Headers */, 1B34443A13A978AD00C89872 /* wavpack_local.h in Headers */, 1B34443C13A978B000C89872 /* wavpack_version.h in Headers */, 1B31CB6113C2305100ED119E /* XADArParser.h in Headers */, @@ -3727,6 +3730,7 @@ 1B06CD1C145CFF36003907F9 /* XADCrunchHandles.h in Headers */, 1B5F3F82146A0962007BC5A6 /* XADAppleDouble.h in Headers */, 1BBEF8B014D8A31800790E4B /* XADArchiveParserDescriptions.h in Headers */, + 5530A4B12D4CCC3800CBD82D /* XADTypes.h in Headers */, 1BBEFA5B14EF375400790E4B /* XADStuffItSplitParser.h in Headers */, 1B3581A715A4CFE90002A4C9 /* XADAppleSingleParser.h in Headers */, 1B3581D015A7ABE20002A4C9 /* XADPDFParser.h in Headers */, @@ -5632,7 +5636,6 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = XADMaster_Prefix.pch; - GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "@executable_path/../Frameworks"; LD_RUNPATH_SEARCH_PATHS = "@loader_path"; diff --git a/XADMasterTests/Stuffit/StuffitTests.m b/XADMasterTests/Stuffit/StuffitTests.m index 7b3a4ecf..afac9812 100644 --- a/XADMasterTests/Stuffit/StuffitTests.m +++ b/XADMasterTests/Stuffit/StuffitTests.m @@ -60,7 +60,7 @@ - (void)testArchiveCanBeExtractedWithLessThan8CharactersInPassword XCTAssertEqual(simpleUnarchiverError, XADNoError, @"Error creation: %@", [XADException describeXADError:simpleUnarchiverError]); XCTAssertNotNil(unarchiver); - [unarchiver setDelegate:self.delegate]; + [unarchiver setDelegate:(id)self.delegate]; [unarchiver setPassword:@"1234567"]; [unarchiver setDestination:self.tempDirURL.path]; @@ -86,7 +86,7 @@ - (void)testArchiveCanBeExtractedWithMoreThan8CharactersInPassword XCTAssertEqual(simpleUnarchiverError, XADNoError, @"Error creation: %@", [XADException describeXADError:simpleUnarchiverError]); XCTAssertNotNil(unarchiver); - [unarchiver setDelegate:self.delegate]; + [unarchiver setDelegate:(id)self.delegate]; [unarchiver setPassword:@"123456789012"]; [unarchiver setDestination:self.tempDirURL.path]; diff --git a/XADNSISParser.m b/XADNSISParser.m index 8f57ef17..2e451c91 100644 --- a/XADNSISParser.m +++ b/XADNSISParser.m @@ -588,12 +588,9 @@ -(void)parseOpcodesWithHeader:(NSData *)header blocks:(NSDictionary *)blocks // a little bit less slow, and put in solidness markers. [self makeEntryArrayStrictlyIncreasing:files]; - NSEnumerator *enumerator=[dirs objectEnumerator]; - NSMutableDictionary *dict; - while((dict=[enumerator nextObject])) [self addEntryWithDictionary:dict]; + for(NSMutableDictionary *dict in dirs) [self addEntryWithDictionary:dict]; - enumerator=[files objectEnumerator]; - while((dict=[enumerator nextObject])) [self addEntryWithDictionary:dict]; + for(NSMutableDictionary *dict in files) [self addEntryWithDictionary:dict]; } -(void)makeEntryArrayStrictlyIncreasing:(NSMutableArray *)array diff --git a/XADPDFParser.m b/XADPDFParser.m index 4ee60bd9..9dacdab0 100644 --- a/XADPDFParser.m +++ b/XADPDFParser.m @@ -81,8 +81,7 @@ -(void)parse // Find image objects in object list NSMutableArray *images=[NSMutableArray array]; NSEnumerator *enumerator=[[parser objectDictionary] objectEnumerator]; - id object; - while(object=[enumerator nextObject]) + for(id object in enumerator) { if([object isKindOfClass:[PDFStream class]]&&[object isImage]) [images addObject:object]; @@ -108,9 +107,7 @@ -(void)parse { page++; NSDictionary *xobjects=[[curr objectForKey:@"Resources"] objectForKey:@"XObject"]; - NSEnumerator *enumerator=[xobjects objectEnumerator]; - id object; - while(object=[enumerator nextObject]) + for(id object in [xobjects objectEnumerator]) { if([object isKindOfClass:[PDFStream class]]&&[object isImage]) [order setObject:[NSNumber numberWithInt:page] forKey:[object reference]]; @@ -124,9 +121,7 @@ -(void)parse [images sortUsingFunction:(void *)SortPages context:order]; // Output images. - enumerator=[images objectEnumerator]; - PDFStream *image; - while(image=[enumerator nextObject]) + for(PDFStream *image in images) { PDFObjectReference *ref=[image reference]; NSNumber *page=[order objectForKey:ref]; @@ -534,12 +529,8 @@ static int SortPages(id first,id second,void *context) uint32_t dataoffset=8+2+[entries count]*12+4; uint32_t datasize=0; - NSEnumerator *enumerator; - NSDictionary *entry; - // Calculate total data size. - enumerator=[entries objectEnumerator]; - while((entry=[enumerator nextObject])) + for(NSDictionary *entry in entries) { NSData *data=[entry objectForKey:@"Data"]; int length=[data length]; @@ -549,8 +540,7 @@ static int SortPages(id first,id second,void *context) uint32_t imagestart=dataoffset+datasize; // Write IFD entries. - enumerator=[entries objectEnumerator]; - while((entry=[enumerator nextObject])) + for(NSDictionary *entry in entries) { NSNumber *tag=[entry objectForKey:@"Tag"]; NSNumber *type=[entry objectForKey:@"Type"]; @@ -580,8 +570,7 @@ static int SortPages(id first,id second,void *context) [header writeUInt32LE:0]; // Next IFD offset. // Write data segments. - enumerator=[entries objectEnumerator]; - while((entry=[enumerator nextObject])) + for(NSDictionary *entry in entries) { NSData *data=[entry objectForKey:@"Data"]; [header writeData:data]; diff --git a/XADPath.h b/XADPath.h index da9eaa51..1e07e967 100644 --- a/XADPath.h +++ b/XADPath.h @@ -18,13 +18,17 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "XADString.h" +#pragma clang diagnostic pop #define XADUnixPathSeparator "/" #define XADWindowsPathSeparator "\\" #define XADEitherPathSeparator "/\\" #define XADNoPathSeparator "" +XADEXPORT @interface XADPath:NSObject { XADPath *parent; @@ -37,7 +41,7 @@ +(XADPath *)pathWithString:(NSString *)string; +(XADPath *)pathWithStringComponents:(NSArray *)components; +(XADPath *)separatedPathWithString:(NSString *)string; -+(XADPath *)decodedPathWithData:(NSData *)bytedata encodingName:(NSString *)encoding separators:(const char *)separators; ++(XADPath *)decodedPathWithData:(NSData *)bytedata encodingName:(XADStringEncodingName)encoding separators:(const char *)separators; +(XADPath *)analyzedPathWithData:(NSData *)bytedata source:(XADStringSource *)stringsource separators:(const char *)pathseparators; @@ -51,30 +55,30 @@ separators:(const char *)pathseparators; -(BOOL)isEmpty; -(BOOL)isEqual:(id)other; -(BOOL)isCanonicallyEqual:(id)other; --(BOOL)isCanonicallyEqual:(id)other encodingName:(NSString *)encoding; +-(BOOL)isCanonicallyEqual:(id)other encodingName:(XADStringEncodingName)encoding; -(BOOL)hasPrefix:(XADPath *)other; -(BOOL)hasCanonicalPrefix:(XADPath *)other; --(BOOL)hasCanonicalPrefix:(XADPath *)other encodingName:(NSString *)encoding; +-(BOOL)hasCanonicalPrefix:(XADPath *)other encodingName:(XADStringEncodingName)encoding; -(int)depth; // Note: Does not take . or .. paths into account. --(int)depthWithEncodingName:(NSString *)encoding; +-(int)depthWithEncodingName:(XADStringEncodingName)encoding; -(NSArray *)pathComponents; --(NSArray *)pathComponentsWithEncodingName:(NSString *)encoding; +-(NSArray *)pathComponentsWithEncodingName:(XADStringEncodingName)encoding; -(NSArray *)canonicalPathComponents; --(NSArray *)canonicalPathComponentsWithEncodingName:(NSString *)encoding; --(void)_addPathComponentsToArray:(NSMutableArray *)components encodingName:(NSString *)encoding; +-(NSArray *)canonicalPathComponentsWithEncodingName:(XADStringEncodingName)encoding; +-(void)_addPathComponentsToArray:(NSMutableArray *)components encodingName:(XADStringEncodingName)encoding; -(NSString *)lastPathComponent; --(NSString *)lastPathComponentWithEncodingName:(NSString *)encoding; +-(NSString *)lastPathComponentWithEncodingName:(XADStringEncodingName)encoding; -(NSString *)firstPathComponent; --(NSString *)firstPathComponentWithEncodingName:(NSString *)encoding; +-(NSString *)firstPathComponentWithEncodingName:(XADStringEncodingName)encoding; -(NSString *)firstCanonicalPathComponent; --(NSString *)firstCanonicalPathComponentWithEncodingName:(NSString *)encoding; +-(NSString *)firstCanonicalPathComponentWithEncodingName:(XADStringEncodingName)encoding; -(XADPath *)pathByDeletingLastPathComponent; --(XADPath *)pathByDeletingLastPathComponentWithEncodingName:(NSString *)encoding; +-(XADPath *)pathByDeletingLastPathComponentWithEncodingName:(XADStringEncodingName)encoding; -(XADPath *)pathByDeletingFirstPathComponent; --(XADPath *)pathByDeletingFirstPathComponentWithEncodingName:(NSString *)encoding; +-(XADPath *)pathByDeletingFirstPathComponentWithEncodingName:(XADStringEncodingName)encoding; -(XADPath *)pathByAppendingXADStringComponent:(XADString *)component; -(XADPath *)pathByAppendingPath:(XADPath *)path; @@ -82,20 +86,20 @@ separators:(const char *)pathseparators; // These are safe for filesystem use, and adapted to the current platform. -(NSString *)sanitizedPathString; --(NSString *)sanitizedPathStringWithEncodingName:(NSString *)encoding; +-(NSString *)sanitizedPathStringWithEncodingName:(XADStringEncodingName)encoding; // XADString interface. // NOTE: These are not guaranteed to be safe for usage as filesystem paths, // only for display! --(BOOL)canDecodeWithEncodingName:(NSString *)encoding; +-(BOOL)canDecodeWithEncodingName:(XADStringEncodingName)encoding; -(NSString *)string; --(NSString *)stringWithEncodingName:(NSString *)encoding; +-(NSString *)stringWithEncodingName:(XADStringEncodingName)encoding; -(NSData *)data; -(void)_appendPathToData:(NSMutableData *)data; --(BOOL)encodingIsKnown; --(NSString *)encodingName; --(float)confidence; +@property (readonly, nonatomic) BOOL encodingIsKnown; +@property (readonly, copy) XADStringEncodingName encodingName; +@property (readonly) float confidence; -(XADStringSource *)source; @@ -106,29 +110,26 @@ separators:(const char *)pathseparators; -(NSStringEncoding)encoding; #endif -// Other interfaces. --(NSUInteger)hash; --(id)copyWithZone:(NSZone *)zone; - // Deprecated. --(XADPath *)safePath; // Deprecated. Use sanitizedPathString: instead. +-(XADPath *)safePath DEPRECATED_ATTRIBUTE; // Deprecated. Use sanitizedPathString: instead. // Subclass methods. -(BOOL)_isPartAbsolute; -(BOOL)_isPartEmpty; --(int)_depthOfPartWithEncodingName:(NSString *)encoding; --(void)_addPathComponentsOfPartToArray:(NSMutableArray *)array encodingName:(NSString *)encoding; --(NSString *)_lastPathComponentOfPartWithEncodingName:(NSString *)encoding; --(NSString *)_firstPathComponentOfPartWithEncodingName:(NSString *)encoding; --(XADPath *)_pathByDeletingLastPathComponentOfPartWithEncodingName:(NSString *)encoding; --(XADPath *)_pathByDeletingFirstPathComponentOfPartWithEncodingName:(NSString *)encoding; --(BOOL)_canDecodePartWithEncodingName:(NSString *)encoding; +-(int)_depthOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(void)_addPathComponentsOfPartToArray:(NSMutableArray *)array encodingName:(XADStringEncodingName)encoding; +-(NSString *)_lastPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(NSString *)_firstPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(XADPath *)_pathByDeletingLastPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(XADPath *)_pathByDeletingFirstPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(BOOL)_canDecodePartWithEncodingName:(XADStringEncodingName)encoding; -(void)_appendPathForPartToData:(NSMutableData *)data; -(XADStringSource *)_sourceForPart; @end +XADEXPORT @interface XADStringPath:XADPath { NSString *string; @@ -141,13 +142,13 @@ separators:(const char *)pathseparators; -(BOOL)_isPartAbsolute; -(BOOL)_isPartEmpty; --(int)_depthOfPartWithEncodingName:(NSString *)encoding; --(void)_addPathComponentsOfPartToArray:(NSMutableArray *)array encodingName:(NSString *)encoding; --(NSString *)_lastPathComponentOfPartWithEncodingName:(NSString *)encoding; --(NSString *)_firstPathComponentOfPartWithEncodingName:(NSString *)encoding; --(XADPath *)_pathByDeletingLastPathComponentOfPartWithEncodingName:(NSString *)encoding; --(XADPath *)_pathByDeletingFirstPathComponentOfPartWithEncodingName:(NSString *)encoding; --(BOOL)_canDecodePartWithEncodingName:(NSString *)encoding; +-(int)_depthOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(void)_addPathComponentsOfPartToArray:(NSMutableArray *)array encodingName:(XADStringEncodingName)encoding; +-(NSString *)_lastPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(NSString *)_firstPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(XADPath *)_pathByDeletingLastPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(XADPath *)_pathByDeletingFirstPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(BOOL)_canDecodePartWithEncodingName:(XADStringEncodingName)encoding; -(void)_appendPathForPartToData:(NSMutableData *)data; -(XADStringSource *)_sourceForPart; @@ -156,6 +157,7 @@ separators:(const char *)pathseparators; @end +XADEXPORT @interface XADRawPath:XADPath { NSData *data; @@ -172,13 +174,13 @@ separators:(const char *)pathseparators parent:(XADPath *)parentpath; -(BOOL)_isPartAbsolute; -(BOOL)_isPartEmpty; --(int)_depthOfPartWithEncodingName:(NSString *)encoding; --(void)_addPathComponentsOfPartToArray:(NSMutableArray *)array encodingName:(NSString *)encoding; --(NSString *)_lastPathComponentOfPartWithEncodingName:(NSString *)encoding; --(NSString *)_firstPathComponentOfPartWithEncodingName:(NSString *)encoding; --(XADPath *)_pathByDeletingLastPathComponentOfPartWithEncodingName:(NSString *)encoding; --(XADPath *)_pathByDeletingFirstPathComponentOfPartWithEncodingName:(NSString *)encoding; --(BOOL)_canDecodePartWithEncodingName:(NSString *)encoding; +-(int)_depthOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(void)_addPathComponentsOfPartToArray:(NSMutableArray *)array encodingName:(XADStringEncodingName)encoding; +-(NSString *)_lastPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(NSString *)_firstPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(XADPath *)_pathByDeletingLastPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(XADPath *)_pathByDeletingFirstPathComponentOfPartWithEncodingName:(XADStringEncodingName)encoding; +-(BOOL)_canDecodePartWithEncodingName:(XADStringEncodingName)encoding; -(void)_appendPathForPartToData:(NSMutableData *)data; -(XADStringSource *)_sourceForPart; diff --git a/XADPlatform.h b/XADPlatform.h index 24b85303..7ecaf7c6 100644 --- a/XADPlatform.h +++ b/XADPlatform.h @@ -18,9 +18,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" +#import "XADTypes.h" #import "XADUnarchiver.h" #import "CSHandle.h" +#pragma clang diagnostic pop +XADEXPORT @interface XADPlatform:NSObject {} // Archive entry extraction. @@ -48,8 +54,12 @@ preservePermissions:(BOOL)preservepermissions; // Resource forks +(CSHandle *)handleForReadingResourceForkAtPath:(NSString *)path; ++(CSHandle *)handleForReadingResourceForkAtFileURL:(NSURL *)path; // Time functions. -+(double)currentTimeInSeconds; +#if __has_feature(objc_class_property) +@property (class, readonly) NSTimeInterval currentTimeInSeconds; +#endif ++(NSTimeInterval)currentTimeInSeconds; @end diff --git a/XADPlatformLinux.m b/XADPlatformLinux.m index 0983bb34..831265c3 100644 --- a/XADPlatformLinux.m +++ b/XADPlatformLinux.m @@ -38,7 +38,7 @@ @implementation XADPlatform +(XADError)extractResourceForkEntryWithDictionary:(NSDictionary *)dict unarchiver:(XADUnarchiver *)unarchiver toPath:(NSString *)destpath { - return XADNotSupportedError; + return XADErrorNotSupported; } +(XADError)updateFileAttributesAtPath:(NSString *)path @@ -51,7 +51,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path BOOL islink=linknum&&[linknum boolValue]; struct stat st; - if(lstat(cpath,&st)!=0) return XADOpenFileError; // TODO: better error + if(lstat(cpath,&st)!=0) return XADErrorOpenFile; // TODO: better error // If the file does not have write permissions, change this temporarily // and remember to change back. @@ -77,7 +77,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path if(modification) times[1]=[modification timevalStruct]; int res=lutimes(cpath,times); - if(res!=0&&res!=ENOSYS) return XADUnknownError; // TODO: better error + if(res!=0&&res!=ENOSYS) return XADErrorUnknown; // TODO: better error } // Handle permissions (or change back to original permissions if they were changed). @@ -102,10 +102,10 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path } if(!islink) - if(chmod(cpath,mode&~S_IFMT)!=0) return XADUnknownError; // TODO: bette error + if(chmod(cpath,mode&~S_IFMT)!=0) return XADErrorUnknown; // TODO: bette error } - return XADNoError; + return XADErrorNone; } +(XADError)createLinkAtPath:(NSString *)path withDestinationPath:(NSString *)link @@ -113,9 +113,9 @@ +(XADError)createLinkAtPath:(NSString *)path withDestinationPath:(NSString *)lin struct stat st; const char *destcstr=[path fileSystemRepresentation]; if(lstat(destcstr,&st)==0) unlink(destcstr); - if(symlink([link fileSystemRepresentation],destcstr)!=0) return XADLinkError; + if(symlink([link fileSystemRepresentation],destcstr)!=0) return XADErrorLink; - return XADNoError; + return XADErrorNone; } @@ -226,7 +226,7 @@ +(BOOL)removeItemAtPath:(NSString *)path +(CSHandle *)handleForReadingResourceForkAtPath:(NSString *)path { return nil; } - ++(CSHandle *)handleForReadingResourceForkAtFileURL:(NSURL *)path { return nil; } // // Time functions. diff --git a/XADPlatformMacOSX.m b/XADPlatformMacOSX.m index 258f5e04..f417448b 100644 --- a/XADPlatformMacOSX.m +++ b/XADPlatformMacOSX.m @@ -103,8 +103,8 @@ +(XADError)extractResourceForkEntryWithDictionary:(NSDictionary *)dict if(S_ISLNK(st.st_mode)) { NSNumber *sizenum=[dict objectForKey:XADFileSizeKey]; - if(!sizenum) return XADNoError; - else if([sizenum longLongValue]==0) return XADNoError; + if(!sizenum) return XADErrorNone; + else if([sizenum longLongValue]==0) return XADErrorNone; } // Otherwise, try changing permissions. @@ -113,7 +113,7 @@ +(XADError)extractResourceForkEntryWithDictionary:(NSDictionary *)dict chmod(cpath,0700); fd=open(cpath,O_WRONLY|O_CREAT|O_NOFOLLOW,0666); - if(fd==-1) return XADOpenFileError; // TODO: Better error. + if(fd==-1) return XADErrorOpenFile; // TODO: Better error. } struct ResourceOutputArguments args={ .fd=fd, .offset=0 }; @@ -133,11 +133,11 @@ +(XADError)outputToResourceFork:(NSValue *)pointerval bytes:(uint8_t *)bytes len { struct ResourceOutputArguments *args=[pointerval pointerValue]; if(fsetxattr(args->fd,XATTR_RESOURCEFORK_NAME,bytes,length, - args->offset,0)) return XADOutputError; + args->offset,0)) return XADErrorOutput; args->offset+=length; - return XADNoError; + return XADErrorNone; } @@ -151,7 +151,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path // Read file permissions. struct stat st; - if(lstat(cpath,&st)!=0) return XADOpenFileError; // TODO: better error + if(lstat(cpath,&st)!=0) return XADErrorOpenFile; // TODO: better error // If the file does not have write permissions, change this temporarily. if(!(st.st_mode&S_IWUSR)) chmod(cpath,0700); @@ -160,9 +160,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path NSDictionary *extattrs=[parser extendedAttributesForDictionary:dict]; if(extattrs) { - NSEnumerator *enumerator=[extattrs keyEnumerator]; - NSString *key; - while((key=[enumerator nextObject])) + for(NSString *key in extattrs) { NSData *data=[extattrs objectForKey:key]; @@ -233,7 +231,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path // Finally, set all attributes. setattrlist(cpath,&list,attrdata,attrptr-attrdata,FSOPT_NOFOLLOW); - return XADNoError; + return XADErrorNone; } +(void)setComment:(NSString *)comment forPath:(NSString *)path; @@ -260,19 +258,22 @@ +(void)setComment:(NSString *)comment forPath:(NSString *)path; NSAppleEventDescriptor *commentdesc=[NSAppleEventDescriptor descriptorWithString:comment]; - FSRef ref; - bzero(&ref,sizeof(ref)); - if(FSPathMakeRef((UInt8 *)[path fileSystemRepresentation],&ref,NULL)!=noErr) return; + NSURL *fileURL = [NSURL fileURLWithPath:path]; + NSData *fileStrData = (NSData*)CFURLCreateData(kCFAllocatorDefault, (CFURLRef)fileURL, kCFStringEncodingUTF8, true); + // TODO: The alias manager has been deprecated for awhile: Use typeFileURL or + // typeBookmarkData instead… but that would most likely mean re-writing the eventformat + // string or migrating it to something else. AEDesc filedesc; AEInitializeDesc(&filedesc); - if(AECoercePtr(typeFSRef,&ref,sizeof(ref),typeAlias,&filedesc)!=noErr) return; + if(AECoercePtr(typeFileURL,[fileStrData bytes],[fileStrData length],typeAlias,&filedesc)!=noErr) {[fileStrData release]; return;} AEDesc builtevent,replyevent; AEInitializeDesc(&builtevent); AEInitializeDesc(&replyevent); + [fileStrData release]; - static OSType findersignature='MACS'; + static const OSType findersignature='MACS'; OSErr err=AEBuildAppleEvent(kAECoreSuite,kAESetData, typeApplSignature,&findersignature,sizeof(findersignature), @@ -297,9 +298,9 @@ +(XADError)createLinkAtPath:(NSString *)path withDestinationPath:(NSString *)lin struct stat st; const char *destcstr=[path fileSystemRepresentation]; if(lstat(destcstr,&st)==0) unlink(destcstr); - if(symlink([link fileSystemRepresentation],destcstr)!=0) return XADLinkError; + if(symlink([link fileSystemRepresentation],destcstr)!=0) return XADErrorLink; - return XADNoError; + return XADErrorNone; } @@ -557,6 +558,33 @@ +(CSHandle *)handleForReadingResourceForkAtPath:(NSString *)path return [CSMemoryHandle memoryHandleForReadingData:data]; } ++(CSHandle *)handleForReadingResourceForkAtFileURL:(NSURL *)path +{ + // TODO: Make an actual CSHandle subclass? Possible but sort of useless. + NSMutableData *data=[NSMutableData data]; + + const char *cpath=[path fileSystemRepresentation]; + int fd=open(cpath,O_RDONLY); + if(fd==-1) return nil; + + uint32_t pos=0; + for(;;) + { + uint8_t buffer[16384]; + + ssize_t actual=fgetxattr(fd,XATTR_RESOURCEFORK_NAME,buffer,sizeof(buffer),pos,0); + if(actual<0) { close(fd); return nil; } + if(actual==0) break; + + [data appendBytes:buffer length:actual]; + pos+=actual; + } + + close(fd); + + return [CSMemoryHandle memoryHandleForReadingData:data]; +} + // diff --git a/XADPlatformWindows.m b/XADPlatformWindows.m index cb1c4978..c30af531 100644 --- a/XADPlatformWindows.m +++ b/XADPlatformWindows.m @@ -38,7 +38,7 @@ @implementation XADPlatform +(XADError)extractResourceForkEntryWithDictionary:(NSDictionary *)dict unarchiver:(XADUnarchiver *)unarchiver toPath:(NSString *)destpath { - return XADNotSupportedError; + return XADErrorNotSupported; } +(XADError)updateFileAttributesAtPath:(NSString *)path @@ -68,7 +68,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path { HANDLE handle=CreateFileW(wpath,GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL); - if(handle==INVALID_HANDLE_VALUE) return XADUnknownError; // TODO: better error + if(handle==INVALID_HANDLE_VALUE) return XADErrorUnknown; // TODO: better error FILETIME creationtime,lastaccesstime,lastwritetime; @@ -82,7 +82,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path modification?&lastwritetime:NULL)) { CloseHandle(handle); - return XADUnknownError; // TODO: better error + return XADErrorUnknown; // TODO: better error } CloseHandle(handle); @@ -97,12 +97,12 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path SetFileAttributesW(wpath,newattributes); } - return XADNoError; + return XADErrorNone; } +(XADError)createLinkAtPath:(NSString *)path withDestinationPath:(NSString *)link { - return XADNotSupportedError; + return XADErrorNotSupported; } @@ -281,7 +281,7 @@ +(BOOL)removeItemAtPath:(NSString *)path +(CSHandle *)handleForReadingResourceForkAtPath:(NSString *)path { return nil; } - ++(CSHandle *)handleForReadingResourceForkAtFileURL:(NSURL *)path { return nil; } // // Time functions. diff --git a/XADPlatformiOS.m b/XADPlatformiOS.m index 20345cee..8ec5b732 100644 --- a/XADPlatformiOS.m +++ b/XADPlatformiOS.m @@ -38,7 +38,7 @@ @implementation XADPlatform +(XADError)extractResourceForkEntryWithDictionary:(NSDictionary *)dict unarchiver:(XADUnarchiver *)unarchiver toPath:(NSString *)destpath { - return XADNotSupportedError; + return XADErrorNotSupported; } +(XADError)updateFileAttributesAtPath:(NSString *)path @@ -49,7 +49,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path // Read file permissions. struct stat st; - if(lstat(cpath,&st)!=0) return XADOpenFileError; // TODO: better error + if(lstat(cpath,&st)!=0) return XADErrorOpenFile; // TODO: better error // If the file does not have write permissions, change this temporarily. if(!(st.st_mode&S_IWUSR)) chmod(cpath,0700); @@ -58,9 +58,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path NSDictionary *extattrs=[parser extendedAttributesForDictionary:dict]; if(extattrs) { - NSEnumerator *enumerator=[extattrs keyEnumerator]; - NSString *key; - while((key=[enumerator nextObject])) + for(NSString *key in extattrs) { NSData *data=[extattrs objectForKey:key]; @@ -123,7 +121,7 @@ +(XADError)updateFileAttributesAtPath:(NSString *)path // Finally, set all attributes. setattrlist(cpath,&list,attrdata,attrptr-attrdata,FSOPT_NOFOLLOW); - return XADNoError; + return XADErrorNone; } +(XADError)createLinkAtPath:(NSString *)path withDestinationPath:(NSString *)link @@ -131,9 +129,9 @@ +(XADError)createLinkAtPath:(NSString *)path withDestinationPath:(NSString *)lin struct stat st; const char *destcstr=[path fileSystemRepresentation]; if(lstat(destcstr,&st)==0) unlink(destcstr); - if(symlink([link fileSystemRepresentation],destcstr)!=0) return XADLinkError; + if(symlink([link fileSystemRepresentation],destcstr)!=0) return XADErrorLink; - return XADNoError; + return XADErrorNone; } @@ -243,7 +241,7 @@ +(BOOL)removeItemAtPath:(NSString *)path +(CSHandle *)handleForReadingResourceForkAtPath:(NSString *)path { return nil; } - ++(CSHandle *)handleForReadingResourceForkAtFileURL:(NSURL *)path { return nil; } // // Time functions. diff --git a/XADPrefixCode.h b/XADPrefixCode.h index 9d6c8095..afd3f604 100644 --- a/XADPrefixCode.h +++ b/XADPrefixCode.h @@ -18,13 +18,17 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "CSInputBuffer.h" +#pragma clang diagnostic pop -extern NSString *XADInvalidPrefixCodeException; +XADEXTERN NSExceptionName const XADInvalidPrefixCodeException; typedef struct XADCodeTreeNode XADCodeTreeNode; typedef struct XADCodeTableEntry XADCodeTableEntry; +XADEXPORT @interface XADPrefixCode:NSObject { XADCodeTreeNode *tree; @@ -66,5 +70,5 @@ maximumLength:(int)maxlength shortestCodeIsZeros:(BOOL)zeros; @end -int CSInputNextSymbolUsingCode(CSInputBuffer *buf,XADPrefixCode *code); -int CSInputNextSymbolUsingCodeLE(CSInputBuffer *buf,XADPrefixCode *code); +XADEXTERN int CSInputNextSymbolUsingCode(CSInputBuffer *buf,XADPrefixCode *code); +XADEXTERN int CSInputNextSymbolUsingCodeLE(CSInputBuffer *buf,XADPrefixCode *code); diff --git a/XADPrefixCode.m b/XADPrefixCode.m index 8c09f7b3..e4505e36 100644 --- a/XADPrefixCode.m +++ b/XADPrefixCode.m @@ -21,7 +21,7 @@ #import "XADPrefixCode.h" #import "Realloc.h" -NSString *XADInvalidPrefixCodeException=@"XADInvalidPrefixCodeException"; +NSString * const XADInvalidPrefixCodeException=@"XADInvalidPrefixCodeException"; struct XADCodeTreeNode diff --git a/XADRAR5Parser.m b/XADRAR5Parser.m index b89d841c..eef70034 100644 --- a/XADRAR5Parser.m +++ b/XADRAR5Parser.m @@ -329,9 +329,7 @@ -(void)addEntryWithDictionary:(NSMutableDictionary *)dict // Calculate and set the total compressed size. off_t compsize=0; - NSEnumerator *enumerator=[parts objectEnumerator]; - NSDictionary *part; - while(part=[enumerator nextObject]) compsize+=[[part objectForKey:@"InputLength"] longLongValue]; + for(NSDictionary *part in parts) compsize+=[[part objectForKey:@"InputLength"] longLongValue]; [dict setObject:[NSNumber numberWithLongLong:compsize] forKey:XADCompressedSizeKey]; diff --git a/XADRARInputHandle.m b/XADRARInputHandle.m index 33ae9663..c73aac84 100644 --- a/XADRARInputHandle.m +++ b/XADRARInputHandle.m @@ -27,16 +27,14 @@ @implementation XADRARInputHandle -(id)initWithHandle:(CSHandle *)handle parts:(NSArray *)partarray { off_t totallength=0; - NSEnumerator *enumerator=[partarray objectEnumerator]; - NSDictionary *dict; - while((dict=[enumerator nextObject])) + for(NSDictionary *dict in partarray) { totallength+=[[dict objectForKey:@"InputLength"] longLongValue]; } if((self=[super initWithParentHandle:handle length:totallength])) { - parts=[partarray retain]; + parts=[partarray copy]; } return self; } diff --git a/XADRARParser.m b/XADRARParser.m index e8dd95f3..bece7325 100644 --- a/XADRARParser.m +++ b/XADRARParser.m @@ -752,7 +752,7 @@ -(CSInputBuffer *)inputBufferForFileWithIndex:(int)file files:(NSArray *)files -(CSHandle *)inputHandleForFileWithIndex:(int)file files:(NSArray *)files { - if(file>=[files count]) [XADException raiseExceptionWithXADError:XADInputError]; // TODO: better error + if(file>=[files count]) [XADException raiseExceptionWithXADError:XADErrorInput]; // TODO: better error NSDictionary *dict=[files objectAtIndex:file]; CSHandle *handle=[self inputHandleWithParts:[dict objectForKey:@"Parts"] @@ -805,7 +805,7 @@ -(NSData *)keyForSalt:(NSData *)salt -(off_t)outputLengthOfFileWithIndex:(int)file files:(NSArray *)files { - if(file>=[files count]) [XADException raiseExceptionWithXADError:XADInputError]; // TODO: better error + if(file>=[files count]) [XADException raiseExceptionWithXADError:XADErrorInput]; // TODO: better error NSDictionary *dict=[files objectAtIndex:file]; return [[dict objectForKey:@"OutputLength"] longLongValue]; diff --git a/XADRegex.h b/XADRegex.h index 947201dc..14dbde57 100644 --- a/XADRegex.h +++ b/XADRegex.h @@ -20,12 +20,18 @@ */ #import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" +#import "XADTypes.h" +#pragma clang diagnostic pop + #ifdef _WIN32 #import "regex.h" #else #import #endif +XADEXPORT @interface XADRegex:NSObject { NSString *patternstring; @@ -106,4 +112,4 @@ -(void)replaceEveryPattern:(NSString *)pattern usingSelector:(SEL)selector onObject:(id)object; -(void)replaceEveryPattern:(NSString *)pattern usingSelector:(SEL)selector onObject:(id)object options:(int)options; -@end*/ \ No newline at end of file +@end*/ diff --git a/XADResourceFork.h b/XADResourceFork.h index 2e35ef45..a9ba1c5a 100644 --- a/XADResourceFork.h +++ b/XADResourceFork.h @@ -18,9 +18,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "CSHandle.h" #import "XADException.h" +#pragma clang diagnostic pop +XADEXPORT @interface XADResourceFork:NSObject { NSDictionary *resources; diff --git a/XADResourceFork.m b/XADResourceFork.m index 9bd5ed8f..5473d657 100644 --- a/XADResourceFork.m +++ b/XADResourceFork.m @@ -123,14 +123,11 @@ -(NSDictionary *)_parseMapFromHandle:(CSHandle *)handle withDataObjects:(NSMutab [dict setObject:references forKey:[NSNumber numberWithUnsignedInt:type]]; } - NSEnumerator *typeenumerator=[dict keyEnumerator]; - NSNumber *type; - while(type=[typeenumerator nextObject]) + for(NSNumber *type in dict) { NSDictionary *resourcesoftype=[dict objectForKey:type]; NSEnumerator *identifierenumerator=[resourcesoftype keyEnumerator]; - NSNumber *identifier; - while(identifier=[identifierenumerator nextObject]) + for(NSNumber *identifier in identifierenumerator) { NSMutableDictionary *resource=[resourcesoftype objectForKey:identifier]; [resource setObject:type forKey:@"Type"]; diff --git a/XADSimpleUnarchiver.h b/XADSimpleUnarchiver.h index 605e21d1..bff84c44 100644 --- a/XADSimpleUnarchiver.h +++ b/XADSimpleUnarchiver.h @@ -20,20 +20,26 @@ */ #import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "XADArchiveParser.h" #import "XADUnarchiver.h" #import "XADRegex.h" +#pragma clang diagnostic pop #define XADNeverCreateEnclosingDirectory 0 #define XADAlwaysCreateEnclosingDirectory 1 #define XADCreateEnclosingDirectoryWhenNeeded 2 -@interface XADSimpleUnarchiver:NSObject +@protocol XADSimpleUnarchiverDelegate; + +XADEXPORT +@interface XADSimpleUnarchiver:NSObject { XADArchiveParser *parser; XADUnarchiver *unarchiver,*subunarchiver; - id delegate; + id delegate; BOOL shouldstop; NSString *destination,*enclosingdir; @@ -50,7 +56,7 @@ NSMutableSet *resourceforks; id metadata; NSString *unpackdestination,*finaldestination,*overridesoloitem; - int numextracted; + NSInteger numextracted; NSString *toplevelname; BOOL lookslikesolo; @@ -70,67 +76,53 @@ -(XADArchiveParser *)innerArchiveParser; -(NSArray *)reasonsForInterest; --(id)delegate; --(void)setDelegate:(id)newdelegate; +@property (assign) id delegate; // TODO: Encoding wrappers? -(NSString *)password; -(void)setPassword:(NSString *)password; --(NSString *)destination; --(void)setDestination:(NSString *)destpath; +@property (nonatomic, copy) NSString *destination; --(NSString *)enclosingDirectoryName; --(void)setEnclosingDirectoryName:(NSString *)dirname; +@property (nonatomic, copy) NSString *enclosingDirectoryName; --(BOOL)removesEnclosingDirectoryForSoloItems; --(void)setRemovesEnclosingDirectoryForSoloItems:(BOOL)removeflag; +@property BOOL removesEnclosingDirectoryForSoloItems; --(BOOL)alwaysOverwritesFiles; --(void)setAlwaysOverwritesFiles:(BOOL)overwriteflag; +@property BOOL alwaysOverwritesFiles; --(BOOL)alwaysRenamesFiles; --(void)setAlwaysRenamesFiles:(BOOL)renameflag; +@property BOOL alwaysRenamesFiles; --(BOOL)alwaysSkipsFiles; --(void)setAlwaysSkipsFiles:(BOOL)skipflag; +@property BOOL alwaysSkipsFiles; --(BOOL)extractsSubArchives; --(void)setExtractsSubArchives:(BOOL)extractflag; +@property BOOL extractsSubArchives; --(BOOL)copiesArchiveModificationTimeToEnclosingDirectory; --(void)setCopiesArchiveModificationTimeToEnclosingDirectory:(BOOL)copyflag; +@property BOOL copiesArchiveModificationTimeToEnclosingDirectory; --(BOOL)copiesArchiveModificationTimeToSoloItems; --(void)setCopiesArchiveModificationTimeToSoloItems:(BOOL)copyflag; +@property BOOL copiesArchiveModificationTimeToSoloItems; --(BOOL)resetsDateForSoloItems; --(void)setResetsDateForSoloItems:(BOOL)resetflag; +@property BOOL resetsDateForSoloItems; --(BOOL)propagatesRelevantMetadata; --(void)setPropagatesRelevantMetadata:(BOOL)propagateflag; +@property BOOL propagatesRelevantMetadata; --(int)macResourceForkStyle; --(void)setMacResourceForkStyle:(int)style; +@property (nonatomic) XADForkStyle macResourceForkStyle; --(BOOL)preservesPermissions; --(void)setPreserevesPermissions:(BOOL)preserveflag; +@property (nonatomic) BOOL preservesPermissions; +-(void)setPreserevesPermissions:(BOOL)preserveflag API_DEPRECATED_WITH_REPLACEMENT("-setPreservesPermissions:", macosx(10.0, 10.8), ios(3.0, 8.0)); --(double)updateInterval; --(void)setUpdateInterval:(double)interval; +@property (nonatomic) NSTimeInterval updateInterval; -(void)addGlobFilter:(NSString *)wildcard; -(void)addRegexFilter:(XADRegex *)regex; --(void)addIndexFilter:(int)index; +-(void)addIndexFilter:(NSInteger)index; -(void)setIndices:(NSIndexSet *)indices; -(off_t)predictedTotalSize; -(off_t)predictedTotalSizeIgnoringUnknownFiles:(BOOL)ignoreunknown; --(int)numberOfItemsExtracted; --(BOOL)wasSoloItem; --(NSString *)actualDestination; +@property (readonly) NSInteger numberOfItemsExtracted; +@property (readonly) BOOL wasSoloItem; +@property (readonly, copy) NSString *actualDestination; -(NSString *)soloItem; -(NSString *)createdItem; -(NSString *)createdItemOrActualDestination; @@ -139,6 +131,7 @@ -(XADError)parse; -(XADError)_setupSubArchiveForEntryWithDataFork:(NSDictionary *)datadict resourceFork:(NSDictionary *)resourcedict; +-(BOOL)_setupSubArchiveForEntryWithDataFork:(NSDictionary *)datadict resourceFork:(NSDictionary *)resourcedict error:(NSError**)outError; -(XADError)unarchive; -(XADError)_unarchiveRegularArchive; @@ -160,13 +153,13 @@ -@interface NSObject (XADSimpleUnarchiverDelegate) - +@protocol XADSimpleUnarchiverDelegate +@optional -(void)simpleUnarchiverNeedsPassword:(XADSimpleUnarchiver *)unarchiver; -(CSHandle *)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver outputHandleForEntryWithDictionary:(NSDictionary *)dict; --(NSString *)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver encodingNameForXADString:(id )string; +-(XADStringEncodingName)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver encodingNameForXADString:(id )string; -(BOOL)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver shouldExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path; -(void)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver willExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path; diff --git a/XADSimpleUnarchiver.m b/XADSimpleUnarchiver.m index 6dbf6449..04b4655a 100644 --- a/XADSimpleUnarchiver.m +++ b/XADSimpleUnarchiver.m @@ -151,8 +151,7 @@ -(XADArchiveParser *)innerArchiveParser { return [subunarchiver archiveParser]; -(NSArray *)reasonsForInterest { return reasonsforinterest; } --(id)delegate { return delegate; } --(void)setDelegate:(id)newdelegate { delegate=newdelegate; } +@synthesize delegate; -(NSString *)password { return [parser password]; } -(void)setPassword:(NSString *)password @@ -161,65 +160,60 @@ -(void)setPassword:(NSString *)password [[subunarchiver archiveParser] setPassword:password]; } --(NSString *)destination { return destination; } +@synthesize destination; -(void)setDestination:(NSString *)destpath { if(destpath!=destination) { [destination release]; - destination=[destpath retain]; + destination=[destpath copy]; } } --(NSString *)enclosingDirectoryName { return enclosingdir; } +@synthesize enclosingDirectoryName = enclosingdir; -(void)setEnclosingDirectoryName:(NSString *)dirname { if(dirname!=enclosingdir) { [enclosingdir release]; - enclosingdir=[dirname retain]; + enclosingdir=[dirname copy]; } } --(BOOL)removesEnclosingDirectoryForSoloItems { return removesolo; } --(void)setRemovesEnclosingDirectoryForSoloItems:(BOOL)removeflag { removesolo=removeflag; } +@synthesize removesEnclosingDirectoryForSoloItems = removesolo; --(BOOL)alwaysOverwritesFiles { return overwrite; } --(void)setAlwaysOverwritesFiles:(BOOL)overwriteflag { overwrite=overwriteflag; } +@synthesize alwaysOverwritesFiles = overwrite; --(BOOL)alwaysRenamesFiles { return rename; } --(void)setAlwaysRenamesFiles:(BOOL)renameflag { rename=renameflag; } +@synthesize alwaysRenamesFiles = rename; --(BOOL)alwaysSkipsFiles { return skip; } --(void)setAlwaysSkipsFiles:(BOOL)skipflag { skip=skipflag; } +@synthesize alwaysSkipsFiles = skip; --(BOOL)extractsSubArchives { return extractsubarchives; } --(void)setExtractsSubArchives:(BOOL)extractflag { extractsubarchives=extractflag; } +@synthesize extractsSubArchives = extractsubarchives; --(BOOL)copiesArchiveModificationTimeToEnclosingDirectory { return copydatetoenclosing; } --(void)setCopiesArchiveModificationTimeToEnclosingDirectory:(BOOL)copyflag { copydatetoenclosing=copyflag; } +@synthesize copiesArchiveModificationTimeToEnclosingDirectory = copydatetoenclosing; --(BOOL)copiesArchiveModificationTimeToSoloItems { return copydatetosolo; } --(void)setCopiesArchiveModificationTimeToSoloItems:(BOOL)copyflag { copydatetosolo=copyflag; } +@synthesize copiesArchiveModificationTimeToSoloItems = copydatetosolo; --(BOOL)resetsDateForSoloItems { return resetsolodate; } --(void)setResetsDateForSoloItems:(BOOL)resetflag { resetsolodate=resetflag; } +@synthesize resetsDateForSoloItems = resetsolodate; --(BOOL)propagatesRelevantMetadata { return propagatemetadata; } --(void)setPropagatesRelevantMetadata:(BOOL)propagateflag { propagatemetadata=propagateflag; } +@synthesize propagatesRelevantMetadata = propagatemetadata; --(int)macResourceForkStyle { return [unarchiver macResourceForkStyle]; } --(void)setMacResourceForkStyle:(int)style +-(XADForkStyle)macResourceForkStyle { return [unarchiver macResourceForkStyle]; } +-(void)setMacResourceForkStyle:(XADForkStyle)style { [unarchiver setMacResourceForkStyle:style]; [subunarchiver setMacResourceForkStyle:style]; } -(BOOL)preservesPermissions { return [unarchiver preservesPermissions]; } +-(void)setPreservesPermissions:(BOOL)preserveflag +{ + [unarchiver setPreservesPermissions:preserveflag]; + [subunarchiver setPreservesPermissions:preserveflag]; +} -(void)setPreserevesPermissions:(BOOL)preserveflag { - [unarchiver setPreserevesPermissions:preserveflag]; - [subunarchiver setPreserevesPermissions:preserveflag]; + self.preservesPermissions = preserveflag; } -(double)updateInterval { return [unarchiver updateInterval]; } @@ -246,7 +240,7 @@ -(void)addRegexFilter:(XADRegex *)regex [regexes addObject:regex]; } --(void)addIndexFilter:(int)index +-(void)addIndexFilter:(NSInteger)index { if(!indices) indices=[NSMutableIndexSet new]; [indices addIndex:index]; @@ -268,9 +262,7 @@ -(off_t)predictedTotalSizeIgnoringUnknownFiles:(BOOL)ignoreunknown { off_t total=0; - NSEnumerator *enumerator=[entries objectEnumerator]; - NSDictionary *dict; - while((dict=[enumerator nextObject])) + for(NSDictionary *dict in entries) { NSNumber *num=[dict objectForKey:XADFileSizeKey]; if(!num) @@ -288,11 +280,11 @@ -(off_t)predictedTotalSizeIgnoringUnknownFiles:(BOOL)ignoreunknown --(int)numberOfItemsExtracted { return numextracted; } +@synthesize numberOfItemsExtracted = numextracted; --(BOOL)wasSoloItem { return lookslikesolo; } +@synthesize wasSoloItem = lookslikesolo; --(NSString *)actualDestination { return finaldestination; } +@synthesize actualDestination = finaldestination; -(NSString *)soloItem { @@ -332,7 +324,66 @@ -(NSString *)createdItemOrActualDestination } } +-(BOOL)parseWithError:(NSError**)error +{ + if(entries.count) { + if (error) { + *error = [NSError errorWithDomain:XADErrorDomain code:XADErrorBadParameters userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"You can not call parseAndUnarchive twice", NSLocalizedDescriptionKey, nil]]; + } + + return NO; + } + + // Run parser to find archive entries. + parser.delegate = self; + BOOL parseSuccess=[parser parseWithError:error]; + if (!parseSuccess) { + return NO; + } + + if (extractsubarchives) { + // Check if we have a single entry, which is an archive. + if (entries.count==1) { + NSDictionary *entry=[entries objectAtIndex:0]; + NSNumber *archnum=[entry objectForKey:XADIsArchiveKey]; + BOOL isarc=archnum&&archnum.boolValue; + if(isarc) return [self _setupSubArchiveForEntryWithDataFork:entry resourceFork:nil error:error]; + } + + // Check if we have two entries, which are data and resource forks + // of the same archive. + if (entries.count==2) { + NSDictionary *first=[entries objectAtIndex:0]; + NSDictionary *second=[entries objectAtIndex:1]; + XADPath *name1=[first objectForKey:XADFileNameKey]; + XADPath *name2=[second objectForKey:XADFileNameKey]; + NSNumber *archnum1=[first objectForKey:XADIsArchiveKey]; + NSNumber *archnum2=[second objectForKey:XADIsArchiveKey]; + BOOL isarc1=archnum1&&archnum1.boolValue; + BOOL isarc2=archnum2&&archnum2.boolValue; + + if ([name1 isEqual:name2] && (isarc1||isarc2)) { + NSNumber *resnum=[first objectForKey:XADIsResourceForkKey]; + NSDictionary *datafork,*resourcefork; + if (resnum&&resnum.boolValue) { + datafork=second; + resourcefork=first; + } else { + datafork=first; + resourcefork=second; + } + + // TODO: Handle resource forks for archives that require them. + NSNumber *archnum=[datafork objectForKey:XADIsArchiveKey]; + if(archnum&&archnum.boolValue) { + return [self _setupSubArchiveForEntryWithDataFork:datafork resourceFork:resourcefork error:error]; + } + } + } + } + return YES; +} -(XADError)parse @@ -390,7 +441,7 @@ -(XADError)parse } } - return XADNoError; + return XADErrorNone; } -(XADError)_setupSubArchiveForEntryWithDataFork:(NSDictionary *)datadict resourceFork:(NSDictionary *)resourcedict @@ -402,12 +453,32 @@ -(XADError)_setupSubArchiveForEntryWithDataFork:(NSDictionary *)datadict resourc if(!subunarchiver) { if(error) return error; - else return XADSubArchiveError; + else return XADErrorSubArchive; } - return XADNoError; + return XADErrorNone; } +-(BOOL)_setupSubArchiveForEntryWithDataFork:(NSDictionary *)datadict resourceFork:(NSDictionary *)resourcedict error:(NSError**)outError +{ + // Create unarchiver. + NSError *error = nil; + subunarchiver=[[unarchiver unarchiverForEntryWithDictionary:datadict + resourceForkDictionary:resourcedict wantChecksum:YES nserror:&error] + retain]; + if (!subunarchiver) { + if (outError) { + if (!error) { + *outError = [NSError errorWithDomain:XADErrorDomain code:XADErrorSubArchive userInfo:nil]; + } else { + *outError = error; + } + } + + return NO; + } + return YES; +} -(XADError)unarchive @@ -418,15 +489,11 @@ -(XADError)unarchive -(XADError)_unarchiveRegularArchive { - NSEnumerator *enumerator; - NSDictionary *entry; - // Calculate total size and check if there is a single top-level item. totalsize=0; totalprogress=0; - enumerator=[entries objectEnumerator]; - while((entry=[enumerator nextObject])) + for(NSDictionary *entry in entries) { NSNumber *dirnum=[entry objectForKey:XADIsDirectoryKey]; BOOL isdir=dirnum && [dirnum boolValue]; @@ -438,7 +505,7 @@ -(XADError)_unarchiveRegularArchive NSNumber *size=[entry objectForKey:XADFileSizeKey]; // Disable accurate progress calculation if any sizes are unknown. - if(size) totalsize+=[size longLongValue]; + if(size != nil) totalsize+=[size longLongValue]; else totalsize=-1; } @@ -457,7 +524,7 @@ -(XADError)_unarchiveRegularArchive // Check for collision. destpath=[self _checkPath:destpath forEntryWithDictionary:nil deferred:NO]; - if(!destpath) return XADNoError; + if(!destpath) return XADErrorNone; } else { @@ -465,29 +532,28 @@ -(XADError)_unarchiveRegularArchive else destpath=@"."; } - unpackdestination=[destpath retain]; - finaldestination=[destpath retain]; + unpackdestination=[destpath copy]; + finaldestination=[destpath copy]; // Run unarchiver on all entries. - [unarchiver setDelegate:self]; + unarchiver.delegate = self; - enumerator=[entries objectEnumerator]; - while((entry=[enumerator nextObject])) + for(NSDictionary *entry in entries) { - if([self _shouldStop]) return XADBreakError; + if([self _shouldStop]) return XADErrorBreak; if(totalsize>=0) currsize=[[entry objectForKey:XADFileSizeKey] longLongValue]; XADError error=[unarchiver extractEntryWithDictionary:entry]; - if(error==XADBreakError) return XADBreakError; + if(error==XADErrorBreak) return XADErrorBreak; if(totalsize>=0) totalprogress+=currsize; } - if([self _shouldStop]) return XADBreakError; + if([self _shouldStop]) return XADErrorBreak; // If we ended up extracting nothing, give up. - if(!numextracted) return XADNoError; + if(!numextracted) return XADErrorNone; return [self _finalizeExtraction]; } @@ -518,7 +584,7 @@ -(XADError)_unarchiveSubArchive { // Check for collision. destpath=[self _checkPath:destpath forEntryWithDictionary:nil deferred:NO]; - if(!destpath) return XADNoError; + if(!destpath) return XADErrorNone; } } else @@ -527,7 +593,7 @@ -(XADError)_unarchiveSubArchive else destpath=@"."; } - unpackdestination=[destpath retain]; + unpackdestination=[destpath copy]; // Disable accurate progress calculation. totalsize=-1; @@ -535,12 +601,12 @@ -(XADError)_unarchiveSubArchive // Parse sub-archive and automatically unarchive its contents. // At this stage, files are guaranteed to be written to unpackdestination // and never outside it. - [subunarchiver setDelegate:self]; + subunarchiver.delegate = self; error=[subunarchiver parseAndUnarchive]; // Check if the caller wants to give up. - if(error==XADBreakError) return XADBreakError; - if([self _shouldStop]) return XADBreakError; + if(error==XADErrorBreak) return XADErrorBreak; + if([self _shouldStop]) return XADErrorBreak; // If we ended up extracting nothing, give up. if(!numextracted) return error; @@ -582,7 +648,7 @@ -(XADError)_unarchiveSubArchive // Move the item into place and delete the enclosing directory. if(![self _recursivelyMoveItemAtPath:newitempath toPath:finalitempath overwrite:YES]) - error=XADFileExistsError; // TODO: Better error handling. + error=XADErrorFileExists; // TODO: Better error handling. [XADPlatform removeItemAtPath:newenclosingpath]; @@ -618,27 +684,27 @@ -(XADError)_unarchiveSubArchive // new location selected. This may end up being the original // path that caused the collision. if(![self _recursivelyMoveItemAtPath:enclosingpath toPath:newenclosingpath overwrite:YES]) - error=XADFileExistsError; // TODO: Better error handling. + error=XADErrorFileExists; // TODO: Better error handling. } // Remember where the items ended up. - finaldestination=[newenclosingpath retain]; + finaldestination=[newenclosingpath copy]; } else { // Remember where the items ended up. - finaldestination=[destpath retain]; + finaldestination=[destpath copy]; } } } else { // Remember where the items ended up. - finaldestination=[destpath retain]; + finaldestination=[destpath copy]; } // Save the final path to the solo item, if any. - overridesoloitem=[soloitem retain]; + overridesoloitem=[soloitem copy]; if(error) return error; @@ -671,7 +737,7 @@ -(XADError)_finalizeExtraction } } - return XADNoError; + return XADErrorNone; } -(void)_testForSoloItems:(NSDictionary *)entry @@ -689,7 +755,7 @@ -(void)_testForSoloItems:(NSDictionary *)entry if(!toplevelname) { - toplevelname=[firstcomp retain]; + toplevelname=[firstcomp copy]; lookslikesolo=YES; } else @@ -714,7 +780,9 @@ -(BOOL)archiveParsingShouldStop:(XADArchiveParser *)parser -(void)archiveParserNeedsPassword:(XADArchiveParser *)parser { - [delegate simpleUnarchiverNeedsPassword:self]; + if ([delegate respondsToSelector:@selector(simpleUnarchiverNeedsPassword:)]) { + [delegate simpleUnarchiverNeedsPassword:self]; + } } -(void)archiveParser:(XADArchiveParser *)parser findsFileInterestingForReason:(NSString *)reason; @@ -724,7 +792,9 @@ -(void)archiveParser:(XADArchiveParser *)parser findsFileInterestingForReason:(N -(void)unarchiverNeedsPassword:(XADUnarchiver *)unarchiver { - [delegate simpleUnarchiverNeedsPassword:self]; + if ([delegate respondsToSelector:@selector(simpleUnarchiverNeedsPassword:)]) { + [delegate simpleUnarchiverNeedsPassword:self]; + } } -(BOOL)unarchiver:(XADUnarchiver *)currunarchiver shouldExtractEntryWithDictionary:(NSDictionary *)dict suggestedPath:(NSString **)pathptr @@ -822,7 +892,7 @@ -(BOOL)unarchiver:(XADUnarchiver *)currunarchiver shouldExtractEntryWithDictiona *pathptr=path; - if(delegate) + if([delegate respondsToSelector:@selector(simpleUnarchiver:shouldExtractEntryWithDictionary:to:)]) { // If we have a delegate, ask it if we should extract. if(![delegate simpleUnarchiver:self shouldExtractEntryWithDictionary:dict to:path]) return NO; @@ -830,7 +900,10 @@ -(BOOL)unarchiver:(XADUnarchiver *)currunarchiver shouldExtractEntryWithDictiona // Check if the user wants to extract the entry to his own filehandle. // In such case, call into the lower-level API to run the extraction // and return without doing further work. - CSHandle *handle=[delegate simpleUnarchiver:self outputHandleForEntryWithDictionary:dict]; + CSHandle *handle=nil; + if ([delegate respondsToSelector:@selector(simpleUnarchiver:outputHandleForEntryWithDictionary:)]) { + handle=[delegate simpleUnarchiver:self outputHandleForEntryWithDictionary:dict]; + } if(handle) { [unarchiver runExtractorWithDictionary:dict outputHandle:handle]; @@ -846,14 +919,16 @@ -(void)unarchiver:(XADUnarchiver *)unarch willExtractEntryWithDictionary:(NSDict { // If we are writing OS X or HFV resource forks, keep a list of which resource // forks have been extracted, for the collision tests in checkPath. - int style=[unarch macResourceForkStyle]; - if(style==XADMacOSXForkStyle || style==XADHFVExplorerAppleDoubleForkStyle) + XADForkStyle style=[unarch macResourceForkStyle]; + if(style==XADForkStyleMacOSX || style==XADForkStyleHFVExplorerAppleDouble) { NSNumber *resnum=[dict objectForKey:XADIsResourceForkKey]; if(resnum && [resnum boolValue]) [resourceforks addObject:path]; } - [delegate simpleUnarchiver:self willExtractEntryWithDictionary:dict to:path]; + if ([delegate respondsToSelector:@selector(simpleUnarchiver:willExtractEntryWithDictionary:to:)]) { + [delegate simpleUnarchiver:self willExtractEntryWithDictionary:dict to:path]; + } } -(void)unarchiver:(XADUnarchiver *)unarchiver didExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path error:(XADError)error @@ -861,8 +936,10 @@ -(void)unarchiver:(XADUnarchiver *)unarchiver didExtractEntryWithDictionary:(NSD numextracted++; if(propagatemetadata && metadata) [XADPlatform writeCloneableMetadata:metadata toPath:path]; - - [delegate simpleUnarchiver:self didExtractEntryWithDictionary:dict to:path error:error]; + + if ([delegate respondsToSelector:@selector(simpleUnarchiver:didExtractEntryWithDictionary:to:error:)]) { + [delegate simpleUnarchiver:self didExtractEntryWithDictionary:dict to:path error:error]; + } } -(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldCreateDirectory:(NSString *)directory @@ -889,7 +966,12 @@ -(NSString *)unarchiver:(XADUnarchiver *)unarchiver destinationForLink:(XADStrin { if(!delegate) return nil; - NSString *encodingname=[delegate simpleUnarchiver:self encodingNameForXADString:link]; + NSString *encodingname; + if ([delegate respondsToSelector:@selector(simpleUnarchiver:encodingNameForXADString:)]) { + encodingname=[delegate simpleUnarchiver:self encodingNameForXADString:link]; + } else { + encodingname=[link encodingName]; + } if(!encodingname) return nil; return [link stringWithEncodingName:encodingname]; @@ -913,15 +995,19 @@ -(void)unarchiver:(XADUnarchiver *)unarchiver extractionProgressForEntryWithDict { // If the total size is known, report exact progress. off_t fileprogress=fileratio*currsize; - [delegate simpleUnarchiver:self extractionProgressForEntryWithDictionary:dict - fileProgress:fileprogress of:currsize - totalProgress:totalprogress+fileprogress of:totalsize]; + if ([delegate respondsToSelector:@selector(simpleUnarchiver:extractionProgressForEntryWithDictionary:fileProgress:of:totalProgress:of:)]) { + [delegate simpleUnarchiver:self extractionProgressForEntryWithDictionary:dict + fileProgress:fileprogress of:currsize + totalProgress:totalprogress+fileprogress of:totalsize]; + } } else { // If the total size is not known, report estimated progress. - [delegate simpleUnarchiver:self estimatedExtractionProgressForEntryWithDictionary:dict - fileProgress:fileratio totalProgress:totalratio]; + if ([delegate respondsToSelector:@selector(simpleUnarchiver:estimatedExtractionProgressForEntryWithDictionary:fileProgress:totalProgress:)]) { + [delegate simpleUnarchiver:self estimatedExtractionProgressForEntryWithDictionary:dict + fileProgress:fileratio totalProgress:totalratio]; + } } } @@ -932,7 +1018,7 @@ -(void)unarchiver:(XADUnarchiver *)unarchiver findsFileInterestingForReason:(NSS -(BOOL)_shouldStop { - if(!delegate) return NO; + if(!([delegate respondsToSelector:@selector(extractionShouldStopForSimpleUnarchiver:)])) return NO; if(shouldstop) return YES; return shouldstop=[delegate extractionShouldStopForSimpleUnarchiver:self]; @@ -952,7 +1038,7 @@ -(NSString *)_checkPath:(NSString *)path forEntryWithDictionary:(NSDictionary *) // When writing OS X data forks, some collisions will happen. Try // to handle these. #ifdef __APPLE__ - if(dict && [self macResourceForkStyle]==XADMacOSXForkStyle) + if(dict && [self macResourceForkStyle]==XADForkStyleMacOSX) { NSNumber *resnum=[dict objectForKey:XADIsResourceForkKey]; if(resnum && [resnum boolValue]) @@ -975,7 +1061,7 @@ -(NSString *)_checkPath:(NSString *)path forEntryWithDictionary:(NSDictionary *) // HFV Explorer style forks always create dummy data forks, which can cause collisions. // Just kludge this by ignoring collisions for data forks if a resource was written earlier. - if(dict && [self macResourceForkStyle]==XADHFVExplorerAppleDoubleForkStyle) + if(dict && [self macResourceForkStyle]==XADForkStyleHFVExplorerAppleDouble) { NSNumber *resnum=[dict objectForKey:XADIsResourceForkKey]; if(!resnum || ![resnum boolValue]) @@ -1000,12 +1086,17 @@ -(NSString *)_checkPath:(NSString *)path forEntryWithDictionary:(NSDictionary *) else if(delegate) { // If we have a delegate, ask it. - if(deferred) return [delegate simpleUnarchiver:self - deferredReplacementPathForOriginalPath:path - suggestedPath:unique]; - else return [delegate simpleUnarchiver:self + if (deferred && [delegate respondsToSelector:@selector(simpleUnarchiver:deferredReplacementPathForOriginalPath:suggestedPath:)]) { + return [delegate simpleUnarchiver:self + deferredReplacementPathForOriginalPath:path + suggestedPath:unique]; + } else if ([delegate respondsToSelector:@selector(simpleUnarchiver:replacementPathForEntryWithDictionary:originalPath:suggestedPath:)]) { + return [delegate simpleUnarchiver:self replacementPathForEntryWithDictionary:dict - originalPath:path suggestedPath:unique]; + originalPath:path suggestedPath:unique]; + } else { + return nil; + } } else { @@ -1033,9 +1124,7 @@ -(BOOL)_recursivelyMoveItemAtPath:(NSString *)src toPath:(NSString *)dest overwr // If both source and destinaton are directories, iterate over the // contents and recurse. NSArray *files=[XADPlatform contentsOfDirectoryAtPath:src]; - NSEnumerator *enumerator=[files objectEnumerator]; - NSString *file; - while((file=[enumerator nextObject])) + for(NSString *file in files) { NSString *newsrc=[src stringByAppendingPathComponent:file]; NSString *newdest=[dest stringByAppendingPathComponent:file]; @@ -1086,31 +1175,3 @@ +(NSString *)_findUniquePathForOriginalPath:(NSString *)path reservedPaths:(NSSe -@implementation NSObject (XADSimpleUnarchiverDelegate) - --(void)simpleUnarchiverNeedsPassword:(XADSimpleUnarchiver *)unarchiver {} - --(CSHandle *)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver outputHandleForEntryWithDictionary:(NSDictionary *)dict { return nil; } - --(NSString *)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver encodingNameForXADString:(id )string; { return [string encodingName]; } - --(BOOL)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver shouldExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path { return YES; } --(void)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver willExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path {} --(void)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver didExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path error:(XADError)error {} - --(NSString *)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver replacementPathForEntryWithDictionary:(NSDictionary *)dict -originalPath:(NSString *)path suggestedPath:(NSString *)unique { return nil; } --(NSString *)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver deferredReplacementPathForOriginalPath:(NSString *)path -suggestedPath:(NSString *)unique { return nil; } - --(BOOL)extractionShouldStopForSimpleUnarchiver:(XADSimpleUnarchiver *)unarchiver { return NO; } - --(void)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver -extractionProgressForEntryWithDictionary:(NSDictionary *)dict -fileProgress:(off_t)fileprogress of:(off_t)filesize -totalProgress:(off_t)totalprogress of:(off_t)totalsize {} --(void)simpleUnarchiver:(XADSimpleUnarchiver *)unarchiver -estimatedExtractionProgressForEntryWithDictionary:(NSDictionary *)dict -fileProgress:(double)fileprogress totalProgress:(double)totalprogress {} - -@end diff --git a/XADSkipHandle.h b/XADSkipHandle.h index 80d2229c..f46ab937 100644 --- a/XADSkipHandle.h +++ b/XADSkipHandle.h @@ -18,7 +18,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" #import "CSHandle.h" +#pragma clang diagnostic pop typedef struct XADSkipRegion { @@ -27,6 +30,7 @@ typedef struct XADSkipRegion //static inline XADSkip XADMakeSkip(off_t start,off_t length) { XADSkip skip={start,length}; return skip; } +XADEXPORT @interface XADSkipHandle:CSHandle { XADSkipRegion *regions; @@ -42,9 +46,9 @@ typedef struct XADSkipRegion -(off_t)actualOffsetForSkipOffset:(off_t)skipoffset; -(off_t)skipOffsetForActualOffset:(off_t)actualoffset; --(off_t)fileSize; --(off_t)offsetInFile; --(BOOL)atEndOfFile; +@property (readonly, nonatomic) off_t fileSize; +@property (readonly, nonatomic) off_t offsetInFile; +@property (readonly, nonatomic) BOOL atEndOfFile; -(void)seekToFileOffset:(off_t)offs; -(void)seekToEndOfFile; diff --git a/XADString.h b/XADString.h index d72053b2..6770f5b9 100644 --- a/XADString.h +++ b/XADString.h @@ -19,79 +19,92 @@ * MA 02110-1301 USA */ #import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" +#import "XADTypes.h" +#pragma clang diagnostic pop @class XADStringSource,UniversalDetector; +#if defined(__swift__) && defined(__APPLE__) +// Swift wrapping needed to make sure the Swift doesn't try to unwrap +// an NSNumber posing as an NSString +//! The supported encodings used by `XADString`. +typedef NSObject *XADStringEncodingName NS_TYPED_ENUM NS_SWIFT_NAME(XADString.EncodingName); +#else +//! The supported encodings used by `XADString`. +typedef NSString *XADStringEncodingName NS_TYPED_ENUM NS_SWIFT_NAME(XADString.EncodingName); +#endif -extern NSString *XADUTF8StringEncodingName; -extern NSString *XADASCIIStringEncodingName; - -extern NSString *XADISOLatin1StringEncodingName; -extern NSString *XADISOLatin2StringEncodingName; -extern NSString *XADISOLatin3StringEncodingName; -extern NSString *XADISOLatin4StringEncodingName; -extern NSString *XADISOLatin5StringEncodingName; -extern NSString *XADISOLatin6StringEncodingName; -extern NSString *XADISOLatin7StringEncodingName; -extern NSString *XADISOLatin8StringEncodingName; -extern NSString *XADISOLatin9StringEncodingName; -extern NSString *XADISOLatin10StringEncodingName; -extern NSString *XADISOLatin11StringEncodingName; -extern NSString *XADISOLatin12StringEncodingName; -extern NSString *XADISOLatin13StringEncodingName; -extern NSString *XADISOLatin14StringEncodingName; -extern NSString *XADISOLatin15StringEncodingName; -extern NSString *XADISOLatin16StringEncodingName; - -extern NSString *XADShiftJISStringEncodingName; - -extern NSString *XADWindowsCP1250StringEncodingName; -extern NSString *XADWindowsCP1251StringEncodingName; -extern NSString *XADWindowsCP1252StringEncodingName; -extern NSString *XADWindowsCP1253StringEncodingName; -extern NSString *XADWindowsCP1254StringEncodingName; - -extern NSString *XADMacOSRomanStringEncodingName; -extern NSString *XADMacOSJapaneseStringEncodingName; -extern NSString *XADMacOSTraditionalChineseStringEncodingName; -extern NSString *XADMacOSKoreanStringEncodingName; -extern NSString *XADMacOSArabicStringEncodingName; -extern NSString *XADMacOSHebrewStringEncodingName; -extern NSString *XADMacOSGreekStringEncodingName; -extern NSString *XADMacOSCyrillicStringEncodingName; -extern NSString *XADMacOSSimplifiedChineseStringEncodingName; -extern NSString *XADMacOSRomanianStringEncodingName; -extern NSString *XADMacOSUkranianStringEncodingName; -extern NSString *XADMacOSThaiStringEncodingName; -extern NSString *XADMacOSCentralEuropeanRomanStringEncodingName; -extern NSString *XADMacOSIcelandicStringEncodingName; -extern NSString *XADMacOSTurkishStringEncodingName; -extern NSString *XADMacOSCroatianStringEncodingName; +XADEXTERN XADStringEncodingName const XADUTF8StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.utf8); +XADEXTERN XADStringEncodingName const XADASCIIStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.ascii); + +XADEXTERN XADStringEncodingName const XADISOLatin1StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin1); +XADEXTERN XADStringEncodingName const XADISOLatin2StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin2); +XADEXTERN XADStringEncodingName const XADISOLatin3StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin3); +XADEXTERN XADStringEncodingName const XADISOLatin4StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin4); +XADEXTERN XADStringEncodingName const XADISOLatin5StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin5); +XADEXTERN XADStringEncodingName const XADISOLatin6StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin6); +XADEXTERN XADStringEncodingName const XADISOLatin7StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin7); +XADEXTERN XADStringEncodingName const XADISOLatin8StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin8); +XADEXTERN XADStringEncodingName const XADISOLatin9StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin9); +XADEXTERN XADStringEncodingName const XADISOLatin10StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin10); +XADEXTERN XADStringEncodingName const XADISOLatin11StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin11); +XADEXTERN XADStringEncodingName const XADISOLatin12StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin12); +XADEXTERN XADStringEncodingName const XADISOLatin13StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin13); +XADEXTERN XADStringEncodingName const XADISOLatin14StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin14); +XADEXTERN XADStringEncodingName const XADISOLatin15StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin15); +XADEXTERN XADStringEncodingName const XADISOLatin16StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.isoLatin16); + +XADEXTERN XADStringEncodingName const XADShiftJISStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.shiftJIS); + +XADEXTERN XADStringEncodingName const XADWindowsCP1250StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.windowsCP1250); +XADEXTERN XADStringEncodingName const XADWindowsCP1251StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.windowsCP1251); +XADEXTERN XADStringEncodingName const XADWindowsCP1252StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.windowsCP1252); +XADEXTERN XADStringEncodingName const XADWindowsCP1253StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.windowsCP1253); +XADEXTERN XADStringEncodingName const XADWindowsCP1254StringEncodingName NS_SWIFT_NAME(XADStringEncodingName.windowsCP1254); + +XADEXTERN XADStringEncodingName const XADMacOSRomanStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSRoman); +XADEXTERN XADStringEncodingName const XADMacOSJapaneseStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSJapanese); +XADEXTERN XADStringEncodingName const XADMacOSTraditionalChineseStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSTraditionalChinese); +XADEXTERN XADStringEncodingName const XADMacOSKoreanStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSKorean); +XADEXTERN XADStringEncodingName const XADMacOSArabicStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSArabic); +XADEXTERN XADStringEncodingName const XADMacOSHebrewStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSHebrew); +XADEXTERN XADStringEncodingName const XADMacOSGreekStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSGreek); +XADEXTERN XADStringEncodingName const XADMacOSCyrillicStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSCyrillic); +XADEXTERN XADStringEncodingName const XADMacOSSimplifiedChineseStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSSimplifiedChinese); +XADEXTERN XADStringEncodingName const XADMacOSRomanianStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSRomanian); +XADEXTERN XADStringEncodingName const XADMacOSUkranianStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSUkranian); +XADEXTERN XADStringEncodingName const XADMacOSThaiStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSThai); +XADEXTERN XADStringEncodingName const XADMacOSCentralEuropeanRomanStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSCentralEuropean); +XADEXTERN XADStringEncodingName const XADMacOSIcelandicStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSIcelandic); +XADEXTERN XADStringEncodingName const XADMacOSTurkishStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSTurkish); +XADEXTERN XADStringEncodingName const XADMacOSCroatianStringEncodingName NS_SWIFT_NAME(XADStringEncodingName.macOSCroatian); @protocol XADString --(BOOL)canDecodeWithEncodingName:(NSString *)encoding; +-(BOOL)canDecodeWithEncodingName:(XADStringEncodingName)encoding; -(NSString *)string; --(NSString *)stringWithEncodingName:(NSString *)encoding; +-(NSString *)stringWithEncodingName:(XADStringEncodingName)encoding; -(NSData *)data; --(BOOL)encodingIsKnown; --(NSString *)encodingName; --(float)confidence; +@property (readonly, nonatomic) BOOL encodingIsKnown; +@property (readonly, copy) XADStringEncodingName encodingName; +@property (readonly) float confidence; --(XADStringSource *)source; +@property (nonatomic, readonly, retain) XADStringSource *source; #ifdef __APPLE__ -(BOOL)canDecodeWithEncoding:(NSStringEncoding)encoding; -(NSString *)stringWithEncoding:(NSStringEncoding)encoding; --(NSStringEncoding)encoding; +@property (readonly) NSStringEncoding encoding; #endif @end - +XADEXPORT @interface XADString:NSObject { NSData *data; @@ -101,10 +114,10 @@ extern NSString *XADMacOSCroatianStringEncodingName; +(XADString *)XADStringWithString:(NSString *)string; +(XADString *)analyzedXADStringWithData:(NSData *)bytedata source:(XADStringSource *)stringsource; -+(XADString *)decodedXADStringWithData:(NSData *)bytedata encodingName:(NSString *)encoding; ++(XADString *)decodedXADStringWithData:(NSData *)bytedata encodingName:(XADStringEncodingName)encoding; +(NSString *)escapedStringForData:(NSData *)data encodingName:(NSString *)encoding; -+(NSString *)escapedStringForBytes:(const void *)bytes length:(size_t)length encodingName:(NSString *)encoding; ++(NSString *)escapedStringForBytes:(const void *)bytes length:(size_t)length encodingName:(XADStringEncodingName)encoding; +(NSString *)escapedASCIIStringForBytes:(const void *)bytes length:(size_t)length; +(NSData *)escapedASCIIDataForString:(NSString *)string; @@ -112,57 +125,52 @@ extern NSString *XADMacOSCroatianStringEncodingName; -(id)initWithString:(NSString *)knownstring; -(void)dealloc; --(BOOL)canDecodeWithEncodingName:(NSString *)encoding; +-(BOOL)canDecodeWithEncodingName:(XADStringEncodingName)encoding; -(NSString *)string; --(NSString *)stringWithEncodingName:(NSString *)encoding; +-(NSString *)stringWithEncodingName:(XADStringEncodingName)encoding; -(NSData *)data; --(BOOL)encodingIsKnown; --(NSString *)encodingName; --(float)confidence; +@property (readonly, nonatomic) BOOL encodingIsKnown; +@property (readonly, copy) XADStringEncodingName encodingName; +@property (readonly) float confidence; --(XADStringSource *)source; +@property (nonatomic, readonly, retain) XADStringSource *source; -(BOOL)hasASCIIPrefix:(NSString *)asciiprefix; -(XADString *)XADStringByStrippingASCIIPrefixOfLength:(int)length; --(BOOL)isEqual:(id)other; --(NSUInteger)hash; - --(NSString *)description; --(id)copyWithZone:(NSZone *)zone; #ifdef __APPLE__ -(BOOL)canDecodeWithEncoding:(NSStringEncoding)encoding; -(NSString *)stringWithEncoding:(NSStringEncoding)encoding; --(NSStringEncoding)encoding; +@property (readonly) NSStringEncoding encoding; #endif @end @interface XADString (PlatformSpecific) -+(BOOL)canDecodeData:(NSData *)data encodingName:(NSString *)encoding; -+(BOOL)canDecodeBytes:(const void *)bytes length:(size_t)length encodingName:(NSString *)encoding; -+(NSString *)stringForData:(NSData *)data encodingName:(NSString *)encoding; -+(NSString *)stringForBytes:(const void *)bytes length:(size_t)length encodingName:(NSString *)encoding; -+(NSData *)dataForString:(NSString *)string encodingName:(NSString *)encoding; ++(BOOL)canDecodeData:(NSData *)data encodingName:(XADStringEncodingName)encoding; ++(BOOL)canDecodeBytes:(const void *)bytes length:(size_t)length encodingName:(XADStringEncodingName)encoding; ++(NSString *)stringForData:(NSData *)data encodingName:(XADStringEncodingName)encoding; ++(NSString *)stringForBytes:(const void *)bytes length:(size_t)length encodingName:(XADStringEncodingName)encoding; ++(NSData *)dataForString:(NSString *)string encodingName:(XADStringEncodingName)encoding; +(NSArray *)availableEncodingNames; #ifdef __APPLE__ -+(NSString *)encodingNameForEncoding:(NSStringEncoding)encoding; -+(NSStringEncoding)encodingForEncodingName:(NSString *)encoding; ++(XADStringEncodingName)encodingNameForEncoding:(NSStringEncoding)encoding; ++(NSStringEncoding)encodingForEncodingName:(XADStringEncodingName)encoding; #endif @end - +XADEXPORT @interface XADStringSource:NSObject { UniversalDetector *detector; - NSString *fixedencodingname; + XADStringEncodingName fixedencodingname; BOOL mac,hasanalyzeddata; #ifdef __APPLE__ @@ -176,16 +184,16 @@ extern NSString *XADMacOSCroatianStringEncodingName; -(void)analyzeData:(NSData *)data; -(BOOL)hasAnalyzedData; --(NSString *)encodingName; +-(XADStringEncodingName)encodingName; -(float)confidence; --(UniversalDetector *)detector; +@property (readonly, retain) UniversalDetector *detector; --(void)setFixedEncodingName:(NSString *)encodingname; --(BOOL)hasFixedEncoding; +-(void)setFixedEncodingName:(XADStringEncodingName)encodingname; +@property (readonly, nonatomic) BOOL hasFixedEncoding; -(void)setPrefersMacEncodings:(BOOL)prefermac; #ifdef __APPLE__ --(NSStringEncoding)encoding; +@property (readonly) NSStringEncoding encoding; -(void)setFixedEncoding:(NSStringEncoding)encoding; #endif diff --git a/XADString.m b/XADString.m index 56e5bc97..843d65a8 100644 --- a/XADString.m +++ b/XADString.m @@ -24,50 +24,50 @@ -NSString *XADASCIIStringEncodingName=@"US-ASCII"; -NSString *XADUTF8StringEncodingName=@"UTF-8"; - -NSString *XADISOLatin1StringEncodingName=@"iso-8859-1"; -NSString *XADISOLatin2StringEncodingName=@"iso-8859-2"; -NSString *XADISOLatin3StringEncodingName=@"iso-8859-3"; -NSString *XADISOLatin4StringEncodingName=@"iso-8859-4"; -NSString *XADISOLatin5StringEncodingName=@"iso-8859-5"; -NSString *XADISOLatin6StringEncodingName=@"iso-8859-6"; -NSString *XADISOLatin7StringEncodingName=@"iso-8859-7"; -NSString *XADISOLatin8StringEncodingName=@"iso-8859-8"; -NSString *XADISOLatin9StringEncodingName=@"iso-8859-9"; -NSString *XADISOLatin10StringEncodingName=@"iso-8859-10"; -NSString *XADISOLatin11StringEncodingName=@"iso-8859-11"; -NSString *XADISOLatin12StringEncodingName=@"iso-8859-12"; -NSString *XADISOLatin13StringEncodingName=@"iso-8859-13"; -NSString *XADISOLatin14StringEncodingName=@"iso-8859-14"; -NSString *XADISOLatin15StringEncodingName=@"iso-8859-15"; -NSString *XADISOLatin16StringEncodingName=@"iso-8859-16"; - -NSString *XADShiftJISStringEncodingName=@"Shift_JIS"; - -NSString *XADWindowsCP1250StringEncodingName=@"windows-1250"; -NSString *XADWindowsCP1251StringEncodingName=@"windows-1251"; -NSString *XADWindowsCP1252StringEncodingName=@"windows-1252"; -NSString *XADWindowsCP1253StringEncodingName=@"windows-1253"; -NSString *XADWindowsCP1254StringEncodingName=@"windows-1254"; - -NSString *XADMacOSRomanStringEncodingName=@"macintosh"; -NSString *XADMacOSJapaneseStringEncodingName=@"x-mac-japanese"; -NSString *XADMacOSTraditionalChineseStringEncodingName=@"x-mac-trad-chinese"; -NSString *XADMacOSKoreanStringEncodingName=@"x-mac-korean"; -NSString *XADMacOSArabicStringEncodingName=@"x-mac-arabic"; -NSString *XADMacOSHebrewStringEncodingName=@"x-mac-hebrew"; -NSString *XADMacOSGreekStringEncodingName=@"x-mac-greek"; -NSString *XADMacOSCyrillicStringEncodingName=@"x-mac-cyrillic"; -NSString *XADMacOSSimplifiedChineseStringEncodingName=@"x-mac-simp-chinese"; -NSString *XADMacOSRomanianStringEncodingName=@"x-mac-romanian"; -NSString *XADMacOSUkranianStringEncodingName=@"x-mac-ukrainian"; -NSString *XADMacOSThaiStringEncodingName=@"x-mac-thai"; -NSString *XADMacOSCentralEuropeanRomanStringEncodingName=@"x-mac-centraleurroman"; -NSString *XADMacOSIcelandicStringEncodingName=@"x-mac-icelandic"; -NSString *XADMacOSTurkishStringEncodingName=@"x-mac-turkish"; -NSString *XADMacOSCroatianStringEncodingName=@"x-mac-croatian"; +NSString *const XADASCIIStringEncodingName=@"US-ASCII"; +NSString *const XADUTF8StringEncodingName=@"UTF-8"; + +NSString *const XADISOLatin1StringEncodingName=@"iso-8859-1"; +NSString *const XADISOLatin2StringEncodingName=@"iso-8859-2"; +NSString *const XADISOLatin3StringEncodingName=@"iso-8859-3"; +NSString *const XADISOLatin4StringEncodingName=@"iso-8859-4"; +NSString *const XADISOLatin5StringEncodingName=@"iso-8859-5"; +NSString *const XADISOLatin6StringEncodingName=@"iso-8859-6"; +NSString *const XADISOLatin7StringEncodingName=@"iso-8859-7"; +NSString *const XADISOLatin8StringEncodingName=@"iso-8859-8"; +NSString *const XADISOLatin9StringEncodingName=@"iso-8859-9"; +NSString *const XADISOLatin10StringEncodingName=@"iso-8859-10"; +NSString *const XADISOLatin11StringEncodingName=@"iso-8859-11"; +NSString *const XADISOLatin12StringEncodingName=@"iso-8859-12"; +NSString *const XADISOLatin13StringEncodingName=@"iso-8859-13"; +NSString *const XADISOLatin14StringEncodingName=@"iso-8859-14"; +NSString *const XADISOLatin15StringEncodingName=@"iso-8859-15"; +NSString *const XADISOLatin16StringEncodingName=@"iso-8859-16"; + +NSString *const XADShiftJISStringEncodingName=@"Shift_JIS"; + +NSString *const XADWindowsCP1250StringEncodingName=@"windows-1250"; +NSString *const XADWindowsCP1251StringEncodingName=@"windows-1251"; +NSString *const XADWindowsCP1252StringEncodingName=@"windows-1252"; +NSString *const XADWindowsCP1253StringEncodingName=@"windows-1253"; +NSString *const XADWindowsCP1254StringEncodingName=@"windows-1254"; + +NSString *const XADMacOSRomanStringEncodingName=@"macintosh"; +NSString *const XADMacOSJapaneseStringEncodingName=@"x-mac-japanese"; +NSString *const XADMacOSTraditionalChineseStringEncodingName=@"x-mac-trad-chinese"; +NSString *const XADMacOSKoreanStringEncodingName=@"x-mac-korean"; +NSString *const XADMacOSArabicStringEncodingName=@"x-mac-arabic"; +NSString *const XADMacOSHebrewStringEncodingName=@"x-mac-hebrew"; +NSString *const XADMacOSGreekStringEncodingName=@"x-mac-greek"; +NSString *const XADMacOSCyrillicStringEncodingName=@"x-mac-cyrillic"; +NSString *const XADMacOSSimplifiedChineseStringEncodingName=@"x-mac-simp-chinese"; +NSString *const XADMacOSRomanianStringEncodingName=@"x-mac-romanian"; +NSString *const XADMacOSUkranianStringEncodingName=@"x-mac-ukrainian"; +NSString *const XADMacOSThaiStringEncodingName=@"x-mac-thai"; +NSString *const XADMacOSCentralEuropeanRomanStringEncodingName=@"x-mac-centraleurroman"; +NSString *const XADMacOSIcelandicStringEncodingName=@"x-mac-icelandic"; +NSString *const XADMacOSTurkishStringEncodingName=@"x-mac-turkish"; +NSString *const XADMacOSCroatianStringEncodingName=@"x-mac-croatian"; static BOOL IsDataASCII(NSData *data); @@ -242,7 +242,7 @@ -(float)confidence --(XADStringSource *)source { return source; } +@synthesize source; @@ -402,10 +402,7 @@ -(float)confidence return [detector confidence]; } --(UniversalDetector *)detector -{ - return detector; -} +@synthesize detector; -(void)setFixedEncodingName:(NSString *)encoding { diff --git a/XADStuffItSplitParser.m b/XADStuffItSplitParser.m index 6cbd4fe6..a940d3d5 100644 --- a/XADStuffItSplitParser.m +++ b/XADStuffItSplitParser.m @@ -57,9 +57,7 @@ +(NSArray *)volumesForHandle:(CSHandle *)handle firstBytes:(NSData *)data name:( NSString *parts[256]={nil}; - NSEnumerator *enumerator=[dircontents objectEnumerator]; - NSString *filename; - while((filename=[enumerator nextObject])) + for(NSString *filename in dircontents) { if(![filename hasPrefix:basename]) continue; @@ -106,9 +104,7 @@ -(void)parse XADSkipHandle *sh=[self skipHandle]; off_t curroffset=0; - NSEnumerator *enumerator=[volumesizes objectEnumerator]; - NSNumber *volumesize; - while((volumesize=[enumerator nextObject])) + for(NSNumber *volumesize in volumesizes) { [sh addSkipFrom:curroffset length:100]; curroffset+=[volumesize longLongValue]; diff --git a/XADStuffItXParser.m b/XADStuffItXParser.m index 44f37dcd..4d6e6cfe 100644 --- a/XADStuffItXParser.m +++ b/XADStuffItXParser.m @@ -352,9 +352,7 @@ -(void)parse // Find actual size of stream NSMutableArray *forks=[streamforks objectForKey:[NSNumber numberWithLongLong:objid]]; - NSEnumerator *enumerator=[forks objectEnumerator]; - NSMutableDictionary *fork; - while((fork=[enumerator nextObject])) + for(NSMutableDictionary *fork in forks) { if((id)fork==[NSNull null]) [XADException raiseIllegalDataException]; NSNumber *lengthnum=[fork objectForKey:@"Length"]; @@ -364,9 +362,7 @@ -(void)parse // Send out all the entries without data streams first if(forkedset) { - NSEnumerator *enumerator=[entries objectEnumerator]; - NSMutableDictionary *entry; - while((entry=[enumerator nextObject])) + for(NSMutableDictionary *entry in entries) { if(![forkedset containsObject:[entry objectForKey:@"StuffItXID"]]) { @@ -417,9 +413,8 @@ -(void)parse NSValue *elementval=[NSValue valueWithBytes:&element objCType:@encode(StuffItXElement)]; - enumerator=[forks objectEnumerator]; off_t offs=0; - while((fork=[enumerator nextObject])) + for(NSMutableDictionary *fork in forks) { if(![self shouldKeepParsing]) return; @@ -442,9 +437,7 @@ -(void)parse if(uncompsize) currcompsize=[lengthnum longLongValue]*compsize/uncompsize; NSNumber *currcompsizenum=[NSNumber numberWithLongLong:currcompsize]; - NSEnumerator *entryenumerator=[entries objectEnumerator]; - NSNumber *entrynum; - while((entrynum=[entryenumerator nextObject])) + for(NSNumber *entrynum in entries) { NSDictionary *entry=[entrydict objectForKey:entrynum]; NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithDictionary:entry]; @@ -630,9 +623,7 @@ -(void)parse -(void)parseCatalogWithHandle:(CSHandle *)fh entryArray:(NSArray *)entries entryDictionary:(NSDictionary *)dict { - NSEnumerator *enumerator=[entries objectEnumerator]; - NSMutableDictionary *entry; - while((entry=[enumerator nextObject])) + for(NSMutableDictionary *entry in entries) { for(;;) { diff --git a/XADTypes.h b/XADTypes.h new file mode 100644 index 00000000..9cc5c068 --- /dev/null +++ b/XADTypes.h @@ -0,0 +1,175 @@ +/* + * XADTypes.h + * + * Copyright (c) 2018-present, MacPaw Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + * + * This file contains compatibility wrappers for non-Apple architectures. + */ + +#ifndef XADTypes_h +#define XADTypes_h + +#import + +#ifndef XADEXPORT +# if defined(__WIN32__) || defined(__WINRT__) +# ifdef __BORLANDC__ +# ifdef BUILD_XADMASTER +# define XADEXPORT +# else +# define XADEXPORT __declspec(dllimport) +# endif +# else +# define XADEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && __GNUC__ >= 4 +# define XADEXPORT __attribute__ ((visibility("default"))) +# else +# define XADEXPORT +# endif +# endif +#endif + +#ifdef __cplusplus +#define XADEXTERN extern "C" XADEXPORT +#else +#define XADEXTERN extern XADEXPORT +#endif + +#ifndef NS_TYPED_ENUM +#define NS_TYPED_ENUM +#endif + +#ifndef NS_TYPED_EXTENSIBLE_ENUM +#define NS_TYPED_EXTENSIBLE_ENUM +#endif + +#ifndef NS_SWIFT_NAME +#define NS_SWIFT_NAME(...) +#endif + +#ifndef NS_REFINED_FOR_SWIFT +#define NS_REFINED_FOR_SWIFT +#endif + +#ifndef NS_SWIFT_UNAVAILABLE +#define NS_SWIFT_UNAVAILABLE(...) +#endif + +#ifndef NS_DESIGNATED_INITIALIZER +#define NS_DESIGNATED_INITIALIZER +#endif + +#ifndef NS_RETURNS_INNER_POINTER +#define NS_RETURNS_INNER_POINTER +#endif + +// To make other compilers happy +#ifndef __has_attribute +#define __has_attribute(...) 0 +#endif +#ifndef __has_extension +#define __has_extension(...) 0 +#endif + +#if !defined(NS_REQUIRES_NIL_TERMINATION) + #if __has_attribute(attribute_sentinel) + #if defined(__APPLE_CC__) && (__APPLE_CC__ >= 5549) + #define NS_REQUIRES_NIL_TERMINATION __attribute__((sentinel(0,1))) + #else + #define NS_REQUIRES_NIL_TERMINATION __attribute__((sentinel)) + #endif + #else + #define NS_REQUIRES_NIL_TERMINATION + #endif +#endif + +#ifndef NS_ENUM +#if __has_attribute(enum_extensibility) +#define __XAD_ENUM_ATTRIBUTES __attribute__((enum_extensibility(open))) +#define __XAD_CLOSED_ENUM_ATTRIBUTES __attribute__((enum_extensibility(closed))) +#define __XAD_OPTIONS_ATTRIBUTES __attribute__((flag_enum,enum_extensibility(open))) +#else +#define __XAD_ENUM_ATTRIBUTES +#define __XAD_CLOSED_ENUM_ATTRIBUTES +#define __XAD_OPTIONS_ATTRIBUTES +#endif + +#define __XAD_ENUM_GET_MACRO(_1, _2, NAME, ...) NAME +#define __XAD_ENUM_FIXED_IS_AVAILABLE (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum)) + +#if __XAD_ENUM_FIXED_IS_AVAILABLE +#define __XAD_NAMED_ENUM(_type, _name) enum __XAD_ENUM_ATTRIBUTES _name : _type _name; enum _name : _type +#define __XAD_ANON_ENUM(_type) enum __XAD_ENUM_ATTRIBUTES : _type +#define NS_CLOSED_ENUM(_type, _name) enum __XAD_CLOSED_ENUM_ATTRIBUTES _name : _type _name; enum _name : _type +#if (__cplusplus) +#define NS_OPTIONS(_type, _name) __attribute__((availability(swift,unavailable))) _type _name; enum __XAD_OPTIONS_ATTRIBUTES : _name +#else +#define NS_OPTIONS(_type, _name) enum __XAD_OPTIONS_ATTRIBUTES _name : _type _name; enum _name : _type +#endif +#else +#define __XAD_NAMED_ENUM(_type, _name) _type _name; enum +#define __XAD_ANON_ENUM(_type) enum +#define NS_CLOSED_ENUM(_type, _name) _type _name; enum +#define NS_OPTIONS(_type, _name) _type _name; enum +#endif + +#define NS_ENUM(...) __XAD_ENUM_GET_MACRO(__VA_ARGS__, __XAD_NAMED_ENUM, __XAD_ANON_ENUM, )(__VA_ARGS__) +#endif + +#ifndef DEPRECATED_ATTRIBUTE +#if defined(__has_feature) && defined(__has_attribute) + #if __has_attribute(deprecated) + #define DEPRECATED_ATTRIBUTE __attribute__((deprecated)) + #if __has_feature(attribute_deprecated_with_message) + #define DEPRECATED_MSG_ATTRIBUTE(s) __attribute__((deprecated(s))) + #else + #define DEPRECATED_MSG_ATTRIBUTE(s) __attribute__((deprecated)) + #endif + #else + #define DEPRECATED_ATTRIBUTE + #define DEPRECATED_MSG_ATTRIBUTE(s) + #endif +#elif defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) + #define DEPRECATED_ATTRIBUTE __attribute__((deprecated)) + #if (__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) + #define DEPRECATED_MSG_ATTRIBUTE(s) __attribute__((deprecated(s))) + #else + #define DEPRECATED_MSG_ATTRIBUTE(s) __attribute__((deprecated)) + #endif +#else + #define DEPRECATED_ATTRIBUTE + #define DEPRECATED_MSG_ATTRIBUTE(s) +#endif +#endif + +#ifndef API_DEPRECATED_WITH_REPLACEMENT +#if __has_attribute(attribute_deprecated_with_replacement) +#define API_DEPRECATED_WITH_REPLACEMENT(X, ...) __attribute__((deprecated("Use " #X " instead", X))) +#else +#define API_DEPRECATED_WITH_REPLACEMENT(X, ...) DEPRECATED_MSG_ATTRIBUTE("Use " #X " instead") +#endif +#endif + +#if !defined(NSFoundationVersionNumber10_11_Max) && !defined(NSFoundationVersionNumber_iOS_9_x_Max) +typedef NSString * NSExceptionName NS_TYPED_EXTENSIBLE_ENUM; +typedef NSString * NSErrorUserInfoKey NS_TYPED_EXTENSIBLE_ENUM; +#endif + +#endif /* XADTypes_h */ diff --git a/XADUnarchiver.h b/XADUnarchiver.h index 83978bd2..a23e9931 100644 --- a/XADUnarchiver.h +++ b/XADUnarchiver.h @@ -20,29 +20,38 @@ */ #import +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" +#import "XADTypes.h" #import "XADArchiveParser.h" - -#define XADIgnoredForkStyle 0 -#define XADMacOSXForkStyle 1 -#define XADHiddenAppleDoubleForkStyle 2 -#define XADVisibleAppleDoubleForkStyle 3 -#define XADHFVExplorerAppleDoubleForkStyle 4 - -#ifdef __APPLE__ -#define XADDefaultForkStyle XADMacOSXForkStyle +#pragma clang diagnostic pop + +typedef NS_ENUM(int, XADForkStyle) { + XADForkStyleIgnored = 0, + XADForkStyleMacOSX = 1, + XADForkStyleHiddenAppleDouble = 2, + XADForkStyleVisibleAppleDouble = 3, + XADForkStyleHFVExplorerAppleDouble = 4, + +#if defined(__APPLE__) && TARGET_OS_OSX + XADForkStyleDefault = XADForkStyleMacOSX, #else -#define XADDefaultForkStyle XADVisibleAppleDoubleForkStyle + XADForkStyleDefault = XADForkStyleVisibleAppleDouble, #endif +}; + +@protocol XADUnarchiverDelegate; -@interface XADUnarchiver:NSObject +XADEXPORT +@interface XADUnarchiver:NSObject { XADArchiveParser *parser; NSString *destination; - int forkstyle; + XADForkStyle forkstyle; BOOL preservepermissions; double updateinterval; - id delegate; + id delegate; BOOL shouldstop; NSMutableArray *deferreddirectories,*deferredlinks; @@ -51,33 +60,32 @@ +(XADUnarchiver *)unarchiverForArchiveParser:(XADArchiveParser *)archiveparser; +(XADUnarchiver *)unarchiverForPath:(NSString *)path; +(XADUnarchiver *)unarchiverForPath:(NSString *)path error:(XADError *)errorptr; ++(XADUnarchiver *)unarchiverForPath:(NSString *)path nserror:(NSError **)errorptr; -(id)initWithArchiveParser:(XADArchiveParser *)archiveparser; -(void)dealloc; --(XADArchiveParser *)archiveParser; +@property (readonly, retain) XADArchiveParser *archiveParser; --(id)delegate; --(void)setDelegate:(id)newdelegate; +@property (assign) id delegate; --(NSString *)destination; --(void)setDestination:(NSString *)destpath; +@property (copy) NSString *destination; --(int)macResourceForkStyle; --(void)setMacResourceForkStyle:(int)style; +@property XADForkStyle macResourceForkStyle; --(BOOL)preservesPermissions; --(void)setPreserevesPermissions:(BOOL)preserveflag; +@property BOOL preservesPermissions; +-(void)setPreserevesPermissions:(BOOL)preserveflag API_DEPRECATED_WITH_REPLACEMENT("-setPreservesPermissions:", macosx(10.0, 10.8), ios(3.0, 8.0)); --(double)updateInterval; --(void)setUpdateInterval:(double)interval; +@property NSTimeInterval updateInterval; --(XADError)parseAndUnarchive; +-(XADError)parseAndUnarchive NS_REFINED_FOR_SWIFT; +-(BOOL)parseAndUnarchiveWithError:(NSError**)outErr NS_SWIFT_NAME(parseAndUnarchive()); -(XADError)extractEntryWithDictionary:(NSDictionary *)dict; -(XADError)extractEntryWithDictionary:(NSDictionary *)dict forceDirectories:(BOOL)force; -(XADError)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path; -(XADError)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path forceDirectories:(BOOL)force; +-(BOOL)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path forceDirectories:(BOOL)force error:(NSError **)outErr; -(XADError)finishExtractions; -(XADError)_fixDeferredLinks; @@ -87,6 +95,11 @@ wantChecksum:(BOOL)checksum error:(XADError *)errorptr; -(XADUnarchiver *)unarchiverForEntryWithDictionary:(NSDictionary *)dict resourceForkDictionary:(NSDictionary *)forkdict wantChecksum:(BOOL)checksum error:(XADError *)errorptr; +-(XADUnarchiver *)unarchiverForEntryWithDictionary:(NSDictionary *)dict +wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr; +-(XADUnarchiver *)unarchiverForEntryWithDictionary:(NSDictionary *)dict +resourceForkDictionary:(NSDictionary *)forkdict wantChecksum:(BOOL)checksum +nserror:(NSError **)errorptr; -(XADError)_extractFileEntryWithDictionary:(NSDictionary *)dict as:(NSString *)destpath; -(XADError)_extractDirectoryEntryWithDictionary:(NSDictionary *)dict as:(NSString *)destpath; @@ -97,10 +110,15 @@ resourceForkDictionary:(NSDictionary *)forkdict wantChecksum:(BOOL)checksum erro -(XADError)_updateFileAttributesAtPath:(NSString *)path forEntryWithDictionary:(NSDictionary *)dict deferDirectories:(BOOL)defer; -(XADError)_ensureDirectoryExists:(NSString *)path; +-(BOOL)_ensureDirectoryExists:(NSString *)path error:(NSError**)outError; -(XADError)runExtractorWithDictionary:(NSDictionary *)dict outputHandle:(CSHandle *)handle; -(XADError)runExtractorWithDictionary:(NSDictionary *)dict outputTarget:(id)target selector:(SEL)sel argument:(id)arg; +-(BOOL)runExtractorWithDictionary:(NSDictionary *)dict +outputHandle:(CSHandle *)handle error:(NSError**)outError; +-(BOOL)runExtractorWithDictionary:(NSDictionary *)dict +outputTarget:(id)target selector:(SEL)sel argument:(id)arg error:(NSError**)outError; -(NSString *)adjustPathString:(NSString *)path forEntryWithDictionary:(NSDictionary *)dict; @@ -111,35 +129,49 @@ outputTarget:(id)target selector:(SEL)sel argument:(id)arg; -@interface NSObject (XADUnarchiverDelegate) +@protocol XADUnarchiverDelegate +@optional -(void)unarchiverNeedsPassword:(XADUnarchiver *)unarchiver; -(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldExtractEntryWithDictionary:(NSDictionary *)dict suggestedPath:(NSString **)pathptr; -(void)unarchiver:(XADUnarchiver *)unarchiver willExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path; -(void)unarchiver:(XADUnarchiver *)unarchiver didExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path error:(XADError)error; +-(void)unarchiver:(XADUnarchiver *)unarchiver didExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path nserror:(NSError*)error; +@required -(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldCreateDirectory:(NSString *)directory; +@optional -(void)unarchiver:(XADUnarchiver *)unarchiver didCreateDirectory:(NSString *)directory; -(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldDeleteFileAndCreateDirectory:(NSString *)directory; +@optional -(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldExtractArchiveEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path; -(void)unarchiver:(XADUnarchiver *)unarchiver willExtractArchiveEntryWithDictionary:(NSDictionary *)dict withUnarchiver:(XADUnarchiver *)subunarchiver to:(NSString *)path; -(void)unarchiver:(XADUnarchiver *)unarchiver didExtractArchiveEntryWithDictionary:(NSDictionary *)dict withUnarchiver:(XADUnarchiver *)subunarchiver to:(NSString *)path error:(XADError)error; +-(void)unarchiver:(XADUnarchiver *)unarchiver didExtractArchiveEntryWithDictionary:(NSDictionary *)dict withUnarchiver:(XADUnarchiver *)subunarchiver to:(NSString *)path nserror:(NSError*)error; +@required -(NSString *)unarchiver:(XADUnarchiver *)unarchiver destinationForLink:(XADString *)link from:(NSString *)path; -(BOOL)extractionShouldStopForUnarchiver:(XADUnarchiver *)unarchiver; -(void)unarchiver:(XADUnarchiver *)unarchiver extractionProgressForEntryWithDictionary:(NSDictionary *)dict fileFraction:(double)fileprogress estimatedTotalFraction:(double)totalprogress; +@optional -(void)unarchiver:(XADUnarchiver *)unarchiver findsFileInterestingForReason:(NSString *)reason; -@end - -@interface NSObject (XADUnarchiverDelegateDeprecated) +@optional // Deprecated. --(NSString *)unarchiver:(XADUnarchiver *)unarchiver pathForExtractingEntryWithDictionary:(NSDictionary *)dict; --(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path; --(NSString *)unarchiver:(XADUnarchiver *)unarchiver linkDestinationForEntryWithDictionary:(NSDictionary *)dict from:(NSString *)path; +-(NSString *)unarchiver:(XADUnarchiver *)unarchiver pathForExtractingEntryWithDictionary:(NSDictionary *)dict DEPRECATED_ATTRIBUTE; +-(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path DEPRECATED_ATTRIBUTE; +-(NSString *)unarchiver:(XADUnarchiver *)unarchiver linkDestinationForEntryWithDictionary:(NSDictionary *)dict from:(NSString *)path DEPRECATED_ATTRIBUTE; @end + + +static const XADForkStyle XADIgnoredForkStyle API_DEPRECATED_WITH_REPLACEMENT("XADForkStyleIgnored", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADForkStyleIgnored; +static const XADForkStyle XADMacOSXForkStyle API_DEPRECATED_WITH_REPLACEMENT("XADForkStyleMacOSX", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADForkStyleMacOSX; +static const XADForkStyle XADHiddenAppleDoubleForkStyle API_DEPRECATED_WITH_REPLACEMENT("XADForkStyleHiddenAppleDouble", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADForkStyleHiddenAppleDouble; +static const XADForkStyle XADVisibleAppleDoubleForkStyle API_DEPRECATED_WITH_REPLACEMENT("XADForkStyleVisibleAppleDouble", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADForkStyleVisibleAppleDouble; +static const XADForkStyle XADHFVExplorerAppleDoubleForkStyle API_DEPRECATED_WITH_REPLACEMENT("XADForkStyleHFVExplorerAppleDouble", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADForkStyleHFVExplorerAppleDouble; +static const XADForkStyle XADDefaultForkStyle API_DEPRECATED_WITH_REPLACEMENT("XADForkStyleDefault", macosx(10.0, 10.8), ios(3.0, 8.0)) = XADForkStyleDefault; diff --git a/XADUnarchiver.m b/XADUnarchiver.m index 3da64cc4..c43ce6df 100644 --- a/XADUnarchiver.m +++ b/XADUnarchiver.m @@ -43,13 +43,20 @@ +(XADUnarchiver *)unarchiverForPath:(NSString *)path error:(XADError *)errorptr return [[[self alloc] initWithArchiveParser:archiveparser] autorelease]; } ++(XADUnarchiver *)unarchiverForPath:(NSString *)path nserror:(NSError **)errorptr +{ + XADArchiveParser *archiveparser=[XADArchiveParser archiveParserForPath:path nserror:errorptr]; + if(!archiveparser) return nil; + return [[[self alloc] initWithArchiveParser:archiveparser] autorelease]; +} + -(id)initWithArchiveParser:(XADArchiveParser *)archiveparser { if((self=[super init])) { parser=[archiveparser retain]; destination=nil; - forkstyle=XADDefaultForkStyle; + forkstyle=XADForkStyleDefault; preservepermissions=NO; updateinterval=0.1; delegate=nil; @@ -70,32 +77,18 @@ -(void)dealloc [super dealloc]; } --(XADArchiveParser *)archiveParser { return parser; } - - --(id)delegate { return delegate; } - --(void)setDelegate:(id)newdelegate { delegate=newdelegate; } - --(NSString *)destination { return destination; } - --(void)setDestination:(NSString *)destpath -{ - [destination autorelease]; - destination=[destpath retain]; -} +@synthesize archiveParser = parser; --(int)macResourceForkStyle { return forkstyle; } --(void)setMacResourceForkStyle:(int)style { forkstyle=style; } +@synthesize delegate; --(BOOL)preservesPermissions { return preservepermissions; } +@synthesize destination; --(void)setPreserevesPermissions:(BOOL)preserveflag { preservepermissions=preserveflag; } +@synthesize macResourceForkStyle = forkstyle; --(double)updateInterval { return updateinterval; } +@synthesize preservesPermissions = preservepermissions; --(void)setUpdateInterval:(double)interval { updateinterval=interval; } +@synthesize updateInterval = updateinterval; @@ -109,7 +102,7 @@ -(XADError)parseAndUnarchive [parser setDelegate:olddelegate]; if(error) return error; - if([self _shouldStop]) return XADBreakError; + if([self _shouldStop]) return XADErrorBreak; error=[self finishExtractions]; if(error) return error; @@ -117,7 +110,40 @@ -(XADError)parseAndUnarchive error=[parser testChecksumWithoutExceptions]; if(error) return error; - return XADNoError; + return XADErrorNone; +} + +-(BOOL)parseAndUnarchiveWithError:(NSError**)outErr +{ + id olddelegate=parser.delegate; + + parser.delegate = self; + BOOL success=[parser parseWithError:outErr]; + parser.delegate = olddelegate; + if(!success) return NO; + + if(self._shouldStop) { + if (outErr) { + *outErr = [NSError errorWithDomain:XADErrorDomain code:XADErrorBreak userInfo:nil]; + } + return NO; + } + + + XADError error=[self finishExtractions]; + if(error) { + if (outErr) { + *outErr = [NSError errorWithDomain:XADErrorDomain code:error userInfo:nil]; + } + return NO; + } + + success=[parser testChecksumWithError:outErr]; + if(!success) { + return NO; + } + + return YES; } -(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDictionary *)dict @@ -133,12 +159,16 @@ -(BOOL)archiveParsingShouldStop:(XADArchiveParser *)parser -(void)archiveParserNeedsPassword:(XADArchiveParser *)parser { - [delegate unarchiverNeedsPassword:self]; + if ([delegate respondsToSelector:@selector(unarchiverNeedsPassword:)]) { + [delegate unarchiverNeedsPassword:self]; + } } -(void)archiveParser:(XADArchiveParser *)parser findsFileInterestingForReason:(NSString *)reason { - [delegate unarchiver:self findsFileInterestingForReason:reason]; + if ([delegate respondsToSelector:@selector(unarchiver:findsFileInterestingForReason:)]) { + [delegate unarchiver:self findsFileInterestingForReason:reason]; + } } @@ -191,9 +221,11 @@ -(XADError)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path f if(![delegate unarchiver:self shouldExtractEntryWithDictionary:dict suggestedPath:&path]) { [pool release]; - return XADNoError; + return XADErrorNone; + } + if ([delegate respondsToSelector:@selector(unarchiver:willExtractEntryWithDictionary:to:)]) { + [delegate unarchiver:self willExtractEntryWithDictionary:dict to:path]; } - [delegate unarchiver:self willExtractEntryWithDictionary:dict to:path]; } XADError error; @@ -211,7 +243,7 @@ -(XADError)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path f error=[self _extractArchiveEntryWithDictionary:dict to:unarchiverpath name:[path lastPathComponent]]; // If extraction was attempted, and succeeded for failed, skip everything else. // Otherwise, if the archive couldn't be opened, fall through and extract normally. - if(error!=XADSubArchiveError) goto end; + if(error!=XADErrorSubArchive) goto end; } } @@ -220,20 +252,20 @@ -(XADError)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path f { switch(forkstyle) { - case XADIgnoredForkStyle: + case XADForkStyleIgnored: break; - case XADMacOSXForkStyle: + case XADForkStyleMacOSX: if(!isdir) error=[XADPlatform extractResourceForkEntryWithDictionary:dict unarchiver:self toPath:path]; break; - case XADHiddenAppleDoubleForkStyle: - case XADVisibleAppleDoubleForkStyle: + case XADForkStyleHiddenAppleDouble: + case XADForkStyleVisibleAppleDouble: error=[self _extractResourceForkEntryWithDictionary:dict asAppleDoubleFile:path]; break; - case XADHFVExplorerAppleDoubleForkStyle: + case XADForkStyleHFVExplorerAppleDouble: // We need to make sure there is an empty file for the data fork in all // cases, so just try to recover the original filename and create an empty // file there in case one doesn't exist, and this isn't a directory. @@ -257,7 +289,7 @@ -(XADError)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path f default: // TODO: better error - error=XADBadParametersError; + error=XADErrorBadParameters; break; } } @@ -281,7 +313,7 @@ -(XADError)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path f // Report success or failure end: - if(delegate) + if([delegate respondsToSelector:@selector(unarchiver:didExtractEntryWithDictionary:to:error:)]) { [delegate unarchiver:self didExtractEntryWithDictionary:dict to:path error:error]; } @@ -291,8 +323,183 @@ -(XADError)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path f return error; } +// FIXME: Improve extractEntryWithDictionary:as:forceDirectories:error: with an NSError value. +-(BOOL)extractEntryWithDictionary:(NSDictionary *)dict as:(NSString *)path forceDirectories:(BOOL)force error:(NSError**)outErr +{ + NSError *tmpErr = nil; + BOOL okay; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSNumber *dirnum=[dict objectForKey:XADIsDirectoryKey]; + NSNumber *linknum=[dict objectForKey:XADIsLinkKey]; + NSNumber *resnum=[dict objectForKey:XADIsResourceForkKey]; + NSNumber *archivenum=[dict objectForKey:XADIsArchiveKey]; + BOOL isdir=dirnum&&dirnum.boolValue; + BOOL islink=linknum&&linknum.boolValue; + BOOL isres=resnum&&resnum.boolValue; + BOOL isarchive=archivenum&&archivenum.boolValue; + + // If we were not given a path, pick one ourselves. + if(!path) + { + XADPath *name=[dict objectForKey:XADFileNameKey]; + NSString *namestring=name.sanitizedPathString; + + if(destination) path=[destination stringByAppendingPathComponent:namestring]; + else path=namestring; + + // Adjust path for resource forks. + path=[self adjustPathString:path forEntryWithDictionary:dict]; + } + + // Ask for permission and possibly a path, and report that we are starting. + if(delegate) + { + if(![delegate unarchiver:self shouldExtractEntryWithDictionary:dict suggestedPath:&path]) + { + return YES; + } + if ([delegate respondsToSelector:@selector(unarchiver:willExtractEntryWithDictionary:to:)]) { + [delegate unarchiver:self willExtractEntryWithDictionary:dict to:path]; + } + } + + XADError error=0; + + okay=[self _ensureDirectoryExists:path.stringByDeletingLastPathComponent error:&tmpErr]; + [tmpErr retain]; + if(!okay) goto end; + + // Attempt to extract embedded archives if requested. + if(isarchive&&delegate) + { + NSString *unarchiverpath=path.stringByDeletingLastPathComponent; + + if([delegate unarchiver:self shouldExtractArchiveEntryWithDictionary:dict to:unarchiverpath]) + { + okay=[self _extractArchiveEntryWithDictionary:dict to:unarchiverpath name:path.lastPathComponent error:&tmpErr]; + [tmpErr retain]; + // If extraction was attempted, and succeeded for failed, skip everything else. + // Otherwise, if the archive couldn't be opened, fall through and extract normally. + if(!okay && ([tmpErr.domain isEqualToString:XADErrorDomain] && tmpErr.code != XADErrorSubArchive)) goto end; + } + } + + // Extract normally. + if(isres) + { + switch(forkstyle) + { + case XADForkStyleIgnored: + break; + + case XADForkStyleMacOSX: + if(!isdir) { + error=[XADPlatform extractResourceForkEntryWithDictionary:dict unarchiver:self toPath:path]; + if (error == XADErrorNone) { + okay = YES; + tmpErr = nil; + } else { + okay = NO; + tmpErr = [[NSError alloc] initWithDomain:XADErrorDomain code:error userInfo:nil]; + } + } + break; + + case XADForkStyleHiddenAppleDouble: + case XADForkStyleVisibleAppleDouble: + { + error=[self _extractResourceForkEntryWithDictionary:dict asAppleDoubleFile:path]; + if (error == XADErrorNone) { + okay = YES; + tmpErr = nil; + } else { + okay = NO; + tmpErr = [[NSError alloc] initWithDomain:XADErrorDomain code:error userInfo:nil]; + } + } + break; + + case XADForkStyleHFVExplorerAppleDouble: + // We need to make sure there is an empty file for the data fork in all + // cases, so just try to recover the original filename and create an empty + // file there in case one doesn't exist, and this isn't a directory. + // Kludge in the same file attributes as the resource fork. If there is + // an actual data fork later, it will overwrite this file. There special-case + // code to avoid collision warnings. + if(![[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:NULL] && !isdir) + { + NSString *dirpart=path.stringByDeletingLastPathComponent; + NSString *namepart=path.lastPathComponent; + if([namepart hasPrefix:@"%"]) + { + NSString *originalname=[namepart substringFromIndex:1]; + NSString *datapath=[dirpart stringByAppendingPathComponent:originalname]; + [[NSData data] writeToFile:datapath atomically:NO]; + [self _updateFileAttributesAtPath:datapath forEntryWithDictionary:dict deferDirectories:!force]; + } + } + error=[self _extractResourceForkEntryWithDictionary:dict asAppleDoubleFile:path]; + if (error == XADErrorNone) { + okay = YES; + tmpErr = nil; + } else { + okay = NO; + tmpErr = [[NSError alloc] initWithDomain:XADErrorDomain code:error userInfo:nil]; + } + break; + + default: + // TODO: better error + error=XADErrorBadParameters; + okay = NO; + tmpErr = [[NSError alloc] initWithDomain:XADErrorDomain code:XADErrorBadParameters userInfo:nil]; + + break; + } + } + else if(isdir) + { + error=[self _extractDirectoryEntryWithDictionary:dict as:path]; + } + else if(islink) + { + error=[self _extractLinkEntryWithDictionary:dict as:path]; + } + else + { + error=[self _extractFileEntryWithDictionary:dict as:path]; + } + if(!error) + { + error=[self _updateFileAttributesAtPath:path forEntryWithDictionary:dict deferDirectories:!force]; + } + if (error == XADErrorNone) { + okay = YES; + tmpErr = nil; + } else { + okay = NO; + tmpErr = [[NSError alloc] initWithDomain:XADErrorDomain code:error userInfo:nil]; + } + + // Report success or failure + end: + if([delegate respondsToSelector:@selector(unarchiver:didExtractEntryWithDictionary:to:error:)]) + { + [delegate unarchiver:self didExtractEntryWithDictionary:dict to:path nserror:okay ? nil : tmpErr]; + } + [pool release]; + + if (outErr && tmpErr) { + *outErr = [tmpErr autorelease]; + } else if (tmpErr) { + [tmpErr release]; + } + + return okay; +} static NSComparisonResult SortDirectoriesByDepthAndResource(id entry1,id entry2,void *context) { @@ -301,8 +508,8 @@ static NSComparisonResult SortDirectoriesByDepthAndResource(id entry1,id entry2, XADPath *path1=[dict1 objectForKey:XADFileNameKey]; XADPath *path2=[dict2 objectForKey:XADFileNameKey]; - int depth1=[path1 depth]; - int depth2=[path2 depth]; + NSInteger depth1=[path1 depth]; + NSInteger depth2=[path2 depth]; if(depth1>depth2) return NSOrderedAscending; else if(depth1=1050 || __IPHONE_OS_VERSION_MIN_REQUIRED>__IPHONE_2_0 if([manager createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:NULL]) { - if (delegate) { + if ([delegate respondsToSelector:@selector(unarchiver:didCreateDirectory:)]) { [delegate unarchiver:self didCreateDirectory:path]; } - return XADNoError; + return XADErrorNone; } #else if([manager createDirectoryAtPath:path attributes:nil]) { - if (delegate) { + if ([delegate respondsToSelector:@selector(unarchiver:didCreateDirectory:)]) { [delegate unarchiver:self didCreateDirectory:path]; } - return XADNoError; + return XADErrorNone; } #endif - else return XADMakeDirectoryError; + else return XADErrorMakeDirectory; } @@ -591,8 +900,8 @@ -(XADError)_outputToHandle:(CSHandle *)handle bytes:(uint8_t *)bytes length:(int { // TODO: combine the exception parsing for input and output @try { [handle writeBytes:length fromBuffer:bytes]; } - @catch(id e) { return XADOutputError; } - return XADNoError; + @catch(id e) { return XADErrorOutput; } + return XADErrorNone; } -(XADError)runExtractorWithDictionary:(NSDictionary *)dict @@ -606,8 +915,10 @@ -(XADError)runExtractorWithDictionary:(NSDictionary *)dict @try { // Send a progress report to show that we are starting. - [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict - fileFraction:0 estimatedTotalFraction:[[parser handle] estimatedProgress]]; + if ([delegate respondsToSelector:@selector(unarchiver:extractionProgressForEntryWithDictionary:fileFraction:estimatedTotalFraction:)]) { + [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict + fileFraction:0 estimatedTotalFraction:[[parser handle] estimatedProgress]]; + } // Try to find the size of this entry. NSNumber *sizenum=[dict objectForKey:XADFileSizeKey]; @@ -623,7 +934,7 @@ -(XADError)runExtractorWithDictionary:(NSDictionary *)dict // Create handle and start unpacking. CSHandle *srchandle=[parser handleForEntryWithDictionary:dict wantChecksum:YES]; - if(!srchandle) return XADNotSupportedError; + if(!srchandle) return XADErrorNotSupported; off_t done=0; double updatetime=0; @@ -634,7 +945,10 @@ -(XADError)runExtractorWithDictionary:(NSDictionary *)dict for(;;) { - if([self _shouldStop]) return XADBreakError; + if([self _shouldStop]) { + free(buf); + return XADErrorBreak; + } // Read some data, and send it to the output function. // Stop if no more data was available. @@ -658,30 +972,34 @@ -(XADError)runExtractorWithDictionary:(NSDictionary *)dict if(sizenum) progress=(double)done/(double)size; else progress=[srchandle estimatedProgress]; - [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict - fileFraction:progress estimatedTotalFraction:[[parser handle] estimatedProgress]]; + if ([delegate respondsToSelector:@selector(unarchiver:extractionProgressForEntryWithDictionary:fileFraction:estimatedTotalFraction:)]) { + [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict + fileFraction:progress estimatedTotalFraction:[[parser handle] estimatedProgress]]; + } } } // Check if the file has already been marked as corrupt, and // give up without testing checksum if so. NSNumber *iscorrupt=[dict objectForKey:XADIsCorruptedKey]; - if(iscorrupt&&[iscorrupt boolValue]) return XADDecrunchError; + if(iscorrupt&&[iscorrupt boolValue]) return XADErrorDecrunch; // If the file has a checksum, check it. Otherwise, if it has a // size, check that the size ended up correct. if([srchandle hasChecksum]) { - if(![srchandle isChecksumCorrect]) return XADChecksumError; + if(![srchandle isChecksumCorrect]) return XADErrorChecksum; } else { - if(sizenum&&done!=size) return XADDecrunchError; // kind of hacky + if(sizenum&&done!=size) return XADErrorDecrunch; // kind of hacky } // Send a final progress report. - [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict - fileFraction:1 estimatedTotalFraction:[[parser handle] estimatedProgress]]; + if ([delegate respondsToSelector:@selector(unarchiver:extractionProgressForEntryWithDictionary:fileFraction:estimatedTotalFraction:)]) { + [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict + fileFraction:1 estimatedTotalFraction:parser.handle.estimatedProgress]; + } } @catch(id e) { @@ -690,7 +1008,154 @@ -(XADError)runExtractorWithDictionary:(NSDictionary *)dict free(buf); - return XADNoError; + return XADErrorNone; +} + +-(BOOL)runExtractorWithDictionary:(NSDictionary *)dict outputHandle:(CSHandle *)handle error:(NSError **)outError +{ + return [self runExtractorWithDictionary:dict outputTarget:self + selector:@selector(_outputToHandle:bytes:length:) argument:handle error:outError]; +} + +-(BOOL)runExtractorWithDictionary:(NSDictionary *)dict +outputTarget:(id)target selector:(SEL)selector argument:(id)argument error:(NSError**)outError; +{ + XADError (*outputfunc)(id,SEL,id,uint8_t *,int); + outputfunc=(void *)[target methodForSelector:selector]; + + uint8_t *buf=NULL; + + @try + { + // Send a progress report to show that we are starting. + if ([delegate respondsToSelector:@selector(unarchiver:extractionProgressForEntryWithDictionary:fileFraction:estimatedTotalFraction:)]) { + [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict + fileFraction:0 estimatedTotalFraction:parser.handle.estimatedProgress]; + } + + // Try to find the size of this entry. + NSNumber *sizenum=[dict objectForKey:XADFileSizeKey]; + off_t size=0; + if(sizenum != nil) + { + size=sizenum.longLongValue; + + // If this file is empty, don't bother reading anything, just + // call the output function once with 0 bytes and return. + if(size==0) { + XADError error = outputfunc(target,selector,argument,(uint8_t *)"",0); + if (error == XADErrorNone) { + return YES; + } else if(outError) { + *outError = [NSError errorWithDomain:XADErrorDomain code:error userInfo:nil]; + } + return NO; + } + } + + // Create handle and start unpacking. + CSHandle *srchandle=[parser handleForEntryWithDictionary:dict wantChecksum:YES nserror:outError]; + if(!srchandle) return NO; + + off_t done=0; + double updatetime=0; + + const int bufsize=0x40000; + buf=malloc(bufsize); + if(!buf) [XADException raiseOutOfMemoryException]; + + for(;;) + { + if(self._shouldStop) { + free(buf); + if (outError) { + *outError = [NSError errorWithDomain:XADErrorDomain code:XADErrorBreak userInfo:nil]; + } + return NO; + } + + // Read some data, and send it to the output function. + // Stop if no more data was available. + int actual=[srchandle readAtMost:bufsize toBuffer:buf]; + if(actual) + { + XADError error=outputfunc(target,selector,argument,buf,actual); + if(error) { + if (outError) { + *outError = [NSError errorWithDomain:XADErrorDomain code:error userInfo:nil]; + } + return NO; + } + } + else break; + + done+=actual; + + // Occasionally, send a progress message. + double currtime=[XADPlatform currentTimeInSeconds]; + if(currtime-updatetime>updateinterval) + { + updatetime=currtime; + + double progress; + if(sizenum != nil) progress=(double)done/(double)size; + else progress=srchandle.estimatedProgress; + + if ([delegate respondsToSelector:@selector(unarchiver:extractionProgressForEntryWithDictionary:fileFraction:estimatedTotalFraction:)]) { + [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict + fileFraction:progress estimatedTotalFraction:parser.handle.estimatedProgress]; + } + } + } + + // Check if the file has already been marked as corrupt, and + // give up without testing checksum if so. + NSNumber *iscorrupt=[dict objectForKey:XADIsCorruptedKey]; + if(iscorrupt&&iscorrupt.boolValue) { + if (outError) { + *outError = [NSError errorWithDomain:XADErrorDomain code:XADErrorDecrunch userInfo:nil]; + } + return NO; + } + + // If the file has a checksum, check it. Otherwise, if it has a + // size, check that the size ended up correct. + if(srchandle.hasChecksum) + { + if(![srchandle isChecksumCorrect]) { + if (outError) { + *outError = [NSError errorWithDomain:XADErrorDomain code:XADErrorChecksum userInfo:nil]; + } + return NO; + } + } + else + { + if(sizenum&&done!=size) { + if (outError) { + *outError = [NSError errorWithDomain:XADErrorDomain code:XADErrorDecrunch userInfo:nil]; // kind of hacky + } + return NO; + } + } + + // Send a final progress report. + if ([delegate respondsToSelector:@selector(unarchiver:extractionProgressForEntryWithDictionary:fileFraction:estimatedTotalFraction:)]) { + [delegate unarchiver:self extractionProgressForEntryWithDictionary:dict + fileFraction:1 estimatedTotalFraction:parser.handle.estimatedProgress]; + } + } + @catch(id e) + { + if (outError) { + *outError = [XADException parseExceptionReturningNSError:e]; + } + return NO; + } + + free(buf); + + return YES; } -(NSString *)adjustPathString:(NSString *)path forEntryWithDictionary:(NSDictionary *)dict @@ -701,18 +1166,19 @@ -(NSString *)adjustPathString:(NSString *)path forEntryWithDictionary:(NSDiction { switch(forkstyle) { - case XADHiddenAppleDoubleForkStyle: + case XADForkStyleHiddenAppleDouble: // TODO: is this path generation correct? return [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent: [@"._" stringByAppendingString:[path lastPathComponent]]]; break; - case XADVisibleAppleDoubleForkStyle: + case XADForkStyleVisibleAppleDouble: return [path stringByAppendingPathExtension:@"rsrc"]; break; - case XADHFVExplorerAppleDoubleForkStyle: + case XADForkStyleHFVExplorerAppleDouble: // TODO: is this path generation correct? + // FIXME: this is not correct: HFVExplorer requires non-ascii characters to be percent-encoded. return [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent: [@"%" stringByAppendingString:[path lastPathComponent]]]; break; @@ -726,17 +1192,23 @@ -(BOOL)_shouldStop if(!delegate) return NO; if(shouldstop) return YES; - return shouldstop=[delegate extractionShouldStopForUnarchiver:self]; + if ([delegate respondsToSelector:@selector(extractionShouldStopForUnarchiver:)]) { + shouldstop=[delegate extractionShouldStopForUnarchiver:self]; + } + return shouldstop; } -@end +-(void)setPreserevesPermissions:(BOOL)preserve +{ + self.preservesPermissions = preserve; +} +@end +//TODO: remove all of these: migrate needed code to XADUnarchiver. @implementation NSObject (XADUnarchiverDelegate) --(void)unarchiverNeedsPassword:(XADUnarchiver *)unarchiver {} - -(NSString *)unarchiver:(XADUnarchiver *)unarchiver pathForExtractingEntryWithDictionary:(NSDictionary *)dict { return nil; } -(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldExtractEntryWithDictionary:(NSDictionary *)dict suggestedPath:(NSString **)pathptr @@ -746,41 +1218,47 @@ -(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldExtractEntryWithDictionary:( { NSString *path=[self unarchiver:unarchiver pathForExtractingEntryWithDictionary:dict]; if(path) *pathptr=path; - return [self unarchiver:unarchiver shouldExtractEntryWithDictionary:dict to:*pathptr]; + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated" + return [(NSObject*)self unarchiver:unarchiver shouldExtractEntryWithDictionary:dict to:*pathptr]; + #pragma clang diagnostic pop } else return YES; } --(void)unarchiver:(XADUnarchiver *)unarchiver willExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path {} --(void)unarchiver:(XADUnarchiver *)unarchiver didExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path error:(XADError)error {} - --(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldCreateDirectory:(NSString *)directory { return YES; } --(void)unarchiver:(XADUnarchiver *)unarchiver didCreateDirectory:(NSString *)directory { } --(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldDeleteFileAndCreateDirectory:(NSString *)directory { return NO; } - -(BOOL)unarchiver:(XADUnarchiver *)unarchiver shouldExtractArchiveEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path { return NO; } -(void)unarchiver:(XADUnarchiver *)unarchiver willExtractArchiveEntryWithDictionary:(NSDictionary *)dict withUnarchiver:(XADUnarchiver *)subunarchiver to:(NSString *)path {} --(void)unarchiver:(XADUnarchiver *)unarchiver didExtractArchiveEntryWithDictionary:(NSDictionary *)dict withUnarchiver:(XADUnarchiver *)subunarchiver to:(NSString *)path error:(XADError)error {} +-(void)unarchiver:(XADUnarchiver *)unarchiver didExtractArchiveEntryWithDictionary:(NSDictionary *)dict withUnarchiver:(XADUnarchiver *)subunarchiver to:(NSString *)path error:(XADError)error +{ + if ([self respondsToSelector:@selector(unarchiver:didExtractArchiveEntryWithDictionary:withUnarchiver:to:nserror:)]) { + [(NSObject*)self unarchiver:unarchiver didExtractArchiveEntryWithDictionary:dict withUnarchiver:subunarchiver to:path nserror:error == XADErrorNone ? nil : [NSError errorWithDomain:XADErrorDomain code:error userInfo:nil]]; + } +} + +-(void)unarchiver:(XADUnarchiver *)unarchiver didExtractEntryWithDictionary:(NSDictionary *)dict to:(NSString *)path error:(XADError)error +{ + if ([self respondsToSelector:@selector(unarchiver:didExtractEntryWithDictionary:to:nserror:)]) { + [(NSObject*)self unarchiver:unarchiver didExtractEntryWithDictionary:dict to:path nserror:error == XADErrorNone ? nil : [NSError errorWithDomain:XADErrorDomain code:error userInfo:nil]]; + } +} -(NSString *)unarchiver:(XADUnarchiver *)unarchiver destinationForLink:(XADString *)link from:(NSString *)path { // Kludge to handle old-style interface. if([self respondsToSelector:@selector(unarchiver:linkDestinationForEntryWithDictionary:from:)]) { - return [self unarchiver:unarchiver linkDestinationForEntryWithDictionary: + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated" + return [(NSObject*)self unarchiver:unarchiver linkDestinationForEntryWithDictionary: [NSMutableDictionary dictionaryWithObjectsAndKeys: link,XADLinkDestinationKey, [NSNumber numberWithBool:YES],XADIsLinkKey, nil] from:path]; + #pragma clang diagnostic pop } else return [link string]; } --(BOOL)extractionShouldStopForUnarchiver:(XADUnarchiver *)unarchiver { return NO; } --(void)unarchiver:(XADUnarchiver *)unarchiver extractionProgressForEntryWithDictionary:(NSDictionary *)dict -fileFraction:(double)fileprogress estimatedTotalFraction:(double)totalprogress {} - --(void)unarchiver:(XADUnarchiver *)unarchiver findsFileInterestingForReason:(NSString *)reason {} @end diff --git a/XADWARCParser.h b/XADWARCParser.h index f0aa1b7f..8d4a96b9 100644 --- a/XADWARCParser.h +++ b/XADWARCParser.h @@ -20,7 +20,7 @@ */ #import "XADArchiveParser.h" -@interface XADWARCParser:XADArchiveParser +@interface XADWARCParser:XADArchiveParser { } diff --git a/XADWARCParser.m b/XADWARCParser.m index 2a933c74..922bafdc 100644 --- a/XADWARCParser.m +++ b/XADWARCParser.m @@ -111,9 +111,7 @@ -(void)parse NSMutableArray *filerecords=[NSMutableArray array]; NSMutableDictionary *root=[NSMutableDictionary dictionary]; - NSEnumerator *enumerator=[recordarray objectEnumerator]; - NSMutableDictionary *record; - while((record=[enumerator nextObject])) + for(NSMutableDictionary *record in recordarray) { NSString *type=[record objectForKey:@"WARC-Type"]; NSArray *headers=[record objectForKey:@"HTTPHeaders"]; @@ -149,8 +147,7 @@ -(void)parse // Iterate over the files, finding and loading the request // records and emit archive entries. - enumerator=[filerecords objectEnumerator]; - while((record=[enumerator nextObject])) + for(NSMutableDictionary *record in filerecords) { NSString *target=[self getTargetURI:record]; NSNumber *startnum=[record objectForKey:@"HTTPBodyStart"]; @@ -333,9 +330,7 @@ -(void)insertFile:(NSString *)name record:(NSMutableDictionary *)record inDirect -(void)buildXADPathsForFilesInDirectory:(NSMutableDictionary *)dir parentPath:(XADPath *)parent { - NSEnumerator *enumerator=[dir keyEnumerator]; - NSString *name; - while((name=[enumerator nextObject])) + for(NSString *name in [dir keyEnumerator]) { NSMutableDictionary *entry=[dir objectForKey:name]; XADString *xadname=[self XADStringWithString:name]; diff --git a/XADWinZipJPEGHandle.m b/XADWinZipJPEGHandle.m index c0a8dd56..ccd5ab53 100644 --- a/XADWinZipJPEGHandle.m +++ b/XADWinZipJPEGHandle.m @@ -56,7 +56,7 @@ -(void)resetBlockStream if(decompressor) FreeWinZipJPEGDecompressor(decompressor); decompressor=AllocWinZipJPEGDecompressor(ReadFunction,input); - if(!decompressor) [XADException raiseExceptionWithXADError:XADOutOfMemoryError]; + if(!decompressor) [XADException raiseExceptionWithXADError:XADErrorOutOfMemory]; int error=ReadWinZipJPEGHeader(decompressor); if(error) @@ -89,7 +89,7 @@ -(int)produceBlockAtOffset:(off_t)pos if(error) { fprintf(stderr,"Error %d while trying to read next WinZip JPEG slice.\n",error); - [XADException raiseExceptionWithXADError:XADInputError]; + [XADException raiseExceptionWithXADError:XADErrorInput]; } } diff --git a/XADXARParser.m b/XADXARParser.m index 94cf88d2..bbc9e756 100644 --- a/XADXARParser.m +++ b/XADXARParser.m @@ -37,12 +37,12 @@ #define ExtendedAttributeState 5 #define OldExtendedAttributeState 6 -static const NSString *StringFormat=@"String"; -static const NSString *XADStringFormat=@"XADString"; -static const NSString *DecimalFormat=@"Decimal"; -static const NSString *OctalFormat=@"Octal"; -static const NSString *HexFormat=@"Hex"; -static const NSString *DateFormat=@"Date"; +static const NSString *const StringFormat=@"String"; +static const NSString *const XADStringFormat=@"XADString"; +static const NSString *const DecimalFormat=@"Decimal"; +static const NSString *const OctalFormat=@"Octal"; +static const NSString *const HexFormat=@"Hex"; +static const NSString *const DateFormat=@"Date"; @implementation XADXARParser @@ -140,9 +140,7 @@ -(void)parse } } - NSEnumerator *enumerator=[files objectEnumerator]; - NSMutableDictionary *file; - while((file=[enumerator nextObject])) + for(NSMutableDictionary *file in files) { if(![self shouldKeepParsing]) break; [self finishFile:file parentPath:[self XADPath]]; @@ -181,9 +179,7 @@ -(void)finishFile:(NSMutableDictionary *)file parentPath:(XADPath *)parentpath int numeas=0; if(eas) { - NSEnumerator *enumerator=[eas objectEnumerator]; - NSMutableDictionary *ea; - while((ea=[enumerator nextObject])) + for(NSMutableDictionary *ea in eas) { NSString *name=[ea objectForKey:@"Name"]; if(!name) continue; @@ -272,9 +268,7 @@ -(void)finishFile:(NSMutableDictionary *)file parentPath:(XADPath *)parentpath if(filearray) { - NSEnumerator *enumerator=[filearray objectEnumerator]; - NSMutableDictionary *file; - while((file=[enumerator nextObject])) [self finishFile:file parentPath:path]; + for(NSMutableDictionary *file in filearray) [self finishFile:file parentPath:path]; } } @@ -440,9 +434,7 @@ -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string -(void)startSimpleElement:(NSString *)name attributes:(NSDictionary *)attributes definitions:(NSDictionary *)definitions destinationDictionary:(NSMutableDictionary *)dest { - NSEnumerator *enumerator=[attributes keyEnumerator]; - NSString *key; - while((key=[enumerator nextObject])) + for(NSString *key in attributes) { NSArray *definition=[definitions objectForKey:[NSString stringWithFormat:@"%@ %@",name,key]]; if(definition) [self parseDefinition:definition string:[attributes objectForKey:key] destinationDictionary:dest]; diff --git a/lsar.m b/lsar.m index 12fd7429..fe243200 100644 --- a/lsar.m +++ b/lsar.m @@ -39,10 +39,10 @@ static int TestEntry(XADSimpleUnarchiver *unarchiver,NSDictionary *dict); -@interface Lister:NSObject {} +@interface Lister:NSObject {} @end -@interface JSONLister:NSObject {} +@interface JSONLister:NSObject {} @end int returncode; @@ -554,7 +554,7 @@ static int TestEntry(XADSimpleUnarchiver *unarchiver,NSDictionary *dict) if(!handle) { returncode=1; - if(error==XADPasswordError) return EntryHasWrongPasswordResult; + if(error==XADErrorPassword) return EntryHasWrongPasswordResult; else return EntryIsNotSupportedResult; } diff --git a/unar.m b/unar.m index 18828c5f..bf31662d 100644 --- a/unar.m +++ b/unar.m @@ -26,7 +26,7 @@ #define VERSION_STRING @"v1.10.7" -@interface Unarchiver:NSObject {} +@interface Unarchiver:NSObject {} @end int numerrors; @@ -129,7 +129,7 @@ int main(int argc,const char **argv) @"and \"skip\" discards all resource forks. Defaults to \"fork\"."]; [cmdline addAlias:@"k" forOption:@"forks"]; - int forkvalues[]={XADMacOSXForkStyle,XADVisibleAppleDoubleForkStyle,XADHiddenAppleDoubleForkStyle,XADIgnoredForkStyle}; + XADForkStyle forkvalues[]={XADForkStyleMacOSX,XADForkStyleVisibleAppleDouble,XADForkStyleHiddenAppleDouble,XADForkStyleIgnored}; #elif defined(_WIN32) @@ -142,7 +142,7 @@ int main(int argc,const char **argv) @"and \"skip\" discards all resource forks. Defaults to \"visible\"."]; [cmdline addAlias:@"k" forOption:@"forks"]; - int forkvalues[]={XADVisibleAppleDoubleForkStyle,XADHiddenAppleDoubleForkStyle,XADHFVExplorerAppleDoubleForkStyle,XADIgnoredForkStyle}; + XADForkStyle forkvalues[]={XADForkStyleVisibleAppleDouble,XADForkStyleHiddenAppleDouble,XADForkStyleHFVExplorerAppleDouble,XADForkStyleIgnored}; #else @@ -154,7 +154,7 @@ int main(int argc,const char **argv) @"and \"skip\" discards all resource forks. Defaults to \"visible\"."]; [cmdline addAlias:@"k" forOption:@"forks"]; - int forkvalues[]={XADVisibleAppleDoubleForkStyle,XADHiddenAppleDoubleForkStyle,XADIgnoredForkStyle}; + XADForkStyle forkvalues[]={XADForkStyleVisibleAppleDouble,XADForkStyleHiddenAppleDouble,XADForkStyleIgnored}; #endif