1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_STORAGE_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_STORAGE_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_index.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/important_file_writer.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkModel; 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkNode; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BookmarkLoadDetails is used by BookmarkStorage when loading bookmarks. 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BookmarkModel creates a BookmarkLoadDetails and passes it (including 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ownership) to BookmarkStorage. BoomarkStorage loads the bookmarks (and index) 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the background thread, then calls back to the BookmarkModel (on the main 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// thread) when loading is done, passing ownership back to the BookmarkModel. 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// While loading BookmarkModel does not maintain references to the contents 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of the BookmarkLoadDetails, this ensures we don't have any threading 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// problems. 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkLoadDetails { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkLoadDetails(BookmarkNode* bb_node, 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkNode* other_folder_node, 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkIndex* index, 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int64 max_id); 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ~BookmarkLoadDetails(); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkNode* bb_node() { return bb_node_.get(); } 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkNode* release_bb_node() { return bb_node_.release(); } 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkNode* other_folder_node() { return other_folder_node_.get(); } 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkNode* release_other_folder_node() { 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return other_folder_node_.release(); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkIndex* index() { return index_.get(); } 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkIndex* release_index() { return index_.release(); } 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Max id of the nodes. 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_max_id(int64 max_id) { max_id_ = max_id; } 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 max_id() const { return max_id_; } 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Computed checksum. 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_computed_checksum(const std::string& value) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch computed_checksum_ = value; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& computed_checksum() const { return computed_checksum_; } 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Stored checksum. 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_stored_checksum(const std::string& value) { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch stored_checksum_ = value; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& stored_checksum() const { return stored_checksum_; } 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether ids were reassigned. 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_ids_reassigned(bool value) { ids_reassigned_ = value; } 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ids_reassigned() const { return ids_reassigned_; } 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<BookmarkNode> bb_node_; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<BookmarkNode> other_folder_node_; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<BookmarkIndex> index_; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int64 max_id_; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string computed_checksum_; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string stored_checksum_; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ids_reassigned_; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(BookmarkLoadDetails); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BookmarkStorage handles reading/write the bookmark bar model. The 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BookmarkModel uses the BookmarkStorage to load bookmarks from disk, as well 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as notifying the BookmarkStorage every time the model changes. 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Internally BookmarkStorage uses BookmarkCodec to do the actual read/write. 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkStorage : public NotificationObserver, 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public ImportantFileWriter::DataSerializer, 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public base::RefCountedThreadSafe<BookmarkStorage> { 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Creates a BookmarkStorage for the specified model 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkStorage(Profile* profile, BookmarkModel* model); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Loads the bookmarks into the model, notifying the model when done. This 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // takes ownership of |details|. See BookmarkLoadDetails for details. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void LoadBookmarks(BookmarkLoadDetails* details); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Schedules saving the bookmark bar model to disk. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ScheduleSave(); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notification the bookmark bar model is going to be deleted. If there is 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // a pending save, it is saved immediately. 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void BookmarkModelDeleted(); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ImportantFileWriter::DataSerializer 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool SerializeData(std::string* output); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class base::RefCountedThreadSafe<BookmarkStorage>; 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~BookmarkStorage(); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class LoadTask; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callback from backend with the results of the bookmark file. 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This may be called multiple times, with different paths. This happens when 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we migrate bookmark data from database. 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnLoadFinished(bool file_exists, 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath& path); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Loads bookmark data from |file| and notifies the model when finished. 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DoLoadBookmarks(const FilePath& file); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Load bookmarks data from the file written by history (StarredURLDatabase). 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void MigrateFromHistory(); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when history has written the file with bookmarks data. Loads data 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // from that file. 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnHistoryFinishedWriting(); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called after we loaded file generated by history. Saves the data, deletes 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the temporary file, and notifies the model. 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void FinishHistoryMigration(); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NotificationObserver 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void Observe(NotificationType type, 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const NotificationSource& source, 13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const NotificationDetails& details); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Serializes the data and schedules save using ImportantFileWriter. 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true on successful serialization. 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool SaveNow(); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Keep the pointer to profile, we may need it for migration from history. 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile_; 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The model. The model is NULL once BookmarkModelDeleted has been invoked. 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BookmarkModel* model_; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to write bookmark data safely. 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ImportantFileWriter writer_; 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Helper to ensure that we unregister from notifications on destruction. 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationRegistrar notification_registrar_; 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Path to temporary file created during migrating bookmarks from history. 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath tmp_history_path_; 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See class description of BookmarkLoadDetails for details on this. 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<BookmarkLoadDetails> details_; 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(BookmarkStorage); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_STORAGE_H_ 162