// Copyright (c) 2010 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.
#include "chrome/browser/history/top_sites_backend.h"
#include "base/file_path.h"
#include "base/file_util.h"
#include "chrome/browser/history/top_sites_database.h"
#include "content/browser/browser_thread.h"
namespace history {
TopSitesBackend::TopSitesBackend()
: db_(new TopSitesDatabase()) {
}
void TopSitesBackend::Init(const FilePath& path) {
db_path_ = path;
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE, NewRunnableMethod(
this, &TopSitesBackend::InitDBOnDBThread, path));
}
void TopSitesBackend::Shutdown() {
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE, NewRunnableMethod(
this, &TopSitesBackend::ShutdownDBOnDBThread));
}
TopSitesBackend::Handle TopSitesBackend::GetMostVisitedThumbnails(
CancelableRequestConsumerBase* consumer,
GetMostVisitedThumbnailsCallback* callback) {
GetMostVisitedThumbnailsRequest* request =
new GetMostVisitedThumbnailsRequest(callback);
request->value = new MostVisitedThumbnails;
AddRequest(request, consumer);
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE, NewRunnableMethod(
this,
&TopSitesBackend::GetMostVisitedThumbnailsOnDBThread,
scoped_refptr<GetMostVisitedThumbnailsRequest>(request)));
return request->handle();
}
void TopSitesBackend::UpdateTopSites(const TopSitesDelta& delta) {
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE, NewRunnableMethod(
this, &TopSitesBackend::UpdateTopSitesOnDBThread, delta));
}
void TopSitesBackend::SetPageThumbnail(const MostVisitedURL& url,
int url_rank,
const Images& thumbnail) {
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE, NewRunnableMethod(
this, &TopSitesBackend::SetPageThumbnailOnDBThread, url,
url_rank, thumbnail));
}
void TopSitesBackend::ResetDatabase() {
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE, NewRunnableMethod(
this, &TopSitesBackend::ResetDatabaseOnDBThread, db_path_));
}
TopSitesBackend::Handle TopSitesBackend::DoEmptyRequest(
CancelableRequestConsumerBase* consumer,
EmptyRequestCallback* callback) {
EmptyRequestRequest* request = new EmptyRequestRequest(callback);
AddRequest(request, consumer);
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE, NewRunnableMethod(
this,
&TopSitesBackend::DoEmptyRequestOnDBThread,
scoped_refptr<EmptyRequestRequest>(request)));
return request->handle();
}
TopSitesBackend::~TopSitesBackend() {
DCHECK(!db_.get()); // Shutdown should have happened first (which results in
// nulling out db).
}
void TopSitesBackend::InitDBOnDBThread(const FilePath& path) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
if (!db_->Init(path)) {
NOTREACHED() << "Failed to initialize database.";
db_.reset();
}
}
void TopSitesBackend::ShutdownDBOnDBThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
db_.reset();
}
void TopSitesBackend::GetMostVisitedThumbnailsOnDBThread(
scoped_refptr<GetMostVisitedThumbnailsRequest> request) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
if (request->canceled())
return;
bool may_need_history_migration = false;
if (db_.get()) {
db_->GetPageThumbnails(&(request->value->most_visited),
&(request->value->url_to_images_map));
may_need_history_migration = db_->may_need_history_migration();
}
request->ForwardResult(GetMostVisitedThumbnailsRequest::TupleType(
request->handle(),
request->value,
may_need_history_migration));
}
void TopSitesBackend::UpdateTopSitesOnDBThread(const TopSitesDelta& delta) {
if (!db_.get())
return;
for (size_t i = 0; i < delta.deleted.size(); ++i)
db_->RemoveURL(delta.deleted[i]);
for (size_t i = 0; i < delta.added.size(); ++i)
db_->SetPageThumbnail(delta.added[i].url, delta.added[i].rank, Images());
for (size_t i = 0; i < delta.moved.size(); ++i)
db_->UpdatePageRank(delta.moved[i].url, delta.moved[i].rank);
}
void TopSitesBackend::SetPageThumbnailOnDBThread(const MostVisitedURL& url,
int url_rank,
const Images& thumbnail) {
if (!db_.get())
return;
db_->SetPageThumbnail(url, url_rank, thumbnail);
}
void TopSitesBackend::ResetDatabaseOnDBThread(const FilePath& file_path) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
db_.reset(NULL);
file_util::Delete(db_path_, false);
db_.reset(new TopSitesDatabase());
InitDBOnDBThread(db_path_);
}
void TopSitesBackend::DoEmptyRequestOnDBThread(
scoped_refptr<EmptyRequestRequest> request) {
request->ForwardResult(EmptyRequestRequest::TupleType(request->handle()));
}
} // namespace history