Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
dbg-importer/main.c
/* |
File: main.c |
Version: 1.0 |
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, 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 Computer, 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 © 2005 Apple Computer, 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 "6379F953-2DC9-4A7F-823B-816DD001A6D6" |
// |
// 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; |
} |
// ----------------------------------------------------------------------------- |
// Deallocdbg_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; |
} |
} |
// ----------------------------------------------------------------------------- |
// dbg_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; |
} |
Copyright © 2005 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2005-06-01