blob: ac62380cf2fce635039fb9b463e0024a94e2c369 [file] [log] [blame]
// 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 <AppKit/AppKit.h>
#include <CoreFoundation/CoreFoundation.h>
#include "base/files/file_path.h"
#include "base/mac/foundation_util.h"
#include "base/strings/sys_string_conversions.h"
#include "chrome/common/chrome_constants.h"
namespace app_mode {
bool FindBundleById(NSString* bundle_id, base::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 base::FilePath& chrome_bundle,
base::string16* raw_version_str,
base::FilePath* version_path,
base::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<NSString>(
[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<NSString>(
[cr_bundle objectForInfoDictionaryKey:@"CFBundleExecutable"]);
NSString* cr_framework_shlib_path =
[cr_versioned_path stringByAppendingPathComponent:
base::SysUTF8ToNSString(chrome::kFrameworkName)];
// chrome::kFrameworkName looks like "$PRODUCT_STRING Framework.framework".
// The library itself is at
// "$PRODUCT_STRING Framework.framework/$PRODUCT_STRING Framework", so we cut
// off the .framework extension here and append it to the path.
// It's important to build the path to the framework this way because
// in Canary the framework is still called "Google Chrome Framework".
cr_framework_shlib_path =
[cr_framework_shlib_path stringByAppendingPathComponent:
[base::SysUTF8ToNSString(chrome::kFrameworkName)
stringByDeletingPathExtension]];
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