Chromium Code Reviews| 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 "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "components/offline_pages/background/request_queue_store.h" | 10 #include "components/offline_pages/background/request_queue_store.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 44 break; | 44 break; |
| 45 case ItemActionStatus::NOT_FOUND: | 45 case ItemActionStatus::NOT_FOUND: |
| 46 default: | 46 default: |
| 47 NOTREACHED(); | 47 NOTREACHED(); |
| 48 return; | 48 return; |
| 49 } | 49 } |
| 50 callback.Run(result, request); | 50 callback.Run(result, request); |
| 51 } | 51 } |
| 52 | 52 |
| 53 // Completes the update request call. | 53 // Completes the update request call. |
| 54 // TODO(petewil): Move callers to the UpdateMultipleRequestDone callback | 54 // TODO(fgorski): For specific cases, check that appropriate items were updated. |
| 55 void UpdateRequestDone(const RequestQueue::UpdateRequestCallback& callback, | 55 void UpdateRequestsDone(const RequestQueue::UpdateRequestCallback& callback, |
| 56 RequestQueueStore::UpdateStatus status) { | 56 std::unique_ptr<UpdateRequestsResult> store_result) { |
| 57 RequestQueue::UpdateRequestResult result = | 57 RequestQueue::UpdateRequestResult result; |
| 58 (status == RequestQueueStore::UpdateStatus::UPDATED) | 58 if (store_result->store_state != StoreState::LOADED) { |
| 59 ? RequestQueue::UpdateRequestResult::SUCCESS | 59 result = RequestQueue::UpdateRequestResult::STORE_FAILURE; |
| 60 : RequestQueue::UpdateRequestResult::STORE_FAILURE; | 60 } else if (store_result->item_statuses.size() == 0) { |
| 61 result = RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; | |
| 62 } else { | |
| 63 ItemActionStatus status = store_result->item_statuses.begin()->second; | |
| 64 if (status == ItemActionStatus::STORE_ERROR) | |
| 65 result = RequestQueue::UpdateRequestResult::STORE_FAILURE; | |
| 66 else if (status == ItemActionStatus::NOT_FOUND) | |
| 67 result = RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; | |
| 68 else | |
| 69 result = RequestQueue::UpdateRequestResult::SUCCESS; | |
| 70 } | |
| 71 | |
| 61 callback.Run(result); | 72 callback.Run(result); |
| 62 } | 73 } |
| 63 | 74 |
| 64 // Handles updating multiple requests at the same time. | 75 // Handles updating multiple requests at the same time. |
| 65 void UpdateMultipleRequestsDone( | 76 void UpdateMultipleRequestsDone( |
|
Pete Williamson
2016/09/22 00:12:50
We should remove all references to UpdateMultipleR
fgorski
2016/09/22 15:47:53
I agree with you, but let's go step by step. This
| |
| 66 const RequestQueue::UpdateMultipleRequestsCallback& callback, | 77 const RequestQueue::UpdateMultipleRequestsCallback& callback, |
| 67 const RequestQueue::UpdateMultipleRequestResults& results, | 78 const RequestQueue::UpdateMultipleRequestResults& results, |
| 68 std::vector<std::unique_ptr<SavePageRequest>> requests) { | 79 std::vector<std::unique_ptr<SavePageRequest>> requests) { |
| 69 callback.Run(results, std::move(requests)); | 80 callback.Run(results, std::move(requests)); |
| 70 } | 81 } |
| 71 | 82 |
| 72 // Completes the remove request call. | 83 // Completes the remove request call. |
| 73 void RemoveRequestsDone( | 84 void RemoveRequestsDone( |
| 74 const RequestQueue::RemoveRequestsCallback& callback, | 85 const RequestQueue::RemoveRequestsCallback& callback, |
| 75 const RequestQueue::UpdateMultipleRequestResults& results, | 86 const RequestQueue::UpdateMultipleRequestResults& results, |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 94 // TODO(fgorski): check that request does not violate policy. | 105 // TODO(fgorski): check that request does not violate policy. |
| 95 store_->AddRequest(request, base::Bind(&AddRequestDone, callback, request)); | 106 store_->AddRequest(request, base::Bind(&AddRequestDone, callback, request)); |
| 96 } | 107 } |
| 97 | 108 |
| 98 void RequestQueue::UpdateRequest(const SavePageRequest& update_request, | 109 void RequestQueue::UpdateRequest(const SavePageRequest& update_request, |
| 99 const UpdateRequestCallback& update_callback) { | 110 const UpdateRequestCallback& update_callback) { |
| 100 // We have to pass the update_callback *through* the get callback. We do this | 111 // We have to pass the update_callback *through* the get callback. We do this |
| 101 // by currying the update_callback as a parameter to be used when calling | 112 // by currying the update_callback as a parameter to be used when calling |
| 102 // GetForUpdateDone. The actual request queue store get operation will not | 113 // GetForUpdateDone. The actual request queue store get operation will not |
| 103 // see this bound parameter, but just pass it along. GetForUpdateDone then | 114 // see this bound parameter, but just pass it along. GetForUpdateDone then |
| 104 // passes it into the AddOrUpdateRequest method, where it ends up calling back | 115 // passes it into the UpdateRequests method, where it ends up calling back |
| 105 // to the request queue client. | 116 // to the request queue client. |
| 106 // TODO(petewil): This would be more efficient if the store supported a call | 117 // TODO(petewil): This would be more efficient if the store supported a call |
| 107 // to get a single item by ID. Change this code to use that API when added. | 118 // to get a single item by ID. Change this code to use that API when added. |
| 108 // crbug.com/630657. | 119 // crbug.com/630657. |
| 109 store_->GetRequests(base::Bind( | 120 store_->GetRequests(base::Bind( |
| 110 &RequestQueue::GetForUpdateDone, weak_ptr_factory_.GetWeakPtr(), | 121 &RequestQueue::GetForUpdateDone, weak_ptr_factory_.GetWeakPtr(), |
| 111 update_callback, update_request)); | 122 update_callback, update_request)); |
| 112 } | 123 } |
| 113 | 124 |
| 114 // We need a different version of the GetCallback that can take the curried | 125 // We need a different version of the GetCallback that can take the curried |
| 115 // update_callback as a parameter, and call back into the request queue store | 126 // update_callback as a parameter, and call back into the request queue store |
| 116 // implementation. This must be a member function because we need access to | 127 // implementation. This must be a member function because we need access to |
| 117 // the store pointer to call AddOrUpdateRequest. | 128 // the store pointer to call UpdateRequests. |
| 118 void RequestQueue::GetForUpdateDone( | 129 void RequestQueue::GetForUpdateDone( |
| 119 const UpdateRequestCallback& update_callback, | 130 const UpdateRequestCallback& update_callback, |
| 120 const SavePageRequest& update_request, | 131 const SavePageRequest& update_request, |
| 121 bool success, | 132 bool success, |
| 122 std::vector<std::unique_ptr<SavePageRequest>> found_requests) { | 133 std::vector<std::unique_ptr<SavePageRequest>> found_requests) { |
| 123 // If the result was not found, return now. | 134 // If the result was not found, return now. |
| 124 if (!success) { | 135 if (!success) { |
| 125 update_callback.Run( | 136 update_callback.Run( |
| 126 RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST); | 137 RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST); |
| 127 return; | 138 return; |
| 128 } | 139 } |
| 129 // If the found result does not contain the request we are looking for, return | 140 // If the found result does not contain the request we are looking for, return |
| 130 // now. | 141 // now. |
| 131 bool found = false; | 142 bool found = false; |
| 132 std::vector<std::unique_ptr<SavePageRequest>>::const_iterator iter; | 143 std::vector<std::unique_ptr<SavePageRequest>>::const_iterator iter; |
| 133 for (iter = found_requests.begin(); iter != found_requests.end(); ++iter) { | 144 for (iter = found_requests.begin(); iter != found_requests.end(); ++iter) { |
| 134 if ((*iter)->request_id() == update_request.request_id()) | 145 if ((*iter)->request_id() == update_request.request_id()) |
| 135 found = true; | 146 found = true; |
| 136 } | 147 } |
| 137 if (!found) { | 148 if (!found) { |
| 138 update_callback.Run( | 149 update_callback.Run( |
| 139 RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST); | 150 RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST); |
| 140 return; | 151 return; |
| 141 } | 152 } |
| 142 | 153 |
| 143 // Since the request exists, update it. | 154 // Since the request exists, update it. |
| 144 store_->AddOrUpdateRequest(update_request, | 155 std::vector<SavePageRequest> update_requests{update_request}; |
| 145 base::Bind(&UpdateRequestDone, update_callback)); | 156 store_->UpdateRequests(update_requests, |
| 157 base::Bind(&UpdateRequestsDone, update_callback)); | |
| 146 } | 158 } |
| 147 | 159 |
| 148 void RequestQueue::RemoveRequests(const std::vector<int64_t>& request_ids, | 160 void RequestQueue::RemoveRequests(const std::vector<int64_t>& request_ids, |
| 149 const RemoveRequestsCallback& callback) { | 161 const RemoveRequestsCallback& callback) { |
| 150 store_->RemoveRequests(request_ids, base::Bind(RemoveRequestsDone, callback)); | 162 store_->RemoveRequests(request_ids, base::Bind(RemoveRequestsDone, callback)); |
| 151 } | 163 } |
| 152 | 164 |
| 153 void RequestQueue::ChangeRequestsState( | 165 void RequestQueue::ChangeRequestsState( |
| 154 const std::vector<int64_t>& request_ids, | 166 const std::vector<int64_t>& request_ids, |
| 155 const SavePageRequest::RequestState new_state, | 167 const SavePageRequest::RequestState new_state, |
| 156 const UpdateMultipleRequestsCallback& callback) { | 168 const UpdateMultipleRequestsCallback& callback) { |
| 157 store_->ChangeRequestsState(request_ids, new_state, | 169 store_->ChangeRequestsState(request_ids, new_state, |
| 158 base::Bind(UpdateMultipleRequestsDone, callback)); | 170 base::Bind(UpdateMultipleRequestsDone, callback)); |
| 159 } | 171 } |
| 160 | 172 |
| 161 void RequestQueue::PurgeRequests(const PurgeRequestsCallback& callback) {} | 173 void RequestQueue::PurgeRequests(const PurgeRequestsCallback& callback) {} |
| 162 | 174 |
| 163 } // namespace offline_pages | 175 } // namespace offline_pages |
| OLD | NEW |