// Copyright (c) 2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/mac_util.h" #import #include "base/file_path.h" #include "base/logging.h" #include "base/scoped_cftyperef.h" #include "base/sys_string_conversions.h" namespace mac_util { std::string PathFromFSRef(const FSRef& ref) { scoped_cftyperef url( CFURLCreateFromFSRef(kCFAllocatorDefault, &ref)); NSString *path_string = [(NSURL *)url.get() path]; return [path_string fileSystemRepresentation]; } bool FSRefFromPath(const std::string& path, FSRef* ref) { OSStatus status = FSPathMakeRef((const UInt8*)path.c_str(), ref, nil); return status == noErr; } // Adapted from http://developer.apple.com/carbon/tipsandtricks.html#AmIBundled bool AmIBundled() { ProcessSerialNumber psn = {0, kCurrentProcess}; FSRef fsref; if (GetProcessBundleLocation(&psn, &fsref) != noErr) return false; FSCatalogInfo info; if (FSGetCatalogInfo(&fsref, kFSCatInfoNodeFlags, &info, NULL, NULL, NULL) != noErr) { return false; } return info.nodeFlags & kFSNodeIsDirectoryMask; } // No threading worries since NSBundle isn't thread safe. static NSBundle* g_override_app_bundle = nil; NSBundle* MainAppBundle() { if (g_override_app_bundle) return g_override_app_bundle; return [NSBundle mainBundle]; } void SetOverrideAppBundle(NSBundle* bundle) { if (bundle != g_override_app_bundle) { [g_override_app_bundle release]; g_override_app_bundle = [bundle retain]; } } void SetOverrideAppBundlePath(const FilePath& file_path) { NSString* path = base::SysUTF8ToNSString(file_path.value()); NSBundle* bundle = [NSBundle bundleWithPath:path]; DCHECK(bundle) << "failed to load the bundle: " << file_path.value(); SetOverrideAppBundle(bundle); } OSType CreatorCodeForCFBundleRef(CFBundleRef bundle) { OSType creator = kUnknownType; CFBundleGetPackageInfo(bundle, NULL, &creator); return creator; } OSType CreatorCodeForApplication() { CFBundleRef bundle = CFBundleGetMainBundle(); if (!bundle) return kUnknownType; return CreatorCodeForCFBundleRef(bundle); } FilePath GetUserLibraryPath() { NSArray* dirs = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); if ([dirs count] == 0) return FilePath(); NSString* library_dir = [dirs objectAtIndex:0]; const char* library_dir_path = [library_dir fileSystemRepresentation]; if (!library_dir_path) return FilePath(); return FilePath(library_dir_path); } } // namespace mac_util