X-Git-Url: https://git.saurik.com/apple/cf.git/blobdiff_plain/47a9ab1f151d80a00a045f81937ddac81c51a463..bd5b749cf7786ae858ab372fc8f64179736c6515:/PlugIn.subproj/CFPlugIn_Factory.c diff --git a/PlugIn.subproj/CFPlugIn_Factory.c b/PlugIn.subproj/CFPlugIn_Factory.c deleted file mode 100644 index 436d458..0000000 --- a/PlugIn.subproj/CFPlugIn_Factory.c +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/* CFPlugIn_Factory.c - Copyright 1999-2002, Apple, Inc. All rights reserved. - Responsibility: Doug Davidson -*/ - -#include "CFBundle_Internal.h" -#include "CFInternal.h" - -static CFSpinLock_t CFPlugInGlobalDataLock = 0; -static CFMutableDictionaryRef _factoriesByFactoryID = NULL; /* Value is _CFPFactory */ -static CFMutableDictionaryRef _factoriesByTypeID = NULL; /* Value is array of _CFPFactory */ - -static void _CFPFactoryAddToTable(_CFPFactory *factory) { - __CFSpinLock(&CFPlugInGlobalDataLock); - if (_factoriesByFactoryID == NULL) { - CFDictionaryValueCallBacks _factoryDictValueCallbacks = {0, NULL, NULL, NULL, NULL}; - // Use default allocator - _factoriesByFactoryID = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &_factoryDictValueCallbacks); - } - CFDictionarySetValue(_factoriesByFactoryID, factory->_uuid, factory); - __CFSpinUnlock(&CFPlugInGlobalDataLock); -} - -static void _CFPFactoryRemoveFromTable(_CFPFactory *factory) { - __CFSpinLock(&CFPlugInGlobalDataLock); - if (_factoriesByFactoryID != NULL) { - CFDictionaryRemoveValue(_factoriesByFactoryID, factory->_uuid); - } - __CFSpinUnlock(&CFPlugInGlobalDataLock); -} - -__private_extern__ _CFPFactory *_CFPFactoryFind(CFUUIDRef factoryID, Boolean enabled) { - _CFPFactory *result = NULL; - - __CFSpinLock(&CFPlugInGlobalDataLock); - if (_factoriesByFactoryID != NULL) { - result = (_CFPFactory *)CFDictionaryGetValue(_factoriesByFactoryID, factoryID); - if (result && result->_enabled != enabled) { - result = NULL; - } - } - __CFSpinUnlock(&CFPlugInGlobalDataLock); - return result; -} - -static void _CFPFactoryDeallocate(_CFPFactory *factory) { - CFAllocatorRef allocator = factory->_allocator; - SInt32 c; - - _CFPFactoryRemoveFromTable(factory); - - if (factory->_plugIn) { - _CFPlugInRemoveFactory(factory->_plugIn, factory); - } - - /* Remove all types for this factory. */ - c = CFArrayGetCount(factory->_types); - while (c--) { - _CFPFactoryRemoveType(factory, CFArrayGetValueAtIndex(factory->_types, c)); - } - CFRelease(factory->_types); - - if (factory->_funcName) { - CFRelease(factory->_funcName); - } - - if (factory->_uuid) { - CFRelease(factory->_uuid); - } - - CFAllocatorDeallocate(allocator, factory); - CFRelease(allocator); -} - -static _CFPFactory *_CFPFactoryCommonCreate(CFAllocatorRef allocator, CFUUIDRef factoryID) { - _CFPFactory *factory; - UInt32 size; - size = sizeof(_CFPFactory); - allocator = ((NULL == allocator) ? CFRetain(__CFGetDefaultAllocator()) : CFRetain(allocator)); - factory = CFAllocatorAllocate(allocator, size, 0); - if (NULL == factory) { - CFRelease(allocator); - return NULL; - } - - factory->_allocator = allocator; - - factory->_uuid = CFRetain(factoryID); - factory->_enabled = true; - factory->_instanceCount = 0; - - _CFPFactoryAddToTable(factory); - - factory->_types = CFArrayCreateMutable(allocator, 0, &kCFTypeArrayCallBacks); - - return factory; -} - -__private_extern__ _CFPFactory *_CFPFactoryCreate(CFAllocatorRef allocator, CFUUIDRef factoryID, CFPlugInFactoryFunction func) { - _CFPFactory *factory = _CFPFactoryCommonCreate(allocator, factoryID); - - factory->_func = func; - factory->_plugIn = NULL; - factory->_funcName = NULL; - - return factory; -} - -__private_extern__ _CFPFactory *_CFPFactoryCreateByName(CFAllocatorRef allocator, CFUUIDRef factoryID, CFPlugInRef plugIn, CFStringRef funcName) { - _CFPFactory *factory = _CFPFactoryCommonCreate(allocator, factoryID); - - factory->_func = NULL; - factory->_plugIn = plugIn; - if (plugIn) { - _CFPlugInAddFactory(plugIn, factory); - } - factory->_funcName = (funcName ? CFStringCreateCopy(allocator, funcName) : NULL); - - return factory; -} - -__private_extern__ CFUUIDRef _CFPFactoryGetFactoryID(_CFPFactory *factory) { - return factory->_uuid; -} - -__private_extern__ CFPlugInRef _CFPFactoryGetPlugIn(_CFPFactory *factory) { - return factory->_plugIn; -} - -__private_extern__ void *_CFPFactoryCreateInstance(CFAllocatorRef allocator, _CFPFactory *factory, CFUUIDRef typeID) { - void *result = NULL; - if (factory->_enabled) { - if (factory->_func == NULL) { - factory->_func = CFBundleGetFunctionPointerForName(factory->_plugIn, factory->_funcName); - if (factory->_func == NULL) { - CFLog(__kCFLogPlugIn, CFSTR("Cannot find function pointer %@ for factory %@ in %@"), factory->_funcName, factory->_uuid, factory->_plugIn); - } -#if defined(__MACH__) && defined(__ppc__) - else { - // return values from CFBundleGetFunctionPointerForName will always be dyld, but - // we must force-fault them because pointers to glue code do not fault correctly - factory->_func = (void *)((uint32_t)(factory->_func) | 0x1); - } -#endif - } - if (factory->_func) { -#if 1 - // UPPGOOP - FAULT_CALLBACK((void **)&(factory->_func)); - result = (void *)INVOKE_CALLBACK2(factory->_func, allocator, typeID); -#else - result = factory->_func(allocator, typeID); -#endif - } - } else { - CFLog(__kCFLogPlugIn, CFSTR("Factory %@ is disabled"), factory->_uuid); - } - return result; -} - -__private_extern__ void _CFPFactoryDisable(_CFPFactory *factory) { - factory->_enabled = false; - if (factory->_instanceCount == 0) { - _CFPFactoryDeallocate(factory); - } -} - -__private_extern__ Boolean _CFPFactoryIsEnabled(_CFPFactory *factory) { - return factory->_enabled; -} - -__private_extern__ void _CFPFactoryFlushFunctionCache(_CFPFactory *factory) { - /* MF:!!! Assert that this factory belongs to a plugIn. */ - /* This is called by the factory's plugIn when the plugIn unloads its code. */ - factory->_func = NULL; -} - -__private_extern__ void _CFPFactoryAddType(_CFPFactory *factory, CFUUIDRef typeID) { - CFMutableArrayRef array; - - /* Add the type to the factory's type list */ - CFArrayAppendValue(factory->_types, typeID); - - /* Add the factory to the type's array of factories */ - __CFSpinLock(&CFPlugInGlobalDataLock); - if (_factoriesByTypeID == NULL) { - // Create this from default allocator - _factoriesByTypeID = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - } - array = (CFMutableArrayRef)CFDictionaryGetValue(_factoriesByTypeID, typeID); - if (array == NULL) { - CFArrayCallBacks _factoryArrayCallbacks = {0, NULL, NULL, NULL, NULL}; - // Create this from default allocator - array = CFArrayCreateMutable(NULL, 0, &_factoryArrayCallbacks); - CFDictionarySetValue(_factoriesByTypeID, typeID, array); - CFRelease(array); - } - CFArrayAppendValue(array, factory); - __CFSpinUnlock(&CFPlugInGlobalDataLock); -} - -__private_extern__ void _CFPFactoryRemoveType(_CFPFactory *factory, CFUUIDRef typeID) { - /* Remove it from the factory's type list */ - SInt32 idx; - - idx = CFArrayGetFirstIndexOfValue(factory->_types, CFRangeMake(0, CFArrayGetCount(factory->_types)), typeID); - if (idx >=0) { - CFArrayRemoveValueAtIndex(factory->_types, idx); - } - - /* Remove the factory from the type's list of factories */ - __CFSpinLock(&CFPlugInGlobalDataLock); - if (_factoriesByTypeID != NULL) { - CFMutableArrayRef array = (CFMutableArrayRef)CFDictionaryGetValue(_factoriesByTypeID, typeID); - if (array != NULL) { - idx = CFArrayGetFirstIndexOfValue(array, CFRangeMake(0, CFArrayGetCount(array)), factory); - if (idx >=0) { - CFArrayRemoveValueAtIndex(array, idx); - if (CFArrayGetCount(array) == 0) { - CFDictionaryRemoveValue(_factoriesByTypeID, typeID); - } - } - } - } - __CFSpinUnlock(&CFPlugInGlobalDataLock); -} - -__private_extern__ Boolean _CFPFactorySupportsType(_CFPFactory *factory, CFUUIDRef typeID) { - SInt32 idx; - - idx = CFArrayGetFirstIndexOfValue(factory->_types, CFRangeMake(0, CFArrayGetCount(factory->_types)), typeID); - return ((idx >= 0) ? true : false); -} - -__private_extern__ CFArrayRef _CFPFactoryFindForType(CFUUIDRef typeID) { - CFArrayRef result = NULL; - - __CFSpinLock(&CFPlugInGlobalDataLock); - if (_factoriesByTypeID != NULL) { - result = CFDictionaryGetValue(_factoriesByTypeID, typeID); - } - __CFSpinUnlock(&CFPlugInGlobalDataLock); - - return result; -} - -/* These methods are called by CFPlugInInstance when an instance is created or destroyed. If a factory's instance count goes to 0 and the factory has been disabled, the factory is destroyed. */ -__private_extern__ void _CFPFactoryAddInstance(_CFPFactory *factory) { - /* MF:!!! Assert that factory is enabled. */ - factory->_instanceCount++; - if (factory->_plugIn) { - _CFPlugInAddPlugInInstance(factory->_plugIn); - } -} - -__private_extern__ void _CFPFactoryRemoveInstance(_CFPFactory *factory) { - /* MF:!!! Assert that _instanceCount > 0. */ - factory->_instanceCount--; - if (factory->_plugIn) { - _CFPlugInRemovePlugInInstance(factory->_plugIn); - } - if ((factory->_instanceCount == 0) && (!factory->_enabled)) { - _CFPFactoryDeallocate(factory); - } -}