mirror of
https://github.com/MacPaw/XADMaster.git
synced 2025-08-29 03:23:48 +02:00
271 lines
11 KiB
Objective-C
271 lines
11 KiB
Objective-C
/*
|
|
* XADArchiveParser.h
|
|
*
|
|
* Copyright (c) 2017-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
|
|
*/
|
|
#import <Foundation/Foundation.h>
|
|
#import "XADException.h"
|
|
#import "XADString.h"
|
|
#import "XADPath.h"
|
|
#import "XADRegex.h"
|
|
#import "CSHandle.h"
|
|
#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;
|
|
|
|
// Archive properties only
|
|
extern NSString *XADArchiveNameKey;
|
|
extern NSString *XADVolumesKey;
|
|
extern NSString *XADVolumeScanningFailedKey;
|
|
extern NSString *XADDiskLabelKey;
|
|
|
|
extern NSString *XADSignatureOffset;
|
|
extern NSString *XADParserClass;
|
|
|
|
@interface XADArchiveParser:NSObject
|
|
{
|
|
CSHandle *sourcehandle;
|
|
XADSkipHandle *skiphandle;
|
|
XADResourceFork *resourcefork;
|
|
|
|
id delegate;
|
|
NSString *password;
|
|
NSString *passwordencodingname;
|
|
BOOL caresaboutpasswordencoding;
|
|
|
|
NSMutableDictionary *properties;
|
|
XADStringSource *stringsource;
|
|
|
|
int currindex;
|
|
|
|
id parsersolidobj;
|
|
NSMutableDictionary *firstsoliddict,*prevsoliddict;
|
|
id currsolidobj;
|
|
CSHandle *currsolidhandle;
|
|
BOOL forcesolid;
|
|
|
|
BOOL shouldstop;
|
|
}
|
|
|
|
+(void)initialize;
|
|
+(Class)archiveParserClassForHandle:(CSHandle *)handle firstBytes:(NSData *)header
|
|
resourceFork:(XADResourceFork *)fork name:(NSString *)name propertiesToAdd:(NSMutableDictionary *)props;
|
|
+ (Class)archiveParserFromParsersWithFloatingSignature:(NSArray *)parsers forHandle:(CSHandle *)handle firstBytes:(NSData *)header name:(NSString *)name propertiesToAdd:(NSMutableDictionary *)props;
|
|
+ (BOOL)isValidParserClass:(Class)parserClass forHandle:(CSHandle *)handle firstBytes:(NSData *)header name:(NSString *)name propertiesToAdd:(NSMutableDictionary *)props;
|
|
|
|
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle name:(NSString *)name;
|
|
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle name:(NSString *)name error:(XADError *)errorptr;
|
|
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle resourceFork:(XADResourceFork *)fork name:(NSString *)name;
|
|
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle resourceFork:(XADResourceFork *)fork name:(NSString *)name error:(XADError *)errorptr;
|
|
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header name:(NSString *)name;
|
|
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header name:(NSString *)name error:(XADError *)errorptr;
|
|
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header resourceFork:(XADResourceFork *)fork name:(NSString *)name;
|
|
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header resourceFork:(XADResourceFork *)fork name:(NSString *)name error:(XADError *)errorptr;
|
|
+(XADArchiveParser *)archiveParserForPath:(NSString *)filename;
|
|
+(XADArchiveParser *)archiveParserForPath:(NSString *)filename error:(XADError *)errorptr;
|
|
+(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum;
|
|
+(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum error:(XADError *)errorptr;
|
|
+(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;
|
|
|
|
-(id)init;
|
|
-(void)dealloc;
|
|
|
|
-(CSHandle *)handle;
|
|
-(void)setHandle:(CSHandle *)newhandle;
|
|
-(XADResourceFork *)resourceFork;
|
|
-(void)setResourceFork:(XADResourceFork *)newfork;
|
|
-(NSString *)name;
|
|
-(void)setName:(NSString *)newname;
|
|
-(NSString *)filename;
|
|
-(void)setFilename:(NSString *)filename;
|
|
-(NSArray *)allFilenames;
|
|
-(void)setAllFilenames:(NSArray *)newnames;
|
|
|
|
-(id)delegate;
|
|
-(void)setDelegate:(id)newdelegate;
|
|
|
|
-(NSDictionary *)properties;
|
|
-(NSString *)currentFilename;
|
|
|
|
-(BOOL)isEncrypted;
|
|
-(NSString *)password;
|
|
-(BOOL)hasPassword;
|
|
-(void)setPassword:(NSString *)newpassword;
|
|
|
|
-(NSString *)encodingName;
|
|
-(float)encodingConfidence;
|
|
-(void)setEncodingName:(NSString *)encodingname;
|
|
-(BOOL)caresAboutPasswordEncoding;
|
|
-(NSString *)passwordEncodingName;
|
|
-(void)setPasswordEncodingName:(NSString *)encodingname;
|
|
-(XADStringSource *)stringSource;
|
|
|
|
-(XADString *)linkDestinationForDictionary:(NSDictionary *)dict;
|
|
-(XADString *)linkDestinationForDictionary:(NSDictionary *)dict error:(XADError *)errorptr;
|
|
-(NSDictionary *)extendedAttributesForDictionary:(NSDictionary *)dict;
|
|
-(NSData *)finderInfoForDictionary:(NSDictionary *)dict;
|
|
|
|
-(BOOL)wasStopped;
|
|
|
|
-(BOOL)hasChecksum;
|
|
-(BOOL)testChecksum;
|
|
-(XADError)testChecksumWithoutExceptions;
|
|
|
|
|
|
|
|
// Internal functions
|
|
|
|
+(NSArray *)scanForVolumesWithFilename:(NSString *)filename regex:(XADRegex *)regex;
|
|
+(NSArray *)scanForVolumesWithFilename:(NSString *)filename
|
|
regex:(XADRegex *)regex firstFileExtension:(NSString *)firstext;
|
|
|
|
-(BOOL)shouldKeepParsing;
|
|
|
|
-(CSHandle *)handleAtDataOffsetForDictionary:(NSDictionary *)dict;
|
|
-(XADSkipHandle *)skipHandle;
|
|
-(CSHandle *)zeroLengthHandleWithChecksum:(BOOL)checksum;
|
|
-(CSHandle *)subHandleFromSolidStreamForEntryWithDictionary:(NSDictionary *)dict;
|
|
|
|
-(BOOL)hasVolumes;
|
|
-(NSArray *)volumeSizes;
|
|
-(CSHandle *)currentHandle;
|
|
|
|
-(void)setObject:(id)object forPropertyKey:(NSString *)key;
|
|
-(void)addPropertiesFromDictionary:(NSDictionary *)dict;
|
|
-(void)setIsMacArchive:(BOOL)ismac;
|
|
|
|
-(void)addEntryWithDictionary:(NSMutableDictionary *)dict;
|
|
-(void)addEntryWithDictionary:(NSMutableDictionary *)dict retainPosition:(BOOL)retainpos;
|
|
|
|
-(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 *)XADStringWithCString:(const char *)cstring;
|
|
-(XADString *)XADStringWithCString:(const char *)cstring encodingName:(NSString *)encoding;
|
|
|
|
-(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 *)XADPathWithCString:(const char *)cstring separators:(const char *)separators;
|
|
-(XADPath *)XADPathWithCString:(const char *)cstring encodingName:(NSString *)encoding separators:(const char *)separators;
|
|
|
|
-(NSData *)encodedPassword;
|
|
-(const char *)encodedCStringPassword;
|
|
|
|
-(void)reportInterestingFileWithReason:(NSString *)reason,...;
|
|
|
|
|
|
|
|
// Subclasses implement these:
|
|
|
|
+(int)requiredHeaderSize;
|
|
+(BOOL)recognizeFileWithHandle:(CSHandle *)handle firstBytes:(NSData *)data
|
|
name:(NSString *)name;
|
|
+(BOOL)recognizeFileWithHandle:(CSHandle *)handle firstBytes:(NSData *)data
|
|
name:(NSString *)name propertiesToAdd:(NSMutableDictionary *)props;
|
|
+(NSArray *)volumesForHandle:(CSHandle *)handle firstBytes:(NSData *)data
|
|
name:(NSString *)name;
|
|
|
|
-(void)parse;
|
|
-(CSHandle *)handleForEntryWithDictionary:(NSDictionary *)dict wantChecksum:(BOOL)checksum;
|
|
-(NSString *)formatName;
|
|
|
|
-(CSHandle *)handleForSolidStreamWithObject:(id)obj wantChecksum:(BOOL)checksum;
|
|
|
|
// Exception-free wrappers for subclass methods:
|
|
// parseWithoutExceptions will in addition return XADBreakError if the delegate
|
|
// requested parsing to stop.
|
|
|
|
-(XADError)parseWithoutExceptions;
|
|
-(CSHandle *)handleForEntryWithDictionary:(NSDictionary *)dict wantChecksum:(BOOL)checksum error:(XADError *)errorptr;
|
|
|
|
@end
|
|
|
|
@interface NSObject (XADArchiveParserDelegate)
|
|
|
|
-(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDictionary *)dict;
|
|
-(BOOL)archiveParsingShouldStop:(XADArchiveParser *)parser;
|
|
-(void)archiveParserNeedsPassword:(XADArchiveParser *)parser;
|
|
-(void)archiveParser:(XADArchiveParser *)parser findsFileInterestingForReason:(NSString *)reason;
|
|
|
|
@end
|
|
|
|
NSMutableArray *XADSortVolumes(NSMutableArray *volumes,NSString *firstfileextension);
|