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