// Copyright (c) 2012 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. #import "chrome/common/mac/app_mode_chrome_locator.h" #import #include #include "base/file_path.h" #include "base/mac/foundation_util.h" #include "base/sys_string_conversions.h" namespace app_mode { bool FindBundleById(NSString* bundle_id, FilePath* out_bundle) { NSWorkspace* ws = [NSWorkspace sharedWorkspace]; NSString *bundlePath = [ws absolutePathForAppBundleWithIdentifier:bundle_id]; if (!bundlePath) return false; *out_bundle = base::mac::NSStringToFilePath(bundlePath); return true; } bool GetChromeBundleInfo(const FilePath& chrome_bundle, string16* raw_version_str, FilePath* version_path, FilePath* framework_shlib_path) { using base::mac::ObjCCast; NSString* cr_bundle_path = base::mac::FilePathToNSString(chrome_bundle); NSBundle* cr_bundle = [NSBundle bundleWithPath:cr_bundle_path]; if (!cr_bundle) return false; // Read raw version string. NSString* cr_version = ObjCCast( [cr_bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]); if (!cr_version) return false; // Get versioned directory. NSArray* cr_versioned_path_components = [NSArray arrayWithObjects:cr_bundle_path, @"Contents", @"Versions", cr_version, nil]; NSString* cr_versioned_path = [NSString pathWithComponents:cr_versioned_path_components]; // Get the framework path. NSString* cr_bundle_exe = ObjCCast( [cr_bundle objectForInfoDictionaryKey:@"CFBundleExecutable"]); NSString* cr_framework_shlib_path = [cr_versioned_path stringByAppendingPathComponent: [cr_bundle_exe stringByAppendingString:@" Framework.framework"]]; cr_framework_shlib_path = [cr_framework_shlib_path stringByAppendingPathComponent: [cr_bundle_exe stringByAppendingString:@" Framework"]]; if (!cr_bundle_exe || !cr_framework_shlib_path) return false; // A few more sanity checks. BOOL is_directory; BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:cr_framework_shlib_path isDirectory:&is_directory]; if (!exists || is_directory) return false; // Everything OK, copy output parameters. *raw_version_str = base::SysNSStringToUTF16(cr_version); *version_path = base::mac::NSStringToFilePath(cr_versioned_path); *framework_shlib_path = base::mac::NSStringToFilePath(cr_framework_shlib_path); return true; } } // namespace app_mode