static CFURLRef _preferencesDirectoryForUserHostSafetyLevel(CFStringRef userName, CFStringRef hostName, unsigned long safeLevel) { CFAllocatorRef alloc = __CFPreferencesAllocator(); #if 0 CFURLRef url = NULL; UniChar szPath[MAX_PATH]; if (S_OK == SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, (LPWSTR) szPath)) { CFStringRef directoryPath = CFStringCreateWithCharacters(alloc, szPath, strlen_UniChar(szPath)); if (directoryPath) { CFStringRef completePath = CFStringCreateWithFormat(alloc, NULL, CFSTR("%@\\Apple\\"), directoryPath); if (completePath) { url = CFURLCreateWithFileSystemPath(alloc, completePath, kCFURLWindowsPathStyle, true); CFRelease(completePath); } CFRelease(directoryPath); } } // Can't find a better place? Home directory then? if (url == NULL) url = CFCopyHomeDirectoryURLForUser((userName == kCFPreferencesCurrentUser) ? NULL : userName); return url; #else CFURLRef home = NULL; CFURLRef url; int levels = 0; // if (hostName != kCFPreferencesCurrentHost && hostName != kCFPreferencesAnyHost) return NULL; // Arbitrary host access not permitted if (userName == kCFPreferencesAnyUser) { if (!home) home = CFURLCreateWithFileSystemPath(alloc, CFSTR("/Library/Preferences/"), kCFURLPOSIXPathStyle, true); levels = 1; if (hostName == kCFPreferencesCurrentHost) url = home; else { url = CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Network/"), kCFURLPOSIXPathStyle, true, home); levels ++; CFRelease(home); } } else { home = CFCopyHomeDirectoryURLForUser((userName == kCFPreferencesCurrentUser) ? NULL : userName); if (home) { url = (safeLevel > 0) ? CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Library/Safe Preferences/"), kCFURLPOSIXPathStyle, true, home) : CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("Library/Preferences/"), kCFURLPOSIXPathStyle, true, home); levels = 2; CFRelease(home); if (hostName != kCFPreferencesAnyHost) { home = url; url = CFURLCreateWithFileSystemPathRelativeToBase(alloc, CFSTR("ByHost/"), kCFURLPOSIXPathStyle, true, home); levels ++; CFRelease(home); } } else { url = NULL; } } return url; #endif }
/* * _CFCreateApplicationRepositoryPath returns the path to the application's * repository in a CFMutableStringRef. The path returned will be: * <nFolder_path>\Apple Computer\<bundle_name>\ * or if the bundle name cannot be obtained: * <nFolder_path>\Apple Computer\ * where nFolder_path is obtained by calling SHGetFolderPath with nFolder * (for example, with CSIDL_APPDATA or CSIDL_LOCAL_APPDATA). * * The CFMutableStringRef result must be released by the caller. * * If anything fails along the way, the result will be NULL. */ CF_EXPORT CFMutableStringRef _CFCreateApplicationRepositoryPath(CFAllocatorRef alloc, int nFolder) { CFMutableStringRef result = NULL; UniChar szPath[MAX_PATH]; // get the current path to the data repository: CSIDL_APPDATA (roaming) or CSIDL_LOCAL_APPDATA (nonroaming) if (S_OK == SHGetFolderPathW(NULL, nFolder, NULL, 0, (wchar_t *) szPath)) { CFStringRef directoryPath; // make it a CFString directoryPath = CFStringCreateWithCharacters(alloc, szPath, strlen_UniChar(szPath)); if (directoryPath) { CFBundleRef bundle; CFStringRef bundleName; CFStringRef completePath; // attempt to get the bundle name bundle = CFBundleGetMainBundle(); if (bundle) { bundleName = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(bundle, kCFBundleNameKey); } else { bundleName = NULL; } if (bundleName) { // the path will be "<directoryPath>\Apple Computer\<bundleName>\" if there is a bundle name completePath = CFStringCreateWithFormat(alloc, NULL, CFSTR("%@\\Apple Computer\\%@\\"), directoryPath, bundleName); } else { // or "<directoryPath>\Apple Computer\" if there is no bundle name. completePath = CFStringCreateWithFormat(alloc, NULL, CFSTR("%@\\Apple Computer\\"), directoryPath); } CFRelease(directoryPath); // make a mutable copy to return if (completePath) { result = CFStringCreateMutableCopy(alloc, 0, completePath); CFRelease(completePath); } } } return ( result ); }