Home | History | Annotate | Download | only in importer
      1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_IMPORTER_EXTERNAL_PROCESS_IMPORTER_HOST_H_
      6 #define CHROME_BROWSER_IMPORTER_EXTERNAL_PROCESS_IMPORTER_HOST_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/compiler_specific.h"
     10 #include "base/memory/ref_counted.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/memory/weak_ptr.h"
     13 #include "chrome/browser/bookmarks/base_bookmark_model_observer.h"
     14 #include "chrome/browser/importer/importer_progress_observer.h"
     15 #include "chrome/browser/importer/profile_writer.h"
     16 #include "chrome/common/importer/importer_data_types.h"
     17 #include "content/public/browser/notification_observer.h"
     18 #include "content/public/browser/notification_registrar.h"
     19 #include "ui/gfx/native_widget_types.h"
     20 
     21 class ExternalProcessImporterClient;
     22 class FirefoxProfileLock;
     23 class Importer;
     24 class Profile;
     25 
     26 namespace importer {
     27 struct SourceProfile;
     28 }
     29 
     30 // This class manages the import process. It creates the in-process half of the
     31 // importer bridge and the external process importer client.
     32 class ExternalProcessImporterHost : public BaseBookmarkModelObserver,
     33                                     public content::NotificationObserver {
     34  public:
     35   ExternalProcessImporterHost();
     36 
     37   void Cancel();
     38 
     39   // Starts the process of importing the settings and data depending on what the
     40   // user selected.
     41   // |source_profile| - importer profile to import.
     42   // |target_profile| - profile to import into.
     43   // |items| - specifies which data to import (bitmask of importer::ImportItem).
     44   // |writer| - called to actually write data back to the profile.
     45   virtual void StartImportSettings(
     46       const importer::SourceProfile& source_profile,
     47       Profile* target_profile,
     48       uint16 items,
     49       ProfileWriter* writer);
     50 
     51   // When in headless mode, the importer will not show any warning dialog if
     52   // a user action is required (e.g., Firefox profile is locked and user should
     53   // close Firefox to continue) and the outcome is as if the user had canceled
     54   // the import operation.
     55   void set_headless() { headless_ = true; }
     56   bool is_headless() const { return headless_; }
     57 
     58   void set_parent_window(gfx::NativeWindow parent_window) {
     59     parent_window_ = parent_window;
     60   }
     61 
     62   void set_observer(importer::ImporterProgressObserver* observer) {
     63     observer_ = observer;
     64   }
     65 
     66   // A series of functions invoked at the start, during and end of the import
     67   // process. The middle functions are notifications that the a harvesting of a
     68   // particular source of data (specified by |item|) is under way.
     69   void NotifyImportStarted();
     70   void NotifyImportItemStarted(importer::ImportItem item);
     71   void NotifyImportItemEnded(importer::ImportItem item);
     72   void NotifyImportEnded();
     73 
     74  private:
     75   // ExternalProcessImporterHost deletes itself in OnImportEnded().
     76   virtual ~ExternalProcessImporterHost();
     77 
     78   // Launches the utility process that starts the import task, unless bookmark
     79   // or template model are not yet loaded. If load is not detected, this method
     80   // will be called when the loading observer sees that model loading is
     81   // complete.
     82   virtual void LaunchImportIfReady();
     83 
     84   // BaseBookmarkModelObserver:
     85   virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE;
     86   virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
     87   virtual void BookmarkModelChanged() OVERRIDE;
     88 
     89   // content::NotificationObserver:
     90   // Called when TemplateURLService has been loaded.
     91   virtual void Observe(int type,
     92                        const content::NotificationSource& source,
     93                        const content::NotificationDetails& details) OVERRIDE;
     94 
     95   // ShowWarningDialog() asks user to close the application that is owning the
     96   // lock. They can retry or skip the importing process.
     97   // This method should not be called if the importer is in headless mode.
     98   void ShowWarningDialog();
     99 
    100   // This is called when when user ends the lock dialog by clicking on either
    101   // the "Skip" or "Continue" buttons. |is_continue| is true when user clicked
    102   // the "Continue" button.
    103   void OnImportLockDialogEnd(bool is_continue);
    104 
    105   // Make sure that Firefox isn't running, if import browser is Firefox. Show
    106   // to the user a dialog that notifies that is necessary to close Firefox
    107   // prior to continue.
    108   // |source_profile| - importer profile to import.
    109   // Returns false iff import should be aborted.
    110   bool CheckForFirefoxLock(const importer::SourceProfile& source_profile);
    111 
    112   // Make sure BookmarkModel and TemplateURLService are loaded before import
    113   // process starts, if bookmarks and/or search engines are among the items
    114   // which are to be imported.
    115   void CheckForLoadedModels(uint16 items);
    116 
    117   // Vends weak pointers for the importer to call us back.
    118   base::WeakPtrFactory<ExternalProcessImporterHost> weak_ptr_factory_;
    119 
    120   // True if UI is not to be shown.
    121   bool headless_;
    122 
    123   // Parent window that we pass to the import lock dialog (i.e, the Firefox
    124   // warning dialog).
    125   gfx::NativeWindow parent_window_;
    126 
    127   // The observer that we need to notify about changes in the import process.
    128   importer::ImporterProgressObserver* observer_;
    129 
    130   // Firefox profile lock.
    131   scoped_ptr<FirefoxProfileLock> firefox_lock_;
    132 
    133   // Profile we're importing from.
    134   Profile* profile_;
    135 
    136   // True if we're waiting for the model to finish loading.
    137   bool waiting_for_bookmarkbar_model_;
    138 
    139   // Have we installed a listener on the bookmark model?
    140   bool installed_bookmark_observer_;
    141 
    142   // True if source profile is readable.
    143   bool is_source_readable_;
    144 
    145   // Receives notification when the TemplateURLService has loaded.
    146   content::NotificationRegistrar registrar_;
    147 
    148   // Writes data from the importer back to the profile.
    149   scoped_refptr<ProfileWriter> writer_;
    150 
    151   // Used to pass notifications from the browser side to the external process.
    152   ExternalProcessImporterClient* client_;
    153 
    154   // Information about a profile needed for importing.
    155   importer::SourceProfile source_profile_;
    156 
    157   // Bitmask of items to be imported (see importer::ImportItem enum).
    158   uint16 items_;
    159 
    160   // True if the import process has been cancelled.
    161   bool cancelled_;
    162 
    163   // True if the import process has been launched. This prevents race
    164   // conditions on import cancel.
    165   bool import_process_launched_;
    166 
    167   DISALLOW_COPY_AND_ASSIGN(ExternalProcessImporterHost);
    168 };
    169 
    170 #endif  // CHROME_BROWSER_IMPORTER_EXTERNAL_PROCESS_IMPORTER_HOST_H_
    171