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