1 // Copyright (c) 2012 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_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_ 6 #define CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_ 7 8 #include <list> 9 #include <map> 10 #include <string> 11 12 #include "base/threading/thread.h" 13 #include "base/values.h" 14 #include "chrome/service/cloud_print/connector_settings.h" 15 #include "chrome/service/cloud_print/print_system.h" 16 #include "chrome/service/cloud_print/printer_job_handler.h" 17 18 namespace cloud_print { 19 20 // CloudPrintConnector handles top printer management tasks. 21 // - Matching local and cloud printers 22 // - Registration of local printers 23 // - Deleting cloud printers 24 // All tasks are posted to the common queue (PendingTasks) and executed 25 // one-by-one in FIFO order. 26 // CloudPrintConnector will notify client over Client interface. 27 class CloudPrintConnector 28 : public base::RefCountedThreadSafe<CloudPrintConnector>, 29 private PrintSystem::PrintServerWatcher::Delegate, 30 private PrinterJobHandlerDelegate, 31 private CloudPrintURLFetcherDelegate { 32 public: 33 class Client { 34 public: 35 virtual void OnAuthFailed() = 0; 36 virtual void OnXmppPingUpdated(int ping_timeout) = 0; 37 protected: 38 virtual ~Client() {} 39 }; 40 41 CloudPrintConnector(Client* client, const ConnectorSettings& settings); 42 43 bool Start(); 44 void Stop(); 45 bool IsRunning(); 46 47 // Return list of printer ids registered with CloudPrint. 48 void GetPrinterIds(std::list<std::string>* printer_ids); 49 50 // Check for jobs for specific printer. If printer id is empty 51 // jobs will be checked for all available printers. 52 void CheckForJobs(const std::string& reason, const std::string& printer_id); 53 54 // Update settings for specific printer. 55 void UpdatePrinterSettings(const std::string& printer_id); 56 57 private: 58 friend class base::RefCountedThreadSafe<CloudPrintConnector>; 59 60 // Prototype for a response handler. 61 typedef CloudPrintURLFetcher::ResponseAction 62 (CloudPrintConnector::*ResponseHandler)( 63 const net::URLFetcher* source, 64 const GURL& url, 65 DictionaryValue* json_data, 66 bool succeeded); 67 68 enum PendingTaskType { 69 PENDING_PRINTERS_NONE, 70 PENDING_PRINTERS_AVAILABLE, 71 PENDING_PRINTER_REGISTER, 72 PENDING_PRINTER_DELETE 73 }; 74 75 // TODO(vitalybuka): Consider delete pending_tasks_ and just use MessageLoop. 76 struct PendingTask { 77 PendingTaskType type; 78 // Optional members, depending on type. 79 std::string printer_id; // For pending delete. 80 printing::PrinterBasicInfo printer_info; // For pending registration. 81 82 PendingTask() : type(PENDING_PRINTERS_NONE) {} 83 ~PendingTask() {} 84 }; 85 86 virtual ~CloudPrintConnector(); 87 // PrintServerWatcherDelegate implementation 88 virtual void OnPrinterAdded() OVERRIDE; 89 // PrinterJobHandler::Delegate implementation 90 virtual void OnPrinterDeleted(const std::string& printer_name) OVERRIDE; 91 virtual void OnAuthError() OVERRIDE; 92 93 // CloudPrintURLFetcher::Delegate implementation. 94 virtual CloudPrintURLFetcher::ResponseAction HandleRawData( 95 const net::URLFetcher* source, 96 const GURL& url, 97 const std::string& data) OVERRIDE; 98 virtual CloudPrintURLFetcher::ResponseAction HandleJSONData( 99 const net::URLFetcher* source, 100 const GURL& url, 101 base::DictionaryValue* json_data, 102 bool succeeded) OVERRIDE; 103 virtual CloudPrintURLFetcher::ResponseAction OnRequestAuthError() OVERRIDE; 104 virtual std::string GetAuthHeader() OVERRIDE; 105 106 // Begin response handlers 107 CloudPrintURLFetcher::ResponseAction HandlePrinterListResponse( 108 const net::URLFetcher* source, 109 const GURL& url, 110 DictionaryValue* json_data, 111 bool succeeded); 112 113 CloudPrintURLFetcher::ResponseAction HandlePrinterListResponseSettingsUpdate( 114 const net::URLFetcher* source, 115 const GURL& url, 116 DictionaryValue* json_data, 117 bool succeeded); 118 119 CloudPrintURLFetcher::ResponseAction HandlePrinterDeleteResponse( 120 const net::URLFetcher* source, 121 const GURL& url, 122 DictionaryValue* json_data, 123 bool succeeded); 124 125 CloudPrintURLFetcher::ResponseAction HandleRegisterPrinterResponse( 126 const net::URLFetcher* source, 127 const GURL& url, 128 DictionaryValue* json_data, 129 bool succeeded); 130 // End response handlers 131 132 // Helper functions for network requests. 133 void StartGetRequest(const GURL& url, 134 int max_retries, 135 ResponseHandler handler); 136 void StartPostRequest(CloudPrintURLFetcher::RequestType type, 137 const GURL& url, 138 int max_retries, 139 const std::string& mime_type, 140 const std::string& post_data, 141 ResponseHandler handler); 142 143 // Reports a diagnostic message to the server. 144 void ReportUserMessage(const std::string& message_id, 145 const std::string& failure_message); 146 147 bool RemovePrinterFromList(const std::string& printer_name, 148 printing::PrinterList* printer_list); 149 150 void InitJobHandlerForPrinter(DictionaryValue* printer_data); 151 152 void UpdateSettingsFromPrintersList(DictionaryValue* json_data); 153 154 void AddPendingAvailableTask(); 155 void AddPendingDeleteTask(const std::string& id); 156 void AddPendingRegisterTask(const printing::PrinterBasicInfo& info); 157 void AddPendingTask(const PendingTask& task); 158 void ProcessPendingTask(); 159 void ContinuePendingTaskProcessing(); 160 void OnPrintersAvailable(); 161 void OnPrinterRegister(const printing::PrinterBasicInfo& info); 162 void OnPrinterDelete(const std::string& name); 163 164 void OnReceivePrinterCaps( 165 bool succeeded, 166 const std::string& printer_name, 167 const printing::PrinterCapsAndDefaults& caps_and_defaults); 168 169 // Register printer from the list. 170 void RegisterPrinters(const printing::PrinterList& printers); 171 172 bool IsSamePrinter(const std::string& name1, const std::string& name2) const; 173 bool InitPrintSystem(); 174 175 void ScheduleStatsReport(); 176 void ReportStats(); 177 178 // CloudPrintConnector client. 179 Client* client_; 180 // Connector settings. 181 ConnectorSettings settings_; 182 // Pointer to current print system. 183 scoped_refptr<PrintSystem> print_system_; 184 // Watcher for print system updates. 185 scoped_refptr<PrintSystem::PrintServerWatcher> 186 print_server_watcher_; 187 // A map of printer id to job handler. 188 typedef std::map<std::string, scoped_refptr<PrinterJobHandler> > 189 JobHandlerMap; 190 JobHandlerMap job_handler_map_; 191 // Next response handler. 192 ResponseHandler next_response_handler_; 193 // The list of pending tasks to be done in the background. 194 std::list<PendingTask> pending_tasks_; 195 // The CloudPrintURLFetcher instance for the current request. 196 scoped_refptr<CloudPrintURLFetcher> request_; 197 // The CloudPrintURLFetcher instance for the user message request. 198 scoped_refptr<CloudPrintURLFetcher> user_message_request_; 199 base::WeakPtrFactory<CloudPrintConnector> stats_ptr_factory_; 200 201 DISALLOW_COPY_AND_ASSIGN(CloudPrintConnector); 202 }; 203 204 } // namespace cloud_print 205 206 #endif // CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_ 207 208