| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_SYNC_ENGINE_GET_UPDATES_PROCESSOR_H_ |
| #define COMPONENTS_SYNC_ENGINE_GET_UPDATES_PROCESSOR_H_ |
| |
| #include "base/gtest_prod_util.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/memory/raw_ref.h" |
| #include "components/sync/base/data_type.h" |
| #include "components/sync/engine/data_type_registry.h" |
| #include "components/sync/engine/syncer_error.h" |
| |
| namespace sync_pb { |
| class GetUpdatesResponse; |
| class ClientToServerMessage; |
| } // namespace sync_pb |
| |
| namespace syncer { |
| |
| class GetUpdatesDelegate; |
| class StatusController; |
| class SyncCycle; |
| |
| // This class manages the set of per-type syncer objects. |
| // |
| // It owns these types and hides the details of iterating over all of them. |
| // Most methods allow the caller to specify a subset of types on which the |
| // operation is to be applied. It is a logic error if the supplied set of types |
| // contains a type which was not previously registered with the manager. |
| class GetUpdatesProcessor { |
| public: |
| explicit GetUpdatesProcessor(UpdateHandlerMap* update_handler_map, |
| const GetUpdatesDelegate& delegate); |
| |
| GetUpdatesProcessor(const GetUpdatesProcessor&) = delete; |
| GetUpdatesProcessor& operator=(const GetUpdatesProcessor&) = delete; |
| |
| ~GetUpdatesProcessor(); |
| |
| // Downloads and processes a batch of updates for the specified types. |
| // |
| // Returns SYNCER_OK if the download succeeds or an appropriate error value in |
| // case of failure. |
| SyncerError DownloadUpdates(DataTypeSet* request_types, SyncCycle* cycle); |
| |
| // Applies any downloaded and processed updates. |
| void ApplyUpdates(const DataTypeSet& gu_types, |
| const DataTypeSet& data_types_with_failure, |
| StatusController* status_controller); |
| |
| // Records a download failure for the updated types. |
| void RecordDownloadFailure(const DataTypeSet& gu_types, |
| UpdateHandler::NudgedUpdateResult failure_result); |
| |
| // Returns true if last DownloadUpdates() outcome indicated that there are |
| // more updates to download from the server, e.g. when GetUpdatesResponse has |
| // non-zero `changes_remaining`. |
| bool HasMoreUpdatesToDownload() const; |
| |
| private: |
| // Populates a GetUpdates request message with per-type information. |
| void PrepareGetUpdates(const DataTypeSet& gu_types, |
| sync_pb::ClientToServerMessage* message); |
| |
| // Sends the specified message to the server and stores the response in a |
| // member of the `cycle`'s StatusController. |
| SyncerError ExecuteDownloadUpdates(DataTypeSet* request_types, |
| SyncCycle* cycle, |
| sync_pb::ClientToServerMessage* msg); |
| |
| // Processes a GetUpdates response for each type. |
| SyncerError ProcessResponse(const sync_pb::GetUpdatesResponse& gu_response, |
| const DataTypeSet& gu_types, |
| StatusController* status_controller); |
| |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, BookmarkNudge); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, NotifyNormalDelegate); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, NotifyConfigureDelegate); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, |
| NotifyPollGetUpdatesDelegate); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, InitialSyncRequest); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, ConfigureTest); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, PollTest); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, RetryTest); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, NudgeWithRetryTest); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, InvalidResponse); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, MoreToDownloadResponse); |
| FRIEND_TEST_ALL_PREFIXES(GetUpdatesProcessorTest, NormalResponseTest); |
| |
| // A map of 'update handlers', one for each enabled type. |
| // This must be kept in sync with the routing info. Our temporary solution to |
| // that problem is to initialize this map in set_routing_info(). |
| const raw_ptr<UpdateHandlerMap> update_handler_map_; |
| |
| // Whether last GetUpdatesResponse has non-zero `changes_remaining`. |
| bool has_more_updates_to_download_ = false; |
| |
| const raw_ref<const GetUpdatesDelegate> delegate_; |
| }; |
| |
| } // namespace syncer |
| |
| #endif // COMPONENTS_SYNC_ENGINE_GET_UPDATES_PROCESSOR_H_ |