// Copyright (c) 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 CHROME_BROWSER_EXTENSIONS_EXTENSION_SYNC_BUNDLE_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_SYNC_BUNDLE_H_ #include <map> #include <set> #include <string> #include <vector> #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "chrome/browser/extensions/extension_sync_data.h" #include "chrome/browser/extensions/sync_bundle.h" #include "sync/api/syncable_service.h" class ExtensionSyncService; class ExtensionSet; namespace syncer { class SyncChangeProcessor; class SyncErrorFactory; } namespace extensions { class Extension; // Bundle of extension specific sync stuff. class ExtensionSyncBundle : public SyncBundle { public: explicit ExtensionSyncBundle(ExtensionSyncService* extension_sync_service); virtual ~ExtensionSyncBundle(); // Setup this bundle to be sync extension data. void SetupSync(syncer::SyncChangeProcessor* sync_processor, syncer::SyncErrorFactory* sync_error_factory, const syncer::SyncDataList& initial_sync_data); // Resets this class back to it default values, which will disable all syncing // until a new sync processor is set. void Reset(); // Returns a syncer::SyncChange that will delete the given extension. syncer::SyncChange CreateSyncChangeToDelete(const Extension* extension) const; // Process the sync deletion of the given extension. void ProcessDeletion( std::string extension_id, const syncer::SyncChange& sync_change); // Create a sync change based on |sync_data|. syncer::SyncChange CreateSyncChange(const syncer::SyncData& sync_data); // Get all the sync data contained in this bundle. syncer::SyncDataList GetAllSyncData() const; // Process the given sync change and apply it. void ProcessSyncChange(ExtensionSyncData extension_sync_data); // Process the list of sync changes. void ProcessSyncChangeList(syncer::SyncChangeList sync_change_list); // Check to see if the given |id| is either synced or pending to be synced. bool HasExtensionId(const std::string& id) const; bool HasPendingExtensionId(const std::string& id) const; // Add a pending extension to be synced. void AddPendingExtension(const std::string& id, const ExtensionSyncData& extension_sync_data); // Returns a vector of all the pending sync data. std::vector<ExtensionSyncData> GetPendingData() const; // Appends sync data objects for every extension in |extensions|. void GetExtensionSyncDataListHelper( const ExtensionSet* extensions, std::vector<extensions::ExtensionSyncData>* sync_data_list) const; // Overrides for SyncBundle. // Returns true if SetupSync has been called, false otherwise. virtual bool IsSyncing() const OVERRIDE; // Sync a newly-installed extension or change an existing one. virtual void SyncChangeIfNeeded(const Extension& extension) OVERRIDE; private: // Add a synced extension. void AddExtension(const std::string& id); // Remove a synced extension. void RemoveExtension(const std::string& id); // Change an extension from being pending to synced. void MarkPendingExtensionSynced(const std::string& id); ExtensionSyncService* extension_sync_service_; // Owns us. scoped_ptr<syncer::SyncChangeProcessor> sync_processor_; scoped_ptr<syncer::SyncErrorFactory> sync_error_factory_; std::set<std::string> synced_extensions_; std::map<std::string, ExtensionSyncData> pending_sync_data_; DISALLOW_COPY_AND_ASSIGN(ExtensionSyncBundle); }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SYNC_BUNDLE_H_