local_discovery_ui_handler.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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 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 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 void ScheduleQuery(int timeout_seconds); 150 151 void SendQuery(int next_timeout_seconds); 152 153#if defined(CLOUD_PRINT_CONNECTOR_UI_AVAILABLE) 154 void StartCloudPrintConnector(); 155 void OnCloudPrintPrefsChanged(); 156 void ShowCloudPrintSetupDialog(const ListValue* args); 157 void HandleDisableCloudPrintConnector(const ListValue* args); 158 void SetupCloudPrintConnectorSection(); 159 void RemoveCloudPrintConnectorSection(); 160 void RefreshCloudPrintStatusFromService(); 161#endif 162 163 // The current HTTP client (used for the current operation). 164 scoped_ptr<PrivetHTTPClient> current_http_client_; 165 166 // The current register operation. Only one allowed at any time. 167 scoped_ptr<PrivetRegisterOperation> current_register_operation_; 168 169 // The current confirm call used during the registration flow. 170 scoped_ptr<PrivetConfirmApiCallFlow> confirm_api_call_flow_; 171 172 // The device lister used to list devices on the local network. 173 scoped_ptr<PrivetDeviceLister> privet_lister_; 174 175 // The service discovery client used listen for devices on the local network. 176 scoped_refptr<ServiceDiscoverySharedClient> service_discovery_client_; 177 178 // A factory for creating the privet HTTP Client. 179 scoped_ptr<PrivetHTTPAsynchronousFactory> privet_http_factory_; 180 181 // An object representing the resolution process for the privet_http_factory. 182 scoped_ptr<PrivetHTTPResolution> privet_resolution_; 183 184 // A map of current device descriptions provided by the PrivetDeviceLister. 185 DeviceDescriptionMap device_descriptions_; 186 187 // Whether or not the page is marked as visible. 188 bool is_visible_; 189 190 // List of printers from cloud print. 191 scoped_ptr<CloudPrintPrinterList> cloud_print_printer_list_; 192 193 // Callback for requery. 194 base::CancelableCallback<void()> requery_callback_; 195 196#if defined(CLOUD_PRINT_CONNECTOR_UI_AVAILABLE) 197 StringPrefMember cloud_print_connector_email_; 198 BooleanPrefMember cloud_print_connector_enabled_; 199 bool cloud_print_connector_ui_enabled_; 200#endif 201 202 content::NotificationRegistrar notification_registrar_; 203 DISALLOW_COPY_AND_ASSIGN(LocalDiscoveryUIHandler); 204}; 205 206#undef CLOUD_PRINT_CONNECTOR_UI_AVAILABLE 207 208} // namespace local_discovery 209#endif // CHROME_BROWSER_UI_WEBUI_LOCAL_DISCOVERY_LOCAL_DISCOVERY_UI_HANDLER_H_ 210