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 base::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 base::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(
69 const base::string16& title) {
70 BookmarkModel* bookmark_model = GetBookmarkModel();
73 std::vector<const BookmarkNode*> nodes;
74 bookmark_model->GetNodesByURL(url, &nodes);
75 for (std::vector<const BookmarkNode*>::iterator i = nodes.begin();
76 i != nodes.end(); ++i) {
77 bookmark_model->SetTitle(*i, title);
82 BookmarkModelSQLHandler::Task::~Task() {
85 BookmarkModel* BookmarkModelSQLHandler::Task::GetBookmarkModel() {
86 Profile* profile = ProfileManager::GetLastUsedProfile();
89 return BookmarkModelFactory::GetForProfile(profile);
92 BookmarkModelSQLHandler::BookmarkModelSQLHandler(
93 URLDatabase* url_database)
94 : SQLHandler(kInterestingColumns, arraysize(kInterestingColumns)),
95 url_database_(url_database) {
98 BookmarkModelSQLHandler::~BookmarkModelSQLHandler() {
101 bool BookmarkModelSQLHandler::Update(const HistoryAndBookmarkRow& row,
102 const TableIDRows& ids_set) {
103 for (TableIDRows::const_iterator i = ids_set.begin();
104 i != ids_set.end(); ++i) {
105 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK)) {
106 if (row.is_bookmark()) {
108 if (!url_database_->GetURLRow(i->url_id, &url_row))
110 if (row.is_value_set_explicitly(HistoryAndBookmarkRow::PARENT_ID)) {
111 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
112 &BookmarkModelSQLHandler::Task::AddBookmark,
113 scoped_refptr<BookmarkModelSQLHandler::Task>(
114 new BookmarkModelSQLHandler::Task()),
115 i->url, url_row.title(), row.parent_id()));
117 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
118 &BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder,
119 scoped_refptr<BookmarkModelSQLHandler::Task>(
120 new BookmarkModelSQLHandler::Task()),
121 i->url, url_row.title()));
124 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
125 &BookmarkModelSQLHandler::Task::RemoveBookmark,
126 scoped_refptr<BookmarkModelSQLHandler::Task>(
127 new BookmarkModelSQLHandler::Task()),
130 } else if (row.is_value_set_explicitly(HistoryAndBookmarkRow::TITLE)) {
131 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
132 &BookmarkModelSQLHandler::Task::UpdateBookmarkTitle,
133 scoped_refptr<BookmarkModelSQLHandler::Task>(
134 new BookmarkModelSQLHandler::Task()),
135 i->url, row.title()));
141 bool BookmarkModelSQLHandler::Delete(const TableIDRows& ids_set) {
142 for (TableIDRows::const_iterator i = ids_set.begin();
143 i != ids_set.end(); ++i) {
144 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
145 &BookmarkModelSQLHandler::Task::RemoveBookmark,
146 scoped_refptr<BookmarkModelSQLHandler::Task>(
147 new BookmarkModelSQLHandler::Task()),
153 bool BookmarkModelSQLHandler::Insert(HistoryAndBookmarkRow* row) {
154 DCHECK(row->is_value_set_explicitly(HistoryAndBookmarkRow::URL));
155 if (!row->is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK) ||
158 if (row->is_value_set_explicitly(HistoryAndBookmarkRow::PARENT_ID)) {
159 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
160 &BookmarkModelSQLHandler::Task::AddBookmark,
161 scoped_refptr<BookmarkModelSQLHandler::Task>(
162 new BookmarkModelSQLHandler::Task()),
163 row->url(), row->title(), row->parent_id()));
165 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
166 &BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder,
167 scoped_refptr<BookmarkModelSQLHandler::Task>(
168 new BookmarkModelSQLHandler::Task()),
169 row->url(), row->title()));
174 } // namespace history