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