Skip to content

Commit

Permalink
Initial pokes for re-doing how protocols are handled.
Browse files Browse the repository at this point in the history
  • Loading branch information
MaddTheSane committed Jan 30, 2025
1 parent 8945195 commit d1796be
Show file tree
Hide file tree
Showing 12 changed files with 390 additions and 320 deletions.
84 changes: 44 additions & 40 deletions XADArchive.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#import "XADUnarchiver.h"
#import "XADException.h"

//TODO: wrap in an emum
typedef int XADAction;
//typedef off_t xadSize; // deprecated

Expand All @@ -33,19 +34,52 @@ typedef int XADAction;
#define XADOverwriteAction 3
#define XADRenameAction 4

extern NSString *XADResourceDataKey;
extern NSString *XADResourceForkData;
extern NSString *XADFinderFlags;
extern NSString *const XADResourceDataKey;
extern NSString *const XADResourceForkData;
extern NSString *const XADFinderFlags;


@class UniversalDetector;
@class XADArchive;
@protocol XADArchiveDelegate <NSObject>
@optional

@interface XADArchive:NSObject
-(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;

-(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

@interface XADArchive:NSObject <XADArchiveDelegate, XADUnarchiverDelegate, XADArchiveParserDelegate>
{
XADArchiveParser *parser;
XADUnarchiver *unarchiver;

id delegate;
id<XADArchiveDelegate> delegate;
NSTimeInterval update_interval;
XADError lasterror;

Expand All @@ -69,13 +103,13 @@ 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<XADArchiveDelegate>)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)initWithData:(NSData *)data delegate:(id<XADArchiveDelegate>)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 delegate:(id<XADArchiveDelegate>)del error:(XADError *)error;
-(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n
immediateExtractionTo:(NSString *)destination error:(XADError *)error;
-(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n
Expand All @@ -95,8 +129,8 @@ extern NSString *XADFinderFlags;
-(NSString *)commonTopDirectory;
-(NSString *)comment;

-(void)setDelegate:(id)delegate;
-(id)delegate;
-(void)setDelegate:(id<XADArchiveDelegate>)delegate;
-(id<XADArchiveDelegate>)delegate;

-(NSString *)password;
-(void)setPassword:(NSString *)newpassword;
Expand Down Expand Up @@ -167,36 +201,6 @@ dataFork:(BOOL)datafork resourceFork:(BOOL)resfork;
@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;

-(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;

@end


#ifndef XAD_NO_DEPRECATED

#define XADAbort XADAbortAction
Expand Down
200 changes: 122 additions & 78 deletions XADArchive.m
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
#import <sys/time.h>


NSString *XADResourceDataKey=@"XADResourceData";
NSString *XADFinderFlags=@"XADFinderFlags";
NSString *const XADResourceDataKey=@"XADResourceData";
NSString *const XADFinderFlags=@"XADFinderFlags";



Expand Down Expand Up @@ -81,8 +81,8 @@ -(id)init
immediatesize=0;
parentarchive=nil;

dataentries=[[NSMutableArray array] retain];
resourceentries=[[NSMutableArray array] retain];
dataentries=[[NSMutableArray alloc] init];
resourceentries=[[NSMutableArray alloc] init];
namedict=nil;
}
return self;
Expand Down Expand Up @@ -1140,100 +1140,144 @@ -(void)fixWritePermissions { [self updateAttributesForDeferredDirectories]; }


-(NSStringEncoding)archive:(XADArchive *)archive encodingForData:(NSData *)data guess:(NSStringEncoding)guess confidence:(float)confidence
{ return [delegate archive:archive encodingForData:data guess:guess confidence:confidence]; }
{
if ([delegate respondsToSelector:@selector(archive:encodingForData:guess:confidence:)]) {
return [delegate archive:archive encodingForData:data guess:guess confidence:confidence];
} else if ([delegate respondsToSelector:@selector(archive:encodingForName:guess:confidence:)]) {
// Default implementation calls old method
// ...if it's available
NSMutableData *terminateddata=[[NSMutableData alloc] initWithData:data];
[terminateddata increaseLengthBy:1]; // append a 0 byte
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
NSStringEncoding enc=[delegate archive:archive encodingForName:terminateddata.bytes guess:guess confidence:confidence];
#pragma clang diagnostic pop
[terminateddata release];
return enc;
} else {
return guess;
}
}

-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n data:(NSData *)data
{ return [delegate archive:archive nameDecodingDidFailForEntry:n data:data]; }
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(NSInteger)n data:(NSData *)data
{
if ([delegate respondsToSelector:@selector(archive:nameDecodingDidFailForEntry:data:)]) {
return [delegate archive:archive nameDecodingDidFailForEntry:n data:data];
} else if ([delegate respondsToSelector:@selector(archive:nameDecodingDidFailForEntry:bytes:)]) {
// Default implementation calls old method
// ...if it's available
NSMutableData *terminateddata=[[NSMutableData alloc] initWithData:data];
[terminateddata increaseLengthBy:1]; // append a 0 byte
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
XADAction action=[delegate archive:archive nameDecodingDidFailForEntry:n bytes:terminateddata.bytes];
#pragma clang diagnostic pop
[terminateddata release];
return action;
} else {
return XADAbortAction;
}
}

-(BOOL)archiveExtractionShouldStop:(XADArchive *)arc
{ return [delegate archiveExtractionShouldStop:arc]; }
{
if ([delegate respondsToSelector:@selector(archiveExtractionShouldStop:)]) {
return [delegate archiveExtractionShouldStop:arc];
} else {
return NO;
}
}

-(BOOL)archive:(XADArchive *)arc shouldCreateDirectory:(NSString *)directory
{ return [delegate archive:arc shouldCreateDirectory:directory]; }

-(void)archive:(XADArchive *)arc didCreateDirectory:(NSString *)directory
{ [delegate archive:arc didCreateDirectory:directory]; }
{
if ([delegate respondsToSelector:@selector(archive:shouldCreateDirectory:)]) {
return [delegate archive:arc shouldCreateDirectory:directory];
} else {
return YES;
}
}

-(XADAction)archive:(XADArchive *)arc entry:(int)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname
{ return [delegate archive:arc entry:n collidesWithFile:file newFilename:newname]; }
-(XADAction)archive:(XADArchive *)arc entry:(NSInteger)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname
{
if ([delegate respondsToSelector:@selector(archive:entry:collidesWithFile:newFilename:)]) {
return [delegate archive:arc entry:n collidesWithFile:file newFilename:newname];
} else {
return XADOverwriteAction;
}
}

-(XADAction)archive:(XADArchive *)arc entry:(int)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname
{ return [delegate archive:arc entry:n collidesWithDirectory:file newFilename:newname]; }
-(XADAction)archive:(XADArchive *)arc entry:(NSInteger)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname
{
if ([delegate respondsToSelector:@selector(archive:entry:collidesWithDirectory:newFilename:)]) {
return [delegate archive:arc entry:n collidesWithDirectory:file newFilename:newname];
} else {
return XADSkipAction;
}
}

-(XADAction)archive:(XADArchive *)arc creatingDirectoryDidFailForEntry:(int)n
{ return [delegate archive:arc creatingDirectoryDidFailForEntry:n]; }
-(XADAction)archive:(XADArchive *)arc creatingDirectoryDidFailForEntry:(NSInteger)n
{
if ([delegate respondsToSelector:@selector(archive:creatingDirectoryDidFailForEntry:)]) {
return [delegate archive:arc creatingDirectoryDidFailForEntry:n];
} else {
return XADAbortAction;
}
}

-(void)archiveNeedsPassword:(XADArchive *)arc
{ [delegate archiveNeedsPassword:arc]; }

-(void)archive:(XADArchive *)arc extractionOfEntryWillStart:(int)n
{ [delegate archive:arc extractionOfEntryWillStart:n]; }

-(void)archive:(XADArchive *)arc extractionProgressForEntry:(int)n bytes:(off_t)bytes of:(off_t)total
{ [delegate archive:arc extractionProgressForEntry:n bytes:bytes of:total]; }

-(void)archive:(XADArchive *)arc extractionOfEntryDidSucceed:(int)n
{ [delegate archive:arc extractionOfEntryDidSucceed:n]; }

-(XADAction)archive:(XADArchive *)arc extractionOfEntryDidFail:(int)n error:(XADError)error
{ return [delegate archive:arc extractionOfEntryDidFail:n error:error]; }

-(XADAction)archive:(XADArchive *)arc extractionOfResourceForkForEntryDidFail:(int)n error:(XADError)error
{ return [delegate archive:arc extractionOfResourceForkForEntryDidFail:n error:error]; }

-(void)archive:(XADArchive *)arc extractionProgressBytes:(off_t)bytes of:(off_t)total
{ [delegate archive:arc extractionProgressBytes:bytes of:total]; }

//-(void)archive:(XADArchive *)arc extractionProgressFiles:(int)files of:(int)total;
//{}

@end



@implementation NSObject (XADArchiveDelegate)
{
if ([delegate respondsToSelector:@selector(archiveNeedsPassword:)]) {
[delegate archiveNeedsPassword:arc];
}
}

-(NSStringEncoding)archive:(XADArchive *)archive encodingForData:(NSData *)data guess:(NSStringEncoding)guess confidence:(float)confidence
-(void)archive:(XADArchive *)arc extractionOfEntryWillStart:(NSInteger)n
{
// Default implementation calls old method
NSMutableData *terminateddata=[[NSMutableData alloc] initWithData:data];
[terminateddata increaseLengthBy:1]; // append a 0 byte
NSStringEncoding enc=[self archive:archive encodingForName:[terminateddata bytes] guess:guess confidence:confidence];
[terminateddata release];
return enc;
if ([delegate respondsToSelector:@selector(archive:extractionOfEntryWillStart:)]) {
[delegate archive:arc extractionOfEntryWillStart:n];
}
}

-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n data:(NSData *)data
-(void)archive:(XADArchive *)arc extractionProgressForEntry:(NSInteger)n bytes:(off_t)bytes of:(off_t)total
{
// Default implementation calls old method
NSMutableData *terminateddata=[[NSMutableData alloc] initWithData:data];
XADAction action=[self archive:archive nameDecodingDidFailForEntry:n bytes:[terminateddata bytes]];
[terminateddata release];
return action;
if ([delegate respondsToSelector:@selector(archive:extractionProgressForEntry:bytes:of:)]) {
[delegate archive:arc extractionProgressForEntry:n bytes:bytes of:total];
}
}

-(BOOL)archiveExtractionShouldStop:(XADArchive *)archive { return NO; }
-(BOOL)archive:(XADArchive *)archive shouldCreateDirectory:(NSString *)directory { return YES; }
-(void)archive:(XADArchive *)archive didCreateDirectory:(NSString *)directory { }
-(XADAction)archive:(XADArchive *)archive entry:(int)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname { return XADOverwriteAction; }
-(XADAction)archive:(XADArchive *)archive entry:(int)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname { return XADSkipAction; }
-(XADAction)archive:(XADArchive *)archive creatingDirectoryDidFailForEntry:(int)n { return XADAbortAction; }
-(void)archive:(XADArchive *)arc extractionOfEntryDidSucceed:(NSInteger)n
{
if ([delegate respondsToSelector:@selector(archive:extractionOfEntryDidSucceed:)]) {
[delegate archive:arc extractionOfEntryDidSucceed:n];
}
}

-(void)archiveNeedsPassword:(XADArchive *)archive {}
-(XADAction)archive:(XADArchive *)arc extractionOfEntryDidFail:(NSInteger)n error:(XADError)error
{
if ([delegate respondsToSelector:@selector(archive:extractionOfEntryDidFail:error:)]) {
return [delegate archive:arc extractionOfEntryDidFail:n error:error];
} else {
return XADAbortAction;
}
}

-(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 { return XADAbortAction; }
-(XADAction)archive:(XADArchive *)archive extractionOfResourceForkForEntryDidFail:(int)n error:(XADError)error { return XADAbortAction; }
-(XADAction)archive:(XADArchive *)arc extractionOfResourceForkForEntryDidFail:(NSInteger)n error:(XADError)error
{
if ([delegate respondsToSelector:@selector(archive:extractionOfResourceForkForEntryDidFail:error:)]) {
return [delegate archive:arc extractionOfResourceForkForEntryDidFail:n error:error];
} else {
return XADAbortAction;
}
}

-(void)archive:(XADArchive *)archive extractionProgressBytes:(off_t)bytes of:(off_t)total {}
-(void)archive:(XADArchive *)archive extractionProgressFiles:(int)files of:(int)total {}
-(void)archive:(XADArchive *)arc extractionProgressBytes:(off_t)bytes of:(off_t)total
{
if ([delegate respondsToSelector:@selector(archive:extractionProgressBytes:of:)]) {
[delegate archive:arc extractionProgressBytes:bytes of:total];
}
}

// Deprecated
-(NSStringEncoding)archive:(XADArchive *)archive encodingForName:(const char *)bytes guess:(NSStringEncoding)guess confidence:(float)confidence { return guess; }
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n bytes:(const char *)bytes { return XADAbortAction; }
-(void)archive:(XADArchive *)arc extractionProgressFiles:(NSInteger)files of:(NSInteger)total;
{}

@end


Loading

0 comments on commit d1796be

Please sign in to comment.