FVDIHLInterface.cpp [plain text]
#include <security_utilities/cfutilities.h>
#include <security_utilities/errors.h>
#include "FVDIHLInterface.h"
#pragma mark -------------------- Static initializations --------------------
bool FVDIHLInterface::instanceFlag = false;
FVDIHLInterface* FVDIHLInterface::fvdihlInterface = NULL;
#pragma mark -------------------- Implementation --------------------
FVDIHLInterface *FVDIHLInterface::getInstance()
{
if (instanceFlag)
return fvdihlInterface;
fvdihlInterface = new FVDIHLInterface();
instanceFlag = fvdihlInterface->loadDiskImagesFramework();
return fvdihlInterface;
}
bool FVDIHLInterface::loadDiskImagesFramework()
{
if (_dihlDiskImageAttach!=NULL && _dihlDiskImageCreate!=NULL && _dihlDiskImageChangePassword!=NULL &&
_dihlDIInitialize!=NULL && _dihlDIDeinitialize!=NULL)
return true;
#if 1 || defined(NDEBUG)
const char *dyld_framework_path = NULL;
#else
const char *dyld_framework_path = getenv("DYLD_FRAMEWORK_PATH");
#endif
CFRef<CFStringRef> difPathStr = dyld_framework_path?
CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%s/DiskImages.framework"), dyld_framework_path, NULL)
:CFSTR("/System/Library/PrivateFrameworks/DiskImages.framework");
CFRef<CFURLRef> bundleURL = CFURLCreateWithFileSystemPath(NULL, difPathStr, kCFURLPOSIXPathStyle, false);
if (!bundleURL)
return false;
CFRef<CFBundleRef> bundleRef = CFBundleCreate(NULL, bundleURL);
if (!bundleRef)
return false;
if (!CFBundleIsExecutableLoaded(bundleRef))
CFBundleLoadExecutable(bundleRef);
_dihlDiskImageCreate = (_dihlDiskImageCreateProc *)CFBundleGetFunctionPointerForName(bundleRef, CFSTR("DIHLDiskImageCreate"));
_dihlDiskImageAttach = (_dihlDiskImageAttachProc *)CFBundleGetFunctionPointerForName(bundleRef, CFSTR("DIHLDiskImageAttach"));
_dihlDiskImageChangePassword = (_dihlDiskImageChangePasswordProc *)CFBundleGetFunctionPointerForName(bundleRef,
CFSTR("DIHLDiskImageChangePassword"));
_dihlDIInitialize = (_dihlDIInitializeProc *)CFBundleGetFunctionPointerForName(bundleRef, CFSTR("DIInitialize"));
_dihlDIDeinitialize = (_dihlDIDeinitializeProc *)CFBundleGetFunctionPointerForName(bundleRef, CFSTR("DIDeinitialize"));
_dihlDiskImageCompact = (_dihlDiskImageCompactProc *)CFBundleGetFunctionPointerForName(bundleRef, CFSTR("DIHLDiskImageCompact"));
if (_dihlDiskImageAttach==NULL || _dihlDiskImageCreate==NULL || _dihlDiskImageChangePassword==NULL || _dihlDIInitialize==NULL ||
_dihlDIDeinitialize==NULL || _dihlDiskImageCompact==NULL)
MacOSError::throwMe(kUnsupportedFunctionErr);
return true;
}