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 27 namespace local_discovery { 28 29 class PrivetConfirmApiCallFlow; 30 class PrivetHTTPAsynchronousFactory; 31 class PrivetHTTPResolution; 32 class 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. 37 class 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 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 ListValue* args); 154 void HandleDisableCloudPrintConnector(const 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