15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_SYNC_PROCESSOR_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_SYNC_PROCESSOR_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/value_store/value_store_change.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncChangeProcessor;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A wrapper for a SyncChangeProcessor that deals specifically with the syncing
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of a single extension's settings. Handles:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  - translating SettingChanges into calls into the Sync API.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  - deciding whether to ADD/REMOVE/SET depending on the current state of
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    settings.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  - rate limiting (inherently per-extension, which is what we want).
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SettingsSyncProcessor {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettingsSyncProcessor(const std::string& extension_id,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        syncer::ModelType type,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        syncer::SyncChangeProcessor* sync_processor);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SettingsSyncProcessor();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializes this with the initial state of sync.
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Init(const base::DictionaryValue& initial_state);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends |changes| to sync.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncError SendChanges(const ValueStoreChangeList& changes);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Informs this that |changes| have been receieved from sync. No action will
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be taken, but this must be notified for internal bookkeeping.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyChanges(const ValueStoreChangeList& changes);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelType type() { return type_; }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ID of the extension the changes are for.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string extension_id_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sync model type. Either EXTENSION_SETTING or APP_SETTING.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const syncer::ModelType type_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The sync processor used to send changes to sync.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncChangeProcessor* const sync_processor_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether Init() has been called.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool initialized_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keys of the settings that are currently being synced. Used to decide what
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kind of action (ADD, UPDATE, REMOVE) to send to sync.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> synced_keys_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SettingsSyncProcessor);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_STORAGE_SETTINGS_SYNC_PROCESSOR_H_
68