// 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
