local_discovery_ui_handler.h revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_WEBUI_LOCAL_DISCOVERY_LOCAL_DISCOVERY_UI_HANDLER_H_
6#define CHROME_BROWSER_UI_WEBUI_LOCAL_DISCOVERY_LOCAL_DISCOVERY_UI_HANDLER_H_
7
8#include <map>
9#include <string>
10#include <vector>
11
12#include "base/cancelable_callback.h"
13#include "base/prefs/pref_member.h"
14#include "chrome/browser/local_discovery/cloud_print_printer_list.h"
15#include "chrome/browser/local_discovery/privet_device_lister.h"
16#include "chrome/browser/local_discovery/privet_http.h"
17#include "components/signin/core/browser/signin_manager.h"
18#include "content/public/browser/web_ui_message_handler.h"
19
20#if defined(ENABLE_FULL_PRINTING) && !defined(OS_CHROMEOS)
21#define CLOUD_PRINT_CONNECTOR_UI_AVAILABLE
22#endif
23
24// TODO(noamsml): Factor out full registration flow into single class
25namespace local_discovery {
26
27class PrivetConfirmApiCallFlow;
28class PrivetHTTPAsynchronousFactory;
29class PrivetHTTPResolution;
30class ServiceDiscoverySharedClient;
31
32// UI Handler for chrome://devices/
33// It listens to local discovery notifications and passes those notifications
34// into the Javascript to update the page.
35class LocalDiscoveryUIHandler : public content::WebUIMessageHandler,
36                                public PrivetRegisterOperation::Delegate,
37                                public PrivetDeviceLister::Delegate,
38                                public CloudPrintPrinterList::Delegate,
39                                public SigninManagerBase::Observer {
40 public:
41  LocalDiscoveryUIHandler();
42  virtual ~LocalDiscoveryUIHandler();
43
44  static bool GetHasVisible();
45
46  // WebUIMessageHandler implementation.
47  virtual void RegisterMessages() OVERRIDE;
48
49  // PrivetRegisterOperation::Delegate implementation.
50  virtual void OnPrivetRegisterClaimToken(
51      PrivetRegisterOperation* operation,
52      const std::string& token,
53      const GURL& url) OVERRIDE;
54
55  virtual void OnPrivetRegisterError(
56      PrivetRegisterOperation* operation,
57      const std::string& action,
58      PrivetRegisterOperation::FailureReason reason,
59      int printer_http_code,
60      const base::DictionaryValue* json) OVERRIDE;
61
62  virtual void OnPrivetRegisterDone(
63      PrivetRegisterOperation* operation,
64      const std::string& device_id) OVERRIDE;
65
66  // PrivetDeviceLister::Delegate implementation.
67  virtual void DeviceChanged(bool added,
68                             const std::string& name,
69                             const DeviceDescription& description) OVERRIDE;
70
71  virtual void DeviceRemoved(const std::string& name) OVERRIDE;
72
73  virtual void DeviceCacheFlushed() OVERRIDE;
74
75  // CloudPrintPrinterList::Delegate implementation.
76  virtual void OnCloudPrintPrinterListReady() OVERRIDE;
77
78  virtual void OnCloudPrintPrinterListUnavailable() OVERRIDE;
79
80  // SigninManagerBase::Observer implementation.
81  virtual void GoogleSigninSucceeded(const std::string& username,
82                                     const std::string& password) OVERRIDE;
83
84  virtual void GoogleSignedOut(const std::string& username) OVERRIDE;
85
86 private:
87  typedef std::map<std::string, DeviceDescription> DeviceDescriptionMap;
88
89  // Message handlers:
90  // For when the page is ready to recieve device notifications.
91  void HandleStart(const base::ListValue* args);
92
93  // For when a visibility change occurs.
94  void HandleIsVisible(const base::ListValue* args);
95
96  // For when a user choice is made.
97  void HandleRegisterDevice(const base::ListValue* args);
98
99  // For when a cancelation is made.
100  void HandleCancelRegistration(const base::ListValue* args);
101
102  // For requesting the printer list.
103  void HandleRequestPrinterList(const base::ListValue* args);
104
105  // For opening URLs (relative to the Google Cloud Print base URL) in a new
106  // tab.
107  void HandleOpenCloudPrintURL(const base::ListValue* args);
108
109  // For showing sync login UI.
110  void HandleShowSyncUI(const base::ListValue* args);
111
112  // For when the IP address of the printer has been resolved for registration.
113  void StartRegisterHTTP(
114      scoped_ptr<PrivetHTTPClient> http_client);
115
116  // For when the confirm operation on the cloudprint server has finished
117  // executing.
118  void OnConfirmDone(CloudPrintBaseApiFlow::Status status);
119
120  // Signal to the web interface an error has ocurred while registering.
121  void SendRegisterError();
122
123  // Singal to the web interface that registration has finished.
124  void SendRegisterDone(const std::string& service_name,
125                        const DeviceDescription& device);
126
127  // Set the visibility of the page.
128  void SetIsVisible(bool visible);
129
130  // Get the sync account email.
131  std::string GetSyncAccount();
132
133  // Get the base cloud print URL.
134  std::string GetCloudPrintBaseUrl();
135
136  // Reset and cancel the current registration.
137  void ResetCurrentRegistration();
138
139  scoped_ptr<base::DictionaryValue> CreatePrinterInfo(
140      const CloudPrintPrinterList::PrinterDetails& description);
141
142  // Announcement hasn't been sent for a certain time after registration
143  // finished. Consider it failed.
144  // TODO(noamsml): Re-resolve service first.
145  void OnAnnouncementTimeoutReached();
146
147  void CheckUserLoggedIn();
148
149#if defined(CLOUD_PRINT_CONNECTOR_UI_AVAILABLE)
150  void StartCloudPrintConnector();
151  void OnCloudPrintPrefsChanged();
152  void ShowCloudPrintSetupDialog(const base::ListValue* args);
153  void HandleDisableCloudPrintConnector(const base::ListValue* args);
154  void SetupCloudPrintConnectorSection();
155  void RemoveCloudPrintConnectorSection();
156  void RefreshCloudPrintStatusFromService();
157#endif
158
159  // The current HTTP client (used for the current operation).
160  scoped_ptr<PrivetHTTPClient> current_http_client_;
161
162  // The current register operation. Only one allowed at any time.
163  scoped_ptr<PrivetRegisterOperation> current_register_operation_;
164
165  // The current confirm call used during the registration flow.
166  scoped_ptr<PrivetConfirmApiCallFlow> confirm_api_call_flow_;
167
168  // The device lister used to list devices on the local network.
169  scoped_ptr<PrivetDeviceLister> privet_lister_;
170
171  // The service discovery client used listen for devices on the local network.
172  scoped_refptr<ServiceDiscoverySharedClient> service_discovery_client_;
173
174  // A factory for creating the privet HTTP Client.
175  scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory_;
176
177  // An object representing the resolution process for the privet_http_factory.
178  scoped_ptr<PrivetHTTPResolution> privet_resolution_;
179
180  // A map of current device descriptions provided by the PrivetDeviceLister.
181  DeviceDescriptionMap device_descriptions_;
182
183  // Whether or not the page is marked as visible.
184  bool is_visible_;
185
186  // List of printers from cloud print.
187  scoped_ptr<CloudPrintPrinterList> cloud_print_printer_list_;
188
189#if defined(CLOUD_PRINT_CONNECTOR_UI_AVAILABLE)
190  StringPrefMember cloud_print_connector_email_;
191  BooleanPrefMember cloud_print_connector_enabled_;
192  bool cloud_print_connector_ui_enabled_;
193#endif
194
195  DISALLOW_COPY_AND_ASSIGN(LocalDiscoveryUIHandler);
196};
197
198#undef CLOUD_PRINT_CONNECTOR_UI_AVAILABLE
199
200}  // namespace local_discovery
201#endif  // CHROME_BROWSER_UI_WEBUI_LOCAL_DISCOVERY_LOCAL_DISCOVERY_UI_HANDLER_H_
202