| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/android/explore_sites/get_images_task.h" |
| |
| #include "chrome/browser/android/explore_sites/explore_sites_schema.h" |
| #include "sql/database.h" |
| #include "sql/meta_table.h" |
| #include "sql/statement.h" |
| #include "sql/transaction.h" |
| |
| namespace explore_sites { |
| namespace { |
| |
| const char kSelectCategoryImagesSql[] = R"(SELECT favicon |
| FROM sites |
| LEFT JOIN site_blacklist ON (sites.url = site_blacklist.url) |
| WHERE category_id = ? AND NOT removed AND site_blacklist.url IS NULL |
| LIMIT ?;)"; |
| |
| const char kSelectSiteImageSql[] = |
| "SELECT favicon FROM sites WHERE site_id = ?;"; |
| |
| } // namespace |
| |
| EncodedImageList GetCategoryImagesSync(int category_id, |
| int max_images, |
| sql::Database* db) { |
| DCHECK(db); |
| |
| sql::Statement category_statement( |
| db->GetCachedStatement(SQL_FROM_HERE, kSelectCategoryImagesSql)); |
| category_statement.BindInt64(0, category_id); |
| category_statement.BindInt64(1, max_images); |
| |
| EncodedImageList result; |
| while (category_statement.Step()) { |
| int byte_length = category_statement.ColumnByteLength(0); |
| result.push_back(std::make_unique<std::vector<uint8_t>>(byte_length)); |
| category_statement.ColumnBlobAsVector(0, result.back().get()); |
| } |
| if (!category_statement.Succeeded()) |
| return EncodedImageList(); |
| return result; |
| } |
| |
| EncodedImageList GetSiteImageSync(int site_id, sql::Database* db) { |
| DCHECK(db); |
| |
| sql::Statement site_statement( |
| db->GetCachedStatement(SQL_FROM_HERE, kSelectSiteImageSql)); |
| site_statement.BindInt64(0, site_id); |
| |
| EncodedImageList result; |
| while (site_statement.Step()) { |
| int byte_length = site_statement.ColumnByteLength(0); |
| result.push_back(std::make_unique<std::vector<uint8_t>>(byte_length)); |
| site_statement.ColumnBlobAsVector(0, result.back().get()); |
| } |
| if (!site_statement.Succeeded()) |
| return EncodedImageList(); |
| return result; |
| } |
| |
| GetImagesTask::GetImagesTask(ExploreSitesStore* store, |
| int site_id, |
| EncodedImageListCallback callback) |
| : store_(store), |
| data_type_(DataType::kSite), |
| id_(site_id), |
| max_results_(1), |
| callback_(std::move(callback)), |
| weak_ptr_factory_(this) {} |
| |
| GetImagesTask::GetImagesTask(ExploreSitesStore* store, |
| int category_id, |
| int max_images, |
| EncodedImageListCallback callback) |
| : store_(store), |
| data_type_(DataType::kCategory), |
| id_(category_id), |
| max_results_(max_images), |
| callback_(std::move(callback)), |
| weak_ptr_factory_(this) {} |
| |
| GetImagesTask::~GetImagesTask() = default; |
| |
| void GetImagesTask::Run() { |
| switch (data_type_) { |
| case DataType::kCategory: |
| store_->Execute(base::BindOnce(&GetCategoryImagesSync, id_, max_results_), |
| base::BindOnce(&GetImagesTask::FinishedExecuting, |
| weak_ptr_factory_.GetWeakPtr()), |
| EncodedImageList()); |
| break; |
| case DataType::kSite: |
| store_->Execute(base::BindOnce(&GetSiteImageSync, id_), |
| base::BindOnce(&GetImagesTask::FinishedExecuting, |
| weak_ptr_factory_.GetWeakPtr()), |
| EncodedImageList()); |
| break; |
| } |
| } |
| |
| void GetImagesTask::FinishedExecuting(EncodedImageList images) { |
| TaskComplete(); |
| DVLOG(1) << "Finished getting images, resulting in " << images.size() |
| << " images."; |
| std::move(callback_).Run(std::move(images)); |
| } |
| |
| } // namespace explore_sites |