|  | // 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. | 
|  |  | 
|  | #ifndef COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_QUEUE_H_ | 
|  | #define COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_QUEUE_H_ | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <memory> | 
|  | #include <set> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/callback.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/weak_ptr.h" | 
|  | #include "components/offline_pages/background/device_conditions.h" | 
|  | #include "components/offline_pages/background/pick_request_task.h" | 
|  | #include "components/offline_pages/background/pick_request_task_factory.h" | 
|  | #include "components/offline_pages/background/request_queue_results.h" | 
|  | #include "components/offline_pages/background/save_page_request.h" | 
|  | #include "components/offline_pages/core/task_queue.h" | 
|  | #include "components/offline_pages/offline_page_item.h" | 
|  | #include "components/offline_pages/offline_store_types.h" | 
|  |  | 
|  | namespace offline_pages { | 
|  |  | 
|  | class RequestQueueStore; | 
|  | class PickRequestTaskFactory; | 
|  |  | 
|  | // Class responsible for managing save page requests. | 
|  | class RequestQueue { | 
|  | public: | 
|  |  | 
|  | // Callback used for |GetRequests|. | 
|  | typedef base::Callback<void(GetRequestsResult, | 
|  | std::vector<std::unique_ptr<SavePageRequest>>)> | 
|  | GetRequestsCallback; | 
|  |  | 
|  | // Callback used for |AddRequest|. | 
|  | typedef base::Callback<void(AddRequestResult, const SavePageRequest& request)> | 
|  | AddRequestCallback; | 
|  |  | 
|  | // Callback used by |ChangeRequestsState|. | 
|  | typedef base::Callback<void(std::unique_ptr<UpdateRequestsResult>)> | 
|  | UpdateCallback; | 
|  |  | 
|  | // Callback used by |UdpateRequest|. | 
|  | typedef base::Callback<void(UpdateRequestResult)> UpdateRequestCallback; | 
|  |  | 
|  | explicit RequestQueue(std::unique_ptr<RequestQueueStore> store); | 
|  | ~RequestQueue(); | 
|  |  | 
|  | // Gets all of the active requests from the store. Calling this method may | 
|  | // schedule purging of the request queue. | 
|  | void GetRequests(const GetRequestsCallback& callback); | 
|  |  | 
|  | // Adds |request| to the request queue. Result is returned through |callback|. | 
|  | // In case adding the request violates policy, the result will fail with | 
|  | // appropriate result. Callback will also return a copy of a request with all | 
|  | // fields set. | 
|  | void AddRequest(const SavePageRequest& request, | 
|  | const AddRequestCallback& callback); | 
|  |  | 
|  | // Removes the requests matching the |request_ids|. Result is returned through | 
|  | // |callback|.  If a request id cannot be removed, this will still remove the | 
|  | // others. | 
|  | void RemoveRequests(const std::vector<int64_t>& request_ids, | 
|  | const UpdateCallback& callback); | 
|  |  | 
|  | // Changes the state to |new_state| for requests matching the | 
|  | // |request_ids|. Results are returned through |callback|. | 
|  | void ChangeRequestsState(const std::vector<int64_t>& request_ids, | 
|  | const SavePageRequest::RequestState new_state, | 
|  | const UpdateCallback& callback); | 
|  |  | 
|  | // Marks attempt with |request_id| as started. Results are returned through | 
|  | // |callback|. | 
|  | void MarkAttemptStarted(int64_t request_id, const UpdateCallback& callback); | 
|  |  | 
|  | // Marks attempt with |request_id| as aborted. Results are returned through | 
|  | // |callback|. | 
|  | void MarkAttemptAborted(int64_t request_id, const UpdateCallback& callback); | 
|  |  | 
|  | // Marks attempt with |request_id| as completed. The attempt may have | 
|  | // completed with either success or failure (not denoted here). Results | 
|  | // are returned through |callback|. | 
|  | void MarkAttemptCompleted(int64_t request_id, const UpdateCallback& callback); | 
|  |  | 
|  | // Make a task to pick the next request, and report our choice to the | 
|  | // callbacks. | 
|  | void PickNextRequest( | 
|  | PickRequestTask::RequestPickedCallback picked_callback, | 
|  | PickRequestTask::RequestNotPickedCallback not_picked_callback, | 
|  | PickRequestTask::RequestCountCallback request_count_callback, | 
|  | DeviceConditions& conditions, | 
|  | std::set<int64_t>& disabled_requests); | 
|  |  | 
|  | // Takes ownership of the factory.  We use a setter to allow users of the | 
|  | // request queue to not need a PickerFactory to create it, since we have lots | 
|  | // of code using the request queue.  The request coordinator will set a | 
|  | // factory before calling PickNextRequest. | 
|  | void SetPickerFactory(std::unique_ptr<PickRequestTaskFactory> factory) { | 
|  | picker_factory_ = std::move(factory); | 
|  | } | 
|  |  | 
|  | private: | 
|  | // Store initialization functions. | 
|  | void Initialize(); | 
|  | void InitializeStoreDone(bool success); | 
|  |  | 
|  | std::unique_ptr<RequestQueueStore> store_; | 
|  |  | 
|  | // Task queue to serialize store access. | 
|  | TaskQueue task_queue_; | 
|  |  | 
|  | // Builds PickRequestTask objects. | 
|  | std::unique_ptr<PickRequestTaskFactory> picker_factory_; | 
|  |  | 
|  | // Allows us to pass a weak pointer to callbacks. | 
|  | base::WeakPtrFactory<RequestQueue> weak_ptr_factory_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(RequestQueue); | 
|  | }; | 
|  |  | 
|  | }  // namespace offline_pages | 
|  |  | 
|  | #endif  // COMPONENTS_OFFLINE_PAGES_BACKGROUND_REQUEST_QUEUE_H_ |