1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_SYNC_GLUE_PREFERENCE_CHANGE_PROCESSOR_H_
6#define CHROME_BROWSER_SYNC_GLUE_PREFERENCE_CHANGE_PROCESSOR_H_
7#pragma once
8
9#include <string>
10
11#include "chrome/browser/prefs/pref_change_registrar.h"
12#include "chrome/browser/prefs/pref_service.h"
13#include "chrome/browser/sync/engine/syncapi.h"
14#include "chrome/browser/sync/glue/change_processor.h"
15#include "chrome/browser/sync/glue/sync_backend_host.h"
16#include "content/common/notification_observer.h"
17
18namespace browser_sync {
19
20class PreferenceModelAssociator;
21class UnrecoverableErrorHandler;
22
23// This class is responsible for taking changes from the PrefService and
24// applying them to the sync_api 'syncable' model, and vice versa. All
25// operations and use of this class are from the UI thread.
26class PreferenceChangeProcessor : public ChangeProcessor,
27                                  public NotificationObserver {
28 public:
29  PreferenceChangeProcessor(PreferenceModelAssociator* model_associator,
30                            UnrecoverableErrorHandler* error_handler);
31  virtual ~PreferenceChangeProcessor();
32
33  // NotificationObserver implementation.
34  // PrefService -> sync_api model change application.
35  virtual void Observe(NotificationType type,
36                       const NotificationSource& source,
37                       const NotificationDetails& details);
38
39  // sync_api model -> PrefService change application.
40  virtual void ApplyChangesFromSyncModel(
41      const sync_api::BaseTransaction* trans,
42      const sync_api::SyncManager::ChangeRecord* changes,
43      int change_count);
44
45 protected:
46  virtual void StartImpl(Profile* profile);
47  virtual void StopImpl();
48
49 private:
50  Value* ReadPreference(sync_api::ReadNode* node, std::string* name);
51
52  void StartObserving();
53  void StopObserving();
54
55  // The model we are processing changes from. Non-NULL when |running_| is true.
56  PrefService* pref_service_;
57
58  // The two models should be associated according to this ModelAssociator.
59  PreferenceModelAssociator* model_associator_;
60
61  // Whether we are currently processing a preference change notification.
62  bool processing_pref_change_;
63
64  PrefChangeRegistrar registrar_;
65
66  DISALLOW_COPY_AND_ASSIGN(PreferenceChangeProcessor);
67};
68
69}  // namespace browser_sync
70
71#endif  // CHROME_BROWSER_SYNC_GLUE_PREFERENCE_CHANGE_PROCESSOR_H_
72