1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/importer/profile_import_process_host.h"
6
7 #include "base/command_line.h"
8 #include "base/message_loop.h"
9 #include "base/string_number_conversions.h"
10 #include "base/values.h"
11 #include "chrome/browser/importer/firefox_importer_utils.h"
12 #include "chrome/browser/importer/profile_import_process_client.h"
13 #include "chrome/browser/importer/profile_import_process_messages.h"
14 #include "chrome/common/chrome_switches.h"
15 #include "grit/generated_resources.h"
16 #include "ipc/ipc_switches.h"
17 #include "ui/base/l10n/l10n_util.h"
18
ProfileImportProcessHost(ProfileImportProcessClient * import_process_client,BrowserThread::ID thread_id)19 ProfileImportProcessHost::ProfileImportProcessHost(
20 ProfileImportProcessClient* import_process_client,
21 BrowserThread::ID thread_id)
22 : BrowserChildProcessHost(PROFILE_IMPORT_PROCESS),
23 import_process_client_(import_process_client),
24 thread_id_(thread_id) {
25 }
26
~ProfileImportProcessHost()27 ProfileImportProcessHost::~ProfileImportProcessHost() {
28 }
29
StartProfileImportProcess(const importer::SourceProfile & source_profile,uint16 items,bool import_to_bookmark_bar)30 bool ProfileImportProcessHost::StartProfileImportProcess(
31 const importer::SourceProfile& source_profile,
32 uint16 items,
33 bool import_to_bookmark_bar) {
34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
35 if (!StartProcess())
36 return false;
37
38 // Dictionary of all localized strings that could be needed by the importer
39 // in the external process.
40 DictionaryValue localized_strings;
41 localized_strings.SetString(
42 base::IntToString(IDS_BOOKMARK_GROUP_FROM_FIREFOX),
43 l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_FIREFOX));
44 localized_strings.SetString(
45 base::IntToString(IDS_BOOKMARK_GROUP_FROM_SAFARI),
46 l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_SAFARI));
47 localized_strings.SetString(
48 base::IntToString(IDS_IMPORT_FROM_FIREFOX),
49 l10n_util::GetStringUTF8(IDS_IMPORT_FROM_FIREFOX));
50 localized_strings.SetString(
51 base::IntToString(IDS_IMPORT_FROM_GOOGLE_TOOLBAR),
52 l10n_util::GetStringUTF8(IDS_IMPORT_FROM_GOOGLE_TOOLBAR));
53 localized_strings.SetString(
54 base::IntToString(IDS_IMPORT_FROM_SAFARI),
55 l10n_util::GetStringUTF8(IDS_IMPORT_FROM_SAFARI));
56
57 Send(new ProfileImportProcessMsg_StartImport(
58 source_profile, items, localized_strings, import_to_bookmark_bar));
59 return true;
60 }
61
CancelProfileImportProcess()62 bool ProfileImportProcessHost::CancelProfileImportProcess() {
63 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
64 Send(new ProfileImportProcessMsg_CancelImport());
65 return true;
66 }
67
ReportImportItemFinished(importer::ImportItem item)68 bool ProfileImportProcessHost::ReportImportItemFinished(
69 importer::ImportItem item) {
70 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
71 Send(new ProfileImportProcessMsg_ReportImportItemFinished(item));
72 return true;
73 }
74
GetProfileImportProcessCmd()75 FilePath ProfileImportProcessHost::GetProfileImportProcessCmd() {
76 return GetChildPath(true);
77 }
78
StartProcess()79 bool ProfileImportProcessHost::StartProcess() {
80 set_name(L"profile import process");
81
82 if (!CreateChannel())
83 return false;
84
85 FilePath exe_path = GetProfileImportProcessCmd();
86 if (exe_path.empty()) {
87 NOTREACHED() << "Unable to get profile import process binary name.";
88 return false;
89 }
90
91 CommandLine* cmd_line = new CommandLine(exe_path);
92 cmd_line->AppendSwitchASCII(switches::kProcessType,
93 switches::kProfileImportProcess);
94 cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id());
95
96 SetCrashReporterCommandLine(cmd_line);
97
98 const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
99 if (browser_command_line.HasSwitch(switches::kChromeFrame))
100 cmd_line->AppendSwitch(switches::kChromeFrame);
101
102 #if defined(OS_MACOSX)
103 base::environment_vector env;
104 std::string dylib_path = GetFirefoxDylibPath().value();
105 if (!dylib_path.empty())
106 env.push_back(std::make_pair("DYLD_FALLBACK_LIBRARY_PATH", dylib_path));
107
108 Launch(false, env, cmd_line);
109 #elif defined(OS_WIN)
110 FilePath no_exposed_directory;
111
112 Launch(no_exposed_directory, cmd_line);
113 #else
114 base::environment_vector env;
115
116 Launch(false, env, cmd_line);
117 #endif
118
119 return true;
120 }
121
OnMessageReceived(const IPC::Message & message)122 bool ProfileImportProcessHost::OnMessageReceived(const IPC::Message& message) {
123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
124 BrowserThread::PostTask(
125 thread_id_, FROM_HERE,
126 NewRunnableMethod(import_process_client_.get(),
127 &ProfileImportProcessClient::OnMessageReceived,
128 message));
129 return true;
130 }
131
OnProcessCrashed(int exit_code)132 void ProfileImportProcessHost::OnProcessCrashed(int exit_code) {
133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
134 BrowserThread::PostTask(
135 thread_id_, FROM_HERE,
136 NewRunnableMethod(import_process_client_.get(),
137 &ProfileImportProcessClient::OnProcessCrashed,
138 exit_code));
139 }
140
CanShutdown()141 bool ProfileImportProcessHost::CanShutdown() {
142 return true;
143 }
144