1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
#import "XADArchiveParser.h"
@interface ArchiveTester:NSObject
{
int indent;
int successcount,unknowncount,dircount,linkcount;
}
@end
@implementation ArchiveTester
-(id)initWithIndentLevel:(int)indentlevel
{
if((self=[super init]))
{
indent=indentlevel;
successcount=unknowncount=dircount=linkcount=0;
}
return self;
}
-(void)done:(XADArchiveParser *)parser
{
for(int i=0;i<indent;i++) printf(" ");
printf("%s (%s): %d successful files, %d unknown files, %d directories, %d links\n",
[[parser name] UTF8String],[[parser formatName] UTF8String],successcount,unknowncount,dircount,linkcount);
}
-(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDictionary *)dict
{
NSNumber *dir=[dict objectForKey:XADIsDirectoryKey];
NSNumber *link=[dict objectForKey:XADIsLinkKey];
CSHandle *fh=nil;
if(dir&&[dir boolValue]) { dircount++; }
else if(link&&[link boolValue]) { linkcount++; }
else
{
fh=[parser handleForEntryWithDictionary:dict wantChecksum:YES];
if(!fh)
{
NSLog(@"Could not obtain handle for entry: %@",dict);
exit(1);
}
else if([fh hasChecksum])
{
[fh seekToEndOfFile];
if([fh isChecksumCorrect]) successcount++;
else
{
NSLog(@"Checksum failure for entry: %@",dict);
exit(1);
}
}
else unknowncount++;
}
NSNumber *arch=[dict objectForKey:XADIsArchiveKey];
if(arch&&[arch boolValue])
{
[fh seekToFileOffset:0];
XADArchiveParser *parser=[XADArchiveParser archiveParserForHandle:fh name:[[dict objectForKey:XADFileNameKey] string]];
ArchiveTester *tester=[[[ArchiveTester alloc] initWithIndentLevel:indent+2] autorelease];
[parser setDelegate:tester];
[parser parse];
[tester done:parser];
}
}
-(BOOL)archiveParsingShouldStop:(XADArchiveParser *)parser
{
return NO;
}
@end
int main(int argc,char **argv)
{
for(int i=1;i<argc;i++)
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
printf("Testing %s...\n",argv[i]);
NSString *filename=[NSString stringWithUTF8String:argv[i]];
XADArchiveParser *parser=[XADArchiveParser archiveParserForPath:filename];
ArchiveTester *tester=[[[ArchiveTester alloc] initWithIndentLevel:2] autorelease];
[parser setDelegate:tester];
char *pass=getenv("XADTestPassword");
if(pass) [parser setPassword:[NSString stringWithUTF8String:pass]];
[parser parse];
[tester done:parser];
[pool release];
}
return 0;
}
|