// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/login/ownership_status_checker.h"
#include "content/browser/browser_thread.h"
namespace chromeos {
OwnershipStatusChecker::OwnershipStatusChecker(Callback* callback)
: core_(new Core(callback)) {
core_->Check();
}
OwnershipStatusChecker::~OwnershipStatusChecker() {
core_->Cancel();
}
OwnershipStatusChecker::Core::Core(Callback* callback)
: callback_(callback),
origin_loop_(base::MessageLoopProxy::CreateForCurrentThread()) {}
void OwnershipStatusChecker::Core::Check() {
DCHECK(origin_loop_->BelongsToCurrentThread());
OwnershipService::Status status =
OwnershipService::GetSharedInstance()->GetStatus(false);
if (status != OwnershipService::OWNERSHIP_UNKNOWN) {
// Take a spin on the message loop in order to avoid reentrancy in callers.
origin_loop_->PostTask(
FROM_HERE,
NewRunnableMethod(this,
&OwnershipStatusChecker::Core::ReportResult,
status));
} else {
// Switch to the file thread to make the blocking call.
BrowserThread::PostTask(
BrowserThread::FILE, FROM_HERE,
NewRunnableMethod(this,
&OwnershipStatusChecker::Core::CheckOnFileThread));
}
}
void OwnershipStatusChecker::Core::Cancel() {
DCHECK(origin_loop_->BelongsToCurrentThread());
callback_.reset();
}
void OwnershipStatusChecker::Core::CheckOnFileThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
OwnershipService::Status status =
OwnershipService::GetSharedInstance()->GetStatus(true);
origin_loop_->PostTask(
FROM_HERE,
NewRunnableMethod(this,
&OwnershipStatusChecker::Core::ReportResult,
status));
}
void OwnershipStatusChecker::Core::ReportResult(
OwnershipService::Status status) {
DCHECK(origin_loop_->BelongsToCurrentThread());
if (callback_.get()) {
callback_->Run(status);
callback_.reset();
}
}
} // namespace chromeos