1// Copyright (c) 2011 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/chromeos/login/ownership_status_checker.h" 6 7#include "content/browser/browser_thread.h" 8 9namespace chromeos { 10 11OwnershipStatusChecker::OwnershipStatusChecker(Callback* callback) 12 : core_(new Core(callback)) { 13 core_->Check(); 14} 15 16OwnershipStatusChecker::~OwnershipStatusChecker() { 17 core_->Cancel(); 18} 19 20OwnershipStatusChecker::Core::Core(Callback* callback) 21 : callback_(callback), 22 origin_loop_(base::MessageLoopProxy::CreateForCurrentThread()) {} 23 24void OwnershipStatusChecker::Core::Check() { 25 DCHECK(origin_loop_->BelongsToCurrentThread()); 26 OwnershipService::Status status = 27 OwnershipService::GetSharedInstance()->GetStatus(false); 28 if (status != OwnershipService::OWNERSHIP_UNKNOWN) { 29 // Take a spin on the message loop in order to avoid reentrancy in callers. 30 origin_loop_->PostTask( 31 FROM_HERE, 32 NewRunnableMethod(this, 33 &OwnershipStatusChecker::Core::ReportResult, 34 status)); 35 } else { 36 // Switch to the file thread to make the blocking call. 37 BrowserThread::PostTask( 38 BrowserThread::FILE, FROM_HERE, 39 NewRunnableMethod(this, 40 &OwnershipStatusChecker::Core::CheckOnFileThread)); 41 } 42} 43 44void OwnershipStatusChecker::Core::Cancel() { 45 DCHECK(origin_loop_->BelongsToCurrentThread()); 46 callback_.reset(); 47} 48 49void OwnershipStatusChecker::Core::CheckOnFileThread() { 50 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 51 OwnershipService::Status status = 52 OwnershipService::GetSharedInstance()->GetStatus(true); 53 origin_loop_->PostTask( 54 FROM_HERE, 55 NewRunnableMethod(this, 56 &OwnershipStatusChecker::Core::ReportResult, 57 status)); 58} 59 60void OwnershipStatusChecker::Core::ReportResult( 61 OwnershipService::Status status) { 62 DCHECK(origin_loop_->BelongsToCurrentThread()); 63 if (callback_.get()) { 64 callback_->Run(status); 65 callback_.reset(); 66 } 67} 68 69} // namespace chromeos 70