Skip to content

Commit e12ac73

Browse files
committed
Initial pokes for re-doing how protocols are handled.
1 parent 8945195 commit e12ac73

File tree

10 files changed

+387
-317
lines changed

10 files changed

+387
-317
lines changed

XADArchive.h

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#import "XADUnarchiver.h"
2525
#import "XADException.h"
2626

27+
//TODO: wrap in an emum
2728
typedef int XADAction;
2829
//typedef off_t xadSize; // deprecated
2930

@@ -33,19 +34,52 @@ typedef int XADAction;
3334
#define XADOverwriteAction 3
3435
#define XADRenameAction 4
3536

36-
extern NSString *XADResourceDataKey;
37-
extern NSString *XADResourceForkData;
38-
extern NSString *XADFinderFlags;
37+
extern NSString *const XADResourceDataKey;
38+
extern NSString *const XADResourceForkData;
39+
extern NSString *const XADFinderFlags;
3940

4041

4142
@class UniversalDetector;
43+
@class XADArchive;
44+
@protocol XADArchiveDelegate <NSObject>
45+
@optional
4246

43-
@interface XADArchive:NSObject
47+
-(NSStringEncoding)archive:(XADArchive *)archive encodingForData:(NSData *)data guess:(NSStringEncoding)guess confidence:(float)confidence;
48+
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(NSInteger)n data:(NSData *)data;
49+
50+
-(BOOL)archiveExtractionShouldStop:(XADArchive *)archive;
51+
-(BOOL)archive:(XADArchive *)archive shouldCreateDirectory:(NSString *)directory;
52+
-(void)archive:(XADArchive *)archive didCreateDirectory:(NSString *)directory;
53+
-(XADAction)archive:(XADArchive *)archive entry:(NSInteger)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname;
54+
-(XADAction)archive:(XADArchive *)archive entry:(NSInteger)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname;
55+
-(XADAction)archive:(XADArchive *)archive creatingDirectoryDidFailForEntry:(NSInteger)n;
56+
57+
-(void)archiveNeedsPassword:(XADArchive *)archive;
58+
59+
-(void)archive:(XADArchive *)archive extractionOfEntryWillStart:(NSInteger)n;
60+
-(void)archive:(XADArchive *)archive extractionProgressForEntry:(NSInteger)n bytes:(off_t)bytes of:(off_t)total;
61+
-(void)archive:(XADArchive *)archive extractionOfEntryDidSucceed:(NSInteger)n;
62+
-(XADAction)archive:(XADArchive *)archive extractionOfEntryDidFail:(NSInteger)n error:(XADError)error;
63+
-(XADAction)archive:(XADArchive *)archive extractionOfResourceForkForEntryDidFail:(NSInteger)n error:(XADError)error;
64+
65+
-(void)archive:(XADArchive *)archive extractionProgressBytes:(off_t)bytes of:(off_t)total;
66+
67+
@optional
68+
-(void)archive:(XADArchive *)archive extractionProgressFiles:(NSInteger)files of:(NSInteger)total;
69+
70+
@optional
71+
// Deprecated
72+
-(NSStringEncoding)archive:(XADArchive *)archive encodingForName:(const char *)bytes guess:(NSStringEncoding)guess confidence:(float)confidence DEPRECATED_ATTRIBUTE;
73+
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(NSInteger)n bytes:(const char *)bytes DEPRECATED_ATTRIBUTE;
74+
75+
@end
76+
77+
@interface XADArchive:NSObject <XADArchiveDelegate, XADUnarchiverDelegate, XADArchiveParserDelegate>
4478
{
4579
XADArchiveParser *parser;
4680
XADUnarchiver *unarchiver;
4781

48-
id delegate;
82+
id<XADArchiveDelegate> delegate;
4983
NSTimeInterval update_interval;
5084
XADError lasterror;
5185

@@ -69,13 +103,13 @@ extern NSString *XADFinderFlags;
69103
-(id)init;
70104
-(id)initWithFile:(NSString *)file;
71105
-(id)initWithFile:(NSString *)file error:(XADError *)error;
72-
-(id)initWithFile:(NSString *)file delegate:(id)del error:(XADError *)error;
106+
-(id)initWithFile:(NSString *)file delegate:(id<XADArchiveDelegate>)del error:(XADError *)error;
73107
-(id)initWithData:(NSData *)data;
74108
-(id)initWithData:(NSData *)data error:(XADError *)error;
75-
-(id)initWithData:(NSData *)data delegate:(id)del error:(XADError *)error;
109+
-(id)initWithData:(NSData *)data delegate:(id<XADArchiveDelegate>)del error:(XADError *)error;
76110
-(id)initWithArchive:(XADArchive *)archive entry:(int)n;
77111
-(id)initWithArchive:(XADArchive *)archive entry:(int)n error:(XADError *)error;
78-
-(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n delegate:(id)del error:(XADError *)error;
112+
-(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n delegate:(id<XADArchiveDelegate>)del error:(XADError *)error;
79113
-(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n
80114
immediateExtractionTo:(NSString *)destination error:(XADError *)error;
81115
-(id)initWithArchive:(XADArchive *)otherarchive entry:(int)n
@@ -95,8 +129,8 @@ extern NSString *XADFinderFlags;
95129
-(NSString *)commonTopDirectory;
96130
-(NSString *)comment;
97131

98-
-(void)setDelegate:(id)delegate;
99-
-(id)delegate;
132+
-(void)setDelegate:(id<XADArchiveDelegate>)delegate;
133+
-(id<XADArchiveDelegate>)delegate;
100134

101135
-(NSString *)password;
102136
-(void)setPassword:(NSString *)newpassword;
@@ -167,36 +201,6 @@ dataFork:(BOOL)datafork resourceFork:(BOOL)resfork;
167201
@end
168202

169203

170-
171-
@interface NSObject (XADArchiveDelegate)
172-
173-
-(NSStringEncoding)archive:(XADArchive *)archive encodingForData:(NSData *)data guess:(NSStringEncoding)guess confidence:(float)confidence;
174-
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n data:(NSData *)data;
175-
176-
-(BOOL)archiveExtractionShouldStop:(XADArchive *)archive;
177-
-(BOOL)archive:(XADArchive *)archive shouldCreateDirectory:(NSString *)directory;
178-
-(XADAction)archive:(XADArchive *)archive entry:(int)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname;
179-
-(XADAction)archive:(XADArchive *)archive entry:(int)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname;
180-
-(XADAction)archive:(XADArchive *)archive creatingDirectoryDidFailForEntry:(int)n;
181-
182-
-(void)archiveNeedsPassword:(XADArchive *)archive;
183-
184-
-(void)archive:(XADArchive *)archive extractionOfEntryWillStart:(int)n;
185-
-(void)archive:(XADArchive *)archive extractionProgressForEntry:(int)n bytes:(off_t)bytes of:(off_t)total;
186-
-(void)archive:(XADArchive *)archive extractionOfEntryDidSucceed:(int)n;
187-
-(XADAction)archive:(XADArchive *)archive extractionOfEntryDidFail:(int)n error:(XADError)error;
188-
-(XADAction)archive:(XADArchive *)archive extractionOfResourceForkForEntryDidFail:(int)n error:(XADError)error;
189-
190-
-(void)archive:(XADArchive *)archive extractionProgressBytes:(off_t)bytes of:(off_t)total;
191-
-(void)archive:(XADArchive *)archive extractionProgressFiles:(int)files of:(int)total;
192-
193-
// Deprecated
194-
-(NSStringEncoding)archive:(XADArchive *)archive encodingForName:(const char *)bytes guess:(NSStringEncoding)guess confidence:(float)confidence;
195-
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n bytes:(const char *)bytes;
196-
197-
@end
198-
199-
200204
#ifndef XAD_NO_DEPRECATED
201205

202206
#define XADAbort XADAbortAction

XADArchive.m

Lines changed: 122 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
#import <sys/time.h>
3131

3232

33-
NSString *XADResourceDataKey=@"XADResourceData";
34-
NSString *XADFinderFlags=@"XADFinderFlags";
33+
NSString *const XADResourceDataKey=@"XADResourceData";
34+
NSString *const XADFinderFlags=@"XADFinderFlags";
3535

3636

3737

@@ -81,8 +81,8 @@ -(id)init
8181
immediatesize=0;
8282
parentarchive=nil;
8383

84-
dataentries=[[NSMutableArray array] retain];
85-
resourceentries=[[NSMutableArray array] retain];
84+
dataentries=[[NSMutableArray alloc] init];
85+
resourceentries=[[NSMutableArray alloc] init];
8686
namedict=nil;
8787
}
8888
return self;
@@ -1140,100 +1140,144 @@ -(void)fixWritePermissions { [self updateAttributesForDeferredDirectories]; }
11401140

11411141

11421142
-(NSStringEncoding)archive:(XADArchive *)archive encodingForData:(NSData *)data guess:(NSStringEncoding)guess confidence:(float)confidence
1143-
{ return [delegate archive:archive encodingForData:data guess:guess confidence:confidence]; }
1143+
{
1144+
if ([delegate respondsToSelector:@selector(archive:encodingForData:guess:confidence:)]) {
1145+
return [delegate archive:archive encodingForData:data guess:guess confidence:confidence];
1146+
} else if ([delegate respondsToSelector:@selector(archive:encodingForName:guess:confidence:)]) {
1147+
// Default implementation calls old method
1148+
// ...if it's available
1149+
NSMutableData *terminateddata=[[NSMutableData alloc] initWithData:data];
1150+
[terminateddata increaseLengthBy:1]; // append a 0 byte
1151+
#pragma clang diagnostic push
1152+
#pragma clang diagnostic ignored "-Wdeprecated"
1153+
NSStringEncoding enc=[delegate archive:archive encodingForName:terminateddata.bytes guess:guess confidence:confidence];
1154+
#pragma clang diagnostic pop
1155+
[terminateddata release];
1156+
return enc;
1157+
} else {
1158+
return guess;
1159+
}
1160+
}
11441161

1145-
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n data:(NSData *)data
1146-
{ return [delegate archive:archive nameDecodingDidFailForEntry:n data:data]; }
1162+
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(NSInteger)n data:(NSData *)data
1163+
{
1164+
if ([delegate respondsToSelector:@selector(archive:nameDecodingDidFailForEntry:data:)]) {
1165+
return [delegate archive:archive nameDecodingDidFailForEntry:n data:data];
1166+
} else if ([delegate respondsToSelector:@selector(archive:nameDecodingDidFailForEntry:bytes:)]) {
1167+
// Default implementation calls old method
1168+
// ...if it's available
1169+
NSMutableData *terminateddata=[[NSMutableData alloc] initWithData:data];
1170+
[terminateddata increaseLengthBy:1]; // append a 0 byte
1171+
#pragma clang diagnostic push
1172+
#pragma clang diagnostic ignored "-Wdeprecated"
1173+
XADAction action=[delegate archive:archive nameDecodingDidFailForEntry:n bytes:terminateddata.bytes];
1174+
#pragma clang diagnostic pop
1175+
[terminateddata release];
1176+
return action;
1177+
} else {
1178+
return XADAbortAction;
1179+
}
1180+
}
11471181

11481182
-(BOOL)archiveExtractionShouldStop:(XADArchive *)arc
1149-
{ return [delegate archiveExtractionShouldStop:arc]; }
1183+
{
1184+
if ([delegate respondsToSelector:@selector(archiveExtractionShouldStop:)]) {
1185+
return [delegate archiveExtractionShouldStop:arc];
1186+
} else {
1187+
return NO;
1188+
}
1189+
}
11501190

11511191
-(BOOL)archive:(XADArchive *)arc shouldCreateDirectory:(NSString *)directory
1152-
{ return [delegate archive:arc shouldCreateDirectory:directory]; }
1153-
1154-
-(void)archive:(XADArchive *)arc didCreateDirectory:(NSString *)directory
1155-
{ [delegate archive:arc didCreateDirectory:directory]; }
1192+
{
1193+
if ([delegate respondsToSelector:@selector(archive:shouldCreateDirectory:)]) {
1194+
return [delegate archive:arc shouldCreateDirectory:directory];
1195+
} else {
1196+
return YES;
1197+
}
1198+
}
11561199

1157-
-(XADAction)archive:(XADArchive *)arc entry:(int)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname
1158-
{ return [delegate archive:arc entry:n collidesWithFile:file newFilename:newname]; }
1200+
-(XADAction)archive:(XADArchive *)arc entry:(NSInteger)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname
1201+
{
1202+
if ([delegate respondsToSelector:@selector(archive:entry:collidesWithFile:newFilename:)]) {
1203+
return [delegate archive:arc entry:n collidesWithFile:file newFilename:newname];
1204+
} else {
1205+
return XADOverwriteAction;
1206+
}
1207+
}
11591208

1160-
-(XADAction)archive:(XADArchive *)arc entry:(int)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname
1161-
{ return [delegate archive:arc entry:n collidesWithDirectory:file newFilename:newname]; }
1209+
-(XADAction)archive:(XADArchive *)arc entry:(NSInteger)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname
1210+
{
1211+
if ([delegate respondsToSelector:@selector(archive:entry:collidesWithDirectory:newFilename:)]) {
1212+
return [delegate archive:arc entry:n collidesWithDirectory:file newFilename:newname];
1213+
} else {
1214+
return XADSkipAction;
1215+
}
1216+
}
11621217

1163-
-(XADAction)archive:(XADArchive *)arc creatingDirectoryDidFailForEntry:(int)n
1164-
{ return [delegate archive:arc creatingDirectoryDidFailForEntry:n]; }
1218+
-(XADAction)archive:(XADArchive *)arc creatingDirectoryDidFailForEntry:(NSInteger)n
1219+
{
1220+
if ([delegate respondsToSelector:@selector(archive:creatingDirectoryDidFailForEntry:)]) {
1221+
return [delegate archive:arc creatingDirectoryDidFailForEntry:n];
1222+
} else {
1223+
return XADAbortAction;
1224+
}
1225+
}
11651226

11661227
-(void)archiveNeedsPassword:(XADArchive *)arc
1167-
{ [delegate archiveNeedsPassword:arc]; }
1168-
1169-
-(void)archive:(XADArchive *)arc extractionOfEntryWillStart:(int)n
1170-
{ [delegate archive:arc extractionOfEntryWillStart:n]; }
1171-
1172-
-(void)archive:(XADArchive *)arc extractionProgressForEntry:(int)n bytes:(off_t)bytes of:(off_t)total
1173-
{ [delegate archive:arc extractionProgressForEntry:n bytes:bytes of:total]; }
1174-
1175-
-(void)archive:(XADArchive *)arc extractionOfEntryDidSucceed:(int)n
1176-
{ [delegate archive:arc extractionOfEntryDidSucceed:n]; }
1177-
1178-
-(XADAction)archive:(XADArchive *)arc extractionOfEntryDidFail:(int)n error:(XADError)error
1179-
{ return [delegate archive:arc extractionOfEntryDidFail:n error:error]; }
1180-
1181-
-(XADAction)archive:(XADArchive *)arc extractionOfResourceForkForEntryDidFail:(int)n error:(XADError)error
1182-
{ return [delegate archive:arc extractionOfResourceForkForEntryDidFail:n error:error]; }
1183-
1184-
-(void)archive:(XADArchive *)arc extractionProgressBytes:(off_t)bytes of:(off_t)total
1185-
{ [delegate archive:arc extractionProgressBytes:bytes of:total]; }
1186-
1187-
//-(void)archive:(XADArchive *)arc extractionProgressFiles:(int)files of:(int)total;
1188-
//{}
1189-
1190-
@end
1191-
1192-
1193-
1194-
@implementation NSObject (XADArchiveDelegate)
1228+
{
1229+
if ([delegate respondsToSelector:@selector(archiveNeedsPassword:)]) {
1230+
[delegate archiveNeedsPassword:arc];
1231+
}
1232+
}
11951233

1196-
-(NSStringEncoding)archive:(XADArchive *)archive encodingForData:(NSData *)data guess:(NSStringEncoding)guess confidence:(float)confidence
1234+
-(void)archive:(XADArchive *)arc extractionOfEntryWillStart:(NSInteger)n
11971235
{
1198-
// Default implementation calls old method
1199-
NSMutableData *terminateddata=[[NSMutableData alloc] initWithData:data];
1200-
[terminateddata increaseLengthBy:1]; // append a 0 byte
1201-
NSStringEncoding enc=[self archive:archive encodingForName:[terminateddata bytes] guess:guess confidence:confidence];
1202-
[terminateddata release];
1203-
return enc;
1236+
if ([delegate respondsToSelector:@selector(archive:extractionOfEntryWillStart:)]) {
1237+
[delegate archive:arc extractionOfEntryWillStart:n];
1238+
}
12041239
}
12051240

1206-
-(XADAction)archive:(XADArchive *)archive nameDecodingDidFailForEntry:(int)n data:(NSData *)data
1241+
-(void)archive:(XADArchive *)arc extractionProgressForEntry:(NSInteger)n bytes:(off_t)bytes of:(off_t)total
12071242
{
1208-
// Default implementation calls old method
1209-
NSMutableData *terminateddata=[[NSMutableData alloc] initWithData:data];
1210-
XADAction action=[self archive:archive nameDecodingDidFailForEntry:n bytes:[terminateddata bytes]];
1211-
[terminateddata release];
1212-
return action;
1243+
if ([delegate respondsToSelector:@selector(archive:extractionProgressForEntry:bytes:of:)]) {
1244+
[delegate archive:arc extractionProgressForEntry:n bytes:bytes of:total];
1245+
}
12131246
}
12141247

1215-
-(BOOL)archiveExtractionShouldStop:(XADArchive *)archive { return NO; }
1216-
-(BOOL)archive:(XADArchive *)archive shouldCreateDirectory:(NSString *)directory { return YES; }
1217-
-(void)archive:(XADArchive *)archive didCreateDirectory:(NSString *)directory { }
1218-
-(XADAction)archive:(XADArchive *)archive entry:(int)n collidesWithFile:(NSString *)file newFilename:(NSString **)newname { return XADOverwriteAction; }
1219-
-(XADAction)archive:(XADArchive *)archive entry:(int)n collidesWithDirectory:(NSString *)file newFilename:(NSString **)newname { return XADSkipAction; }
1220-
-(XADAction)archive:(XADArchive *)archive creatingDirectoryDidFailForEntry:(int)n { return XADAbortAction; }
1248+
-(void)archive:(XADArchive *)arc extractionOfEntryDidSucceed:(NSInteger)n
1249+
{
1250+
if ([delegate respondsToSelector:@selector(archive:extractionOfEntryDidSucceed:)]) {
1251+
[delegate archive:arc extractionOfEntryDidSucceed:n];
1252+
}
1253+
}
12211254

1222-
-(void)archiveNeedsPassword:(XADArchive *)archive {}
1255+
-(XADAction)archive:(XADArchive *)arc extractionOfEntryDidFail:(NSInteger)n error:(XADError)error
1256+
{
1257+
if ([delegate respondsToSelector:@selector(archive:extractionOfEntryDidFail:error:)]) {
1258+
return [delegate archive:arc extractionOfEntryDidFail:n error:error];
1259+
} else {
1260+
return XADAbortAction;
1261+
}
1262+
}
12231263

1224-
-(void)archive:(XADArchive *)archive extractionOfEntryWillStart:(int)n {}
1225-
-(void)archive:(XADArchive *)archive extractionProgressForEntry:(int)n bytes:(off_t)bytes of:(off_t)total {}
1226-
-(void)archive:(XADArchive *)archive extractionOfEntryDidSucceed:(int)n {}
1227-
-(XADAction)archive:(XADArchive *)archive extractionOfEntryDidFail:(int)n error:(XADError)error { return XADAbortAction; }
1228-
-(XADAction)archive:(XADArchive *)archive extractionOfResourceForkForEntryDidFail:(int)n error:(XADError)error { return XADAbortAction; }
1264+
-(XADAction)archive:(XADArchive *)arc extractionOfResourceForkForEntryDidFail:(NSInteger)n error:(XADError)error
1265+
{
1266+
if ([delegate respondsToSelector:@selector(archive:extractionOfResourceForkForEntryDidFail:error:)]) {
1267+
return [delegate archive:arc extractionOfResourceForkForEntryDidFail:n error:error];
1268+
} else {
1269+
return XADAbortAction;
1270+
}
1271+
}
12291272

1230-
-(void)archive:(XADArchive *)archive extractionProgressBytes:(off_t)bytes of:(off_t)total {}
1231-
-(void)archive:(XADArchive *)archive extractionProgressFiles:(int)files of:(int)total {}
1273+
-(void)archive:(XADArchive *)arc extractionProgressBytes:(off_t)bytes of:(off_t)total
1274+
{
1275+
if ([delegate respondsToSelector:@selector(archive:extractionProgressBytes:of:)]) {
1276+
[delegate archive:arc extractionProgressBytes:bytes of:total];
1277+
}
1278+
}
12321279

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

12371283
@end
1238-
1239-

0 commit comments

Comments
 (0)