Home | History | Annotate | Download | only in glue
      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<password_manager::PasswordStore>& password_store,
     18     syncer::WorkerLoopDestructionObserver* observer)
     19     : syncer::ModelSafeWorker(observer), password_store_(password_store) {
     20   DCHECK(password_store.get());
     21 }
     22 
     23 void PasswordModelWorker::RegisterForLoopDestruction() {
     24   base::AutoLock lock(password_store_lock_);
     25   password_store_->ScheduleTask(
     26       base::Bind(&PasswordModelWorker::RegisterForPasswordLoopDestruction,
     27                  this));
     28 }
     29 
     30 syncer::SyncerError PasswordModelWorker::DoWorkAndWaitUntilDoneImpl(
     31     const syncer::WorkCallback& work) {
     32   syncer::SyncerError error = syncer::UNSET;
     33 
     34   bool scheduled = false;
     35   {
     36     base::AutoLock lock(password_store_lock_);
     37     if (!password_store_.get())
     38       return syncer::CANNOT_DO_WORK;
     39 
     40     scheduled = password_store_->ScheduleTask(
     41         base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask,
     42                    this, work, work_done_or_stopped(), &error));
     43   }
     44 
     45   if (scheduled)
     46     work_done_or_stopped()->Wait();
     47   else
     48     error = syncer::CANNOT_DO_WORK;
     49   return error;
     50 }
     51 
     52 syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() {
     53   return syncer::GROUP_PASSWORD;
     54 }
     55 
     56 PasswordModelWorker::~PasswordModelWorker() {}
     57 
     58 void PasswordModelWorker::CallDoWorkAndSignalTask(
     59     const syncer::WorkCallback& work,
     60     WaitableEvent* done,
     61     syncer::SyncerError *error) {
     62   *error = work.Run();
     63   done->Signal();
     64 }
     65 
     66 void PasswordModelWorker::RegisterForPasswordLoopDestruction() {
     67   base::MessageLoop::current()->AddDestructionObserver(this);
     68   SetWorkingLoopToCurrent();
     69 }
     70 
     71 void PasswordModelWorker::RequestStop() {
     72   ModelSafeWorker::RequestStop();
     73 
     74   base::AutoLock lock(password_store_lock_);
     75   password_store_ = NULL;
     76 }
     77 
     78 }  // namespace browser_sync
     79