Upstream version 5.34.92.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / history / android / bookmark_model_sql_handler.cc
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.
4
5 #include "chrome/browser/history/android/bookmark_model_sql_handler.h"
6
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"
15
16 using base::Time;
17 using content::BrowserThread;
18
19 namespace history {
20
21 namespace {
22
23 // The interesting columns of this handler.
24 const HistoryAndBookmarkRow::ColumnID kInterestingColumns[] = {
25     HistoryAndBookmarkRow::BOOKMARK, HistoryAndBookmarkRow::TITLE };
26
27 } // namespace
28
29 BookmarkModelSQLHandler::Task::Task() {
30 }
31
32 void BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder(
33     const GURL& url,
34     const base::string16& title) {
35   BookmarkModel* bookmark_model = GetBookmarkModel();
36   if (!bookmark_model)
37     return;
38   const BookmarkNode* mobile_node = bookmark_model->mobile_node();
39   if (mobile_node)
40     bookmark_model->AddURL(mobile_node, 0, title, url);
41 }
42
43 void BookmarkModelSQLHandler::Task::AddBookmark(const GURL& url,
44                                                 const base::string16& title,
45                                                 int64 parent_id) {
46   BookmarkModel* bookmark_model = GetBookmarkModel();
47   if (!bookmark_model)
48     return;
49   const BookmarkNode* parent = bookmark_model->GetNodeByID(parent_id);
50   if (parent)
51     bookmark_model->AddURL(parent, 0, title, url);
52 }
53
54 void BookmarkModelSQLHandler::Task::RemoveBookmark(const GURL& url) {
55   BookmarkModel* bookmark_model = GetBookmarkModel();
56   if (!bookmark_model)
57     return;
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));
64   }
65 }
66
67 void BookmarkModelSQLHandler::Task::UpdateBookmarkTitle(
68     const GURL& url,
69     const base::string16& title) {
70   BookmarkModel* bookmark_model = GetBookmarkModel();
71   if (!bookmark_model)
72     return;
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);
78   }
79 }
80
81
82 BookmarkModelSQLHandler::Task::~Task() {
83 }
84
85 BookmarkModel* BookmarkModelSQLHandler::Task::GetBookmarkModel() {
86   Profile* profile = ProfileManager::GetLastUsedProfile();
87   if (!profile)
88     return NULL;
89   return BookmarkModelFactory::GetForProfile(profile);
90 }
91
92 BookmarkModelSQLHandler::BookmarkModelSQLHandler(
93     URLDatabase* url_database)
94     : SQLHandler(kInterestingColumns, arraysize(kInterestingColumns)),
95       url_database_(url_database) {
96 }
97
98 BookmarkModelSQLHandler::~BookmarkModelSQLHandler() {
99 }
100
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()) {
107         URLRow url_row;
108         if (!url_database_->GetURLRow(i->url_id, &url_row))
109           return false;
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()));
116         } else {
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()));
122         }
123       } else {
124         BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
125             &BookmarkModelSQLHandler::Task::RemoveBookmark,
126             scoped_refptr<BookmarkModelSQLHandler::Task>(
127                 new BookmarkModelSQLHandler::Task()),
128             i->url));
129       }
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()));
136     }
137   }
138   return true;
139 }
140
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()),
148         i->url));
149   }
150   return true;
151 }
152
153 bool BookmarkModelSQLHandler::Insert(HistoryAndBookmarkRow* row) {
154   DCHECK(row->is_value_set_explicitly(HistoryAndBookmarkRow::URL));
155   if (!row->is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK) ||
156       !row->is_bookmark())
157     return true;
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()));
164   } else {
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()));
170   }
171   return true;
172 }
173
174 }  // namespace history