Upstream version 10.38.222.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / system_info / system_info_provider.cc
1 // Copyright 2013 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/extensions/api/system_info/system_info_provider.h"
6
7 #include "base/bind.h"
8 #include "content/public/browser/browser_thread.h"
9
10 namespace extensions {
11
12 SystemInfoProvider::SystemInfoProvider()
13     : is_waiting_for_completion_(false) {
14   base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
15   worker_pool_ = pool->GetSequencedTaskRunnerWithShutdownBehavior(
16       pool->GetSequenceToken(),
17       base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
18 }
19
20 SystemInfoProvider::~SystemInfoProvider() {}
21
22 void SystemInfoProvider::PrepareQueryOnUIThread() {}
23
24 void SystemInfoProvider::InitializeProvider(const base::Closure&
25     do_query_info_callback) {
26   do_query_info_callback.Run();
27 }
28
29 void SystemInfoProvider::StartQueryInfo(
30     const QueryInfoCompletionCallback& callback) {
31   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
32   DCHECK(!callback.is_null());
33
34   callbacks_.push(callback);
35
36   if (is_waiting_for_completion_)
37     return;
38
39   is_waiting_for_completion_ = true;
40
41   InitializeProvider(base::Bind(
42       &SystemInfoProvider::StartQueryInfoPostInitialization, this));
43 }
44
45 void SystemInfoProvider::OnQueryCompleted(bool success) {
46   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
47
48   while (!callbacks_.empty()) {
49     QueryInfoCompletionCallback callback = callbacks_.front();
50     callback.Run(success);
51     callbacks_.pop();
52   }
53
54   is_waiting_for_completion_ = false;
55 }
56
57 void SystemInfoProvider::StartQueryInfoPostInitialization() {
58   PrepareQueryOnUIThread();
59   // Post the custom query info task to blocking pool for information querying
60   // and reply with OnQueryCompleted.
61   base::PostTaskAndReplyWithResult(
62       worker_pool_,
63       FROM_HERE,
64       base::Bind(&SystemInfoProvider::QueryInfo, this),
65       base::Bind(&SystemInfoProvider::OnQueryCompleted, this));
66 }
67
68 }  // namespace extensions