1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/profile_import_process_host.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox_importer_utils.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/profile_import_process_client.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/profile_import_process_messages.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "ipc/ipc_switches.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochProfileImportProcessHost::ProfileImportProcessHost(
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ProfileImportProcessClient* import_process_client,
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    BrowserThread::ID thread_id)
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : BrowserChildProcessHost(PROFILE_IMPORT_PROCESS),
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      import_process_client_(import_process_client),
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      thread_id_(thread_id) {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickProfileImportProcessHost::~ProfileImportProcessHost() {
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ProfileImportProcessHost::StartProfileImportProcess(
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const importer::SourceProfile& source_profile,
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    uint16 items,
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool import_to_bookmark_bar) {
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!StartProcess())
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Dictionary of all localized strings that could be needed by the importer
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in the external process.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue localized_strings;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  localized_strings.SetString(
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::IntToString(IDS_BOOKMARK_GROUP_FROM_FIREFOX),
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_FIREFOX));
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  localized_strings.SetString(
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::IntToString(IDS_BOOKMARK_GROUP_FROM_SAFARI),
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_SAFARI));
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  localized_strings.SetString(
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::IntToString(IDS_IMPORT_FROM_FIREFOX),
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF8(IDS_IMPORT_FROM_FIREFOX));
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  localized_strings.SetString(
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::IntToString(IDS_IMPORT_FROM_GOOGLE_TOOLBAR),
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF8(IDS_IMPORT_FROM_GOOGLE_TOOLBAR));
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  localized_strings.SetString(
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::IntToString(IDS_IMPORT_FROM_SAFARI),
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF8(IDS_IMPORT_FROM_SAFARI));
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Send(new ProfileImportProcessMsg_StartImport(
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      source_profile, items, localized_strings, import_to_bookmark_bar));
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ProfileImportProcessHost::CancelProfileImportProcess() {
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Send(new ProfileImportProcessMsg_CancelImport());
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ProfileImportProcessHost::ReportImportItemFinished(
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    importer::ImportItem item) {
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Send(new ProfileImportProcessMsg_ReportImportItemFinished(item));
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFilePath ProfileImportProcessHost::GetProfileImportProcessCmd() {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GetChildPath(true);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ProfileImportProcessHost::StartProcess() {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  set_name(L"profile import process");
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!CreateChannel())
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath exe_path = GetProfileImportProcessCmd();
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (exe_path.empty()) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED() << "Unable to get profile import process binary name.";
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandLine* cmd_line = new CommandLine(exe_path);
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cmd_line->AppendSwitchASCII(switches::kProcessType,
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              switches::kProfileImportProcess);
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id());
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetCrashReporterCommandLine(cmd_line);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (browser_command_line.HasSwitch(switches::kChromeFrame))
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    cmd_line->AppendSwitch(switches::kChromeFrame);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::environment_vector env;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string dylib_path = GetFirefoxDylibPath().value();
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dylib_path.empty())
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    env.push_back(std::make_pair("DYLD_FALLBACK_LIBRARY_PATH", dylib_path));
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Launch(false, env, cmd_line);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_WIN)
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath no_exposed_directory;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Launch(no_exposed_directory, cmd_line);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::environment_vector env;
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Launch(false, env, cmd_line);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool ProfileImportProcessHost::OnMessageReceived(const IPC::Message& message) {
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      thread_id_, FROM_HERE,
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableMethod(import_process_client_.get(),
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        &ProfileImportProcessClient::OnMessageReceived,
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        message));
12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  return true;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ProfileImportProcessHost::OnProcessCrashed(int exit_code) {
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      thread_id_, FROM_HERE,
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableMethod(import_process_client_.get(),
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        &ProfileImportProcessClient::OnProcessCrashed,
13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                        exit_code));
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool ProfileImportProcessHost::CanShutdown() {
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return true;
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
144