158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "remoting/host/setup/daemon_controller.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/bind.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/location.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/single_thread_task_runner.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/thread_task_runner_handle.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/values.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "remoting/base/auto_thread.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "remoting/base/auto_thread_task_runner.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace remoting {
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Name of the Daemon Controller's worker thread.
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kDaemonControllerThreadName[] = "Daemon Controller thread";
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DaemonController::DaemonController(scoped_ptr<Delegate> delegate)
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : caller_task_runner_(base::ThreadTaskRunnerHandle::Get()),
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      delegate_(delegate.Pass()) {
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Launch the delegate thread.
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_thread_.reset(new AutoThread(kDaemonControllerThreadName));
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_thread_->SetComInitType(AutoThread::COM_INIT_STA);
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_task_runner_ =
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      delegate_thread_->StartWithType(base::MessageLoop::TYPE_UI);
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_task_runner_ =
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      delegate_thread_->StartWithType(base::MessageLoop::TYPE_DEFAULT);
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DaemonController::State DaemonController::GetState() {
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return delegate_->GetState();
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::GetConfig(const GetConfigCallback& done) {
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DaemonController::GetConfigCallback wrapped_done = base::Bind(
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::InvokeConfigCallbackAndScheduleNext, this, done);
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure request = base::Bind(
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::DoGetConfig, this, wrapped_done);
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ServiceOrQueueRequest(request);
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DaemonController::InstallHost(const CompletionCallback& done) {
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(caller_task_runner_->BelongsToCurrentThread());
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DaemonController::CompletionCallback wrapped_done = base::Bind(
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      &DaemonController::InvokeCompletionCallbackAndScheduleNext, this, done);
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::Closure request = base::Bind(
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      &DaemonController::DoInstallHost, this, wrapped_done);
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ServiceOrQueueRequest(request);
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::SetConfigAndStart(
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> config,
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool consent,
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const CompletionCallback& done) {
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DaemonController::CompletionCallback wrapped_done = base::Bind(
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::InvokeCompletionCallbackAndScheduleNext, this, done);
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure request = base::Bind(
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::DoSetConfigAndStart, this, base::Passed(&config),
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      consent, wrapped_done);
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ServiceOrQueueRequest(request);
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::UpdateConfig(scoped_ptr<base::DictionaryValue> config,
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                    const CompletionCallback& done) {
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DaemonController::CompletionCallback wrapped_done = base::Bind(
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::InvokeCompletionCallbackAndScheduleNext, this, done);
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure request = base::Bind(
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::DoUpdateConfig, this, base::Passed(&config),
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      wrapped_done);
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ServiceOrQueueRequest(request);
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::Stop(const CompletionCallback& done) {
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DaemonController::CompletionCallback wrapped_done = base::Bind(
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::InvokeCompletionCallbackAndScheduleNext, this, done);
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure request = base::Bind(
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::DoStop, this, wrapped_done);
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ServiceOrQueueRequest(request);
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::SetWindow(void* window_handle) {
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure done = base::Bind(&DaemonController::ScheduleNext, this);
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure request = base::Bind(
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::DoSetWindow, this, window_handle, done);
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ServiceOrQueueRequest(request);
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::GetVersion(const GetVersionCallback& done) {
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DaemonController::GetVersionCallback wrapped_done = base::Bind(
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::InvokeVersionCallbackAndScheduleNext, this, done);
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure request = base::Bind(
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::DoGetVersion, this, wrapped_done);
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ServiceOrQueueRequest(request);
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::GetUsageStatsConsent(
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GetUsageStatsConsentCallback& done) {
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DaemonController::GetUsageStatsConsentCallback wrapped_done = base::Bind(
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::InvokeConsentCallbackAndScheduleNext, this, done);
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure request = base::Bind(
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      &DaemonController::DoGetUsageStatsConsent, this, wrapped_done);
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ServiceOrQueueRequest(request);
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DaemonController::~DaemonController() {
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Make sure |delegate_| is deleted on the background thread.
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_task_runner_->DeleteSoon(FROM_HERE, delegate_.release());
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Stop the thread.
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_task_runner_ = NULL;
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  caller_task_runner_->DeleteSoon(FROM_HERE, delegate_thread_.release());
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::DoGetConfig(const GetConfigCallback& done) {
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(delegate_task_runner_->BelongsToCurrentThread());
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> config = delegate_->GetConfig();
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  caller_task_runner_->PostTask(FROM_HERE,
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                base::Bind(done, base::Passed(&config)));
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DaemonController::DoInstallHost(const CompletionCallback& done) {
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(delegate_task_runner_->BelongsToCurrentThread());
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  delegate_->InstallHost(done);
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::DoSetConfigAndStart(
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> config,
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool consent,
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const CompletionCallback& done) {
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(delegate_task_runner_->BelongsToCurrentThread());
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_->SetConfigAndStart(config.Pass(), consent, done);
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::DoUpdateConfig(
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> config,
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const CompletionCallback& done) {
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(delegate_task_runner_->BelongsToCurrentThread());
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_->UpdateConfig(config.Pass(), done);
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::DoStop(const CompletionCallback& done) {
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(delegate_task_runner_->BelongsToCurrentThread());
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_->Stop(done);
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::DoSetWindow(void* window_handle,
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   const base::Closure& done) {
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(delegate_task_runner_->BelongsToCurrentThread());
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_->SetWindow(window_handle);
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  caller_task_runner_->PostTask(FROM_HERE, done);
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::DoGetVersion(const GetVersionCallback& done) {
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(delegate_task_runner_->BelongsToCurrentThread());
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string version = delegate_->GetVersion();
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  caller_task_runner_->PostTask(FROM_HERE, base::Bind(done, version));
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::DoGetUsageStatsConsent(
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GetUsageStatsConsentCallback& done) {
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(delegate_task_runner_->BelongsToCurrentThread());
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DaemonController::UsageStatsConsent consent =
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      delegate_->GetUsageStatsConsent();
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  caller_task_runner_->PostTask(FROM_HERE, base::Bind(done, consent));
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::InvokeCompletionCallbackAndScheduleNext(
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const CompletionCallback& done,
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AsyncResult result) {
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!caller_task_runner_->BelongsToCurrentThread()) {
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    caller_task_runner_->PostTask(
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&DaemonController::InvokeCompletionCallbackAndScheduleNext,
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   this, done, result));
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  done.Run(result);
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScheduleNext();
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::InvokeConfigCallbackAndScheduleNext(
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GetConfigCallback& done,
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> config) {
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  done.Run(config.Pass());
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScheduleNext();
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::InvokeConsentCallbackAndScheduleNext(
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GetUsageStatsConsentCallback& done,
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const UsageStatsConsent& consent) {
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  done.Run(consent);
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScheduleNext();
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::InvokeVersionCallbackAndScheduleNext(
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const GetVersionCallback& done,
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& version) {
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  done.Run(version);
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScheduleNext();
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::ScheduleNext() {
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(caller_task_runner_->BelongsToCurrentThread());
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pending_requests_.pop();
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ServiceNextRequest();
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::ServiceOrQueueRequest(const base::Closure& request) {
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool servicing_request = !pending_requests_.empty();
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  pending_requests_.push(request);
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!servicing_request)
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ServiceNextRequest();
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DaemonController::ServiceNextRequest() {
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!pending_requests_.empty())
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    delegate_task_runner_->PostTask(FROM_HERE, pending_requests_.front());
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace remoting
258