1// Copyright (c) 2012 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_MODEL_WORKER_H_
6#define CHROME_BROWSER_SYNC_GLUE_PASSWORD_MODEL_WORKER_H_
7
8#include "sync/internal_api/public/engine/model_safe_worker.h"
9
10#include "base/basictypes.h"
11#include "base/callback_forward.h"
12#include "base/compiler_specific.h"
13#include "base/memory/ref_counted.h"
14
15namespace base {
16class WaitableEvent;
17}
18
19namespace password_manager {
20class PasswordStore;
21}
22
23namespace browser_sync {
24
25// A syncer::ModelSafeWorker for password models that accepts requests
26// from the syncapi that need to be fulfilled on the password thread,
27// which is the DB thread on Linux and Windows.
28class PasswordModelWorker : public syncer::ModelSafeWorker {
29 public:
30  PasswordModelWorker(
31      const scoped_refptr<password_manager::PasswordStore>& password_store,
32      syncer::WorkerLoopDestructionObserver* observer);
33
34  // syncer::ModelSafeWorker implementation. Called on syncapi SyncerThread.
35  virtual void RegisterForLoopDestruction() OVERRIDE;
36  virtual syncer::ModelSafeGroup GetModelSafeGroup() OVERRIDE;
37  virtual void RequestStop() OVERRIDE;
38
39 protected:
40  virtual syncer::SyncerError DoWorkAndWaitUntilDoneImpl(
41      const syncer::WorkCallback& work) OVERRIDE;
42
43 private:
44  virtual ~PasswordModelWorker();
45
46  void CallDoWorkAndSignalTask(
47    const syncer::WorkCallback& work,
48    base::WaitableEvent* done,
49    syncer::SyncerError* error);
50
51  // Called on password thread to add PasswordModelWorker as destruction
52  // observer.
53  void RegisterForPasswordLoopDestruction();
54
55  // |password_store_| is used on password thread but released on UI thread.
56  // Protected by |password_store_lock_|.
57  base::Lock password_store_lock_;
58  scoped_refptr<password_manager::PasswordStore> password_store_;
59  DISALLOW_COPY_AND_ASSIGN(PasswordModelWorker);
60};
61
62}  // namespace browser_sync
63
64#endif  // CHROME_BROWSER_SYNC_GLUE_PASSWORD_MODEL_WORKER_H_
65