blob: d79c29963c942d4997aaf70e662305b3f2264d55 [file] [log] [blame]
// Copyright 2012 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_SYNC_MODEL_SYNCABLE_SERVICE_H_
#define COMPONENTS_SYNC_MODEL_SYNCABLE_SERVICE_H_
#include <memory>
#include <vector>
#include "base/callback.h"
#include "base/memory/weak_ptr.h"
#include "components/sync/base/model_type.h"
#include "components/sync/model/sync_change.h"
#include "components/sync/model/sync_data.h"
#include "components/sync/model/sync_error.h"
#include "components/sync/model/sync_merge_result.h"
namespace syncer {
class SyncChangeProcessor;
class SyncErrorFactory;
// TODO(zea): remove SupportsWeakPtr in favor of having all SyncableService
// implementers provide a way of getting a weak pointer to themselves.
// See crbug.com/100114.
class SyncableService : public base::SupportsWeakPtr<SyncableService> {
public:
SyncableService() = default;
virtual ~SyncableService() = default;
// A StartSyncFlare is useful when your SyncableService has a need for sync
// to start ASAP. This is typically for one of three reasons:
// 1) Because a local change event has occurred but MergeDataAndStartSyncing
// hasn't been called yet, meaning you don't have a SyncChangeProcessor. The
// sync subsystem will respond soon after invoking Run() on your flare by
// calling MergeDataAndStartSyncing.
// 2) You want remote data to be visible immediately; for example if the
// history page is open, you want remote sessions data to be available there.
// 3) You want to signal to sync that it's safe to start now that the
// browser's IO-intensive startup process is over. The ModelType parameter is
// included so that the recieving end can track usage and timing statistics,
// make pptimizations or tradeoffs by type, etc.
using StartSyncFlare = base::Callback<void(ModelType)>;
// Allows the SyncableService to delay sync events (all below) until the model
// becomes ready to sync. Callers must ensure there is no previous ongoing
// wait (per datatype, if the SyncableService supports multiple).
virtual void WaitUntilReadyToSync(base::OnceClosure done) = 0;
// Informs the service to begin syncing the specified synced datatype |type|.
// The service should then merge |initial_sync_data| into it's local data,
// calling |sync_processor|'s ProcessSyncChanges as necessary to reconcile the
// two. After this, the SyncableService's local data should match the server
// data, and the service should be ready to receive and process any further
// SyncChange's as they occur.
// Returns: a SyncMergeResult whose error field reflects whether an error
// was encountered while merging the two models. The merge result
// may also contain optional merge statistics.
virtual SyncMergeResult MergeDataAndStartSyncing(
ModelType type,
const SyncDataList& initial_sync_data,
std::unique_ptr<SyncChangeProcessor> sync_processor,
std::unique_ptr<SyncErrorFactory> error_handler) = 0;
// Stop syncing the specified type and reset state.
virtual void StopSyncing(ModelType type) = 0;
// SyncChangeProcessor interface.
// Process a list of new SyncChanges and update the local data as necessary.
// Returns: A default SyncError (IsSet() == false) if no errors were
// encountered, and a filled SyncError (IsSet() == true)
// otherwise.
virtual SyncError ProcessSyncChanges(const base::Location& from_here,
const SyncChangeList& change_list) = 0;
// TODO(crbug.com/870624): We don't seem to use this function anywhere, so
// we should simply remove it and simplify all implementations.
virtual SyncDataList GetAllSyncData(ModelType type) const = 0;
private:
DISALLOW_COPY_AND_ASSIGN(SyncableService);
};
} // namespace syncer
#endif // COMPONENTS_SYNC_MODEL_SYNCABLE_SERVICE_H_