blob: 4ffc466802542029090ee4959a9219801efa4e6a [file] [log] [blame]
// Copyright 2015 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_DRIVER_DEVICE_INFO_SERVICE_H_
#define COMPONENTS_SYNC_DRIVER_DEVICE_INFO_SERVICE_H_
#include <stdint.h>
#include <map>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "components/sync_driver/device_info_tracker.h"
#include "components/sync_driver/local_device_info_provider.h"
#include "sync/api/model_type_service.h"
#include "sync/api/model_type_store.h"
#include "sync/internal_api/public/simple_metadata_change_list.h"
namespace syncer {
class SyncError;
} // namespace syncer
namespace syncer_v2 {
class ModelTypeChangeProcessor;
} // namespace syncer_v2
namespace sync_pb {
class DeviceInfoSpecifics;
} // namespace sync_pb
namespace sync_driver_v2 {
// USS service implementation for DEVICE_INFO model type. Handles storage of
// device info and associated sync metadata, applying/merging foreign changes,
// and allows public read access.
class DeviceInfoService : public syncer_v2::ModelTypeService,
public sync_driver::DeviceInfoTracker {
public:
typedef base::Callback<void(syncer_v2::ModelTypeStore::InitCallback callback)>
StoreFactoryFunction;
DeviceInfoService(
sync_driver::LocalDeviceInfoProvider* local_device_info_provider,
const StoreFactoryFunction& callback);
~DeviceInfoService() override;
// ModelTypeService implementation.
scoped_ptr<syncer_v2::MetadataChangeList> CreateMetadataChangeList() override;
syncer::SyncError MergeSyncData(
scoped_ptr<syncer_v2::MetadataChangeList> metadata_change_list,
syncer_v2::EntityDataMap entity_data_map) override;
syncer::SyncError ApplySyncChanges(
scoped_ptr<syncer_v2::MetadataChangeList> metadata_change_list,
syncer_v2::EntityChangeList entity_changes) override;
void GetData(ClientTagList client_tags, DataCallback callback) override;
void GetAllData(DataCallback callback) override;
std::string GetClientTag(const syncer_v2::EntityData& entity_data) override;
void OnChangeProcessorSet() override;
// DeviceInfoTracker implementation.
bool IsSyncing() const override;
scoped_ptr<sync_driver::DeviceInfo> GetDeviceInfo(
const std::string& client_id) const override;
ScopedVector<sync_driver::DeviceInfo> GetAllDeviceInfo() const override;
void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override;
int CountActiveDevices() const override;
private:
friend class DeviceInfoServiceTest;
scoped_ptr<sync_pb::DeviceInfoSpecifics> CreateLocalSpecifics();
static scoped_ptr<sync_pb::DeviceInfoSpecifics> CreateSpecifics(
const sync_driver::DeviceInfo& info);
// Allocate new DeviceInfo from SyncData.
static scoped_ptr<sync_driver::DeviceInfo> CreateDeviceInfo(
const sync_pb::DeviceInfoSpecifics& specifics);
// Conversion as we prepare to hand data to the processor.
static scoped_ptr<syncer_v2::EntityData> CopyIntoNewEntityData(
const sync_pb::DeviceInfoSpecifics& specifics);
// Store SyncData in the cache and durable storage.
void StoreSpecifics(scoped_ptr<sync_pb::DeviceInfoSpecifics> specifics,
syncer_v2::ModelTypeStore::WriteBatch* batch);
// Delete SyncData from the cache and durable storage, returns true if there
// was actually anything at the given tag.
bool DeleteSpecifics(const std::string& tag,
syncer_v2::ModelTypeStore::WriteBatch* batch);
// Notify all registered observers.
void NotifyObservers();
// Used as callback given to LocalDeviceInfoProvider.
void OnProviderInitialized();
// Methods used as callbacks given to DataTypeStore.
void OnStoreCreated(syncer_v2::ModelTypeStore::Result result,
scoped_ptr<syncer_v2::ModelTypeStore> store);
void OnReadAllData(
syncer_v2::ModelTypeStore::Result result,
scoped_ptr<syncer_v2::ModelTypeStore::RecordList> record_list);
void OnReadAllMetadata(
syncer_v2::ModelTypeStore::Result result,
scoped_ptr<syncer_v2::ModelTypeStore::RecordList> metadata_records,
const std::string& global_metadata);
void OnCommit(syncer_v2::ModelTypeStore::Result result);
// Checks if conditions have been met to perform reconciliation between the
// locally provide device info and the stored device info data. If conditions
// are met and the sets of data differ, than we condier this a local change
// and we send it to the processor.
void TryReconcileLocalAndStored();
// Checks if conditions have been met to load and report metadata to our
// current processor if able.
void TryLoadAllMetadata();
// |local_device_info_provider_| isn't owned.
const sync_driver::LocalDeviceInfoProvider* const local_device_info_provider_;
// Cache of all syncable and local data, stored by device cache guid.
using ClientIdToSpecifics =
std::map<std::string, scoped_ptr<sync_pb::DeviceInfoSpecifics>>;
ClientIdToSpecifics all_data_;
// Registered observers, not owned.
base::ObserverList<Observer, true> observers_;
// Used to listen for provider initialization. If the provider is already
// initialized during our constructor then the subscription is never used.
scoped_ptr<sync_driver::LocalDeviceInfoProvider::Subscription> subscription_;
// In charge of actually persiting changes to disk, or loading previous data.
scoped_ptr<syncer_v2::ModelTypeStore> store_;
// If |store_| has invoked |LoadAllDataCallback|.
bool has_data_loaded_ = false;
// If |local_device_info_provider_| has initialized.
bool has_provider_initialized_ = false;
// Should always be last member.
base::WeakPtrFactory<DeviceInfoService> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(DeviceInfoService);
};
} // namespace sync_driver_v2
#endif // COMPONENTS_SYNC_DRIVER_DEVICE_INFO_SERVICE_H_