SecADWrapper.c   [plain text]


/*
 * Copyright (c) 2016 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@
 */

#include "SecADWrapper.h"

#if TARGET_OS_EMBEDDED
#include <AggregateDictionary/ADClient.h>

static typeof(ADClientAddValueForScalarKey) *soft_ADClientAddValueForScalarKey = NULL;
static typeof(ADClientClearScalarKey) *soft_ADClientClearScalarKey = NULL;
static typeof(ADClientSetValueForScalarKey) *soft_ADClientSetValueForScalarKey = NULL;
static typeof(ADClientPushValueForDistributionKey) *soft_ADClientPushValueForDistributionKey = NULL;

static bool
setup(void)
{
    static dispatch_once_t onceToken;
    static CFBundleRef bundle = NULL;
    dispatch_once(&onceToken, ^{

        CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR("/System/Library/PrivateFrameworks/AggregateDictionary.framework"), kCFURLPOSIXPathStyle, true);
        if (url == NULL)
            return;

        bundle = CFBundleCreate(kCFAllocatorDefault, url);
        CFRelease(url);
        if (bundle == NULL)
            return;

        soft_ADClientClearScalarKey = CFBundleGetFunctionPointerForName(bundle, CFSTR("ADClientClearScalarKey"));
        soft_ADClientSetValueForScalarKey = CFBundleGetFunctionPointerForName(bundle, CFSTR("ADClientSetValueForScalarKey"));
        soft_ADClientAddValueForScalarKey = CFBundleGetFunctionPointerForName(bundle, CFSTR("ADClientAddValueForScalarKey"));
        soft_ADClientPushValueForDistributionKey = CFBundleGetFunctionPointerForName(bundle, CFSTR("ADClientPushValueForDistributionKey"));

        if (soft_ADClientClearScalarKey == NULL ||
            soft_ADClientSetValueForScalarKey == NULL ||
            soft_ADClientAddValueForScalarKey == NULL ||
            soft_ADClientPushValueForDistributionKey == NULL)
        {
            CFRelease(bundle);
            bundle = NULL;
        }
    });
    return bundle != NULL;
}
#endif

void
SecADClearScalarKey(CFStringRef key)
{
#if TARGET_OS_EMBEDDED
    if (setup())
        soft_ADClientClearScalarKey(key);
#endif
}

void
SecADSetValueForScalarKey(CFStringRef key, int64_t value)
{
#if TARGET_OS_EMBEDDED
    if (setup())
        soft_ADClientSetValueForScalarKey(key, value);
#endif
}
void
SecADAddValueForScalarKey(CFStringRef key, int64_t value)
{
#if TARGET_OS_EMBEDDED
    if (setup())
        soft_ADClientAddValueForScalarKey(key, value);
#endif
}

void
SecADClientPushValueForDistributionKey(CFStringRef key, int64_t value)
{
#if TARGET_OS_EMBEDDED
    if (setup())
        soft_ADClientPushValueForDistributionKey(key, value);
#endif
}