#include <CoreFoundation/CFBundle.h>
#include <CoreFoundation/CFString.h>
#include <CoreFoundation/CFURL.h>
#include "config.h"
#include "wintypes.h"
#include "pcsclite.h"
#include "dyn_generic.h"
#include "debuglog.h"
int DYN_LoadLibrary(void **pvLHandle, char *pcLibrary)
{
CFStringRef bundlePath;
CFURLRef bundleURL;
CFBundleRef bundle;
*pvLHandle = 0;
bundlePath = CFStringCreateWithCString(NULL, pcLibrary,
kCFStringEncodingMacRoman);
if (bundlePath == NULL)
return SCARD_E_NO_MEMORY;
bundleURL = CFURLCreateWithFileSystemPath(NULL, bundlePath,
kCFURLPOSIXPathStyle, TRUE);
CFRelease(bundlePath);
if (bundleURL == NULL)
return SCARD_E_NO_MEMORY;
bundle = CFBundleCreate(NULL, bundleURL);
CFRelease(bundleURL);
if (bundle == NULL)
{
Log1(PCSC_LOG_ERROR, "CFBundleCreate");
return SCARD_F_UNKNOWN_ERROR;
}
if (!CFBundleLoadExecutable(bundle))
{
Log1(PCSC_LOG_ERROR, "CFBundleLoadExecutable");
CFRelease(bundle);
return SCARD_F_UNKNOWN_ERROR;
}
*pvLHandle = (void *) bundle;
return SCARD_S_SUCCESS;
}
int DYN_CloseLibrary(void **pvLHandle)
{
CFBundleRef bundle = (CFBundleRef) * pvLHandle;
if (CFBundleIsExecutableLoaded(bundle) == TRUE)
{
CFBundleUnloadExecutable(bundle);
CFRelease(bundle);
}
else
Log1(PCSC_LOG_ERROR, "Cannot unload library.");
*pvLHandle = 0;
return SCARD_S_SUCCESS;
}
int DYN_GetAddress(void *pvLHandle, void **pvFHandle, const char *pcFunction)
{
CFBundleRef bundle = (CFBundleRef) pvLHandle;
CFStringRef cfName = CFStringCreateWithCString(NULL, pcFunction,
kCFStringEncodingMacRoman);
if (cfName == NULL)
return SCARD_E_NO_MEMORY;
*pvFHandle = CFBundleGetFunctionPointerForName(bundle, cfName);
CFRelease(cfName);
if (*pvFHandle == NULL)
return SCARD_F_UNKNOWN_ERROR;
return SCARD_S_SUCCESS;
}