1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/offline_pages/core/background/pending_state_updater.h"
#include "base/functional/bind.h"
#include "components/offline_items_collection/core/pending_state.h"
#include "components/offline_pages/core/background/request_coordinator.h"
namespace offline_pages {
PendingStateUpdater::PendingStateUpdater(
RequestCoordinator* request_coordinator)
: request_coordinator_(request_coordinator),
requests_pending_another_download_(false) {}
PendingStateUpdater::~PendingStateUpdater() = default;
void PendingStateUpdater::UpdateRequestsOnLossOfNetwork() {
requests_pending_another_download_ = false;
request_coordinator_->GetAllRequests(
base::BindOnce(&PendingStateUpdater::NotifyChangedPendingStates,
weak_ptr_factory_.GetWeakPtr()));
}
void PendingStateUpdater::UpdateRequestsOnRequestPicked(
const int64_t picked_request_id,
std::unique_ptr<std::vector<SavePageRequest>> available_requests) {
// Requests do not need to be updated.
if (requests_pending_another_download_)
return;
// All available requests expect for the picked request changed to waiting
// for another download to complete.
for (auto& request : *available_requests) {
if (request.request_id() != picked_request_id) {
request.set_pending_state(PendingState::PENDING_ANOTHER_DOWNLOAD);
request_coordinator_->NotifyChanged(request);
}
}
requests_pending_another_download_ = true;
}
void PendingStateUpdater::SetPendingState(SavePageRequest& request) {
if (request.request_state() == SavePageRequest::RequestState::AVAILABLE) {
if (request_coordinator_->state() ==
RequestCoordinator::RequestCoordinatorState::OFFLINING) {
request.set_pending_state(PendingState::PENDING_ANOTHER_DOWNLOAD);
} else {
requests_pending_another_download_ = false;
request.set_pending_state(PendingState::PENDING_NETWORK);
}
}
}
void PendingStateUpdater::NotifyChangedPendingStates(
std::vector<std::unique_ptr<SavePageRequest>> requests) {
for (const auto& request : requests) {
request_coordinator_->NotifyChanged(*request);
}
}
} // namespace offline_pages
|