// 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 #include #include #include #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 StoreFactoryFunction; DeviceInfoService( sync_driver::LocalDeviceInfoProvider* local_device_info_provider, const StoreFactoryFunction& callback); ~DeviceInfoService() override; // ModelTypeService implementation. scoped_ptr CreateMetadataChangeList() override; syncer::SyncError MergeSyncData( scoped_ptr metadata_change_list, syncer_v2::EntityDataMap entity_data_map) override; syncer::SyncError ApplySyncChanges( scoped_ptr 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 GetDeviceInfo( const std::string& client_id) const override; ScopedVector GetAllDeviceInfo() const override; void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override; private: friend class DeviceInfoServiceTest; scoped_ptr CreateLocalSpecifics(); static scoped_ptr CreateSpecifics( const sync_driver::DeviceInfo& info); // Allocate new DeviceInfo from SyncData. static scoped_ptr CreateDeviceInfo( const sync_pb::DeviceInfoSpecifics& specifics); // Conversion as we prepare to hand data to the processor. static scoped_ptr CopyIntoNewEntityData( const sync_pb::DeviceInfoSpecifics& specifics); // Store SyncData in the cache and durable storage. void StoreSpecifics(scoped_ptr 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 store); void OnReadAllData( syncer_v2::ModelTypeStore::Result result, scoped_ptr record_list); void OnReadAllMetadata( syncer_v2::ModelTypeStore::Result result, scoped_ptr 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>; ClientIdToSpecifics all_data_; // Registered observers, not owned. base::ObserverList observers_; // Used to listen for provider initialization. If the provider is already // initialized during our constructor then the subscription is never used. scoped_ptr subscription_; // In charge of actually persiting changes to disk, or loading previous data. scoped_ptr 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 weak_factory_; DISALLOW_COPY_AND_ASSIGN(DeviceInfoService); }; } // namespace sync_driver_v2 #endif // COMPONENTS_SYNC_DRIVER_DEVICE_INFO_SERVICE_H_