1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/history/android/bookmark_model_sql_handler.h"
7 #include "base/logging.h"
8 #include "chrome/browser/bookmarks/bookmark_model.h"
9 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
10 #include "chrome/browser/bookmarks/bookmark_service.h"
11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/history/url_database.h"
13 #include "chrome/browser/profiles/profile_manager.h"
14 #include "content/public/browser/browser_thread.h"
17 using content::BrowserThread;
23 // The interesting columns of this handler.
24 const HistoryAndBookmarkRow::ColumnID kInterestingColumns[] = {
25 HistoryAndBookmarkRow::BOOKMARK, HistoryAndBookmarkRow::TITLE };
29 BookmarkModelSQLHandler::Task::Task() {
32 void BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder(
34 const string16& title) {
35 BookmarkModel* bookmark_model = GetBookmarkModel();
38 const BookmarkNode* mobile_node = bookmark_model->mobile_node();
40 bookmark_model->AddURL(mobile_node, 0, title, url);
43 void BookmarkModelSQLHandler::Task::AddBookmark(const GURL& url,
44 const string16& title,
46 BookmarkModel* bookmark_model = GetBookmarkModel();
49 const BookmarkNode* parent = bookmark_model->GetNodeByID(parent_id);
51 bookmark_model->AddURL(parent, 0, title, url);
54 void BookmarkModelSQLHandler::Task::RemoveBookmark(const GURL& url) {
55 BookmarkModel* bookmark_model = GetBookmarkModel();
58 std::vector<const BookmarkNode*> nodes;
59 bookmark_model->GetNodesByURL(url, &nodes);
60 for (std::vector<const BookmarkNode*>::iterator i = nodes.begin();
61 i != nodes.end(); ++i) {
62 const BookmarkNode* parent_node = (*i)->parent();
63 bookmark_model->Remove(parent_node, parent_node->GetIndexOf(*i));
67 void BookmarkModelSQLHandler::Task::UpdateBookmarkTitle(const GURL& url,
68 const string16&title) {
69 BookmarkModel* bookmark_model = GetBookmarkModel();
72 std::vector<const BookmarkNode*> nodes;
73 bookmark_model->GetNodesByURL(url, &nodes);
74 for (std::vector<const BookmarkNode*>::iterator i = nodes.begin();
75 i != nodes.end(); ++i) {
76 bookmark_model->SetTitle(*i, title);
81 BookmarkModelSQLHandler::Task::~Task() {
84 BookmarkModel* BookmarkModelSQLHandler::Task::GetBookmarkModel() {
85 Profile* profile = ProfileManager::GetLastUsedProfile();
88 return BookmarkModelFactory::GetForProfile(profile);
91 BookmarkModelSQLHandler::BookmarkModelSQLHandler(
92 URLDatabase* url_database)
93 : SQLHandler(kInterestingColumns, arraysize(kInterestingColumns)),
94 url_database_(url_database) {
97 BookmarkModelSQLHandler::~BookmarkModelSQLHandler() {
100 bool BookmarkModelSQLHandler::Update(const HistoryAndBookmarkRow& row,
101 const TableIDRows& ids_set) {
102 for (TableIDRows::const_iterator i = ids_set.begin();
103 i != ids_set.end(); ++i) {
104 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK)) {
105 if (row.is_bookmark()) {
107 if (!url_database_->GetURLRow(i->url_id, &url_row))
109 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::PARENT_ID)) {
110 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
111 &BookmarkModelSQLHandler::Task::AddBookmark,
112 scoped_refptr<BookmarkModelSQLHandler::Task>(
113 new BookmarkModelSQLHandler::Task()),
114 i->url, url_row.title(), row.parent_id()));
116 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
117 &BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder,
118 scoped_refptr<BookmarkModelSQLHandler::Task>(
119 new BookmarkModelSQLHandler::Task()),
120 i->url, url_row.title()));
123 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
124 &BookmarkModelSQLHandler::Task::RemoveBookmark,
125 scoped_refptr<BookmarkModelSQLHandler::Task>(
126 new BookmarkModelSQLHandler::Task()),
129 } else if (row.is_value_set_explicitly(HistoryAndBookmarkRow::TITLE)) {
130 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
131 &BookmarkModelSQLHandler::Task::UpdateBookmarkTitle,
132 scoped_refptr<BookmarkModelSQLHandler::Task>(
133 new BookmarkModelSQLHandler::Task()),
134 i->url, row.title()));
140 bool BookmarkModelSQLHandler::Delete(const TableIDRows& ids_set) {
141 for (TableIDRows::const_iterator i = ids_set.begin();
142 i != ids_set.end(); ++i) {
143 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
144 &BookmarkModelSQLHandler::Task::RemoveBookmark,
145 scoped_refptr<BookmarkModelSQLHandler::Task>(
146 new BookmarkModelSQLHandler::Task()),
152 bool BookmarkModelSQLHandler::Insert(HistoryAndBookmarkRow* row) {
153 DCHECK(row->is_value_set_explicitly(HistoryAndBookmarkRow::URL));
154 if (!row->is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK) ||
157 if (row->is_value_set_explicitly(HistoryAndBookmarkRow::PARENT_ID)) {
158 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
159 &BookmarkModelSQLHandler::Task::AddBookmark,
160 scoped_refptr<BookmarkModelSQLHandler::Task>(
161 new BookmarkModelSQLHandler::Task()),
162 row->url(), row->title(), row->parent_id()));
164 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
165 &BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder,
166 scoped_refptr<BookmarkModelSQLHandler::Task>(
167 new BookmarkModelSQLHandler::Task()),
168 row->url(), row->title()));
173 } // namespace history.