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