66 lines
2.0 KiB
C++
66 lines
2.0 KiB
C++
// Copyright 2013 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/launch_services_util.h"
|
|
|
|
#include "base/logging.h"
|
|
#include "base/mac/mac_logging.h"
|
|
#include "base/mac/mac_util.h"
|
|
#include "base/strings/sys_string_conversions.h"
|
|
|
|
namespace base {
|
|
namespace mac {
|
|
|
|
bool OpenApplicationWithPath(const base::FilePath& bundle_path,
|
|
const CommandLine& command_line,
|
|
LSLaunchFlags launch_flags,
|
|
ProcessSerialNumber* out_psn) {
|
|
FSRef app_fsref;
|
|
if (!base::mac::FSRefFromPath(bundle_path.value(), &app_fsref)) {
|
|
LOG(ERROR) << "base::mac::FSRefFromPath failed for " << bundle_path.value();
|
|
return false;
|
|
}
|
|
|
|
std::vector<std::string> argv = command_line.argv();
|
|
int argc = argv.size();
|
|
base::ScopedCFTypeRef<CFMutableArrayRef> launch_args(
|
|
CFArrayCreateMutable(NULL, argc - 1, &kCFTypeArrayCallBacks));
|
|
if (!launch_args) {
|
|
LOG(ERROR) << "CFArrayCreateMutable failed, size was " << argc;
|
|
return false;
|
|
}
|
|
|
|
for (int i = 1; i < argc; ++i) {
|
|
const std::string& arg(argv[i]);
|
|
|
|
base::ScopedCFTypeRef<CFStringRef> arg_cf(base::SysUTF8ToCFStringRef(arg));
|
|
if (!arg_cf) {
|
|
LOG(ERROR) << "base::SysUTF8ToCFStringRef failed for " << arg;
|
|
return false;
|
|
}
|
|
CFArrayAppendValue(launch_args, arg_cf);
|
|
}
|
|
|
|
LSApplicationParameters ls_parameters = {
|
|
0, // version
|
|
launch_flags,
|
|
&app_fsref,
|
|
NULL, // asyncLaunchRefCon
|
|
NULL, // environment
|
|
launch_args,
|
|
NULL // initialEvent
|
|
};
|
|
// TODO(jeremya): this opens a new browser window if Chrome is already
|
|
// running without any windows open.
|
|
OSStatus status = LSOpenApplication(&ls_parameters, out_psn);
|
|
if (status != noErr) {
|
|
OSSTATUS_LOG(ERROR, status) << "LSOpenApplication";
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // namespace mac
|
|
} // namespace base
|