Home | History | Annotate | Download | only in login
      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 
      9 namespace chromeos {
     10 
     11 OwnershipStatusChecker::OwnershipStatusChecker(Callback* callback)
     12     : core_(new Core(callback)) {
     13   core_->Check();
     14 }
     15 
     16 OwnershipStatusChecker::~OwnershipStatusChecker() {
     17   core_->Cancel();
     18 }
     19 
     20 OwnershipStatusChecker::Core::Core(Callback* callback)
     21     : callback_(callback),
     22       origin_loop_(base::MessageLoopProxy::CreateForCurrentThread()) {}
     23 
     24 void 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 
     44 void OwnershipStatusChecker::Core::Cancel() {
     45   DCHECK(origin_loop_->BelongsToCurrentThread());
     46   callback_.reset();
     47 }
     48 
     49 void 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 
     60 void 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