| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/offline_pages/background/request_queue.h" | 5 #include "components/offline_pages/background/request_queue.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/location.h" | 10 #include "base/location.h" |
| 9 #include "base/threading/thread_task_runner_handle.h" | 11 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "components/offline_pages/background/change_requests_state_task.h" | 12 #include "components/offline_pages/background/change_requests_state_task.h" |
| 11 #include "components/offline_pages/background/mark_attempt_aborted_task.h" | 13 #include "components/offline_pages/background/mark_attempt_aborted_task.h" |
| 14 #include "components/offline_pages/background/mark_attempt_completed_task.h" |
| 12 #include "components/offline_pages/background/mark_attempt_started_task.h" | 15 #include "components/offline_pages/background/mark_attempt_started_task.h" |
| 13 #include "components/offline_pages/background/remove_requests_task.h" | 16 #include "components/offline_pages/background/remove_requests_task.h" |
| 14 #include "components/offline_pages/background/request_queue_store.h" | 17 #include "components/offline_pages/background/request_queue_store.h" |
| 15 #include "components/offline_pages/background/save_page_request.h" | 18 #include "components/offline_pages/background/save_page_request.h" |
| 16 | 19 |
| 17 namespace offline_pages { | 20 namespace offline_pages { |
| 18 | 21 |
| 19 namespace { | 22 namespace { |
| 20 // Completes the get requests call. | 23 // Completes the get requests call. |
| 21 void GetRequestsDone(const RequestQueue::GetRequestsCallback& callback, | 24 void GetRequestsDone(const RequestQueue::GetRequestsCallback& callback, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 47 result = RequestQueue::AddRequestResult::STORE_FAILURE; | 50 result = RequestQueue::AddRequestResult::STORE_FAILURE; |
| 48 break; | 51 break; |
| 49 case ItemActionStatus::NOT_FOUND: | 52 case ItemActionStatus::NOT_FOUND: |
| 50 default: | 53 default: |
| 51 NOTREACHED(); | 54 NOTREACHED(); |
| 52 return; | 55 return; |
| 53 } | 56 } |
| 54 callback.Run(result, request); | 57 callback.Run(result, request); |
| 55 } | 58 } |
| 56 | 59 |
| 57 // Completes the update request call. | |
| 58 // TODO(fgorski): For specific cases, check that appropriate items were updated. | |
| 59 void UpdateRequestsDone(const RequestQueue::UpdateRequestCallback& callback, | |
| 60 std::unique_ptr<UpdateRequestsResult> store_result) { | |
| 61 RequestQueue::UpdateRequestResult result; | |
| 62 if (store_result->store_state != StoreState::LOADED) { | |
| 63 result = RequestQueue::UpdateRequestResult::STORE_FAILURE; | |
| 64 } else if (store_result->item_statuses.size() == 0) { | |
| 65 result = RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; | |
| 66 } else { | |
| 67 ItemActionStatus status = store_result->item_statuses.begin()->second; | |
| 68 if (status == ItemActionStatus::STORE_ERROR) | |
| 69 result = RequestQueue::UpdateRequestResult::STORE_FAILURE; | |
| 70 else if (status == ItemActionStatus::NOT_FOUND) | |
| 71 result = RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; | |
| 72 else | |
| 73 result = RequestQueue::UpdateRequestResult::SUCCESS; | |
| 74 } | |
| 75 | |
| 76 callback.Run(result); | |
| 77 } | |
| 78 | |
| 79 } // namespace | 60 } // namespace |
| 80 | 61 |
| 81 RequestQueue::RequestQueue(std::unique_ptr<RequestQueueStore> store) | 62 RequestQueue::RequestQueue(std::unique_ptr<RequestQueueStore> store) |
| 82 : store_(std::move(store)), weak_ptr_factory_(this) {} | 63 : store_(std::move(store)), weak_ptr_factory_(this) {} |
| 83 | 64 |
| 84 RequestQueue::~RequestQueue() {} | 65 RequestQueue::~RequestQueue() {} |
| 85 | 66 |
| 86 void RequestQueue::GetRequests(const GetRequestsCallback& callback) { | 67 void RequestQueue::GetRequests(const GetRequestsCallback& callback) { |
| 87 store_->GetRequests(base::Bind(&GetRequestsDone, callback)); | 68 store_->GetRequests(base::Bind(&GetRequestsDone, callback)); |
| 88 } | 69 } |
| 89 | 70 |
| 90 void RequestQueue::AddRequest(const SavePageRequest& request, | 71 void RequestQueue::AddRequest(const SavePageRequest& request, |
| 91 const AddRequestCallback& callback) { | 72 const AddRequestCallback& callback) { |
| 92 // TODO(fgorski): check that request makes sense. | 73 // TODO(fgorski): check that request makes sense. |
| 93 // TODO(fgorski): check that request does not violate policy. | 74 // TODO(fgorski): check that request does not violate policy. |
| 94 store_->AddRequest(request, base::Bind(&AddRequestDone, callback, request)); | 75 store_->AddRequest(request, base::Bind(&AddRequestDone, callback, request)); |
| 95 } | 76 } |
| 96 | 77 |
| 97 void RequestQueue::UpdateRequest(const SavePageRequest& update_request, | |
| 98 const UpdateRequestCallback& update_callback) { | |
| 99 // We have to pass the update_callback *through* the get callback. We do this | |
| 100 // by currying the update_callback as a parameter to be used when calling | |
| 101 // GetForUpdateDone. The actual request queue store get operation will not | |
| 102 // see this bound parameter, but just pass it along. GetForUpdateDone then | |
| 103 // passes it into the UpdateRequests method, where it ends up calling back | |
| 104 // to the request queue client. | |
| 105 // TODO(petewil): This would be more efficient if the store supported a call | |
| 106 // to get a single item by ID. Change this code to use that API when added. | |
| 107 // crbug.com/630657. | |
| 108 store_->GetRequests(base::Bind( | |
| 109 &RequestQueue::GetForUpdateDone, weak_ptr_factory_.GetWeakPtr(), | |
| 110 update_callback, update_request)); | |
| 111 } | |
| 112 | |
| 113 // We need a different version of the GetCallback that can take the curried | |
| 114 // update_callback as a parameter, and call back into the request queue store | |
| 115 // implementation. This must be a member function because we need access to | |
| 116 // the store pointer to call UpdateRequests. | |
| 117 void RequestQueue::GetForUpdateDone( | |
| 118 const UpdateRequestCallback& update_callback, | |
| 119 const SavePageRequest& update_request, | |
| 120 bool success, | |
| 121 std::vector<std::unique_ptr<SavePageRequest>> found_requests) { | |
| 122 // If the result was not found, return now. | |
| 123 if (!success) { | |
| 124 update_callback.Run( | |
| 125 RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST); | |
| 126 return; | |
| 127 } | |
| 128 // If the found result does not contain the request we are looking for, return | |
| 129 // now. | |
| 130 bool found = false; | |
| 131 std::vector<std::unique_ptr<SavePageRequest>>::const_iterator iter; | |
| 132 for (iter = found_requests.begin(); iter != found_requests.end(); ++iter) { | |
| 133 if ((*iter)->request_id() == update_request.request_id()) | |
| 134 found = true; | |
| 135 } | |
| 136 if (!found) { | |
| 137 update_callback.Run( | |
| 138 RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST); | |
| 139 return; | |
| 140 } | |
| 141 | |
| 142 // Since the request exists, update it. | |
| 143 std::vector<SavePageRequest> update_requests{update_request}; | |
| 144 store_->UpdateRequests(update_requests, | |
| 145 base::Bind(&UpdateRequestsDone, update_callback)); | |
| 146 } | |
| 147 | |
| 148 void RequestQueue::RemoveRequests(const std::vector<int64_t>& request_ids, | 78 void RequestQueue::RemoveRequests(const std::vector<int64_t>& request_ids, |
| 149 const UpdateCallback& callback) { | 79 const UpdateCallback& callback) { |
| 150 std::unique_ptr<Task> task( | 80 std::unique_ptr<Task> task( |
| 151 new RemoveRequestsTask(store_.get(), request_ids, callback)); | 81 new RemoveRequestsTask(store_.get(), request_ids, callback)); |
| 152 task_queue_.AddTask(std::move(task)); | 82 task_queue_.AddTask(std::move(task)); |
| 153 } | 83 } |
| 154 | 84 |
| 155 void RequestQueue::ChangeRequestsState( | 85 void RequestQueue::ChangeRequestsState( |
| 156 const std::vector<int64_t>& request_ids, | 86 const std::vector<int64_t>& request_ids, |
| 157 const SavePageRequest::RequestState new_state, | 87 const SavePageRequest::RequestState new_state, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 168 task_queue_.AddTask(std::move(task)); | 98 task_queue_.AddTask(std::move(task)); |
| 169 } | 99 } |
| 170 | 100 |
| 171 void RequestQueue::MarkAttemptAborted(int64_t request_id, | 101 void RequestQueue::MarkAttemptAborted(int64_t request_id, |
| 172 const UpdateCallback& callback) { | 102 const UpdateCallback& callback) { |
| 173 std::unique_ptr<Task> task( | 103 std::unique_ptr<Task> task( |
| 174 new MarkAttemptAbortedTask(store_.get(), request_id, callback)); | 104 new MarkAttemptAbortedTask(store_.get(), request_id, callback)); |
| 175 task_queue_.AddTask(std::move(task)); | 105 task_queue_.AddTask(std::move(task)); |
| 176 } | 106 } |
| 177 | 107 |
| 108 void RequestQueue::MarkAttemptCompleted(int64_t request_id, |
| 109 const UpdateCallback& callback) { |
| 110 std::unique_ptr<Task> task( |
| 111 new MarkAttemptCompletedTask(store_.get(), request_id, callback)); |
| 112 task_queue_.AddTask(std::move(task)); |
| 113 } |
| 114 |
| 178 void RequestQueue::PurgeRequests(const PurgeRequestsCallback& callback) {} | 115 void RequestQueue::PurgeRequests(const PurgeRequestsCallback& callback) {} |
| 179 | 116 |
| 180 } // namespace offline_pages | 117 } // namespace offline_pages |
| OLD | NEW |