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_PASSWORD_CHANGE_PROCESSOR_H_
6#define CHROME_BROWSER_SYNC_GLUE_PASSWORD_CHANGE_PROCESSOR_H_
7#pragma once
8
9#include "chrome/browser/sync/glue/change_processor.h"
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "chrome/browser/sync/glue/password_model_associator.h"
14#include "chrome/browser/sync/glue/sync_backend_host.h"
15#include "content/common/notification_observer.h"
16#include "content/common/notification_registrar.h"
17#include "content/common/notification_type.h"
18
19class PasswordStore;
20class MessageLoop;
21class NotificationService;
22
23namespace browser_sync {
24
25class UnrecoverableErrorHandler;
26
27// This class is responsible for taking changes from the password backend and
28// applying them to the sync_api 'syncable' model, and vice versa. All
29// operations and use of this class are from the DB thread on Windows and Linux,
30// or the password thread on Mac.
31class PasswordChangeProcessor : public ChangeProcessor,
32                                public NotificationObserver {
33 public:
34  PasswordChangeProcessor(PasswordModelAssociator* model_associator,
35                          PasswordStore* password_store,
36                          UnrecoverableErrorHandler* error_handler);
37  virtual ~PasswordChangeProcessor();
38
39  // NotificationObserver implementation.
40  // Passwords -> sync_api model change application.
41  virtual void Observe(NotificationType type,
42                       const NotificationSource& source,
43                       const NotificationDetails& details) OVERRIDE;
44
45  // sync_api model -> WebDataService change application.
46  virtual void ApplyChangesFromSyncModel(
47      const sync_api::BaseTransaction* trans,
48      const sync_api::SyncManager::ChangeRecord* changes,
49      int change_count) OVERRIDE;
50
51  // Commit changes buffered during ApplyChanges. We must commit them to the
52  // password store only after the sync_api transaction is released, else there
53  // is risk of deadlock due to the password store posting tasks to the UI
54  // thread (http://crbug.com/70658).
55  virtual void CommitChangesFromSyncModel() OVERRIDE;
56
57 protected:
58  virtual void StartImpl(Profile* profile) OVERRIDE;
59  virtual void StopImpl() OVERRIDE;
60
61 private:
62  void StartObserving();
63  void StopObserving();
64
65  // The two models should be associated according to this ModelAssociator.
66  PasswordModelAssociator* model_associator_;
67
68  // The model we are processing changes from.  This is owned by the
69  // WebDataService which is kept alive by our data type controller
70  // holding a reference.
71  PasswordStore* password_store_;
72
73  // Buffers used between ApplyChangesFromSyncModel and
74  // CommitChangesFromSyncModel.
75  PasswordModelAssociator::PasswordVector new_passwords_;
76  PasswordModelAssociator::PasswordVector updated_passwords_;
77  PasswordModelAssociator::PasswordVector deleted_passwords_;
78
79  NotificationRegistrar notification_registrar_;
80
81  bool observing_;
82
83  MessageLoop* expected_loop_;
84
85  DISALLOW_COPY_AND_ASSIGN(PasswordChangeProcessor);
86};
87
88}  // namespace browser_sync
89
90#endif  // CHROME_BROWSER_SYNC_GLUE_PASSWORD_CHANGE_PROCESSOR_H_
91