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