1 // Copyright 2018 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 "components/offline_pages/core/model/get_visuals_task.h"
6
7 #include "base/bind.h"
8 #include "components/offline_pages/core/offline_page_metadata_store.h"
9 #include "components/offline_pages/core/offline_store_utils.h"
10 #include "sql/database.h"
11 #include "sql/statement.h"
12 #include "sql/transaction.h"
13
14 namespace offline_pages {
15
16 namespace {
17
GetVisualsSync(int64_t offline_id,sql::Database * db)18 std::unique_ptr<OfflinePageVisuals> GetVisualsSync(int64_t offline_id,
19 sql::Database* db) {
20 std::unique_ptr<OfflinePageVisuals> result;
21 static const char kSql[] =
22 "SELECT offline_id,expiration,thumbnail,favicon FROM page_thumbnails"
23 " WHERE offline_id=?";
24 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
25 statement.BindInt64(0, offline_id);
26
27 if (!statement.Step()) {
28 return result;
29 }
30 result = std::make_unique<OfflinePageVisuals>();
31
32 result->offline_id = statement.ColumnInt64(0);
33 int64_t expiration = statement.ColumnInt64(1);
34 result->expiration = store_utils::FromDatabaseTime(expiration);
35 if (!statement.ColumnBlobAsString(2, &result->thumbnail))
36 result->thumbnail = std::string();
37
38 if (!statement.ColumnBlobAsString(3, &result->favicon))
39 result->favicon = std::string();
40
41 return result;
42 }
43
44 } // namespace
45
GetVisualsTask(OfflinePageMetadataStore * store,int64_t offline_id,CompleteCallback complete_callback)46 GetVisualsTask::GetVisualsTask(OfflinePageMetadataStore* store,
47 int64_t offline_id,
48 CompleteCallback complete_callback)
49 : store_(store),
50 offline_id_(offline_id),
51 complete_callback_(std::move(complete_callback)) {}
52
53 GetVisualsTask::~GetVisualsTask() = default;
54
Run()55 void GetVisualsTask::Run() {
56 store_->Execute(
57 base::BindOnce(GetVisualsSync, std::move(offline_id_)),
58 base::BindOnce(&GetVisualsTask::Complete, weak_ptr_factory_.GetWeakPtr()),
59 std::unique_ptr<OfflinePageVisuals>());
60 }
61
Complete(std::unique_ptr<OfflinePageVisuals> result)62 void GetVisualsTask::Complete(std::unique_ptr<OfflinePageVisuals> result) {
63 TaskComplete();
64 std::move(complete_callback_).Run(std::move(result));
65 }
66
67 } // namespace offline_pages
68