initial import of Spotlight Importer
authorTaybin Rutkin <taybin@taybin.com>
Thu, 25 Jan 2007 01:45:43 +0000 (01:45 +0000)
committerTaybin Rutkin <taybin@taybin.com>
Thu, 25 Jan 2007 01:45:43 +0000 (01:45 +0000)
git-svn-id: svn://localhost/ardour2/trunk@1381 d708f5d6-7413-0410-9779-e7cbd77b26cf

tools/Spotlight Importer/GetMetadataForFile.c [new file with mode: 0644]
tools/Spotlight Importer/Info.plist [new file with mode: 0644]
tools/Spotlight Importer/main.c [new file with mode: 0644]
tools/Spotlight Importer/schema.xml [new file with mode: 0644]

diff --git a/tools/Spotlight Importer/GetMetadataForFile.c b/tools/Spotlight Importer/GetMetadataForFile.c
new file mode 100644 (file)
index 0000000..6b12614
--- /dev/null
@@ -0,0 +1,56 @@
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreServices/CoreServices.h> 
+
+/* -----------------------------------------------------------------------------
+   Step 1
+   Set the UTI types the importer supports
+  
+   Modify the CFBundleDocumentTypes entry in Info.plist to contain
+   an array of Uniform Type Identifiers (UTI) for the LSItemContentTypes 
+   that your importer can handle
+  
+   ----------------------------------------------------------------------------- */
+
+/* -----------------------------------------------------------------------------
+   Step 2 
+   Implement the GetMetadataForFile function
+  
+   Implement the GetMetadataForFile function below to scrape the relevant
+   metadata from your document and return it as a CFDictionary using standard keys
+   (defined in MDItem.h) whenever possible.
+   ----------------------------------------------------------------------------- */
+
+/* -----------------------------------------------------------------------------
+   Step 3 (optional) 
+   If you have defined new attributes, update the schema.xml file
+  
+   Edit the schema.xml file to include the metadata keys that your importer returns.
+   Add them to the <allattrs> and <displayattrs> elements.
+  
+   Add any custom types that your importer requires to the <attributes> element
+  
+   <attribute name="com_mycompany_metadatakey" type="CFString" multivalued="true"/>
+  
+   ----------------------------------------------------------------------------- */
+
+
+
+/* -----------------------------------------------------------------------------
+    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)
+{
+    /* 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 */
+    
+    #warning To complete your importer please implement the function GetMetadataForFile in GetMetadataForFile.c
+    return FALSE;
+}
diff --git a/tools/Spotlight Importer/Info.plist b/tools/Spotlight Importer/Info.plist
new file mode 100644 (file)
index 0000000..93fbb54
--- /dev/null
@@ -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">
+<plist version="1.0">
+<dict>
+
+       <!--
+       If your application does not already define a UTI, you may want to declare it
+       here, so that your documents are recognized by systems which do not have your
+       application installed.
+
+       To export this declaration, fill in the fields with your application's 
+       information, and uncomment the block of XML.
+       -->
+       
+       <!--
+       <key>UTExportedTypeDeclarations</key>
+       <array>
+               <dict>
+                       <key>UTTypeIdentifier</key>
+                       <string>com.yourcompany.yourUTI</string>
+                       <key>UTTypeReferenceURL</key>
+                       <string>http://www.company.com/yourproduct</string>
+                       <key>UTTypeDescription</key>
+                       <string>Your Document Kind String</string>
+                       <key>UTTypeConformsTo</key>
+                       <array>
+                               <string>public.data</string>
+                               <string>public.content</string>
+                       </array>
+                       <key>UTTypeTagSpecification</key>
+                       <dict>
+                               <key>com.apple.ostype</key>
+                               <string>XXXX</string>
+                               <key>public.filename-extension</key>
+                               <array>
+                                       <string>xxxx</string>
+                               </array>
+                       </dict>
+               </dict>
+       </array>
+       -->
+
+       <key>CFBundleDevelopmentRegion</key>
+       <string>English</string>
+       <key>CFBundleDocumentTypes</key>
+       <array>
+               <dict>
+                       <key>CFBundleTypeRole</key>
+                       <string>MDImporter</string>
+                       <key>LSItemContentTypes</key>
+                       <array>
+                               <string>SUPPORTED_UTI_TYPE</string>
+                       </array>
+               </dict>
+       </array>
+       <key>CFBundleExecutable</key>
+       <string>${EXECUTABLE_NAME}</string>
+       <key>CFBundleName</key>
+       <string>${PRODUCT_NAME}</string>
+       <key>CFBundleIconFile</key>
+       <string></string>
+       <key>CFBundleIdentifier</key>
+       <string>com.apple.yourcfbundle</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>D77F8126-18F0-4ADE-917C-4A234A5590B9</key>
+               <string>MetadataImporterPluginFactory</string>
+       </dict>
+       <key>CFPlugInTypes</key>
+       <dict>
+               <key>8B08C4BF-415B-11D8-B3F9-0003936726FC</key>
+               <array>
+                       <string>D77F8126-18F0-4ADE-917C-4A234A5590B9</string>
+               </array>
+       </dict>
+       <key>CFPlugInUnloadFunction</key>
+       <string></string>
+</dict>
+</plist>
diff --git a/tools/Spotlight Importer/main.c b/tools/Spotlight Importer/main.c
new file mode 100644 (file)
index 0000000..77a2c02
--- /dev/null
@@ -0,0 +1,225 @@
+//
+//  main.c
+//  Spotlight Importer
+//
+//  Created by Taybin on 1/24/07.
+//  Copyright (c) 2007 Penguin Sounds. All rights reserved.
+//
+
+
+
+
+
+//==============================================================================
+//
+//     DO NO MODIFY THE CONTENT 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>
+
+// -----------------------------------------------------------------------------
+//     constants
+// -----------------------------------------------------------------------------
+
+
+#define PLUGIN_ID "D77F8126-18F0-4ADE-917C-4A234A5590B9"
+
+//
+// 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 import function to be implemented in GetMetadataForFile.c
+Boolean GetMetadataForFile(void *thisInterface, 
+                          CFMutableDictionaryRef attributes, 
+                          CFStringRef contentTypeUTI,
+                          CFStringRef pathToFile);
+                          
+// The layout for an instance of MetaDataImporterPlugIn 
+typedef struct __MetadataImporterPluginType
+{
+    MDImporterInterfaceStruct *conduitInterface;
+    CFUUIDRef                 factoryID;
+    UInt32                    refCount;
+} MetadataImporterPluginType;
+
+// -----------------------------------------------------------------------------
+//     prototypes
+// -----------------------------------------------------------------------------
+//     Forward declaration for the IUnknown implementation.
+//
+
+MetadataImporterPluginType  *AllocMetadataImporterPluginType(CFUUIDRef inFactoryID);
+void                      DeallocMetadataImporterPluginType(MetadataImporterPluginType *thisInstance);
+HRESULT                   MetadataImporterQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv);
+void                     *MetadataImporterPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID);
+ULONG                     MetadataImporterPluginAddRef(void *thisInstance);
+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;
+}
+
+// -----------------------------------------------------------------------------
+//     DeallocSpotlight_ImporterMDImporterPluginType
+// -----------------------------------------------------------------------------
+//     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;
+    }
+}
+
+// -----------------------------------------------------------------------------
+//     Spotlight_ImporterMDImporterPluginFactory
+// -----------------------------------------------------------------------------
+//     Implementation of the factory function for this type.
+//
+void *MetadataImporterPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID)
+{
+    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;
+}
+
diff --git a/tools/Spotlight Importer/schema.xml b/tools/Spotlight Importer/schema.xml
new file mode 100644 (file)
index 0000000..2b4099b
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+        Custom attributes that this metadata importer supports.  Below
+       is an example of a multivalued string attribute.  Other types
+       are CFNumber, CFDate, CFBoolean and CFData.                   
+    </note>
+    <attributes>
+        <attribute name="com_Foo_YourAttrName" multivalued="true" type="CFString"/>
+    </attributes>
+
+    <types>
+        <type name="SUPPORTED_UTI_TYPE">
+            <note>
+               The keys that this metadata importer handles.
+            </note>
+            <allattrs>
+           com_Foo_YourAttrName
+            </allattrs>
+            <displayattrs>
+           com_Foo_YourAttrName
+            </displayattrs>
+        </type>
+    </types>
+</schema>
+