15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/password_model_worker.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/password_manager/core/browser/password_store.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::WaitableEvent;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PasswordModelWorker::PasswordModelWorker(
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const scoped_refptr<password_manager::PasswordStore>& password_store,
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    syncer::WorkerLoopDestructionObserver* observer)
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : syncer::ModelSafeWorker(observer), password_store_(password_store) {
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DCHECK(password_store.get());
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PasswordModelWorker::RegisterForLoopDestruction() {
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::AutoLock lock(password_store_lock_);
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  password_store_->ScheduleTask(
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&PasswordModelWorker::RegisterForPasswordLoopDestruction,
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 this));
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const syncer::WorkCallback& work) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::SyncerError error = syncer::UNSET;
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool scheduled = false;
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::AutoLock lock(password_store_lock_);
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (!password_store_.get())
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return syncer::CANNOT_DO_WORK;
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    scheduled = password_store_->ScheduleTask(
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask,
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   this, work, work_done_or_stopped(), &error));
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (scheduled)
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    work_done_or_stopped()->Wait();
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  else
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error = syncer::CANNOT_DO_WORK;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::GROUP_PASSWORD;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PasswordModelWorker::~PasswordModelWorker() {}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PasswordModelWorker::CallDoWorkAndSignalTask(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const syncer::WorkCallback& work,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WaitableEvent* done,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncerError *error) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *error = work.Run();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done->Signal();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PasswordModelWorker::RegisterForPasswordLoopDestruction() {
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SetWorkingLoopToCurrent();
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PasswordModelWorker::RequestStop() {
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ModelSafeWorker::RequestStop();
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::AutoLock lock(password_store_lock_);
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  password_store_ = NULL;
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace browser_sync
78