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