blob: b2bfb26df122ded8a8fd515e5c5b532eb101c5a4 [file] [log] [blame]
// Copyright (c) 2010 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 "chrome/browser/profile_import_process_host.h"
#include "base/command_line.h"
#include "base/message_loop.h"
#include "base/string_number_conversions.h"
#include "base/values.h"
#include "chrome/browser/importer/firefox_importer_utils.h"
#include "chrome/browser/importer/importer_messages.h"
#include "chrome/common/chrome_switches.h"
#include "grit/generated_resources.h"
#include "ipc/ipc_switches.h"
#include "ui/base/l10n/l10n_util.h"
ProfileImportProcessHost::ProfileImportProcessHost(
ResourceDispatcherHost* resource_dispatcher,
ImportProcessClient* import_process_client,
BrowserThread::ID thread_id)
: BrowserChildProcessHost(PROFILE_IMPORT_PROCESS, resource_dispatcher),
import_process_client_(import_process_client),
thread_id_(thread_id) {
}
ProfileImportProcessHost::~ProfileImportProcessHost() {
}
bool ProfileImportProcessHost::StartProfileImportProcess(
const importer::ProfileInfo& profile_info, int items,
bool import_to_bookmark_bar) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (!StartProcess())
return false;
// Dictionary of all localized strings that could be needed by the importer
// in the external process.
DictionaryValue localized_strings;
localized_strings.SetString(
base::IntToString(IDS_BOOKMARK_GROUP_FROM_FIREFOX),
l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_FIREFOX));
localized_strings.SetString(
base::IntToString(IDS_BOOKMARK_GROUP_FROM_SAFARI),
l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_SAFARI));
localized_strings.SetString(
base::IntToString(IDS_IMPORT_FROM_FIREFOX),
l10n_util::GetStringUTF8(IDS_IMPORT_FROM_FIREFOX));
localized_strings.SetString(
base::IntToString(IDS_IMPORT_FROM_GOOGLE_TOOLBAR),
l10n_util::GetStringUTF8(IDS_IMPORT_FROM_GOOGLE_TOOLBAR));
localized_strings.SetString(
base::IntToString(IDS_IMPORT_FROM_SAFARI),
l10n_util::GetStringUTF8(IDS_IMPORT_FROM_SAFARI));
Send(new ProfileImportProcessMsg_StartImport(
profile_info, items, localized_strings, import_to_bookmark_bar));
return true;
}
bool ProfileImportProcessHost::CancelProfileImportProcess() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
Send(new ProfileImportProcessMsg_CancelImport());
return true;
}
bool ProfileImportProcessHost::ReportImportItemFinished(
importer::ImportItem item) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
Send(new ProfileImportProcessMsg_ReportImportItemFinished(item));
return true;
}
FilePath ProfileImportProcessHost::GetProfileImportProcessCmd() {
return GetChildPath(true);
}
bool ProfileImportProcessHost::StartProcess() {
set_name(L"profile import process");
if (!CreateChannel())
return false;
FilePath exe_path = GetProfileImportProcessCmd();
if (exe_path.empty()) {
NOTREACHED() << "Unable to get profile import process binary name.";
return false;
}
CommandLine* cmd_line = new CommandLine(exe_path);
cmd_line->AppendSwitchASCII(switches::kProcessType,
switches::kProfileImportProcess);
cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id());
SetCrashReporterCommandLine(cmd_line);
const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess();
if (browser_command_line.HasSwitch(switches::kChromeFrame))
cmd_line->AppendSwitch(switches::kChromeFrame);
#if defined(OS_MACOSX)
base::environment_vector env;
std::string dylib_path = GetFirefoxDylibPath().value();
if (!dylib_path.empty())
env.push_back(std::make_pair("DYLD_FALLBACK_LIBRARY_PATH", dylib_path));
Launch(false, env, cmd_line);
#elif defined(OS_WIN)
FilePath no_exposed_directory;
Launch(no_exposed_directory, cmd_line);
#else
base::environment_vector env;
Launch(false, env, cmd_line);
#endif
return true;
}
bool ProfileImportProcessHost::OnMessageReceived(const IPC::Message& message) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
BrowserThread::PostTask(
thread_id_, FROM_HERE,
NewRunnableMethod(import_process_client_.get(),
&ImportProcessClient::OnMessageReceived,
message));
return true;
}
void ProfileImportProcessHost::OnProcessCrashed(int exit_code) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
BrowserThread::PostTask(
thread_id_, FROM_HERE,
NewRunnableMethod(import_process_client_.get(),
&ImportProcessClient::OnProcessCrashed,
exit_code));
}
bool ProfileImportProcessHost::CanShutdown() {
return true;
}
ProfileImportProcessHost::ImportProcessClient::ImportProcessClient() {}
ProfileImportProcessHost::ImportProcessClient::~ImportProcessClient() {}
bool ProfileImportProcessHost::ImportProcessClient::OnMessageReceived(
const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(ProfileImportProcessHost, message)
// Notification messages about the state of the import process.
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_Import_Started,
ImportProcessClient::OnImportStart)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_Import_Finished,
ImportProcessClient::OnImportFinished)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_ImportItem_Started,
ImportProcessClient::OnImportItemStart)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_ImportItem_Finished,
ImportProcessClient::OnImportItemFinished)
// Data messages containing items to be written to the user profile.
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyHistoryImportStart,
ImportProcessClient::OnHistoryImportStart)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyHistoryImportGroup,
ImportProcessClient::OnHistoryImportGroup)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyHomePageImportReady,
ImportProcessClient::OnHomePageImportReady)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyBookmarksImportStart,
ImportProcessClient::OnBookmarksImportStart)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyBookmarksImportGroup,
ImportProcessClient::OnBookmarksImportGroup)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyFavIconsImportStart,
ImportProcessClient::OnFavIconsImportStart)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyFavIconsImportGroup,
ImportProcessClient::OnFavIconsImportGroup)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyPasswordFormReady,
ImportProcessClient::OnPasswordFormImportReady)
IPC_MESSAGE_HANDLER(ProfileImportProcessHostMsg_NotifyKeywordsReady,
ImportProcessClient::OnKeywordsImportReady)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP_EX()
return handled;
}