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