| Index: remoting/host/setup/daemon_controller.h
|
| diff --git a/remoting/host/setup/daemon_controller.h b/remoting/host/setup/daemon_controller.h
|
| index 0faf7a5413a23051a3947b77427f9a968dd74694..5b1f312df10dcd03a42918fb599f6f72e198a8a3 100644
|
| --- a/remoting/host/setup/daemon_controller.h
|
| +++ b/remoting/host/setup/daemon_controller.h
|
| @@ -5,18 +5,24 @@
|
| #ifndef REMOTING_HOST_SETUP_DAEMON_CONTROLLER_H_
|
| #define REMOTING_HOST_SETUP_DAEMON_CONTROLLER_H_
|
|
|
| +#include <queue>
|
| #include <string>
|
|
|
| -#include "base/callback_forward.h"
|
| +#include "base/callback.h"
|
| +#include "base/memory/ref_counted.h"
|
| #include "base/memory/scoped_ptr.h"
|
|
|
| namespace base {
|
| class DictionaryValue;
|
| +class SingleThreadTaskRunner;
|
| } // namespace base
|
|
|
| namespace remoting {
|
|
|
| -class DaemonController {
|
| +class AutoThread;
|
| +class AutoThreadTaskRunner;
|
| +
|
| +class DaemonController : public base::RefCountedThreadSafe<DaemonController> {
|
| public:
|
| // Note that these enumeration values are duplicated in host_controller.js and
|
| // must be kept in sync.
|
| @@ -79,16 +85,72 @@ class DaemonController {
|
| // Callback type for GetVersion().
|
| typedef base::Callback<void (const std::string&)> GetVersionCallback;
|
|
|
| + struct UsageStatsConsent {
|
| + bool supported;
|
| + bool allowed;
|
| + bool set_by_policy;
|
| + };
|
| +
|
| // Callback type for GetUsageStatsConsent(). |supported| indicates whether
|
| // crash dump reporting is supported by the host. |allowed| indicates if
|
| // crash dump reporting is allowed by the user. |set_by_policy| carries
|
| // information whether the crash dump reporting is controlled by policy.
|
| - typedef base::Callback<void (
|
| - bool supported,
|
| - bool allowed,
|
| - bool set_by_policy)> GetUsageStatsConsentCallback;
|
| + typedef base::Callback<void (const UsageStatsConsent&)>
|
| + GetUsageStatsConsentCallback;
|
| +
|
| + // Interface representing the platform-spacific back-end. Most of its methods
|
| + // are blocking and should called on a background thread. There are two
|
| + // exceptions:
|
| + // - GetState() is synchronous and called on the UI thread. It should avoid
|
| + // accessing any data members of the implementation.
|
| + // - SetConfigAndStart() is non blocking. |done| callback is posted to
|
| + // |task_runner| when the operation completes.
|
| + class Delegate {
|
| + public:
|
| + virtual ~Delegate() {}
|
| +
|
| + // Return the "installed/running" state of the daemon process. This method
|
| + // should avoid accessing any data members of the implementation.
|
| + virtual State GetState() = 0;
|
| +
|
| + // Queries current host configuration. Any values that might be security
|
| + // sensitive have been filtered out.
|
| + virtual scoped_ptr<base::DictionaryValue> GetConfig() = 0;
|
|
|
| - virtual ~DaemonController() {}
|
| + // Starts the daemon process. This may require that the daemon be
|
| + // downloaded and installed. |done| is invoked when the operation is
|
| + // finished or fails.
|
| + virtual void SetConfigAndStart(
|
| + scoped_ptr<base::DictionaryValue> config,
|
| + bool consent,
|
| + const CompletionCallback& done) = 0;
|
| +
|
| + // Updates current host configuration with the values specified in
|
| + // |config|. Any value in the existing configuration that isn't specified in
|
| + // |config| is preserved. |config| must not contain host_id or xmpp_login
|
| + // values, because implementations of this method cannot change them.
|
| + virtual void UpdateConfig(
|
| + scoped_ptr<base::DictionaryValue> config,
|
| + const CompletionCallback& done) = 0;
|
| +
|
| + // Stops the daemon process.
|
| + virtual void Stop(const CompletionCallback& done) = 0;
|
| +
|
| + // Caches the native handle of the plugin window so it can be used to focus
|
| + // elevation prompts properly.
|
| + virtual void SetWindow(void* window_handle) = 0;
|
| +
|
| + // Get the version of the daemon as a dotted decimal string of the form
|
| + // major.minor.build.patch, if it is installed, or "" otherwise.
|
| + virtual std::string GetVersion() = 0;
|
| +
|
| + // Get the user's consent to crash reporting.
|
| + virtual UsageStatsConsent GetUsageStatsConsent() = 0;
|
| + };
|
| +
|
| + static scoped_refptr<DaemonController> Create();
|
| +
|
| + explicit DaemonController(scoped_ptr<Delegate> delegate);
|
|
|
| // Return the "installed/running" state of the daemon process.
|
| //
|
| @@ -96,32 +158,32 @@ class DaemonController {
|
| // webapp. In most cases it requires IO operations, so it may block
|
| // the user interface. Replace it with asynchronous notifications,
|
| // e.g. with StartStateNotifications()/StopStateNotifications() methods.
|
| - virtual State GetState() = 0;
|
| + State GetState();
|
|
|
| - // Queries current host configuration. The |callback| is called
|
| + // Queries current host configuration. The |done| is called
|
| // after the configuration is read, and any values that might be security
|
| // sensitive have been filtered out.
|
| - virtual void GetConfig(const GetConfigCallback& callback) = 0;
|
| + void GetConfig(const GetConfigCallback& done);
|
|
|
| // Start the daemon process. This may require that the daemon be
|
| - // downloaded and installed. |done_callback| is called when the
|
| + // downloaded and installed. |done| is called when the
|
| // operation is finished or fails.
|
| //
|
| // TODO(sergeyu): This method writes config and starts the host -
|
| // these two steps are merged for simplicity. Consider splitting it
|
| // into SetConfig() and Start() once we have basic host setup flow
|
| // working.
|
| - virtual void SetConfigAndStart(scoped_ptr<base::DictionaryValue> config,
|
| - bool consent,
|
| - const CompletionCallback& done) = 0;
|
| + void SetConfigAndStart(scoped_ptr<base::DictionaryValue> config,
|
| + bool consent,
|
| + const CompletionCallback& done);
|
|
|
| // Updates current host configuration with the values specified in
|
| // |config|. Changes must take effect before the call completes.
|
| // Any value in the existing configuration that isn't specified in |config|
|
| // is preserved. |config| must not contain host_id or xmpp_login values,
|
| // because implementations of this method cannot change them.
|
| - virtual void UpdateConfig(scoped_ptr<base::DictionaryValue> config,
|
| - const CompletionCallback& done_callback) = 0;
|
| + void UpdateConfig(scoped_ptr<base::DictionaryValue> config,
|
| + const CompletionCallback& done);
|
|
|
| // Stop the daemon process. It is permitted to call Stop while the daemon
|
| // process is being installed, in which case the installation should be
|
| @@ -129,21 +191,70 @@ class DaemonController {
|
| // daemon process is not started automatically upon successful installation.
|
| // As with Start, Stop may return before the operation is complete--poll
|
| // GetState until the state is STATE_STOPPED.
|
| - virtual void Stop(const CompletionCallback& done_callback) = 0;
|
| + void Stop(const CompletionCallback& done);
|
|
|
| // Caches the native handle of the plugin window so it can be used to focus
|
| // elevation prompts properly.
|
| - virtual void SetWindow(void* window_handle) = 0;
|
| + void SetWindow(void* window_handle);
|
|
|
| // Get the version of the daemon as a dotted decimal string of the form
|
| // major.minor.build.patch, if it is installed, or "" otherwise.
|
| - virtual void GetVersion(const GetVersionCallback& done_callback) = 0;
|
| + void GetVersion(const GetVersionCallback& done);
|
|
|
| // Get the user's consent to crash reporting.
|
| - virtual void GetUsageStatsConsent(
|
| - const GetUsageStatsConsentCallback& done) = 0;
|
| + void GetUsageStatsConsent(const GetUsageStatsConsentCallback& done);
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<DaemonController>;
|
| + virtual ~DaemonController();
|
| +
|
| + // Blocking helper methods used to call the delegate.
|
| + void DoGetConfig(const GetConfigCallback& done);
|
| + void DoSetConfigAndStart(scoped_ptr<base::DictionaryValue> config,
|
| + bool consent,
|
| + const CompletionCallback& done);
|
| + void DoUpdateConfig(scoped_ptr<base::DictionaryValue> config,
|
| + const CompletionCallback& done);
|
| + void DoStop(const CompletionCallback& done);
|
| + void DoSetWindow(void* window_handle, const base::Closure& done);
|
| + void DoGetVersion(const GetVersionCallback& done);
|
| + void DoGetUsageStatsConsent(const GetUsageStatsConsentCallback& done);
|
| +
|
| + // "Trampoline" callbacks that schedule the next pending request and then
|
| + // invoke the original caller-supplied callback.
|
| + void InvokeCompletionCallbackAndScheduleNext(
|
| + const CompletionCallback& done,
|
| + AsyncResult result);
|
| + void InvokeConfigCallbackAndScheduleNext(
|
| + const GetConfigCallback& done,
|
| + scoped_ptr<base::DictionaryValue> config);
|
| + void InvokeConsentCallbackAndScheduleNext(
|
| + const GetUsageStatsConsentCallback& done,
|
| + const UsageStatsConsent& consent);
|
| + void InvokeVersionCallbackAndScheduleNext(
|
| + const GetVersionCallback& done,
|
| + const std::string& version);
|
| +
|
| + // Queue management methods.
|
| + void ScheduleNext();
|
| + void ServiceOrQueueRequest(const base::Closure& request);
|
| + void ServiceNextRequest();
|
| +
|
| + // Task runner on which all public methods of this class should be called.
|
| + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
|
| +
|
| + // Task runner used to run blocking calls to the delegate. A single thread
|
| + // task runner is used to guarantee that one one method of the delegate is
|
| + // called at a time.
|
| + scoped_refptr<AutoThreadTaskRunner> delegate_task_runner_;
|
| +
|
| + scoped_ptr<AutoThread> delegate_thread_;
|
| +
|
| + scoped_ptr<Delegate> delegate_;
|
| +
|
| + std::queue<base::Closure> pending_requests_;
|
|
|
| - static scoped_ptr<DaemonController> Create();
|
| + DISALLOW_COPY_AND_ASSIGN(DaemonController);
|
| };
|
|
|
| } // namespace remoting
|
|
|