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