11#import " SSYResourceForks.h"
22
3+ @interface SSYResourceForks ()
4+
5+ @property (retain ) NSMutableString * xmlString ;
6+
7+ @end
8+
39
410@implementation SSYResourceForks
511
6- + (NSArray *)weblocFilenamesAndUrlsInPaths : (NSArray *)paths {
12+ @synthesize xmlString = m_xmlString ;
13+
14+ - (void )dealloc {
15+ [m_xmlString release ] ;
16+
17+ [super dealloc ] ;
18+ }
19+
20+ - (void ) parser : (NSXMLParser *)parser
21+ didStartElement : (NSString *)elementName
22+ namespaceURI : (NSString *)namespaceURI
23+ qualifiedName : (NSString *)qualifiedName
24+ attributes : (NSDictionary *)attributeDict {
25+ if ([elementName isEqualToString: @" string" ]) {
26+ // The contents are collected in parser:foundCharacters:.
27+ m_accumulatingUrl = YES ;
28+ // The mutable string needs to be reset to empty.
29+ [[self xmlString ] setString: @" " ] ;
30+ }
31+ }
32+
33+ - (void )parser : (NSXMLParser *)parser
34+ didEndElement : (NSString *)elementName
35+ namespaceURI : (NSString *)namespaceURI
36+ qualifiedName : (NSString *)qName {
37+ m_accumulatingUrl = NO ;
38+ }
39+
40+ - (void ) parser : (NSXMLParser *)parser
41+ foundCharacters : (NSString *)string {
42+
43+ if (m_accumulatingUrl) {
44+ // If the current element is one whose content we care about, append 'string'
45+ // to the property that holds the content of the current element.
46+ //
47+ [[self xmlString ] appendString: string] ;
48+ }
49+ }
50+
51+ #if 0
52+ - (void) parser:(NSXMLParser*)parser
53+ parseErrorOccurred:(NSError*)error {
54+ //NSLog(@"Found error in XML: %@", error) ;
55+ }
56+ #endif
57+
58+ - (NSArray *)weblocFilenamesAndUrlsInPaths : (NSArray *)paths {
759 OSErr err ;
860 FSRef fsRef ;
961 NSInteger fileRef ;
1062 NSMutableArray * filenamesAndURLs = [NSMutableArray array ] ;
1163
1264 for (NSString * path in paths) {
13- err = !noErr ;
65+ NSString * url = nil ;
66+
67+ err = !noErr ;
1468
1569 // Try and open resource fork for path
1670 if ( [[NSFileManager defaultManager ] fileExistsAtPath: path] )
@@ -23,8 +77,7 @@ + (NSArray*)weblocFilenamesAndUrlsInPaths:(NSArray*)paths {
2377 err = fileRef > 0 ? ResError ( ) : !noErr;
2478 }
2579
26- if (err == noErr)
27- {
80+ if (err == noErr) {
2881 UseResFile (fileRef) ;
2982 Handle aResHandle = NULL ;
3083 aResHandle = Get1Resource ( ' TEXT' , 256 ) ;
@@ -41,7 +94,33 @@ + (NSArray*)weblocFilenamesAndUrlsInPaths:(NSArray*)paths {
4194 CloseResFile (fileRef) ;
4295
4396 // theData is the 'TEXT' resource data
44- NSString *url = [[NSString alloc ] initWithData: theData encoding: kCFStringEncodingMacRoman ] ;
97+ url = [[[NSString alloc ] initWithData: theData
98+ encoding: NSUTF8StringEncoding] autorelease ] ;
99+ }
100+ else {
101+ // NSLog(@"Reading resource fork failed with OSErr %ld", (long)err) ;
102+ NSData * data = [NSData dataWithContentsOfFile: path] ;
103+ if (data) {
104+ NSXMLParser * parser = [[NSXMLParser alloc ] initWithData: data] ;
105+ [parser setDelegate: self ] ;
106+ NSMutableString * xmlString = [[NSMutableString alloc ] init ] ;
107+ [self setXmlString: xmlString] ;
108+ [xmlString release ] ;
109+
110+ [parser parse ] ;
111+ // Note that -parse is synchronous and will not return until the parsing
112+ // is done or aborted.
113+ [parser release ] ;
114+
115+ url = [self xmlString ] ;
116+
117+ // Not really necessary, but for resource usage efficiency we
118+ // release xmlString here instead of in -dealloc…
119+ [self setXmlString: nil ] ;
120+ }
121+ }
122+
123+ if (url) {
45124 NSString * filename = [[path lastPathComponent ] stringByDeletingPathExtension ] ;
46125
47126 NSDictionary * filenameAndURL = [NSDictionary dictionaryWithObjectsAndKeys:
@@ -50,11 +129,7 @@ + (NSArray*)weblocFilenamesAndUrlsInPaths:(NSArray*)paths {
50129 nil ] ;
51130
52131 [filenamesAndURLs addObject: filenameAndURL] ;
53-
54- [url release ] ;
55- }
56- else
57- NSLog (@" Reading resource fork failed with OSErr %ld " , (long )err) ;
132+ }
58133 }
59134
60135 if ([filenamesAndURLs count ])
@@ -63,4 +138,12 @@ + (NSArray*)weblocFilenamesAndUrlsInPaths:(NSArray*)paths {
63138 return nil ;
64139}
65140
141+ + (NSArray *)weblocFilenamesAndUrlsInPaths : (NSArray *)paths {
142+ SSYResourceForks* instance = [[SSYResourceForks alloc ] init ] ;
143+ NSArray * answer = [instance weblocFilenamesAndUrlsInPaths: paths] ;
144+ [instance release ] ;
145+
146+ return answer ;
147+ }
148+
66149@end
0 commit comments