Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(689)

Side by Side Diff: chrome/service/cloud_print/printer_job_handler.h

Issue 4165013: Re-landing issue 4202006 (http://codereview.chromium.org/4202006/show) which ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_SERVICE_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_ 5 #ifndef CHROME_SERVICE_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_
6 #define CHROME_SERVICE_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_ 6 #define CHROME_SERVICE_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_
7 #pragma once 7 #pragma once
8 8
9 #include <list> 9 #include <list>
10 #include <string> 10 #include <string>
11 11
12 #include "base/file_path.h" 12 #include "base/file_path.h"
13 #include "base/ref_counted.h" 13 #include "base/ref_counted.h"
14 #include "base/message_loop_proxy.h" 14 #include "base/message_loop_proxy.h"
15 #include "base/thread.h" 15 #include "base/thread.h"
16 #include "chrome/service/cloud_print/cloud_print_url_fetcher.h"
16 #include "chrome/service/cloud_print/job_status_updater.h" 17 #include "chrome/service/cloud_print/job_status_updater.h"
17 #include "chrome/common/net/url_fetcher.h"
18 #include "googleurl/src/gurl.h" 18 #include "googleurl/src/gurl.h"
19 #include "net/url_request/url_request_status.h" 19 #include "net/url_request/url_request_status.h"
20 #include "printing/backend/print_backend.h" 20 #include "printing/backend/print_backend.h"
21 21
22 class URLFetcher;
22 // A class that handles cloud print jobs for a particular printer. This class 23 // A class that handles cloud print jobs for a particular printer. This class
23 // imlements a state machine that transitions from Start to various states. The 24 // imlements a state machine that transitions from Start to various states. The
24 // various states are shown in the below diagram. 25 // various states are shown in the below diagram.
25 // the status on the server. 26 // the status on the server.
26 27
27 // Start --> No pending tasks --> Done 28 // Start --> No pending tasks --> Done
28 // | 29 // |
29 // | 30 // |
30 // | Have Pending tasks 31 // | Have Pending tasks
31 // | 32 // |
(...skipping 19 matching lines...) Expand all
51 // | 52 // |
52 // | 53 // |
53 // | 54 // |
54 // | 55 // |
55 // | 56 // |
56 // | 57 // |
57 // | 58 // |
58 // Stop 59 // Stop
59 // (If there are pending tasks go back to Start) 60 // (If there are pending tasks go back to Start)
60 61
61 typedef URLFetcher::Delegate URLFetcherDelegate;
62
63 class PrinterJobHandler : public base::RefCountedThreadSafe<PrinterJobHandler>, 62 class PrinterJobHandler : public base::RefCountedThreadSafe<PrinterJobHandler>,
64 public URLFetcherDelegate, 63 public CloudPrintURLFetcherDelegate,
65 public JobStatusUpdaterDelegate, 64 public JobStatusUpdaterDelegate,
66 public cloud_print::PrinterWatcherDelegate, 65 public cloud_print::PrinterWatcherDelegate,
67 public cloud_print::JobSpoolerDelegate { 66 public cloud_print::JobSpoolerDelegate {
68 enum PrintJobError { 67 enum PrintJobError {
69 SUCCESS, 68 SUCCESS,
70 JOB_DOWNLOAD_FAILED, 69 JOB_DOWNLOAD_FAILED,
71 INVALID_JOB_DATA, 70 INVALID_JOB_DATA,
72 PRINT_FAILED, 71 PRINT_FAILED,
73 }; 72 };
74 struct JobDetails { 73 struct JobDetails {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 ~PrinterJobHandler(); 112 ~PrinterJobHandler();
114 bool Initialize(); 113 bool Initialize();
115 // Notifies the JobHandler that a job is available 114 // Notifies the JobHandler that a job is available
116 void NotifyJobAvailable(); 115 void NotifyJobAvailable();
117 // Shutdown everything (the process is exiting). 116 // Shutdown everything (the process is exiting).
118 void Shutdown(); 117 void Shutdown();
119 // End public interface 118 // End public interface
120 119
121 // Begin Delegate implementations 120 // Begin Delegate implementations
122 121
123 // URLFetcher::Delegate implementation. 122 // CloudPrintURLFetcher::Delegate implementation.
124 virtual void OnURLFetchComplete(const URLFetcher* source, const GURL& url, 123 virtual CloudPrintURLFetcher::ResponseAction HandleRawData(
125 const URLRequestStatus& status, 124 const URLFetcher* source,
126 int response_code, 125 const GURL& url,
127 const ResponseCookies& cookies, 126 const std::string& data);
128 const std::string& data); 127 virtual CloudPrintURLFetcher::ResponseAction HandleJSONData(
128 const URLFetcher* source,
129 const GURL& url,
130 DictionaryValue* json_data,
131 bool succeeded);
132 virtual void OnRequestGiveUp();
133 virtual void OnRequestAuthError();
134
129 // JobStatusUpdater::Delegate implementation 135 // JobStatusUpdater::Delegate implementation
130 virtual bool OnJobCompleted(JobStatusUpdater* updater); 136 virtual bool OnJobCompleted(JobStatusUpdater* updater);
131 virtual void OnAuthError(); 137 virtual void OnAuthError();
132 138
133 // cloud_print::PrinterWatcherDelegate implementation 139 // cloud_print::PrinterWatcherDelegate implementation
134 virtual void OnPrinterDeleted(); 140 virtual void OnPrinterDeleted();
135 virtual void OnPrinterChanged(); 141 virtual void OnPrinterChanged();
136 virtual void OnJobChanged(); 142 virtual void OnJobChanged();
137 143
138 // cloud_print::JobSpoolerDelegate implementation. 144 // cloud_print::JobSpoolerDelegate implementation.
139 // Called on print_thread_. 145 // Called on print_thread_.
140 virtual void OnJobSpoolSucceeded(const cloud_print::PlatformJobId& job_id); 146 virtual void OnJobSpoolSucceeded(const cloud_print::PlatformJobId& job_id);
141 virtual void OnJobSpoolFailed(); 147 virtual void OnJobSpoolFailed();
142 148
143 // End Delegate implementations 149 // End Delegate implementations
144 150
145 private: 151 private:
146 // Prototype for a response handler. The return value indicates whether the 152 // Prototype for a JSON data handler.
147 // request should be retried, false means "retry", true means "do not retry" 153 typedef CloudPrintURLFetcher::ResponseAction
148 typedef bool (PrinterJobHandler::*ResponseHandler)( 154 (PrinterJobHandler::*JSONDataHandler)(const URLFetcher* source,
149 const URLFetcher* source, const GURL& url, 155 const GURL& url,
150 const URLRequestStatus& status, int response_code, 156 DictionaryValue* json_data,
151 const ResponseCookies& cookies, const std::string& data); 157 bool succeeded);
152 // Prototype for a failure handler. This handler will be executed if all 158 // Prototype for a data handler.
153 // attempts to fetch url failed. 159 typedef CloudPrintURLFetcher::ResponseAction
154 typedef void (PrinterJobHandler::*FailureHandler)(); 160 (PrinterJobHandler::*DataHandler)(const URLFetcher* source,
161 const GURL& url,
162 const std::string& data);
155 // Begin request handlers for each state in the state machine 163 // Begin request handlers for each state in the state machine
156 bool HandlePrinterUpdateResponse(const URLFetcher* source, const GURL& url, 164 CloudPrintURLFetcher::ResponseAction HandlePrinterUpdateResponse(
157 const URLRequestStatus& status, 165 const URLFetcher* source,
158 int response_code, 166 const GURL& url,
159 const ResponseCookies& cookies, 167 DictionaryValue* json_data,
160 const std::string& data); 168 bool succeeded);
161 bool HandlePrinterDeleteResponse(const URLFetcher* source, const GURL& url, 169
162 const URLRequestStatus& status, 170 CloudPrintURLFetcher::ResponseAction HandlePrinterDeleteResponse(
163 int response_code, 171 const URLFetcher* source,
164 const ResponseCookies& cookies, 172 const GURL& url,
165 const std::string& data); 173 DictionaryValue* json_data,
166 bool HandleJobMetadataResponse(const URLFetcher* source, const GURL& url, 174 bool succeeded);
167 const URLRequestStatus& status, 175
168 int response_code, 176 CloudPrintURLFetcher::ResponseAction HandleJobMetadataResponse(
169 const ResponseCookies& cookies, 177 const URLFetcher* source,
170 const std::string& data); 178 const GURL& url,
171 bool HandlePrintTicketResponse(const URLFetcher* source, 179 DictionaryValue* json_data,
172 const GURL& url, 180 bool succeeded);
173 const URLRequestStatus& status, 181
174 int response_code, 182 CloudPrintURLFetcher::ResponseAction HandlePrintTicketResponse(
175 const ResponseCookies& cookies, 183 const URLFetcher* source,
176 const std::string& data); 184 const GURL& url,
177 bool HandlePrintDataResponse(const URLFetcher* source, 185 const std::string& data);
178 const GURL& url, 186
179 const URLRequestStatus& status, 187 CloudPrintURLFetcher::ResponseAction HandlePrintDataResponse(
180 int response_code, 188 const URLFetcher* source,
181 const ResponseCookies& cookies, 189 const GURL& url,
182 const std::string& data); 190 const std::string& data);
183 bool HandleSuccessStatusUpdateResponse(const URLFetcher* source, 191
184 const GURL& url, 192 CloudPrintURLFetcher::ResponseAction HandleSuccessStatusUpdateResponse(
185 const URLRequestStatus& status, 193 const URLFetcher* source,
186 int response_code, 194 const GURL& url,
187 const ResponseCookies& cookies, 195 DictionaryValue* json_data,
188 const std::string& data); 196 bool succeeded);
189 bool HandleFailureStatusUpdateResponse(const URLFetcher* source, 197
190 const GURL& url, 198 CloudPrintURLFetcher::ResponseAction HandleFailureStatusUpdateResponse(
191 const URLRequestStatus& status, 199 const URLFetcher* source,
192 int response_code, 200 const GURL& url,
193 const ResponseCookies& cookies, 201 DictionaryValue* json_data,
194 const std::string& data); 202 bool succeeded);
195 // End request handlers for each state in the state machine 203 // End request handlers for each state in the state machine
196 204
197 // Start the state machine. Based on the flags set this could mean updating 205 // Start the state machine. Based on the flags set this could mean updating
198 // printer information, deleting the printer from the server or looking for 206 // printer information, deleting the printer from the server or looking for
199 // new print jobs 207 // new print jobs
200 void Start(); 208 void Start();
201 209
202 // End the state machine. If there are pending tasks, we will post a Start 210 // End the state machine. If there are pending tasks, we will post a Start
203 // again. 211 // again.
204 void Stop(); 212 void Stop();
205 213
206 void StartPrinting(); 214 void StartPrinting();
207 void HandleServerError(const GURL& url); 215 void HandleServerError(const GURL& url);
208 void Reset(); 216 void Reset();
209 void UpdateJobStatus(cloud_print::PrintJobStatus status, PrintJobError error); 217 void UpdateJobStatus(cloud_print::PrintJobStatus status, PrintJobError error);
210 218
211 // This function should be used to go from one state to another. It will 219 // Sets the next response handler to the specifed JSON data handler.
212 // retry to fetch url (up to a limit) if response handler will return false. 220 void SetNextJSONHandler(JSONDataHandler handler);
213 // Calling this function will zero failure counter. 221 // Sets the next response handler to the specifed data handler.
214 void MakeServerRequest(const GURL& url, 222 void SetNextDataHandler(DataHandler handler);
215 ResponseHandler response_handler,
216 FailureHandler failure_handler);
217 // This function should be used ONLY from MakeServerRequest and
218 // HandleServerError. It is using stored handlers and failure counter
219 // to decide which handler to call.
220 void FetchURL(const GURL& url);
221 223
222 void JobFailed(PrintJobError error); 224 void JobFailed(PrintJobError error);
223 void JobSpooled(cloud_print::PlatformJobId local_job_id); 225 void JobSpooled(cloud_print::PlatformJobId local_job_id);
224 // Returns false if printer info is up to date and no updating is needed. 226 // Returns false if printer info is up to date and no updating is needed.
225 bool UpdatePrinterInfo(); 227 bool UpdatePrinterInfo();
226 bool HavePendingTasks(); 228 bool HavePendingTasks();
227 void FailedFetchingJobData(); 229 void FailedFetchingJobData();
228 230
229 // Called on print_thread_. 231 // Called on print_thread_.
230 void DoPrint(const JobDetails& job_details, 232 void DoPrint(const JobDetails& job_details,
231 const std::string& printer_name); 233 const std::string& printer_name);
232 234
233 scoped_ptr<URLFetcher> request_; 235 scoped_refptr<CloudPrintURLFetcher> request_;
234 scoped_refptr<cloud_print::PrintSystem> print_system_; 236 scoped_refptr<cloud_print::PrintSystem> print_system_;
235 printing::PrinterBasicInfo printer_info_; 237 printing::PrinterBasicInfo printer_info_;
236 PrinterInfoFromCloud printer_info_cloud_; 238 PrinterInfoFromCloud printer_info_cloud_;
237 std::string auth_token_; 239 std::string auth_token_;
238 GURL cloud_print_server_url_; 240 GURL cloud_print_server_url_;
239 std::string print_data_url_; 241 std::string print_data_url_;
240 JobDetails job_details_; 242 JobDetails job_details_;
241 Delegate* delegate_; 243 Delegate* delegate_;
242 // Once the job has been spooled to the local spooler, this specifies the 244 // Once the job has been spooled to the local spooler, this specifies the
243 // job id of the job on the local spooler. 245 // job id of the job on the local spooler.
244 cloud_print::PlatformJobId local_job_id_; 246 cloud_print::PlatformJobId local_job_id_;
245 ResponseHandler next_response_handler_; 247
246 FailureHandler next_failure_handler_; 248 // The next response handler can either be a JSONDataHandler or a
249 // DataHandler (depending on the current request being made).
250 JSONDataHandler next_json_data_handler_;
251 DataHandler next_data_handler_;
247 // The number of consecutive times that connecting to the server failed. 252 // The number of consecutive times that connecting to the server failed.
248 int server_error_count_; 253 int server_error_count_;
249 // The thread on which the actual print operation happens 254 // The thread on which the actual print operation happens
250 base::Thread print_thread_; 255 base::Thread print_thread_;
251 // The Job spooler object. This is only non-NULL during a print operation. 256 // The Job spooler object. This is only non-NULL during a print operation.
252 // It lives and dies on |print_thread_| 257 // It lives and dies on |print_thread_|
253 scoped_refptr<cloud_print::PrintSystem::JobSpooler> job_spooler_; 258 scoped_refptr<cloud_print::PrintSystem::JobSpooler> job_spooler_;
254 // The message loop proxy representing the thread on which this object 259 // The message loop proxy representing the thread on which this object
255 // was created. Used by the print thread. 260 // was created. Used by the print thread.
256 scoped_refptr<base::MessageLoopProxy> job_handler_message_loop_proxy_; 261 scoped_refptr<base::MessageLoopProxy> job_handler_message_loop_proxy_;
(...skipping 16 matching lines...) Expand all
273 DISALLOW_COPY_AND_ASSIGN(PrinterJobHandler); 278 DISALLOW_COPY_AND_ASSIGN(PrinterJobHandler);
274 }; 279 };
275 280
276 // This typedef is to workaround the issue with certain versions of 281 // This typedef is to workaround the issue with certain versions of
277 // Visual Studio where it gets confused between multiple Delegate 282 // Visual Studio where it gets confused between multiple Delegate
278 // classes and gives a C2500 error. (I saw this error on the try bots - 283 // classes and gives a C2500 error. (I saw this error on the try bots -
279 // the workaround was not needed for my machine). 284 // the workaround was not needed for my machine).
280 typedef PrinterJobHandler::Delegate PrinterJobHandlerDelegate; 285 typedef PrinterJobHandler::Delegate PrinterJobHandlerDelegate;
281 286
282 #endif // CHROME_SERVICE_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_ 287 #endif // CHROME_SERVICE_CLOUD_PRINT_PRINTER_JOB_HANDLER_H_
OLDNEW
« no previous file with comments | « chrome/service/cloud_print/job_status_updater.cc ('k') | chrome/service/cloud_print/printer_job_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698