Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync / glue / password_model_worker.cc
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 #include "chrome/browser/sync/glue/password_model_worker.h"
6
7 #include "base/bind.h"
8 #include "base/memory/ref_counted.h"
9 #include "base/synchronization/waitable_event.h"
10 #include "components/password_manager/core/browser/password_store.h"
11
12 using base::WaitableEvent;
13
14 namespace browser_sync {
15
16 PasswordModelWorker::PasswordModelWorker(
17     const scoped_refptr<PasswordStore>& password_store,
18     syncer::WorkerLoopDestructionObserver* observer)
19   : syncer::ModelSafeWorker(observer),
20     password_store_(password_store) {
21   DCHECK(password_store.get());
22 }
23
24 void PasswordModelWorker::RegisterForLoopDestruction() {
25   base::AutoLock lock(password_store_lock_);
26   password_store_->ScheduleTask(
27       base::Bind(&PasswordModelWorker::RegisterForPasswordLoopDestruction,
28                  this));
29 }
30
31 syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl(
32     const syncer::WorkCallback& work) {
33   syncer::SyncerError error = syncer::UNSET;
34
35   bool scheduled = false;
36   {
37     base::AutoLock lock(password_store_lock_);
38     if (!password_store_.get())
39       return syncer::CANNOT_DO_WORK;
40
41     scheduled = password_store_->ScheduleTask(
42         base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask,
43                    this, work, work_done_or_stopped(), &error));
44   }
45
46   if (scheduled)
47     work_done_or_stopped()->Wait();
48   else
49     error = syncer::CANNOT_DO_WORK;
50   return error;
51 }
52
53 syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() {
54   return syncer::GROUP_PASSWORD;
55 }
56
57 PasswordModelWorker::~PasswordModelWorker() {}
58
59 void PasswordModelWorker::CallDoWorkAndSignalTask(
60     const syncer::WorkCallback& work,
61     WaitableEvent* done,
62     syncer::SyncerError *error) {
63   *error = work.Run();
64   done->Signal();
65 }
66
67 void PasswordModelWorker::RegisterForPasswordLoopDestruction() {
68   base::MessageLoop::current()->AddDestructionObserver(this);
69   SetWorkingLoopToCurrent();
70 }
71
72 void PasswordModelWorker::RequestStop() {
73   ModelSafeWorker::RequestStop();
74
75   base::AutoLock lock(password_store_lock_);
76   password_store_ = NULL;
77 }
78
79 }  // namespace browser_sync