File: XADTest2.m

package info (click to toggle)
unar 1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 6,664 kB
  • sloc: ansic: 52,939; objc: 39,563; cpp: 4,074; makefile: 99; perl: 10
file content (86 lines) | stat: -rw-r--r-- 2,195 bytes parent folder | download
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
#import "XADArchiveParser.h"
#import "CRC.h"

@interface TestDelegate:NSObject
{
	int count;
}
@end

@implementation TestDelegate

-(id)init
{
	if((self=[super init]))
	{
		count=0;
	}
	return self;
}

-(void)archiveParser:(XADArchiveParser *)parser foundEntryWithDictionary:(NSDictionary *)dict
{
	NSLog(@"Entry %d: %@",count++,dict);

	CSHandle *fh=[parser handleForEntryWithDictionary:dict wantChecksum:YES];

	NSData *data=[fh remainingFileContents];
/*
//	if(![dict objectForKey:XADIsResourceForkKey])
	if([[[dict objectForKey:XADCompressionNameKey] string] isEqual:@"LZMA+BCJ"])
	{
		NSMutableString *name=[NSMutableString stringWithString:[[dict objectForKey:XADFileNameKey] string]];
		[name replaceOccurrencesOfString:@"/" withString:@"_" options:0 range:NSMakeRange(0,[name length])];
		[data writeToFile:name atomically:YES];
	}
*/

	uint32_t crc=0;
	uint8_t xor=0;

	const uint8_t *bytes=[data bytes];
	int length=[data length];
	if(bytes)
	{
		crc=XADCalculateCRC(0xffffffff,bytes,length,XADCRCTable_edb88320)^0xffffffff;
		for(int i=0;i<length;i++) xor^=bytes[i];
	}

	NSLog(@"Checksum: %@, Length: %qd, CRC32: %08x, XOR: 0x%02x (%d)",
	[fh hasChecksum]?[fh isChecksumCorrect]?@"Correct":@"Incorrect":@"Unknown",
	(uint64_t)[data length],crc,xor,xor);

	NSLog(@"\n%@",[data subdataWithRange:NSMakeRange(0,[data length]<256?[data length]:256)]);
}

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

		NSString *filename=[NSString stringWithUTF8String:argv[i]];
		XADArchiveParser *parser=[XADArchiveParser archiveParserForPath:filename];

		NSLog(@"Parsing file \"%@\" with parser \"%@\".",filename,[parser formatName]);

		[parser setDelegate:[[TestDelegate new] autorelease]];

		char *pass=getenv("XADTestPassword");
		if(pass) [parser setPassword:[NSString stringWithUTF8String:pass]];

		NSLog(@"Archive format: \"%@\", properties: %@",[parser formatName],[parser properties]);
		[parser parse];
		NSLog(@"Archive format: \"%@\", properties: %@",[parser formatName],[parser properties]);

		[pool release];
	}
	return 0;
}