summaryrefslogtreecommitdiffstats
path: root/extensions/source/macosx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/macosx')
-rw-r--r--extensions/source/macosx/spotlight/GetMetadataForFile.h29
-rw-r--r--extensions/source/macosx/spotlight/GetMetadataForFile.m64
-rw-r--r--extensions/source/macosx/spotlight/OOoContentDataParser.h51
-rw-r--r--extensions/source/macosx/spotlight/OOoContentDataParser.m149
-rw-r--r--extensions/source/macosx/spotlight/OOoMetaDataParser.h46
-rw-r--r--extensions/source/macosx/spotlight/OOoMetaDataParser.m209
-rw-r--r--extensions/source/macosx/spotlight/OOoSpotlightImporter.h34
-rw-r--r--extensions/source/macosx/spotlight/OOoSpotlightImporter.m487
-rw-r--r--extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/.gitignore1
-rw-r--r--extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/project.pbxproj308
-rw-r--r--extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/xcshareddata/xcschemes/SpotlightImporterTester.xcscheme88
-rw-r--r--extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester/main.m30
-rw-r--r--extensions/source/macosx/spotlight/main.m211
-rw-r--r--extensions/source/macosx/spotlight/mdimporter/Info.plist87
-rw-r--r--extensions/source/macosx/spotlight/mdimporter/en.lproj/schema.strings1
-rw-r--r--extensions/source/macosx/spotlight/mdimporter/schema.xml413
-rw-r--r--extensions/source/macosx/spotlight/version.plist33
17 files changed, 2241 insertions, 0 deletions
diff --git a/extensions/source/macosx/spotlight/GetMetadataForFile.h b/extensions/source/macosx/spotlight/GetMetadataForFile.h
new file mode 100644
index 000000000..e0447f082
--- /dev/null
+++ b/extensions/source/macosx/spotlight/GetMetadataForFile.h
@@ -0,0 +1,29 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_EXTENSIONS_SOURCE_MACOSX_SPOTLIGHT_GETMETADATAFORFILE_H
+#define INCLUDED_EXTENSIONS_SOURCE_MACOSX_SPOTLIGHT_GETMETADATAFORFILE_H
+
+Boolean GetMetadataForFile(
+ void * thisInterface, CFMutableDictionaryRef attributes,
+ CFStringRef contentTypeUTI, CFStringRef pathToFile);
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/GetMetadataForFile.m b/extensions/source/macosx/spotlight/GetMetadataForFile.m
new file mode 100644
index 000000000..a1dcdbe61
--- /dev/null
+++ b/extensions/source/macosx/spotlight/GetMetadataForFile.m
@@ -0,0 +1,64 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreServices/CoreServices.h>
+#include <Foundation/Foundation.h>
+
+#include "GetMetadataForFile.h"
+#import "OOoSpotlightImporter.h"
+
+/* -----------------------------------------------------------------------------
+ Get metadata attributes from file
+
+ This function's job is to extract useful information your file format supports
+ and return it as a dictionary
+ ----------------------------------------------------------------------------- */
+
+Boolean GetMetadataForFile(void* thisInterface,
+ CFMutableDictionaryRef attributes,
+ CFStringRef contentTypeUTI,
+ CFStringRef pathToFile)
+{
+ (void) thisInterface; /* unused */
+ /* Pull any available metadata from the file at the specified path */
+ /* Return the attribute keys and attribute values in the dict */
+ /* Return TRUE if successful, FALSE if there was no data provided */
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ OOoSpotlightImporter *importer = [OOoSpotlightImporter new];
+
+ Boolean importOK = NO;
+ @try {
+ importOK = [importer importDocument:(NSString*)pathToFile
+ contentType:(NSString*)contentTypeUTI
+ attributes:(NSMutableDictionary*)attributes];
+ }
+ @catch (NSException *exception) {
+ NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
+ }
+
+ [importer release];
+
+ [pool release];
+
+ return importOK;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/OOoContentDataParser.h b/extensions/source/macosx/spotlight/OOoContentDataParser.h
new file mode 100644
index 000000000..7112497cf
--- /dev/null
+++ b/extensions/source/macosx/spotlight/OOoContentDataParser.h
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#import <Cocoa/Cocoa.h>
+
+@interface OOoContentDataParser : NSObject {
+ // indicates if we are interested in an element's content
+ BOOL shouldReadCharacters;
+
+ // the MD importer's values
+ NSMutableDictionary *mdiValues;
+
+ // all of the text inside a document
+ NSMutableString *textContent;
+
+ // the current element's content
+ NSMutableString *runningTextContent;
+}
+
+- (void)parseXML:(NSData*)data intoDictionary:(NSMutableDictionary*)dict;
+
+// delegates
+- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict;
+
+- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
+
+- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
+
+- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;
+
+- (void)parserDidEndDocument:(NSXMLParser *)parser;
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/OOoContentDataParser.m b/extensions/source/macosx/spotlight/OOoContentDataParser.m
new file mode 100644
index 000000000..d3ecf16ff
--- /dev/null
+++ b/extensions/source/macosx/spotlight/OOoContentDataParser.m
@@ -0,0 +1,149 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <objc/objc-runtime.h>
+
+#import "OOoContentDataParser.h"
+
+@implementation OOoContentDataParser
+
+- (id)init
+{
+ if ((self = [super init]) != nil) {
+ shouldReadCharacters = NO;
+ textContent = nil;
+ runningTextContent = nil;
+
+ return self;
+ }
+
+ return nil;
+}
+
+- (void)parseXML:(NSData*)data intoDictionary:(NSMutableDictionary*)dict
+{
+ mdiValues = dict;
+
+ //NSLog(@"data: %@ %d", data, [data length]);
+
+ //init parser settings
+ shouldReadCharacters = NO;
+
+ NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
+
+ // Once again...
+ // class 'OOoContentDataParser' does not implement the 'NSXMLParserDelegate' protocol
+ // So instead of this:
+ // [parser setDelegate:self];
+ // do this:
+ ((id (*)(id, SEL, ...))objc_msgSend)(parser, @selector(setDelegate:), self);
+
+ [parser setShouldResolveExternalEntities:NO];
+ [parser parse];
+
+ [parser release];
+
+ //NSLog(@"finished");
+}
+
+- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
+{
+ (void) parser; // unused
+ (void) namespaceURI; // FIXME this should not be ignored but should be used
+ // instead of text: prefix in the comparison below!
+ (void) qualifiedName; // unused
+ (void) attributeDict; // unused
+ // all text content is stored inside <text:p> elements
+ if ([elementName isEqualToString:@"text:p"] == YES) {
+ runningTextContent = [NSMutableString new];
+ shouldReadCharacters = YES;
+ //NSLog(@"start");
+ } else {
+ return;
+ }
+
+ //NSLog(@"start element %@", elementName);
+}
+
+- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
+{
+ (void) parser; // unused
+ (void) elementName; // unused
+ (void) namespaceURI; // unused
+ (void) qName; // unused
+ if (shouldReadCharacters == TRUE) {
+ if (textContent == nil) {
+ textContent = [NSMutableString new];
+ } else if ([runningTextContent isEqualToString:@""] == NO) {
+ // separate by whitespace
+ [textContent appendString:@" "];
+ }
+ //NSLog(@"end");
+
+ [textContent appendString:[NSString stringWithString:runningTextContent]];
+ [runningTextContent release];
+ runningTextContent = nil;
+ }
+ shouldReadCharacters = NO;
+}
+
+- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
+{
+ (void) parser; // unused
+ if (shouldReadCharacters == NO) {
+ return;
+ }
+ //NSLog(string);
+
+ [runningTextContent appendString:string];
+
+ //NSLog(@"read: %@", string);
+
+}
+
+- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
+{
+ //NSLog(@"parsing finished with error");
+ NSLog(@"An error occurred parsing the document. (Error %li, Description: %@, Line: %li, Column: %li)", (long) [parseError code],
+ [[parser parserError] localizedDescription], (long) [parser lineNumber],
+ (long) [parser columnNumber]);
+
+ if (runningTextContent != nil) {
+ [runningTextContent release];
+ runningTextContent = nil;
+ }
+ if (textContent != nil) {
+ [textContent release];
+ textContent = nil;
+ }
+}
+
+- (void)parserDidEndDocument:(NSXMLParser *)parser
+{
+ (void) parser; // unused
+ if (textContent != nil && [textContent length] > 0) {
+ [mdiValues setObject:[NSString stringWithString:textContent] forKey:(NSString*)kMDItemTextContent];
+ [textContent release];
+ textContent = nil;
+ }
+}
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/OOoMetaDataParser.h b/extensions/source/macosx/spotlight/OOoMetaDataParser.h
new file mode 100644
index 000000000..5db7634cc
--- /dev/null
+++ b/extensions/source/macosx/spotlight/OOoMetaDataParser.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface OOoMetaDataParser : NSObject {
+ //indicates if content should be read
+ BOOL shouldReadCharacters;
+ //indicates if the current element is a custom metadata tag
+ BOOL isCustom;
+
+ NSMutableDictionary *metaValues;
+ NSMutableString *textCurrentElement;
+ NSString *customAttribute;
+}
+
+- (void)parseXML:(NSData*)data intoDictionary:(NSMutableDictionary*)dict;
+
+//delegates
+- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict;
+
+- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
+
+- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
+
+- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/OOoMetaDataParser.m b/extensions/source/macosx/spotlight/OOoMetaDataParser.m
new file mode 100644
index 000000000..2b4dac82c
--- /dev/null
+++ b/extensions/source/macosx/spotlight/OOoMetaDataParser.m
@@ -0,0 +1,209 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <objc/objc-runtime.h>
+
+#import "OOoMetaDataParser.h"
+
+static NSSet *singleValueXMLElements;
+static NSSet *multiValueXMLElements;
+static NSDictionary *metaXML2MDIKeys;
+
+@implementation OOoMetaDataParser
+
++ (void)initialize
+{
+ static BOOL isInitialized = NO;
+
+ if (isInitialized == NO) {
+ //set up the meta elements with only one value
+ NSMutableSet *temp = [NSMutableSet new];
+//FIXME these should use namespace URIs and not prefixes
+ [temp addObject:@"dc:title"];
+ [temp addObject:@"dc:description"];
+ [temp addObject:@"meta:user-defined"];
+ singleValueXMLElements = [[NSSet setWithSet:temp] retain];
+
+ //set up the meta elements that can have more than one value
+ [temp removeAllObjects];
+ [temp addObject:@"dc:subject"];
+ [temp addObject:@"meta:keyword"];
+ [temp addObject:@"meta:initial-creator"];
+ [temp addObject:@"dc:creator"];
+ multiValueXMLElements = [[NSSet setWithSet:temp] retain];
+ [temp release];
+
+ //set up the map to store the values with the correct MDI keys
+ NSMutableDictionary *tempDict = [NSMutableDictionary new];
+ [tempDict setObject:(NSString*)kMDItemTitle forKey:@"dc:title"];
+ [tempDict setObject:(NSString*)kMDItemDescription forKey:@"dc:description"];
+ [tempDict setObject:(NSString*)kMDItemKeywords forKey:@"dc:subject"];
+ [tempDict setObject:(NSString*)kMDItemAuthors forKey:@"meta:initial-creator"];
+ [tempDict setObject:(NSString*)kMDItemAuthors forKey:@"dc:creator"];
+ [tempDict setObject:(NSString*)kMDItemKeywords forKey:@"meta:keyword"];
+ [tempDict setObject:@"org_openoffice_opendocument_custominfo1" forKey:@"Info 1"];
+ [tempDict setObject:@"org_openoffice_opendocument_custominfo2" forKey:@"Info 2"];
+ [tempDict setObject:@"org_openoffice_opendocument_custominfo3" forKey:@"Info 3"];
+ [tempDict setObject:@"org_openoffice_opendocument_custominfo4" forKey:@"Info 4"];
+ metaXML2MDIKeys = [[NSDictionary dictionaryWithDictionary:tempDict] retain];
+ [tempDict release];
+
+ isInitialized = YES;
+ }
+}
+
+- (id)init
+{
+ if ((self = [super init]) != nil) {
+ shouldReadCharacters = NO;
+ textCurrentElement = nil;
+
+ return self;
+ }
+
+ return nil;
+}
+
+- (void)parseXML:(NSData*)data intoDictionary:(NSMutableDictionary*)dict
+{
+ metaValues = dict;
+
+ //NSLog(@"data: %@ %d", data, [data length]);
+
+ //init parser settings
+ shouldReadCharacters = NO;
+
+ NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
+
+ // class 'OOoMetaDataParser' does not implement the 'NSXMLParserDelegate' protocol
+ // So instead of this:
+ // [parser setDelegate:self];
+ // do this:
+ ((id (*)(id, SEL, ...))objc_msgSend)(parser, @selector(setDelegate:), self);
+
+ [parser setShouldResolveExternalEntities:NO];
+ [parser parse];
+
+ [parser release];
+
+ //NSLog(@"finished parsing meta");
+}
+
+- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
+{
+ (void) parser; // unused
+ (void) namespaceURI; // FIXME this should not be ignored but should be used
+ // instead of meta: prefix in the comparison below!
+ (void) qualifiedName; // unused
+// NSLog(@"<%@>", elementName);
+ if ([singleValueXMLElements containsObject:elementName] == YES) {
+ shouldReadCharacters = YES;
+ } else if ([multiValueXMLElements containsObject:elementName] == YES) {
+ shouldReadCharacters = YES;
+ } else {
+ //we are not interested in this element
+ shouldReadCharacters = NO;
+ return;
+ }
+
+ if (shouldReadCharacters == YES) {
+ textCurrentElement = [NSMutableString new];
+ isCustom = [elementName isEqualToString:@"meta:user-defined"];
+ if (isCustom == YES) {
+ customAttribute = [[attributeDict objectForKey:@"meta:name"] retain];
+ //NSLog(customAttribute);
+ }
+ }
+
+ //NSLog(@"start element %@", elementName);
+}
+
+- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
+{
+ (void) parser; // unused
+ (void) namespaceURI; // unused
+ (void) qName; // unused
+// NSLog(@"</%@>", elementName);
+ if (shouldReadCharacters == YES) {
+ NSString *mdiName = nil;
+ if (isCustom == YES) {
+ mdiName = (NSString*)[metaXML2MDIKeys objectForKey:customAttribute];
+ } else {
+ mdiName = (NSString*)[metaXML2MDIKeys objectForKey:elementName];
+ }
+ //NSLog(@"mdiName: %@", mdiName);
+
+ if (mdiName == nil) {
+ return;
+ }
+
+ if ([singleValueXMLElements containsObject:elementName] == YES) {
+ [metaValues setObject:textCurrentElement forKey:mdiName];
+ } else {
+ // must be multi-value
+ NSMutableArray *arr = [metaValues objectForKey:mdiName];
+ if (arr == nil) {
+ // we have no array yet, create it
+ arr = [[NSMutableArray new] autorelease];
+ // and store it
+ [metaValues setObject:arr forKey:mdiName];
+ }
+ // only store an element once, no need for duplicates
+ if ([arr containsObject:textCurrentElement] == NO) {
+ [arr addObject:textCurrentElement];
+ }
+ }
+ // cleanup part 1
+ [textCurrentElement release];
+ if (isCustom == YES) {
+ [customAttribute release];
+ }
+ }
+
+ //cleanup part 2
+ shouldReadCharacters = NO;
+ isCustom = NO;
+}
+
+- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
+{
+ (void) parser; // unused
+// NSLog(@"%@", string);
+ if (shouldReadCharacters == NO) {
+ return;
+ }
+
+ // this delegate method might be called several times for a single element,
+ // so we have to collect the received data
+ [textCurrentElement appendString:string];
+
+ //NSLog(@"chars read: %@", string);
+}
+
+- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
+{
+ //NSLog(@"parsing finished with error");
+ NSLog(@"Error %li, Description: %@, Line: %li, Column: %li", (long) [parseError code],
+ [[parser parserError] localizedDescription], (long) [parser lineNumber],
+ (long) [parser columnNumber]);
+}
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/OOoSpotlightImporter.h b/extensions/source/macosx/spotlight/OOoSpotlightImporter.h
new file mode 100644
index 000000000..c00007832
--- /dev/null
+++ b/extensions/source/macosx/spotlight/OOoSpotlightImporter.h
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#import <Cocoa/Cocoa.h>
+
+@interface OOoSpotlightImporter : NSObject {
+}
+
+- (BOOL)importDocument:(NSString*)pathToFile contentType:(NSString*)contentTypeUTI attributes:(NSMutableDictionary*)attributes;
+
+- (NSFileHandle*)openZipFileAtPath:(NSString*)pathToFile;
+
+- (NSData*)metaDataFileFromZip:(NSFileHandle*)unzipFile;
+
+- (NSData*)contentDataFileFromZip:(NSFileHandle*)unzipFile;
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/OOoSpotlightImporter.m b/extensions/source/macosx/spotlight/OOoSpotlightImporter.m
new file mode 100644
index 000000000..a144fe259
--- /dev/null
+++ b/extensions/source/macosx/spotlight/OOoSpotlightImporter.m
@@ -0,0 +1,487 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#import <zlib.h>
+
+#import "OOoSpotlightImporter.h"
+#import "OOoMetaDataParser.h"
+#import "OOoContentDataParser.h"
+
+/* a dictionary to hold the UTIs */
+static NSDictionary *uti2kind;
+
+typedef struct {
+ unsigned short min_version;
+ unsigned short general_flag;
+ unsigned short compression;
+ unsigned short lastmod_time;
+ unsigned short lastmod_date;
+ unsigned crc32;
+ unsigned compressed_size;
+ unsigned uncompressed_size;
+ unsigned short filename_size;
+ unsigned short extra_field_size;
+ NSString *filename;
+ NSString *extra_field;
+} LocalFileHeader;
+
+typedef struct {
+ unsigned short creator_version;
+ unsigned short min_version;
+ unsigned short general_flag;
+ unsigned short compression;
+ unsigned short lastmod_time;
+ unsigned short lastmod_date;
+ unsigned crc32;
+ unsigned compressed_size;
+ unsigned uncompressed_size;
+ unsigned short filename_size;
+ unsigned short extra_field_size;
+ unsigned short file_comment_size;
+ unsigned short disk_num;
+ unsigned short internal_attr;
+ unsigned external_attr;
+ unsigned offset;
+ NSString *filename;
+ NSString *extra_field;
+ NSString *file_comment;
+} CentralDirectoryEntry;
+
+typedef struct {
+ unsigned short disk_num;
+ unsigned short cdir_disk;
+ unsigned short disk_entries;
+ unsigned short cdir_entries;
+ unsigned cdir_size;
+ unsigned cdir_offset;
+ unsigned short comment_size;
+ NSString *comment;
+} CentralDirectoryEnd;
+
+#define CDIR_ENTRY_SIG (0x02014b50)
+#define LOC_FILE_HEADER_SIG (0x04034b50)
+#define CDIR_END_SIG (0x06054b50)
+
+static unsigned char readByte(NSFileHandle *file)
+{
+ if (file == nil)
+ return 0;
+ NSData* tmpBuf = [file readDataOfLength: 1];
+ if (tmpBuf == nil)
+ return 0;
+ unsigned char *d = (unsigned char*)[tmpBuf bytes];
+ if (d == nil)
+ return 0;
+ return *d;
+}
+
+static unsigned short readShort(NSFileHandle *file)
+{
+ unsigned short p0 = (unsigned short)readByte(file);
+ unsigned short p1 = (unsigned short)readByte(file);
+ return (unsigned short)(p0|(p1<<8));
+}
+
+static unsigned readInt(NSFileHandle *file)
+{
+ unsigned p0 = (unsigned)readByte(file);
+ unsigned p1 = (unsigned)readByte(file);
+ unsigned p2 = (unsigned)readByte(file);
+ unsigned p3 = (unsigned)readByte(file);
+ return (unsigned)(p0|(p1<<8)|(p2<<16)|(p3<<24));
+}
+
+static bool readCentralDirectoryEnd(NSFileHandle *file, CentralDirectoryEnd *end)
+{
+ unsigned signature = readInt(file);
+ if (signature != CDIR_END_SIG)
+ return false;
+
+ end->disk_num = readShort(file);
+ end->cdir_disk = readShort(file);
+ end->disk_entries = readShort(file);
+ end->cdir_entries = readShort(file);
+ end->cdir_size = readInt(file);
+ end->cdir_offset = readInt(file);
+ end->comment_size = readShort(file);
+ NSData *data = [file readDataOfLength: end->comment_size];
+ end->comment = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ return true;
+}
+
+static bool readCentralDirectoryEntry(NSFileHandle *file, CentralDirectoryEntry *entry)
+{
+ unsigned signature = readInt(file);
+ if (signature != CDIR_ENTRY_SIG)
+ return false;
+
+ entry->creator_version = readShort(file);
+ entry->min_version = readShort(file);
+ entry->general_flag = readShort(file);
+ entry->compression = readShort(file);
+ entry->lastmod_time = readShort(file);
+ entry->lastmod_date = readShort(file);
+ entry->crc32 = readInt(file);
+ entry->compressed_size = readInt(file);
+ entry->uncompressed_size = readInt(file);
+ entry->filename_size = readShort(file);
+ entry->extra_field_size = readShort(file);
+ entry->file_comment_size = readShort(file);
+ entry->disk_num = readShort(file);
+ entry->internal_attr = readShort(file);
+ entry->external_attr = readInt(file);
+ entry->offset = readInt(file);
+ NSData *data = [file readDataOfLength: entry->filename_size];
+ entry->filename = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ data = [file readDataOfLength: entry->extra_field_size];
+ entry->extra_field = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ data = [file readDataOfLength: entry->file_comment_size];
+ entry->file_comment = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ return true;
+}
+
+static bool readLocalFileHeader(NSFileHandle *file, LocalFileHeader *header)
+{
+ unsigned signature = readInt(file);
+ if (signature != LOC_FILE_HEADER_SIG)
+ return false;
+
+ header->min_version = readShort(file);
+ header->general_flag = readShort(file);
+ header->compression = readShort(file);
+ header->lastmod_time = readShort(file);
+ header->lastmod_date = readShort(file);
+ header->crc32 = readInt(file);
+ header->compressed_size = readInt(file);
+ header->uncompressed_size = readInt(file);
+ header->filename_size = readShort(file);
+ header->extra_field_size = readShort(file);
+ NSData *data = [file readDataOfLength: header->filename_size];
+ header->filename = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ data = [file readDataOfLength: header->extra_field_size];
+ header->extra_field = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+ return true;
+}
+
+static bool areHeadersConsistent(const LocalFileHeader *header, const CentralDirectoryEntry *entry)
+{
+ if (header->min_version != entry->min_version)
+ return false;
+ if (header->general_flag != entry->general_flag)
+ return false;
+ if (header->compression != entry->compression)
+ return false;
+ if (!(header->general_flag & 0x08))
+ {
+ if (header->crc32 != entry->crc32)
+ return false;
+ if (header->compressed_size != entry->compressed_size)
+ return false;
+ if (header->uncompressed_size != entry->uncompressed_size)
+ return false;
+ }
+ return true;
+}
+
+static bool findCentralDirectoryEnd(NSFileHandle *file)
+{
+ // Assume the cdir end is in the last 1024 bytes
+ // Scan backward from end of file for the end signature
+
+ [file seekToEndOfFile];
+ unsigned long long fileLength = [file offsetInFile];
+
+ if (fileLength < 10)
+ return false;
+
+ [file seekToFileOffset: (fileLength - 4)];
+
+ unsigned long long limit;
+ if (fileLength > 1024)
+ limit = fileLength - 1024;
+ else
+ limit = 0;
+
+ unsigned long long offset;
+ while ((offset = [file offsetInFile]) > limit)
+ {
+ unsigned signature = readInt(file);
+ if (signature == CDIR_END_SIG)
+ {
+ // Seek back over the CDIR_END_SIG
+ [file seekToFileOffset: offset];
+ return true;
+ }
+ else
+ {
+ // Seek one byte back
+ [file seekToFileOffset: (offset - 1)];
+ }
+ }
+ return false;
+}
+
+static bool isZipFile(NSFileHandle *file)
+{
+ if (!findCentralDirectoryEnd(file))
+ return false;
+ CentralDirectoryEnd end;
+ if (!readCentralDirectoryEnd(file, &end))
+ return false;
+ [file seekToFileOffset: end.cdir_offset];
+ CentralDirectoryEntry entry;
+ if (!readCentralDirectoryEntry(file, &entry))
+ return false;
+ [file seekToFileOffset: entry.offset];
+ LocalFileHeader header;
+ if (!readLocalFileHeader(file, &header))
+ return false;
+ if (!areHeadersConsistent(&header, &entry))
+ return false;
+ return true;
+}
+
+static bool findDataStream(NSFileHandle *file, CentralDirectoryEntry *entry, NSString *name)
+{
+ [file seekToEndOfFile];
+ unsigned long long fileLength = [file offsetInFile];
+ if (!findCentralDirectoryEnd(file))
+ return false;
+ CentralDirectoryEnd end;
+ if (!readCentralDirectoryEnd(file, &end))
+ return false;
+ [file seekToFileOffset: end.cdir_offset];
+ do
+ {
+ if (!readCentralDirectoryEntry(file, entry))
+ return false;
+ if ([entry->filename compare: name] == NSOrderedSame)
+ break;
+ }
+ while ( [file offsetInFile] < fileLength && [file offsetInFile] < end.cdir_offset + end.cdir_size);
+ if ([entry->filename compare: name] != NSOrderedSame)
+ return false;
+ [file seekToFileOffset: entry->offset];
+ LocalFileHeader header;
+ if (!readLocalFileHeader(file, &header))
+ return false;
+ if (!areHeadersConsistent(&header, entry))
+ return false;
+ return true;
+}
+
+static NSData *getUncompressedData(NSFileHandle *file, NSString *name)
+{
+ CentralDirectoryEntry entry;
+ if (!findDataStream(file, &entry, name))
+ return nil;
+ if (!entry.compression)
+ return [file readDataOfLength: entry.compressed_size];
+ else
+ {
+ int ret;
+ z_stream strm;
+
+ /* allocate inflate state */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit2(&strm,-MAX_WBITS);
+ if (ret != Z_OK)
+ return nil;
+
+ NSData *compressedData = [file readDataOfLength: entry.compressed_size];
+
+ strm.avail_in = [compressedData length];
+ strm.next_in = (Bytef *)[compressedData bytes];
+
+ Bytef *uncompressedData = (Bytef *)malloc(entry.uncompressed_size);
+ if (!uncompressedData)
+ {
+ (void)inflateEnd(&strm);
+ return nil;
+ }
+ strm.avail_out = entry.uncompressed_size;
+ strm.next_out = uncompressedData;
+ ret = inflate(&strm, Z_FINISH);
+ switch (ret)
+ {
+ case Z_NEED_DICT:
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR:
+ (void)inflateEnd(&strm);
+ free(uncompressedData);
+ return nil;
+ }
+ (void)inflateEnd(&strm);
+ NSData *returnBuffer = [NSData dataWithBytes:(const void *)uncompressedData length:entry.uncompressed_size];
+ free(uncompressedData);
+ return returnBuffer;
+ }
+}
+
+@implementation OOoSpotlightImporter
+
+/* initialize is only called once the first time this class is loaded */
++ (void)initialize
+{
+ static BOOL isInitialized = NO;
+ if (isInitialized == NO) {
+ NSMutableDictionary *temp = [NSMutableDictionary new];
+ [temp setObject:@"OpenOffice.org 1.0 Text" forKey:@"org.openoffice.text"];
+ [temp setObject:@"OpenDocument Text" forKey:@"org.oasis.opendocument.text"];
+ [temp setObject:@"OpenOffice.org 1.0 Spreadsheet" forKey:@"org.openoffice.spreadsheet"];
+ [temp setObject:@"OpenDocument Spreadsheet" forKey:@"org.oasis.opendocument.spreadsheet"];
+ [temp setObject:@"OpenOffice.org 1.0 Presentation" forKey:@"org.openoffice.presentation"];
+ [temp setObject:@"OpenDocument Presentation" forKey:@"org.oasis.opendocument.presentation"];
+ [temp setObject:@"OpenOffice.org 1.0 Drawing" forKey:@"org.openoffice.graphics"];
+ [temp setObject:@"OpenDocument Drawing" forKey:@"org.oasis.opendocument.graphics"];
+ [temp setObject:@"OpenOffice.org 1.0 Master" forKey:@"org.openoffice.text-master"];
+ [temp setObject:@"OpenDocument Master" forKey:@"org.oasis.opendocument.text-master"];
+ [temp setObject:@"OpenOffice.org 1.0 Formula" forKey:@"org.openoffice.formula"];
+ [temp setObject:@"OpenDocument Formula" forKey:@"org.oasis.opendocument.formula"];
+ [temp setObject:@"OpenOffice.org 1.0 Text Template" forKey:@"org.openoffice.text-template"];
+ [temp setObject:@"OpenDocument Text Template" forKey:@"org.oasis.opendocument.text-template"];
+ [temp setObject:@"OpenOffice.org 1.0 Spreadsheet Template" forKey:@"org.openoffice.spreadsheet-template"];
+ [temp setObject:@"OpenDocument Spreadsheet Template" forKey:@"org.oasis.opendocument.spreadsheet-template"];
+ [temp setObject:@"OpenOffice.org 1.0 Presentation Template" forKey:@"org.openoffice.presentation-template"];
+ [temp setObject:@"OpenDocument Presentation Template" forKey:@"org.oasis.opendocument.presentation-template"];
+ [temp setObject:@"OpenOffice.org 1.0 Drawing Template" forKey:@"org.openoffice.graphics-template"];
+ [temp setObject:@"OpenDocument Drawing Template" forKey:@"org.oasis.opendocument.graphics-template"];
+ [temp setObject:@"OpenOffice.org 1.0 Database" forKey:@"org.openoffice.database"];
+ [temp setObject:@"OpenDocument Chart" forKey:@"org.oasis.opendocument.chart"];
+
+ uti2kind = [[NSDictionary dictionaryWithDictionary:temp] retain];
+ [temp release];
+
+ isInitialized = YES;
+ }
+}
+
+/* importDocument is the real starting point for our plugin */
+- (BOOL)importDocument:(NSString*)pathToFile contentType:(NSString*)contentTypeUTI attributes:(NSMutableDictionary*)attributes
+{
+ //NSLog(contentTypeUTI);
+ //NSLog(pathToFile);
+
+ NSString *itemKind = [uti2kind objectForKey:contentTypeUTI];
+ if (itemKind != nil) {
+ [attributes setObject:itemKind forKey:(NSString*)kMDItemKind];
+ }
+
+ //first check to see if this is a valid zipped file that contains a file "meta.xml"
+ NSFileHandle *unzipFile = [self openZipFileAtPath:pathToFile];
+
+
+ if (unzipFile == nil) {
+ //NSLog(@"zip file not open");
+ return NO;
+ }
+
+ //first get the metadata
+ NSData *metaData = [self metaDataFileFromZip:unzipFile];
+ if (metaData == nil) {
+ [unzipFile closeFile];
+ return YES;
+ }
+
+ [metaData retain];
+
+ OOoMetaDataParser *parser = [OOoMetaDataParser new];
+ if (parser != nil) {
+ //parse and extract the data
+ [parser parseXML:metaData intoDictionary:attributes];
+ }
+
+ [metaData release];
+ [parser release];
+
+ //and now get the content
+ NSData *contentData = [self contentDataFileFromZip:unzipFile];
+ if (contentData == nil) {
+ [unzipFile closeFile];
+ return YES;
+ }
+
+ [contentData retain];
+
+ OOoContentDataParser *parser2 = [OOoContentDataParser new];
+ if (parser2 != nil) {
+ //parse and extract the data
+ [parser2 parseXML:contentData intoDictionary:attributes];
+ }
+
+ [contentData release];
+ [parser2 release];
+
+ [unzipFile closeFile];
+
+ return YES;
+}
+
+/* openZipFileAtPath returns the file as a valid data structure or nil otherwise*/
+- (NSFileHandle*)openZipFileAtPath:(NSString*)pathToFile
+{
+ NSFileHandle* unzipFile = nil;
+
+ if ([pathToFile length] != 0)
+ {
+ unzipFile = [NSFileHandle fileHandleForReadingAtPath: pathToFile];
+ }
+
+ if (unzipFile == nil)
+ {
+ //NSLog(@"Cannot open %s",zipfilename);
+ return nil;
+ }
+
+ if (!isZipFile(unzipFile))
+ {
+ [unzipFile closeFile];
+ return nil;
+ }
+ //NSLog(@"%s opened",zipfilename);
+
+ return unzipFile;
+}
+
+/* metaDataFileFromZip extracts the file meta.xml from the zip file and returns it as an NSData* structure
+ or nil if the metadata is not present */
+- (NSData*) metaDataFileFromZip:(NSFileHandle*)unzipFile
+{
+ if (unzipFile == nil)
+ return nil;
+ return getUncompressedData(unzipFile, @"meta.xml");
+}
+
+/* contentDataFileFromZip extracts the file content.xml from the zip file and returns it as an NSData* structure
+ or nil if the metadata is not present */
+- (NSData*) contentDataFileFromZip:(NSFileHandle*)unzipFile
+{
+ if (unzipFile == nil)
+ return nil;
+ return getUncompressedData(unzipFile, @"content.xml");
+}
+
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/.gitignore b/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/.gitignore
new file mode 100644
index 000000000..96c4e5542
--- /dev/null
+++ b/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/.gitignore
@@ -0,0 +1 @@
+project.xcworkspace
diff --git a/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/project.pbxproj b/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..f086d7ec9
--- /dev/null
+++ b/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/project.pbxproj
@@ -0,0 +1,308 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ BE9A7AC823590D9500931013 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BE9A7AC723590D9500931013 /* main.m */; };
+ BE9A7AD723590E5D00931013 /* OOoSpotlightImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = BE9A7ACE23590E5D00931013 /* OOoSpotlightImporter.m */; };
+ BE9A7AD823590E5D00931013 /* OOoMetaDataParser.m in Sources */ = {isa = PBXBuildFile; fileRef = BE9A7AD223590E5D00931013 /* OOoMetaDataParser.m */; };
+ BE9A7AD923590E5D00931013 /* OOoContentDataParser.m in Sources */ = {isa = PBXBuildFile; fileRef = BE9A7AD323590E5D00931013 /* OOoContentDataParser.m */; };
+ BE9A7ADA23590E5D00931013 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = BE9A7AD423590E5D00931013 /* main.m */; };
+ BE9A7ADB23590E5D00931013 /* GetMetadataForFile.m in Sources */ = {isa = PBXBuildFile; fileRef = BE9A7AD623590E5D00931013 /* GetMetadataForFile.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ BE9A7AC223590D9400931013 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ BE9A7AC423590D9500931013 /* SpotlightImporterTester */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SpotlightImporterTester; sourceTree = BUILT_PRODUCTS_DIR; };
+ BE9A7AC723590D9500931013 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ BE9A7ACE23590E5D00931013 /* OOoSpotlightImporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OOoSpotlightImporter.m; path = ../../OOoSpotlightImporter.m; sourceTree = "<group>"; };
+ BE9A7ACF23590E5D00931013 /* OOoSpotlightImporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OOoSpotlightImporter.h; path = ../../OOoSpotlightImporter.h; sourceTree = "<group>"; };
+ BE9A7AD023590E5D00931013 /* GetMetadataForFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GetMetadataForFile.h; path = ../../GetMetadataForFile.h; sourceTree = "<group>"; };
+ BE9A7AD123590E5D00931013 /* OOoMetaDataParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OOoMetaDataParser.h; path = ../../OOoMetaDataParser.h; sourceTree = "<group>"; };
+ BE9A7AD223590E5D00931013 /* OOoMetaDataParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OOoMetaDataParser.m; path = ../../OOoMetaDataParser.m; sourceTree = "<group>"; };
+ BE9A7AD323590E5D00931013 /* OOoContentDataParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OOoContentDataParser.m; path = ../../OOoContentDataParser.m; sourceTree = "<group>"; };
+ BE9A7AD423590E5D00931013 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../../main.m; sourceTree = "<group>"; };
+ BE9A7AD523590E5D00931013 /* OOoContentDataParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OOoContentDataParser.h; path = ../../OOoContentDataParser.h; sourceTree = "<group>"; };
+ BE9A7AD623590E5D00931013 /* GetMetadataForFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GetMetadataForFile.m; path = ../../GetMetadataForFile.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ BE9A7AC123590D9400931013 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ BE9A7ABB23590D9400931013 = {
+ isa = PBXGroup;
+ children = (
+ BE9A7AC623590D9500931013 /* SpotlightImporterTester */,
+ BE9A7AC523590D9500931013 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ BE9A7AC523590D9500931013 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ BE9A7AC423590D9500931013 /* SpotlightImporterTester */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ BE9A7AC623590D9500931013 /* SpotlightImporterTester */ = {
+ isa = PBXGroup;
+ children = (
+ BE9A7AD023590E5D00931013 /* GetMetadataForFile.h */,
+ BE9A7AD623590E5D00931013 /* GetMetadataForFile.m */,
+ BE9A7AD423590E5D00931013 /* main.m */,
+ BE9A7AD523590E5D00931013 /* OOoContentDataParser.h */,
+ BE9A7AD323590E5D00931013 /* OOoContentDataParser.m */,
+ BE9A7AD123590E5D00931013 /* OOoMetaDataParser.h */,
+ BE9A7AD223590E5D00931013 /* OOoMetaDataParser.m */,
+ BE9A7ACF23590E5D00931013 /* OOoSpotlightImporter.h */,
+ BE9A7ACE23590E5D00931013 /* OOoSpotlightImporter.m */,
+ BE9A7AC723590D9500931013 /* main.m */,
+ );
+ path = SpotlightImporterTester;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ BE9A7AC323590D9400931013 /* SpotlightImporterTester */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = BE9A7ACB23590D9500931013 /* Build configuration list for PBXNativeTarget "SpotlightImporterTester" */;
+ buildPhases = (
+ BE9A7AC023590D9400931013 /* Sources */,
+ BE9A7AC123590D9400931013 /* Frameworks */,
+ BE9A7AC223590D9400931013 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = SpotlightImporterTester;
+ productName = SpotlightImporterTester;
+ productReference = BE9A7AC423590D9500931013 /* SpotlightImporterTester */;
+ productType = "com.apple.product-type.tool";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ BE9A7ABC23590D9400931013 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 1110;
+ ORGANIZATIONNAME = Collabora;
+ TargetAttributes = {
+ BE9A7AC323590D9400931013 = {
+ CreatedOnToolsVersion = 11.1;
+ };
+ };
+ };
+ buildConfigurationList = BE9A7ABF23590D9400931013 /* Build configuration list for PBXProject "SpotlightImporterTester" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = BE9A7ABB23590D9400931013;
+ productRefGroup = BE9A7AC523590D9500931013 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ BE9A7AC323590D9400931013 /* SpotlightImporterTester */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ BE9A7AC023590D9400931013 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ BE9A7ADA23590E5D00931013 /* main.m in Sources */,
+ BE9A7AD923590E5D00931013 /* OOoContentDataParser.m in Sources */,
+ BE9A7AD823590E5D00931013 /* OOoMetaDataParser.m in Sources */,
+ BE9A7ADB23590E5D00931013 /* GetMetadataForFile.m in Sources */,
+ BE9A7AD723590E5D00931013 /* OOoSpotlightImporter.m in Sources */,
+ BE9A7AC823590D9500931013 /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ BE9A7AC923590D9500931013 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ BE9A7ACA23590D9500931013 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ BE9A7ACC23590D9500931013 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_OBJC_ARC = NO;
+ CODE_SIGN_STYLE = Automatic;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ BE9A7ACD23590D9500931013 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CLANG_ENABLE_OBJC_ARC = NO;
+ CODE_SIGN_STYLE = Automatic;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ BE9A7ABF23590D9400931013 /* Build configuration list for PBXProject "SpotlightImporterTester" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ BE9A7AC923590D9500931013 /* Debug */,
+ BE9A7ACA23590D9500931013 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ BE9A7ACB23590D9500931013 /* Build configuration list for PBXNativeTarget "SpotlightImporterTester" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ BE9A7ACC23590D9500931013 /* Debug */,
+ BE9A7ACD23590D9500931013 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = BE9A7ABC23590D9400931013 /* Project object */;
+}
diff --git a/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/xcshareddata/xcschemes/SpotlightImporterTester.xcscheme b/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/xcshareddata/xcschemes/SpotlightImporterTester.xcscheme
new file mode 100644
index 000000000..d2aab1a01
--- /dev/null
+++ b/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester.xcodeproj/xcshareddata/xcschemes/SpotlightImporterTester.xcscheme
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "1110"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "BE9A7AC323590D9400931013"
+ BuildableName = "SpotlightImporterTester"
+ BlueprintName = "SpotlightImporterTester"
+ ReferencedContainer = "container:SpotlightImporterTester.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES">
+ <Testables>
+ </Testables>
+ </TestAction>
+ <LaunchAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ debugServiceExtension = "internal"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "BE9A7AC323590D9400931013"
+ BuildableName = "SpotlightImporterTester"
+ BlueprintName = "SpotlightImporterTester"
+ ReferencedContainer = "container:SpotlightImporterTester.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <CommandLineArguments>
+ <CommandLineArgument
+ argument = "org.openoffice.database"
+ isEnabled = "YES">
+ </CommandLineArgument>
+ <CommandLineArgument
+ argument = "/tmp/sample.odb"
+ isEnabled = "YES">
+ </CommandLineArgument>
+ </CommandLineArguments>
+ </LaunchAction>
+ <ProfileAction
+ buildConfiguration = "Release"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "BE9A7AC323590D9400931013"
+ BuildableName = "SpotlightImporterTester"
+ BlueprintName = "SpotlightImporterTester"
+ ReferencedContainer = "container:SpotlightImporterTester.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester/main.m b/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester/main.m
new file mode 100644
index 000000000..f9b6bbb5f
--- /dev/null
+++ b/extensions/source/macosx/spotlight/SpotlightImporterTester/SpotlightImporterTester/main.m
@@ -0,0 +1,30 @@
+/* -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+#import <stdio.h>
+
+#import <CoreFoundation/CoreFoundation.h>
+#import <CoreServices/CoreServices.h>
+#import <Foundation/Foundation.h>
+
+#import "GetMetadataForFile.h"
+
+int main(int argc, const char* argv[])
+{
+ @autoreleasepool
+ {
+ if (argc != 3)
+ {
+ fprintf(stderr, "Usage: %s UTI path\n", argv[0]);
+ return 1;
+ }
+ NSMutableDictionary* attributes = [NSMutableDictionary dictionaryWithCapacity:10];
+ NSString* contentTypeUTI = [NSString stringWithUTF8String:argv[1]];
+ NSString* pathToFile = [NSString stringWithUTF8String:argv[2]];
+
+ GetMetadataForFile(NULL, (__bridge CFMutableDictionaryRef)attributes,
+ (__bridge CFStringRef)contentTypeUTI, (__bridge CFStringRef)pathToFile);
+ }
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/main.m b/extensions/source/macosx/spotlight/main.m
new file mode 100644
index 000000000..b1a6381a7
--- /dev/null
+++ b/extensions/source/macosx/spotlight/main.m
@@ -0,0 +1,211 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+//
+// main.m
+// SpotlightTester
+//
+// Created by Florian Heckl on 10.07.07.
+//
+//==============================================================================
+//
+// DO NOT MODIFY THE CONTENTS OF THIS FILE
+//
+// This file contains the generic CFPlug-in code necessary for your importer
+// To complete your importer implement the function in GetMetadataForFile.c
+//
+//==============================================================================
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreFoundation/CFPlugInCOM.h>
+#include <CoreServices/CoreServices.h>
+
+#include "GetMetadataForFile.h"
+
+// constants
+
+
+#define PLUGIN_ID "A3FCC88D-B9A6-4364-8B93-92123C8A2D18"
+
+//
+// Below is the generic glue code for all plug-ins.
+//
+// You should not have to modify this code aside from changing
+// names if you decide to change the names defined in the Info.plist
+//
+
+
+// typedefs
+
+// The layout for an instance of MetaDataImporterPlugIn
+typedef struct
+{
+ MDImporterInterfaceStruct *conduitInterface;
+ CFUUIDRef factoryID;
+ UInt32 refCount;
+} MetadataImporterPluginType;
+
+// prototypes
+// Forward declaration for the IUnknown implementation.
+//
+
+static MetadataImporterPluginType *AllocMetadataImporterPluginType(CFUUIDRef inFactoryID);
+static void DeallocMetadataImporterPluginType(MetadataImporterPluginType *thisInstance);
+static HRESULT MetadataImporterQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv);
+static ULONG MetadataImporterPluginAddRef(void *thisInstance);
+static ULONG MetadataImporterPluginRelease(void *thisInstance);
+// testInterfaceFtbl definition
+// The TestInterface function table.
+//
+
+static MDImporterInterfaceStruct testInterfaceFtbl = {
+ NULL,
+ MetadataImporterQueryInterface,
+ MetadataImporterPluginAddRef,
+ MetadataImporterPluginRelease,
+ GetMetadataForFile
+};
+
+
+// AllocMetadataImporterPluginType
+// Utility function that allocates a new instance.
+// You can do some initial setup for the importer here if you wish
+// like allocating globals etc...
+//
+MetadataImporterPluginType *AllocMetadataImporterPluginType(CFUUIDRef inFactoryID)
+{
+ MetadataImporterPluginType *theNewInstance;
+
+ theNewInstance = (MetadataImporterPluginType *)malloc(sizeof(MetadataImporterPluginType));
+ memset(theNewInstance,0,sizeof(MetadataImporterPluginType));
+
+ /* Point to the function table */
+ theNewInstance->conduitInterface = &testInterfaceFtbl;
+
+ /* Retain and keep an open instance refcount for each factory. */
+ theNewInstance->factoryID = CFRetain(inFactoryID);
+ CFPlugInAddInstanceForFactory(inFactoryID);
+
+ /* This function returns the IUnknown interface so set the refCount to one. */
+ theNewInstance->refCount = 1;
+ return theNewInstance;
+}
+
+// DeallocSpotlightTesterMDImporterPluginType
+// Utility function that deallocates the instance when
+// the refCount goes to zero.
+// In the current implementation importer interfaces are never deallocated
+// but implement this as this might change in the future
+//
+void DeallocMetadataImporterPluginType(MetadataImporterPluginType *thisInstance)
+{
+ CFUUIDRef theFactoryID;
+
+ theFactoryID = thisInstance->factoryID;
+ free(thisInstance);
+ if (theFactoryID){
+ CFPlugInRemoveInstanceForFactory(theFactoryID);
+ CFRelease(theFactoryID);
+ }
+}
+
+// MetadataImporterQueryInterface
+// Implementation of the IUnknown QueryInterface function.
+//
+HRESULT MetadataImporterQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv)
+{
+ CFUUIDRef interfaceID;
+
+ interfaceID = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault,iid);
+
+ if (CFEqual(interfaceID,kMDImporterInterfaceID)){
+ /* If the Right interface was requested, bump the ref count,
+ * set the ppv parameter equal to the instance, and
+ * return good status.
+ */
+ ((MetadataImporterPluginType*)thisInstance)->conduitInterface->AddRef(thisInstance);
+ *ppv = thisInstance;
+ CFRelease(interfaceID);
+ return S_OK;
+ }else{
+ if (CFEqual(interfaceID,IUnknownUUID)){
+ /* If the IUnknown interface was requested, same as above. */
+ ((MetadataImporterPluginType*)thisInstance )->conduitInterface->AddRef(thisInstance);
+ *ppv = thisInstance;
+ CFRelease(interfaceID);
+ return S_OK;
+ }else{
+ /* Requested interface unknown, bail with error. */
+ *ppv = NULL;
+ CFRelease(interfaceID);
+ return E_NOINTERFACE;
+ }
+ }
+}
+
+// MetadataImporterPluginAddRef
+// Implementation of reference counting for this type. Whenever an interface
+// is requested, bump the refCount for the instance. NOTE: returning the
+// refcount is a convention but is not required so don't rely on it.
+//
+ULONG MetadataImporterPluginAddRef(void *thisInstance)
+{
+ ((MetadataImporterPluginType *)thisInstance )->refCount += 1;
+ return ((MetadataImporterPluginType*) thisInstance)->refCount;
+}
+
+// SampleCMPluginRelease
+// When an interface is released, decrement the refCount.
+// If the refCount goes to zero, deallocate the instance.
+//
+ULONG MetadataImporterPluginRelease(void *thisInstance)
+{
+ ((MetadataImporterPluginType*)thisInstance)->refCount -= 1;
+ if (((MetadataImporterPluginType*)thisInstance)->refCount == 0){
+ DeallocMetadataImporterPluginType((MetadataImporterPluginType*)thisInstance );
+ return 0;
+ }else{
+ return ((MetadataImporterPluginType*) thisInstance )->refCount;
+ }
+}
+
+// SpotlightTesterMDImporterPluginFactory
+// Implementation of the factory function for this type.
+//
+__attribute__ ((visibility("default")))
+void *
+MetadataImporterPluginFactory(CFAllocatorRef allocator, CFUUIDRef typeID)
+{
+ (void) allocator; /* unused */
+ MetadataImporterPluginType *result;
+ CFUUIDRef uuid;
+
+ /* If correct type is being requested, allocate an
+ * instance of TestType and return the IUnknown interface.
+ */
+ if (CFEqual(typeID,kMDImporterTypeID)){
+ uuid = CFUUIDCreateFromString(kCFAllocatorDefault,CFSTR(PLUGIN_ID));
+ result = AllocMetadataImporterPluginType(uuid);
+ CFRelease(uuid);
+ return result;
+ }
+ /* If the requested type is incorrect, return NULL. */
+ return NULL;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/extensions/source/macosx/spotlight/mdimporter/Info.plist b/extensions/source/macosx/spotlight/mdimporter/Info.plist
new file mode 100644
index 000000000..5a60493cb
--- /dev/null
+++ b/extensions/source/macosx/spotlight/mdimporter/Info.plist
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+-->
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeRole</key>
+ <string>MDImporter</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>org.openoffice.text</string>
+ <string>org.oasis-open.opendocument.text</string>
+ <string>org.openoffice.spreadsheet</string>
+ <string>org.oasis-open.opendocument.spreadsheet</string>
+ <string>org.openoffice.presentation</string>
+ <string>org.oasis-open.opendocument.presentation</string>
+ <string>org.openoffice.graphics</string>
+ <string>org.oasis-open.opendocument.graphics</string>
+ <string>org.openoffice.text-master</string>
+ <string>org.oasis-open.opendocument.text-master</string>
+ <string>org.openoffice.formula</string>
+ <string>org.oasis-open.opendocument.formula</string>
+ <string>org.openoffice.text-template</string>
+ <string>org.oasis-open.opendocument.text-template</string>
+ <string>org.openoffice.spreadsheet-template</string>
+ <string>org.oasis-open.opendocument.spreadsheet-template</string>
+ <string>org.openoffice.presentation-template</string>
+ <string>org.oasis-open.opendocument.presentation-template</string>
+ <string>org.openoffice.graphics-template</string>
+ <string>org.oasis-open.opendocument.graphics-template</string>
+ <string>org.oasis-open.opendocument.database</string>
+ </array>
+ </dict>
+ </array>
+ <key>CFBundleExecutable</key>
+ <string>OOoSpotlightImporter</string>
+ <key>CFBundleName</key>
+ <string>OOoSpotlightImporter</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>org.libreoffice.mdimporter</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>CFPlugInDynamicRegisterFunction</key>
+ <string></string>
+ <key>CFPlugInDynamicRegistration</key>
+ <string>NO</string>
+ <key>CFPlugInFactories</key>
+ <dict>
+ <key>A3FCC88D-B9A6-4364-8B93-92123C8A2D18</key>
+ <string>MetadataImporterPluginFactory</string>
+ </dict>
+ <key>CFPlugInTypes</key>
+ <dict>
+ <key>8B08C4BF-415B-11D8-B3F9-0003936726FC</key>
+ <array>
+ <string>A3FCC88D-B9A6-4364-8B93-92123C8A2D18</string>
+ </array>
+ </dict>
+ <key>CFPlugInUnloadFunction</key>
+ <string></string>
+
+</dict>
+</plist>
diff --git a/extensions/source/macosx/spotlight/mdimporter/en.lproj/schema.strings b/extensions/source/macosx/spotlight/mdimporter/en.lproj/schema.strings
new file mode 100644
index 000000000..355998783
--- /dev/null
+++ b/extensions/source/macosx/spotlight/mdimporter/en.lproj/schema.strings
@@ -0,0 +1 @@
+ÿþ \ No newline at end of file
diff --git a/extensions/source/macosx/spotlight/mdimporter/schema.xml b/extensions/source/macosx/spotlight/mdimporter/schema.xml
new file mode 100644
index 000000000..f17aa8c6c
--- /dev/null
+++ b/extensions/source/macosx/spotlight/mdimporter/schema.xml
@@ -0,0 +1,413 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+-->
+<schema version="1.0" xmlns="http://www.apple.com/metadata"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.apple.com/metadata file:///System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/MetadataSchema.xsd">
+ <note>
+ OpenOffice.org allows the user to enter 4 pieces of custom information in the document's metadata.
+ These metadata fields are described here for Spotlight's use.
+ </note>
+ <attributes>
+ <attribute name="org_openoffice_opendocument_custominfo1" type="CFString"/>
+ <attribute name="org_openoffice_opendocument_custominfo2" type="CFString"/>
+ <attribute name="org_openoffice_opendocument_custominfo3" type="CFString"/>
+ <attribute name="org_openoffice_opendocument_custominfo4" type="CFString"/>
+ </attributes>
+
+ <types>
+ <type name="org.openoffice.text">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.text">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.spreadsheet">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.spreadsheet">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.presentation">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.presentation">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.graphics">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.graphics">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.text-master">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.text-master">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.formula">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.formula">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.text-template">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.text-template">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.spreadsheet-template">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.spreadsheet-template">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.presentation-template">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.presentation-template">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.openoffice.graphics-template">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.graphics-template">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+
+ <type name="org.oasis.opendocument.chart">
+ <note>
+ The custom metadata info.
+ </note>
+ <allattrs id="attrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </allattrs>
+ <displayattrs id="dattrs">
+ org_openoffice_opendocument_custominfo1
+ org_openoffice_opendocument_custominfo2
+ org_openoffice_opendocument_custominfo3
+ org_openoffice_opendocument_custominfo4
+ </displayattrs>
+ </type>
+ </types>
+</schema>
+
diff --git a/extensions/source/macosx/spotlight/version.plist b/extensions/source/macosx/spotlight/version.plist
new file mode 100644
index 000000000..d91342841
--- /dev/null
+++ b/extensions/source/macosx/spotlight/version.plist
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+-->
+<plist version="1.0">
+<dict>
+ <key>BuildVersion</key>
+ <string>266</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>ProjectName</key>
+ <string>DevToolsWizardTemplates</string>
+ <key>SourceVersion</key>
+ <string>3070000</string>
+</dict>
+</plist>