| // Copyright 2016 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 "components/offline_pages/background/change_requests_state_task.h" |
| |
| #include "base/bind.h" |
| |
| namespace offline_pages { |
| |
| ChangeRequestsStateTask::ChangeRequestsStateTask( |
| RequestQueueStore* store, |
| const std::vector<int64_t>& request_ids, |
| const SavePageRequest::RequestState new_state, |
| const RequestQueueStore::UpdateCallback& callback) |
| : store_(store), |
| request_ids_(request_ids.begin(), request_ids.end()), |
| new_state_(new_state), |
| callback_(callback), |
| weak_ptr_factory_(this) {} |
| |
| ChangeRequestsStateTask::~ChangeRequestsStateTask() {} |
| |
| void ChangeRequestsStateTask::Run() { |
| ReadRequests(); |
| } |
| |
| void ChangeRequestsStateTask::ReadRequests() { |
| if (request_ids_.empty()) { |
| CompleteEarly(ItemActionStatus::NOT_FOUND); |
| return; |
| } |
| |
| store_->GetRequests(base::Bind(&ChangeRequestsStateTask::SelectItemsToUpdate, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |
| |
| void ChangeRequestsStateTask::SelectItemsToUpdate( |
| bool success, |
| std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| if (!success) { |
| CompleteEarly(ItemActionStatus::STORE_ERROR); |
| return; |
| } |
| |
| std::vector<SavePageRequest> items_to_update; |
| for (const auto& request : requests) { |
| // If this request is in our list, update it. |
| if (request_ids_.count(request->request_id()) > 0) { |
| request->set_request_state(new_state_); |
| items_to_update.push_back(*request); |
| // Items that are missing before the update will be marked as not found |
| // before the callback. |
| request_ids_.erase(request->request_id()); |
| } |
| } |
| |
| if (items_to_update.empty()) { |
| CompleteEarly(ItemActionStatus::NOT_FOUND); |
| return; |
| } |
| |
| store_->UpdateRequests(items_to_update, |
| base::Bind(&ChangeRequestsStateTask::UpdateCompleted, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |
| |
| void ChangeRequestsStateTask::UpdateCompleted( |
| std::unique_ptr<UpdateRequestsResult> update_result) { |
| CompleteWithStatus(std::move(update_result), ItemActionStatus::NOT_FOUND); |
| } |
| |
| void ChangeRequestsStateTask::CompleteEarly(ItemActionStatus status) { |
| // TODO(fgorski): store_->state() once implemented |
| std::unique_ptr<UpdateRequestsResult> result( |
| new UpdateRequestsResult(StoreState::LOADED)); |
| CompleteWithStatus(std::move(result), status); |
| } |
| |
| void ChangeRequestsStateTask::CompleteWithStatus( |
| std::unique_ptr<UpdateRequestsResult> result, |
| ItemActionStatus status) { |
| // Mark items as not found, if they are still in the request IDs set. |
| for (int64_t request_id : request_ids_) |
| result->item_statuses.push_back(std::make_pair(request_id, status)); |
| callback_.Run(std::move(result)); |
| TaskComplete(); |
| } |
| |
| } // namespace offline_pages |