- add sources.
[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 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 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(const GURL& url,
68                                                         const string16&title) {
69   BookmarkModel* bookmark_model = GetBookmarkModel();
70   if (!bookmark_model)
71     return;
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);
77   }
78 }
79
80
81 BookmarkModelSQLHandler::Task::~Task() {
82 }
83
84 BookmarkModel* BookmarkModelSQLHandler::Task::GetBookmarkModel() {
85   Profile* profile = ProfileManager::GetLastUsedProfile();
86   if (!profile)
87     return NULL;
88   return BookmarkModelFactory::GetForProfile(profile);
89 }
90
91 BookmarkModelSQLHandler::BookmarkModelSQLHandler(
92     URLDatabase* url_database)
93     : SQLHandler(kInterestingColumns, arraysize(kInterestingColumns)),
94       url_database_(url_database) {
95 }
96
97 BookmarkModelSQLHandler::~BookmarkModelSQLHandler() {
98 }
99
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()) {
106         URLRow url_row;
107         if (!url_database_->GetURLRow(i->url_id, &url_row))
108           return false;
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()));
115         } else {
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()));
121         }
122       } else {
123         BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
124             &BookmarkModelSQLHandler::Task::RemoveBookmark,
125             scoped_refptr<BookmarkModelSQLHandler::Task>(
126                 new BookmarkModelSQLHandler::Task()),
127             i->url));
128       }
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()));
135     }
136   }
137   return true;
138 }
139
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()),
147         i->url));
148   }
149   return true;
150 }
151
152 bool BookmarkModelSQLHandler::Insert(HistoryAndBookmarkRow* row) {
153   DCHECK(row->is_value_set_explicitly(HistoryAndBookmarkRow::URL));
154   if (!row->is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK) ||
155       !row->is_bookmark())
156     return true;
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()));
163   } else {
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()));
169   }
170   return true;
171 }
172
173 }  // namespace history.