15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_HOST_SETUP_DAEMON_CONTROLLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_HOST_SETUP_DAEMON_CONTROLLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <queue> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/callback.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class SingleThreadTaskRunner; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class AutoThread; 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class AutoThreadTaskRunner; 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class DaemonController : public base::RefCountedThreadSafe<DaemonController> { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Note that these enumeration values are duplicated in host_controller.js and 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must be kept in sync. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum State { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Placeholder state for platforms on which the daemon process is not 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implemented. The web-app will not show the corresponding UI. This value 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will eventually be deprecated or removed. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_NOT_IMPLEMENTED = -1, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The daemon is not installed. This is functionally equivalent to 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // STATE_STOPPED, but the start method is expected to be significantly 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // slower, and might involve user interaction. It might be appropriate to 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicate this in the UI. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_NOT_INSTALLED = 0, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The daemon is being installed. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_INSTALLING = 1, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The daemon is installed but not running. Call Start to start it. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_STOPPED = 2, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The daemon process is starting. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_STARTING = 3, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The daemon process is running. Call Start again to change the PIN or 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop to stop it. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_STARTED = 4, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The daemon process is stopping. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_STOPPING = 5, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The state cannot be determined. This could indicate that the plugin 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has not been provided with sufficient information, for example, the 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user for which to query state on a multi-user system. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_UNKNOWN = 6 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enum used for completion callback. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum AsyncResult { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESULT_OK = 0, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The operation has FAILED. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESULT_FAILED = 1, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User has cancelled the action (e.g. rejected UAC prompt). 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sergeyu): Current implementations don't return this value. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESULT_CANCELLED = 2, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Failed to access host directory. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RESULT_FAILED_DIRECTORY = 3 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sergeyu): Add more error codes when we know how to handle 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // them in the webapp. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback type for GetConfig(). If the host is configured then a dictionary 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is returned containing host_id and xmpp_login, with security-sensitive 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fields filtered out. An empty dictionary is returned if the host is not 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // configured, and NULL if the configuration is corrupt or cannot be read. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void (scoped_ptr<base::DictionaryValue> config)> 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetConfigCallback; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback used for asynchronous operations, e.g. when 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starting/stopping the service. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void (AsyncResult result)> CompletionCallback; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback type for GetVersion(). 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void (const std::string&)> GetVersionCallback; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) struct UsageStatsConsent { 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Indicates whether crash dump reporting is supported by the host. 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool supported; 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Indicates if crash dump reporting is allowed by the user. 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool allowed; 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Carries information whether the crash dump reporting is controlled by 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // policy. 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool set_by_policy; 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Callback type for GetUsageStatsConsent(). 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) typedef base::Callback<void (const UsageStatsConsent&)> 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GetUsageStatsConsentCallback; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Interface representing the platform-spacific back-end. Most of its methods 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // are blocking and should be called on a background thread. There are two 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // exceptions: 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // - GetState() is synchronous and called on the UI thread. It should avoid 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // accessing any data members of the implementation. 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // - SetConfigAndStart(), UpdateConfig() and Stop() indicate completion via 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // a callback. There methods can be long running and should be caled 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // on a background thread. 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) class Delegate { 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~Delegate() {} 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Return the "installed/running" state of the daemon process. This method 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // should avoid accessing any data members of the implementation. 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual State GetState() = 0; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Queries current host configuration. Any values that might be security 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // sensitive have been filtered out. 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual scoped_ptr<base::DictionaryValue> GetConfig() = 0; 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Download and install the host component. |done| is invoked on the 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // calling thread when the operation is completed. 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void InstallHost(const CompletionCallback& done) = 0; 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Starts the daemon process. This may require that the daemon be 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // downloaded and installed. |done| is invoked on the calling thread when 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the operation is completed. 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetConfigAndStart( 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<base::DictionaryValue> config, 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool consent, 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& done) = 0; 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Updates current host configuration with the values specified in 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |config|. Any value in the existing configuration that isn't specified in 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |config| is preserved. |config| must not contain host_id or xmpp_login 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // values, because implementations of this method cannot change them. |done| 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // is invoked on the calling thread when the operation is completed. 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void UpdateConfig( 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<base::DictionaryValue> config, 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& done) = 0; 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Stops the daemon process. |done| is invoked on the calling thread when 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the operation is completed. 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void Stop(const CompletionCallback& done) = 0; 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Caches the native handle of the plugin window so it can be used to focus 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // elevation prompts properly. 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetWindow(void* window_handle) = 0; 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Get the version of the daemon as a dotted decimal string of the form 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // major.minor.build.patch, if it is installed, or "" otherwise. 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual std::string GetVersion() = 0; 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Get the user's consent to crash reporting. 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual UsageStatsConsent GetUsageStatsConsent() = 0; 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static scoped_refptr<DaemonController> Create(); 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit DaemonController(scoped_ptr<Delegate> delegate); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the "installed/running" state of the daemon process. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sergeyu): This method is called synchronously from the 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // webapp. In most cases it requires IO operations, so it may block 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the user interface. Replace it with asynchronous notifications, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // e.g. with StartStateNotifications()/StopStateNotifications() methods. 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) State GetState(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Queries current host configuration. The |done| is called 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after the configuration is read, and any values that might be security 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sensitive have been filtered out. 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void GetConfig(const GetConfigCallback& done); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Download and install the host component. |done| is called when the 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // operation is finished or fails. 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void InstallHost(const CompletionCallback& done); 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start the daemon process. This may require that the daemon be 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // downloaded and installed. |done| is called when the 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // operation is finished or fails. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sergeyu): This method writes config and starts the host - 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these two steps are merged for simplicity. Consider splitting it 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into SetConfig() and Start() once we have basic host setup flow 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // working. 19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void SetConfigAndStart(scoped_ptr<base::DictionaryValue> config, 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool consent, 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& done); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates current host configuration with the values specified in 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |config|. Changes must take effect before the call completes. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Any value in the existing configuration that isn't specified in |config| 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is preserved. |config| must not contain host_id or xmpp_login values, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because implementations of this method cannot change them. 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void UpdateConfig(scoped_ptr<base::DictionaryValue> config, 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& done); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the daemon process. It is permitted to call Stop while the daemon 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process is being installed, in which case the installation should be 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aborted if possible; if not then it is sufficient to ensure that the 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // daemon process is not started automatically upon successful installation. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As with Start, Stop may return before the operation is complete--poll 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetState until the state is STATE_STOPPED. 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void Stop(const CompletionCallback& done); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Caches the native handle of the plugin window so it can be used to focus 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // elevation prompts properly. 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void SetWindow(void* window_handle); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the version of the daemon as a dotted decimal string of the form 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // major.minor.build.patch, if it is installed, or "" otherwise. 21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void GetVersion(const GetVersionCallback& done); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the user's consent to crash reporting. 21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void GetUsageStatsConsent(const GetUsageStatsConsentCallback& done); 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) friend class base::RefCountedThreadSafe<DaemonController>; 22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~DaemonController(); 22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Blocking helper methods used to call the delegate. 22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoGetConfig(const GetConfigCallback& done); 227a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void DoInstallHost(const CompletionCallback& done); 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoSetConfigAndStart(scoped_ptr<base::DictionaryValue> config, 22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool consent, 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& done); 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoUpdateConfig(scoped_ptr<base::DictionaryValue> config, 23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& done); 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoStop(const CompletionCallback& done); 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoSetWindow(void* window_handle, const base::Closure& done); 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoGetVersion(const GetVersionCallback& done); 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DoGetUsageStatsConsent(const GetUsageStatsConsentCallback& done); 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // "Trampoline" callbacks that schedule the next pending request and then 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // invoke the original caller-supplied callback. 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void InvokeCompletionCallbackAndScheduleNext( 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& done, 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AsyncResult result); 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void InvokeConfigCallbackAndScheduleNext( 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GetConfigCallback& done, 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<base::DictionaryValue> config); 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void InvokeConsentCallbackAndScheduleNext( 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GetUsageStatsConsentCallback& done, 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const UsageStatsConsent& consent); 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void InvokeVersionCallbackAndScheduleNext( 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GetVersionCallback& done, 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& version); 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Queue management methods. 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ScheduleNext(); 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ServiceOrQueueRequest(const base::Closure& request); 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ServiceNextRequest(); 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Task runner on which all public methods of this class should be called. 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Task runner used to run blocking calls to the delegate. A single thread 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // task runner is used to guarantee that one method of the delegate is 26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // called at a time. 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<AutoThreadTaskRunner> delegate_task_runner_; 26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<AutoThread> delegate_thread_; 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<Delegate> delegate_; 26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::queue<base::Closure> pending_requests_; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DaemonController); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // REMOTING_HOST_SETUP_DAEMON_CONTROLLER_H_ 278