Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1015)

Unified Diff: components/offline_pages/background/change_requests_state_task.cc

Issue 2372043002: [Offline pages] Applying TaskQueue to RequestQueue::ChangeRequestsState (Closed)
Patch Set: Addressing feedback from dougarnett Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/offline_pages/background/change_requests_state_task.cc
diff --git a/components/offline_pages/background/change_requests_state_task.cc b/components/offline_pages/background/change_requests_state_task.cc
new file mode 100644
index 0000000000000000000000000000000000000000..f78665aa82d8eee4047309e2e14d414d9598abe3
--- /dev/null
+++ b/components/offline_pages/background/change_requests_state_task.cc
@@ -0,0 +1,90 @@
+// 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

Powered by Google App Engine
This is Rietveld 408576698