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