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