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_PROFILE_WRITER_H_
6#define CHROME_BROWSER_IMPORTER_PROFILE_WRITER_H_
7#pragma once
8
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/memory/ref_counted.h"
13#include "base/time.h"
14#include "build/build_config.h"
15#include "chrome/browser/history/history_types.h"
16#include "googleurl/src/gurl.h"
17
18class BookmarkModel;
19class Profile;
20class TemplateURL;
21
22namespace webkit_glue {
23struct PasswordForm;
24}
25
26#if defined(OS_WIN)
27struct IE7PasswordInfo;
28#endif
29
30// ProfileWriter encapsulates profile for writing entries into it.
31// This object must be invoked on UI thread.
32class ProfileWriter : public base::RefCountedThreadSafe<ProfileWriter> {
33 public:
34  // Used to identify how the bookmarks are added.
35  enum BookmarkOptions {
36    // Indicates the bookmark should only be added if unique. Uniqueness
37    // is done by title, url and path. That is, if this is passed to
38    // AddBookmarkEntry the bookmark is added only if there is no other
39    // URL with the same url, path and title.
40    ADD_IF_UNIQUE = 1 << 0,
41
42    // Indicates the bookmarks should be added to the bookmark bar.
43    IMPORT_TO_BOOKMARK_BAR = 1 << 1,
44
45    // Indicates the bookmark bar is not shown.
46    BOOKMARK_BAR_DISABLED = 1 << 2
47  };
48
49  struct BookmarkEntry {
50    BookmarkEntry();
51    ~BookmarkEntry();
52
53    bool in_toolbar;
54    bool is_folder;
55    GURL url;
56    std::vector<string16> path;
57    string16 title;
58    base::Time creation_time;
59  };
60
61  explicit ProfileWriter(Profile* profile);
62
63  // These functions return true if the corresponding model has been loaded.
64  // If the models haven't been loaded, the importer waits to run until they've
65  // completed.
66  virtual bool BookmarkModelIsLoaded() const;
67  virtual bool TemplateURLModelIsLoaded() const;
68
69  // Helper methods for adding data to local stores.
70  virtual void AddPasswordForm(const webkit_glue::PasswordForm& form);
71
72#if defined(OS_WIN)
73  virtual void AddIE7PasswordInfo(const IE7PasswordInfo& info);
74#endif
75
76  virtual void AddHistoryPage(const std::vector<history::URLRow>& page,
77                              history::VisitSource visit_source);
78
79  virtual void AddHomepage(const GURL& homepage);
80
81  // Adds the bookmarks to the BookmarkModel.
82  // |options| is a bitmask of BookmarkOptions and dictates how and
83  // which bookmarks are added. If the bitmask contains IMPORT_TO_BOOKMARK_BAR,
84  // then any entries with a value of true for in_toolbar are added to
85  // the bookmark bar. If the bitmask does not contain IMPORT_TO_BOOKMARK_BAR
86  // then the folder name the bookmarks are added to is uniqued based on
87  // |first_folder_name|. For example, if |first_folder_name| is 'foo'
88  // and a folder with the name 'foo' already exists in the other
89  // bookmarks folder, then the folder name 'foo 2' is used.
90  // If |options| contains ADD_IF_UNIQUE, then the bookmark is added only
91  // if another bookmarks does not exist with the same title, path and
92  // url.
93  virtual void AddBookmarkEntry(const std::vector<BookmarkEntry>& bookmark,
94                                const string16& first_folder_name,
95                                int options);
96
97  virtual void AddFavicons(
98      const std::vector<history::ImportedFaviconUsage>& favicons);
99
100  // Add the TemplateURLs in |template_urls| to the local store and make the
101  // TemplateURL at |default_keyword_index| the default keyword (does not set
102  // a default keyword if it is -1).  The local store becomes the owner of the
103  // TemplateURLs.  Some TemplateURLs in |template_urls| may conflict (same
104  // keyword or same host name in the URL) with existing TemplateURLs in the
105  // local store, in which case the existing ones takes precedence and the
106  // duplicate in |template_urls| are deleted.
107  // If unique_on_host_and_path a TemplateURL is only added if there is not an
108  // existing TemplateURL that has a replaceable search url with the same
109  // host+path combination.
110
111  virtual void AddKeywords(const std::vector<TemplateURL*>& template_urls,
112                           int default_keyword_index,
113                           bool unique_on_host_and_path);
114
115  // Shows the bookmarks toolbar.
116  void ShowBookmarkBar();
117
118 protected:
119  friend class base::RefCountedThreadSafe<ProfileWriter>;
120
121  virtual ~ProfileWriter();
122
123 private:
124  // Generates a unique folder name. If folder_name is not unique, then this
125  // repeatedly tests for '|folder_name| + (i)' until a unique name is found.
126  string16 GenerateUniqueFolderName(BookmarkModel* model,
127                                    const string16& folder_name);
128
129  // Returns true if a bookmark exists with the same url, title and path
130  // as |entry|. |first_folder_name| is the name to use for the first
131  // path entry if |import_to_bookmark_bar| is true.
132  bool DoesBookmarkExist(BookmarkModel* model,
133                         const BookmarkEntry& entry,
134                         const string16& first_folder_name,
135                         bool import_to_bookmark_bar);
136
137  Profile* const profile_;
138
139  DISALLOW_COPY_AND_ASSIGN(ProfileWriter);
140};
141
142#endif  // CHROME_BROWSER_IMPORTER_PROFILE_WRITER_H_
143