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/external_process_importer_host.h"
6
7 #include "chrome/browser/bookmarks/bookmark_model.h"
8 #include "chrome/browser/importer/external_process_importer_client.h"
9 #include "chrome/browser/importer/in_process_importer_bridge.h"
10
ExternalProcessImporterHost()11 ExternalProcessImporterHost::ExternalProcessImporterHost()
12 : items_(0),
13 import_to_bookmark_bar_(false),
14 cancelled_(false),
15 import_process_launched_(false) {
16 }
17
Cancel()18 void ExternalProcessImporterHost::Cancel() {
19 cancelled_ = true;
20 if (import_process_launched_)
21 client_->Cancel();
22 NotifyImportEnded(); // Tells the observer that we're done, and releases us.
23 }
24
StartImportSettings(const importer::SourceProfile & source_profile,Profile * target_profile,uint16 items,ProfileWriter * writer,bool first_run)25 void ExternalProcessImporterHost::StartImportSettings(
26 const importer::SourceProfile& source_profile,
27 Profile* target_profile,
28 uint16 items,
29 ProfileWriter* writer,
30 bool first_run) {
31 DCHECK(!profile_);
32 profile_ = target_profile;
33 writer_ = writer;
34 source_profile_ = &source_profile;
35 items_ = items;
36
37 ImporterHost::AddRef(); // Balanced in ImporterHost::NotifyImportEnded.
38
39 import_to_bookmark_bar_ = ShouldImportToBookmarkBar(first_run);
40 CheckForFirefoxLock(source_profile, items, first_run);
41 CheckForLoadedModels(items);
42
43 InvokeTaskIfDone();
44 }
45
InvokeTaskIfDone()46 void ExternalProcessImporterHost::InvokeTaskIfDone() {
47 if (waiting_for_bookmarkbar_model_ || !registrar_.IsEmpty() ||
48 !is_source_readable_ || cancelled_)
49 return;
50
51 // This is the in-process half of the bridge, which catches data from the IPC
52 // pipe and feeds it to the ProfileWriter. The external process half of the
53 // bridge lives in the external process (see ProfileImportThread).
54 // The ExternalProcessImporterClient created in the next line owns the bridge,
55 // and will delete it.
56 InProcessImporterBridge* bridge =
57 new InProcessImporterBridge(writer_.get(), this);
58 client_ = new ExternalProcessImporterClient(
59 this, *source_profile_, items_, bridge, import_to_bookmark_bar_);
60 import_process_launched_ = true;
61 client_->Start();
62 }
63
Loaded(BookmarkModel * model)64 void ExternalProcessImporterHost::Loaded(BookmarkModel* model) {
65 DCHECK(model->IsLoaded());
66 model->RemoveObserver(this);
67 waiting_for_bookmarkbar_model_ = false;
68 installed_bookmark_observer_ = false;
69
70 // Because the import process is running externally, the decision whether
71 // to import to the bookmark bar must be stored here so that it can be
72 // passed to the importer when the import task is invoked.
73 import_to_bookmark_bar_ = (!model->HasBookmarks());
74 InvokeTaskIfDone();
75 }
76