/*
 * Copyright (c) 2008-2009 Brent Fulgham <bfulgham@gmail.org>.  All rights reserved.
 *
 * This source code is a modified version of the CoreFoundation sources released by Apple Inc. under
 * the terms of the APSL version 2.0 (see below).
 *
 * For information about changes from the original Apple source release can be found by reviewing the
 * source control system for the project at https://sourceforge.net/svn/?group_id=246198.
 *
 * The original license information is as follows:
 * 
 * Copyright (c) 2008 Apple 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.h
	Copyright (c) 1999-2007, Apple Inc.  All rights reserved.
*/

#if !defined(__COREFOUNDATION_CFPLUGIN_FACTORY__)
#define __COREFOUNDATION_CFPLUGIN_FACTORY__ 1

#include "CFBundle_Internal.h"

CF_EXTERN_C_BEGIN

typedef struct __CFPFactory {
    CFAllocatorRef _allocator;

    CFUUIDRef _uuid;
    Boolean _enabled;
    char _padding[3];
    SInt32 _instanceCount;

    CFPlugInFactoryFunction _func;
    
    CFPlugInRef _plugIn;
    CFStringRef _funcName;

    CFMutableArrayRef _types;
} _CFPFactory;

extern _CFPFactory *_CFPFactoryCreate(CFAllocatorRef allocator, CFUUIDRef factoryID, CFPlugInFactoryFunction func);
extern _CFPFactory *_CFPFactoryCreateByName(CFAllocatorRef allocator, CFUUIDRef factoryID, CFPlugInRef plugIn, CFStringRef funcName);

extern _CFPFactory *_CFPFactoryFind(CFUUIDRef factoryID, Boolean enabled);

extern CFUUIDRef _CFPFactoryGetFactoryID(_CFPFactory *factory);
extern CFPlugInRef _CFPFactoryGetPlugIn(_CFPFactory *factory);

extern void *_CFPFactoryCreateInstance(CFAllocatorRef allocator, _CFPFactory *factory, CFUUIDRef typeID);
extern void _CFPFactoryDisable(_CFPFactory *factory);
extern Boolean _CFPFactoryIsEnabled(_CFPFactory *factory);

extern void _CFPFactoryFlushFunctionCache(_CFPFactory *factory);

extern void _CFPFactoryAddType(_CFPFactory *factory, CFUUIDRef typeID);
extern void _CFPFactoryRemoveType(_CFPFactory *factory, CFUUIDRef typeID);

extern Boolean _CFPFactorySupportsType(_CFPFactory *factory, CFUUIDRef typeID);
extern CFArrayRef _CFPFactoryFindForType(CFUUIDRef typeID);

/* 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. */
extern void _CFPFactoryAddInstance(_CFPFactory *factory);
extern void _CFPFactoryRemoveInstance(_CFPFactory *factory);

CF_EXTERN_C_END

#endif /* ! __COREFOUNDATION_CFPLUGIN_FACTORY__ */

