blob: c6416d4da6455a2c9a734bf83cf653efc2cdd3d7 [file] [log] [blame]
// 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/ref_counted.h"
#include "base/task.h"
#include "chrome/browser/browser_process.h"
class BookmarkModel;
class BookmarkStorageBackend;
class Profile;
class Value;
// 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 base::RefCountedThreadSafe<BookmarkStorage> {
friend class BookmarkStorageBackend;
public:
// Creates a BookmarkStorage for the specified model
BookmarkStorage(Profile* profile, BookmarkModel* model);
// Loads the bookmarks into the model, notifying the model when done. If
// load_from_history is true, the bookmarks are loaded from the file written
// by history (StarredURLDatabase).
void LoadBookmarks(bool load_from_history);
// 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();
private:
// Callback from backend with the results of the bookmark file.
void LoadedBookmarks(Value* root_value,
bool bookmark_file_exists,
bool loaded_from_history);
// Schedules a save on the backend thread.
void SaveNow();
// Returns the thread the backend is run on.
base::Thread* backend_thread() const { return backend_thread_; }
// The model. The model is NULL once BookmarkModelDeleted has been invoked.
BookmarkModel* model_;
// Used to delay saves.
ScopedRunnableMethodFactory<BookmarkStorage> save_factory_;
// The backend handles actual reading/writing to disk.
scoped_refptr<BookmarkStorageBackend> backend_;
// Thread read/writing is run on. This comes from the profile, and is null
// during testing.
base::Thread* backend_thread_;
DISALLOW_COPY_AND_ASSIGN(BookmarkStorage);
};
// Used to save the bookmarks on the file thread.
class BookmarkStorageBackend :
public base::RefCountedThreadSafe<BookmarkStorageBackend> {
public:
explicit BookmarkStorageBackend(const std::wstring& path,
const std::wstring& tmp_histor_path);
// Writes the specified value to disk. This takes ownership of |value| and
// deletes it when done.
void Write(Value* value);
// Reads the bookmarks from kBookmarksFileName. Notifies |service| with
// the results on the specified MessageLoop.
void Read(scoped_refptr<BookmarkStorage> service,
MessageLoop* message_loop,
bool load_from_history);
private:
// Path we read/write to.
const std::wstring path_;
// Path bookmarks are read from if asked to load from history file.
const std::wstring tmp_history_path_;
DISALLOW_COPY_AND_ASSIGN(BookmarkStorageBackend);
};
#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_STORAGE_H_