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 "chrome/browser/password_manager/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 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 if (password_store_->ScheduleTask( 34 base::Bind(&PasswordModelWorker::CallDoWorkAndSignalTask, 35 this, work, work_done_or_stopped(), &error))) { 36 work_done_or_stopped()->Wait(); 37 } else { 38 error = syncer::CANNOT_DO_WORK; 39 } 40 return error; 41 } 42 43 syncer::ModelSafeGroup PasswordModelWorker::GetModelSafeGroup() { 44 return syncer::GROUP_PASSWORD; 45 } 46 47 PasswordModelWorker::~PasswordModelWorker() {} 48 49 void PasswordModelWorker::CallDoWorkAndSignalTask( 50 const syncer::WorkCallback& work, 51 WaitableEvent* done, 52 syncer::SyncerError *error) { 53 *error = work.Run(); 54 done->Signal(); 55 } 56 57 void PasswordModelWorker::RegisterForPasswordLoopDestruction() { 58 base::MessageLoop::current()->AddDestructionObserver(this); 59 SetWorkingLoopToCurrent(); 60 } 61 62 } // namespace browser_sync 63