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 #ifndef CHROME_BROWSER_IMPORTER_IMPORTER_HOST_H_
      6 #define CHROME_BROWSER_IMPORTER_IMPORTER_HOST_H_
      7 #pragma once
      8 
      9 #include "base/basictypes.h"
     10 #include "base/compiler_specific.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "chrome/browser/bookmarks/base_bookmark_model_observer.h"
     14 #include "chrome/browser/importer/importer_data_types.h"
     15 #include "chrome/browser/importer/profile_writer.h"
     16 #include "content/common/notification_observer.h"
     17 #include "content/common/notification_registrar.h"
     18 #include "ui/gfx/native_widget_types.h"
     19 
     20 class FirefoxProfileLock;
     21 class Importer;
     22 class Profile;
     23 class Task;
     24 
     25 namespace importer {
     26 class ImporterProgressObserver;
     27 }
     28 
     29 // This class hosts the importers. It enumerates profiles from other
     30 // browsers dynamically, and controls the process of importing. When
     31 // the import process is done, ImporterHost deletes itself.
     32 class ImporterHost : public base::RefCountedThreadSafe<ImporterHost>,
     33                      public BaseBookmarkModelObserver,
     34                      public NotificationObserver {
     35  public:
     36   ImporterHost();
     37 
     38   // ShowWarningDialog() asks user to close the application that is owning the
     39   // lock. They can retry or skip the importing process.
     40   void ShowWarningDialog();
     41 
     42   // This is called when when user ends the lock dialog by clicking on either
     43   // the "Skip" or "Continue" buttons. |is_continue| is true when user clicked
     44   // the "Continue" button.
     45   void OnImportLockDialogEnd(bool is_continue);
     46 
     47   void SetObserver(importer::ImporterProgressObserver* observer);
     48 
     49   // A series of functions invoked at the start, during and end of the import
     50   // process. The middle functions are notifications that the a harvesting of a
     51   // particular source of data (specified by |item|) is under way.
     52   void NotifyImportStarted();
     53   void NotifyImportItemStarted(importer::ImportItem item);
     54   void NotifyImportItemEnded(importer::ImportItem item);
     55   void NotifyImportEnded();
     56 
     57   // When in headless mode, the importer will not show the warning dialog and
     58   // the outcome is as if the user had canceled the import operation.
     59   void set_headless() { headless_ = true; }
     60   bool is_headless() const { return headless_; }
     61 
     62   void set_parent_window(gfx::NativeWindow parent_window) {
     63     parent_window_ = parent_window;
     64   }
     65 
     66   // Starts the process of importing the settings and data depending on what the
     67   // user selected.
     68   // |source_profile| - importer profile to import.
     69   // |target_profile| - profile to import into.
     70   // |items| - specifies which data to import (bitmask of importer::ImportItem).
     71   // |writer| - called to actually write data back to the profile.
     72   // |first_run| - true if this method is being called during first run.
     73   virtual void StartImportSettings(
     74       const importer::SourceProfile& source_profile,
     75       Profile* target_profile,
     76       uint16 items,
     77       ProfileWriter* writer,
     78       bool first_run);
     79 
     80   // Cancels the import process.
     81   virtual void Cancel();
     82 
     83  protected:
     84   ~ImporterHost();
     85 
     86   // Returns true if importer should import to bookmark bar.
     87   bool ShouldImportToBookmarkBar(bool first_run);
     88 
     89   // Make sure that Firefox isn't running, if import browser is Firefox. Show
     90   // to the user a dialog that notifies that is necessary to close Firefox
     91   // prior to continue.
     92   // |source_profile| - importer profile to import.
     93   // |items| - specifies which data to import (bitmask of importer::ImportItem).
     94   // |first_run| - true if this method is being called during first run.
     95   void CheckForFirefoxLock(const importer::SourceProfile& source_profile,
     96                            uint16 items,
     97                            bool first_run);
     98 
     99   // Make sure BookmarkModel and TemplateURLModel are loaded before import
    100   // process starts, if bookmarks and/or search engines are among the items
    101   // which are to be imported.
    102   void CheckForLoadedModels(uint16 items);
    103 
    104   // Profile we're importing from.
    105   Profile* profile_;
    106 
    107   // TODO(mirandac): |task_| and |importer_| should be private. Can't just put
    108   // them there without changing the order of construct/destruct, so do this
    109   // after main CL has been committed.
    110   // The task is the process of importing settings from other browsers.
    111   Task* task_;
    112 
    113   // The importer used in the task.
    114   Importer* importer_;
    115 
    116   // True if we're waiting for the model to finish loading.
    117   bool waiting_for_bookmarkbar_model_;
    118 
    119   // Have we installed a listener on the bookmark model?
    120   bool installed_bookmark_observer_;
    121 
    122   // True if source profile is readable.
    123   bool is_source_readable_;
    124 
    125   // Receives notification when the TemplateURLModel has loaded.
    126   NotificationRegistrar registrar_;
    127 
    128   // Writes data from the importer back to the profile.
    129   scoped_refptr<ProfileWriter> writer_;
    130 
    131  private:
    132   friend class base::RefCountedThreadSafe<ImporterHost>;
    133 
    134   // Launches the thread that starts the import task, unless bookmark or
    135   // template model are not yet loaded. If load is not detected, this method
    136   // will be called when the loading observer sees that model loading is
    137   // complete.
    138   virtual void InvokeTaskIfDone();
    139 
    140   // BaseBookmarkModelObserver:
    141   virtual void Loaded(BookmarkModel* model) OVERRIDE;
    142   virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
    143   virtual void BookmarkModelChanged() OVERRIDE;
    144 
    145   // NotificationObserver:
    146   // Called when TemplateURLModel has been loaded.
    147   virtual void Observe(NotificationType type,
    148                        const NotificationSource& source,
    149                        const NotificationDetails& details) OVERRIDE;
    150 
    151   // True if UI is not to be shown.
    152   bool headless_;
    153 
    154   // Parent window that we pass to the import lock dialog (i.e, the Firefox
    155   // warning dialog).
    156   gfx::NativeWindow parent_window_;
    157 
    158   // The observer that we need to notify about changes in the import process.
    159   importer::ImporterProgressObserver* observer_;
    160 
    161   // Firefox profile lock.
    162   scoped_ptr<FirefoxProfileLock> firefox_lock_;
    163 
    164   DISALLOW_COPY_AND_ASSIGN(ImporterHost);
    165 };
    166 
    167 #endif  // CHROME_BROWSER_IMPORTER_IMPORTER_HOST_H_
    168