Home | History | Annotate | Download | only in importer
      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 
     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 
     27 ProfileImportProcessHost::~ProfileImportProcessHost() {
     28 }
     29 
     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 
     62 bool ProfileImportProcessHost::CancelProfileImportProcess() {
     63   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
     64   Send(new ProfileImportProcessMsg_CancelImport());
     65   return true;
     66 }
     67 
     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 
     75 FilePath ProfileImportProcessHost::GetProfileImportProcessCmd() {
     76   return GetChildPath(true);
     77 }
     78 
     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 
    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 
    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 
    141 bool ProfileImportProcessHost::CanShutdown() {
    142   return true;
    143 }
    144