update dev300-m58
[ooovba.git] / extensions / source / macosx / spotlight / OOoMetaDataParser.m
blobdd21a00f1f808773c0eefdc1eb7a9ab99a751f98
1 /*************************************************************************
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  * 
5  * Copyright 2008 by Sun Microsystems, Inc.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * $RCSfile: OOoMetaDataParser.m,v $
10  * $Revision: 1.3 $
11  *
12  * This file is part of OpenOffice.org.
13  *
14  * OpenOffice.org is free software: you can redistribute it and/or modify
15  * it under the terms of the GNU Lesser General Public License version 3
16  * only, as published by the Free Software Foundation.
17  *
18  * OpenOffice.org is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU Lesser General Public License version 3 for more details
22  * (a copy is included in the LICENSE file that accompanied this code).
23  *
24  * You should have received a copy of the GNU Lesser General Public License
25  * version 3 along with OpenOffice.org.  If not, see
26  * <http://www.openoffice.org/license.html>
27  * for a copy of the LGPLv3 License.
28  *
29 *************************************************************************/
31 #import "OOoMetaDataParser.h"
33 static NSSet *singleValueXMLElements;
34 static NSSet *multiValueXMLElements;
35 static NSDictionary *metaXML2MDIKeys;
37 @implementation OOoMetaDataParser
39 + (void)initialize
41     static BOOL isInitialized = NO;
42     
43     if (isInitialized == NO) {
44         //set up the meta elements with only one value
45         NSMutableSet *temp = [NSMutableSet new];
46         [temp addObject:@"dc:title"];
47         [temp addObject:@"dc:description"];
48         [temp addObject:@"meta:user-defined"];
49         singleValueXMLElements = [[NSSet setWithSet:temp] retain];
50         
51         //set up the meta elements that can have more than one value
52         [temp removeAllObjects];
53         [temp addObject:@"dc:subject"];
54         [temp addObject:@"meta:keyword"];
55         [temp addObject:@"meta:initial-creator"];
56         [temp addObject:@"dc:creator"];
57         multiValueXMLElements = [[NSSet setWithSet:temp] retain];
58         [temp release];
59         
60         //set up the map to store the values with the correct MDI keys
61         NSMutableDictionary *tempDict = [NSMutableDictionary new];
62         [tempDict setObject:(NSString*)kMDItemTitle forKey:@"dc:title"];
63         [tempDict setObject:(NSString*)kMDItemDescription forKey:@"dc:description"];
64         [tempDict setObject:(NSString*)kMDItemKeywords forKey:@"dc:subject"];
65         [tempDict setObject:(NSString*)kMDItemAuthors forKey:@"meta:initial-creator"];
66         [tempDict setObject:(NSString*)kMDItemAuthors forKey:@"dc:creator"];
67         [tempDict setObject:(NSString*)kMDItemKeywords forKey:@"meta:keyword"];
68         [tempDict setObject:@"org_openoffice_opendocument_custominfo1" forKey:@"Info 1"];
69         [tempDict setObject:@"org_openoffice_opendocument_custominfo2" forKey:@"Info 2"];
70         [tempDict setObject:@"org_openoffice_opendocument_custominfo3" forKey:@"Info 3"];
71         [tempDict setObject:@"org_openoffice_opendocument_custominfo4" forKey:@"Info 4"];
72         metaXML2MDIKeys = [[NSDictionary dictionaryWithDictionary:tempDict] retain];
73         [tempDict release];
74         
75         isInitialized = YES;
76     }
79 - (id)init
81     if ((self = [super init]) != nil) {
82         shouldReadCharacters = NO;
83 //        currentElement = nil;
84         textCurrentElement = nil;
85         
86         return self;
87     }
88     
89     return nil;
92 - (void)parseXML:(NSData*)data intoDictionary:(NSMutableDictionary*)dict
94     metaValues = dict;
95     
96     //NSLog(@"data: %@ %d", data, [data length]);
97         
98     //init parser settings
99     shouldReadCharacters = NO;
100     
101     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
102     
103     [parser setDelegate:self];
104     [parser setShouldResolveExternalEntities:NO];
105     [parser parse];
106     
107     [parser release];
108     
109     //NSLog(@"finished parsing meta");
112 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
114 //    NSLog(@"<%@>", elementName);
115     if ([singleValueXMLElements containsObject:elementName] == YES) {
116         shouldReadCharacters = YES;
117     } else if ([multiValueXMLElements containsObject:elementName] == YES) {
118         shouldReadCharacters = YES;
119     } else {
120         //we are not interested in this element
121         shouldReadCharacters = NO;
122         return;
123     }
124     
125     if (shouldReadCharacters == YES) {
126         textCurrentElement = [NSMutableString new];
127         isCustom = [elementName isEqualToString:@"meta:user-defined"];
128         if (isCustom == YES) {
129             customAttribute = [[attributeDict objectForKey:@"meta:name"] retain];
130             //NSLog(customAttribute);
131         }
132     }
134     //NSLog(@"start element %@", elementName);
137 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
139 //    NSLog(@"</%@>", elementName);
140     if (shouldReadCharacters == YES) {
141         NSString *mdiName = nil;
142         if (isCustom == YES) {
143             mdiName = (NSString*)[metaXML2MDIKeys objectForKey:customAttribute];
144         } else {
145             mdiName = (NSString*)[metaXML2MDIKeys objectForKey:elementName];
146         }
147         //NSLog(@"mdiName: %@", mdiName);
148         
149         if (mdiName == nil) {
150             return;
151         }
152         
153         if ([singleValueXMLElements containsObject:elementName] == YES) {
154             [metaValues setObject:textCurrentElement forKey:mdiName];
155         } else {
156             // must be multi-value
157             NSMutableArray *arr = [metaValues objectForKey:mdiName];
158             if (arr == nil) {
159                 // we have no array yet, create it
160                 arr = [[NSMutableArray new] autorelease];
161                 // and store it
162                 [metaValues setObject:arr forKey:mdiName];
163             }
164             // only store an element once, no need for duplicates
165             if ([arr containsObject:textCurrentElement] == NO) {
166                 [arr addObject:textCurrentElement];
167             }
168         }
169         // cleanup part 1
170         [textCurrentElement release];
171         if (customAttribute != nil) {
172             [customAttribute release];
173         }
174     }
175     
176     //cleanup part 2
177     shouldReadCharacters = NO;
178     isCustom = NO;
181 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
183 //    NSLog(@"%@", string);
184     if (shouldReadCharacters == NO) {
185         return;
186     }
187     
188     // this delegate method might be called several times for a single element, 
189     // so we have to collect the received data
190     [textCurrentElement appendString:string];
191     
192     //NSLog(@"chars read: %@", string);
195 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
197     //NSLog(@"parsing finished with error");
198     NSLog([NSString stringWithFormat:@"Error %i, Description: %@, Line: %i, Column: %i", [parseError code], 
199         [[parser parserError] localizedDescription], [parser lineNumber],
200         [parser columnNumber]]);
203 @end