• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
~Client()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           base::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 
PendingTaskPendingTask82     PendingTask() : type(PENDING_PRINTERS_NONE) {}
~PendingTaskPendingTask83     ~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       base::DictionaryValue* json_data,
111       bool succeeded);
112 
113   CloudPrintURLFetcher::ResponseAction HandlePrinterListResponseSettingsUpdate(
114       const net::URLFetcher* source,
115       const GURL& url,
116       base::DictionaryValue* json_data,
117       bool succeeded);
118 
119   CloudPrintURLFetcher::ResponseAction HandlePrinterDeleteResponse(
120       const net::URLFetcher* source,
121       const GURL& url,
122       base::DictionaryValue* json_data,
123       bool succeeded);
124 
125   CloudPrintURLFetcher::ResponseAction HandleRegisterPrinterResponse(
126       const net::URLFetcher* source,
127       const GURL& url,
128       base::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(base::DictionaryValue* printer_data);
151 
152   void UpdateSettingsFromPrintersList(base::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