main.c
/* |
File: main.c |
Abstract: Default main.c for an importer |
Version: 1.1 |
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple |
Inc. ("Apple") in consideration of your agreement to the following |
terms, and your use, installation, modification or redistribution of |
this Apple software constitutes acceptance of these terms. If you do |
not agree with these terms, please do not use, install, modify or |
redistribute this Apple software. |
In consideration of your agreement to abide by the following terms, and |
subject to these terms, Apple grants you a personal, non-exclusive |
license, under Apple's copyrights in this original Apple software (the |
"Apple Software"), to use, reproduce, modify and redistribute the Apple |
Software, with or without modifications, in source and/or binary forms; |
provided that if you redistribute the Apple Software in its entirety and |
without modifications, you must retain this notice and the following |
text and disclaimers in all such redistributions of the Apple Software. |
Neither the name, trademarks, service marks or logos of Apple Inc. may |
be used to endorse or promote products derived from the Apple Software |
without specific prior written permission from Apple. Except as |
expressly stated in this notice, no other rights or licenses, express or |
implied, are granted by Apple herein, including but not limited to any |
patent rights that may be infringed by your derivative works or by other |
works in which the Apple Software may be incorporated. |
The Apple Software is provided by Apple on an "AS IS" basis. APPLE |
MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION |
THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS |
FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND |
OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. |
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL |
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, |
MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED |
AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), |
STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGE. |
Copyright (C) 2012 Apple Inc. 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 "7DCC8D96-C843-4D1C-B0D0-8D9CE2443042" |
// |
// 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; |
} |
// ----------------------------------------------------------------------------- |
// DeallociSpendImporterMDImporterPluginType |
// ----------------------------------------------------------------------------- |
// 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; |
} |
} |
// ----------------------------------------------------------------------------- |
// iSpendImporterMDImporterPluginFactory |
// ----------------------------------------------------------------------------- |
// 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; |
} |
Copyright © 2012 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2012-06-07