Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #include "printing/backend/print_backend.h" | 5 #include "printing/backend/print_backend.h" |
| 6 | 6 |
| 7 #include <dlfcn.h> | 7 #include <dlfcn.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #if !defined(OS_MACOSX) | 9 #if !defined(OS_MACOSX) |
| 10 #include <gcrypt.h> | 10 #include <gcrypt.h> |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 | 211 |
| 212 FilePath PrintBackendCUPS::GetPPD(const char* name) { | 212 FilePath PrintBackendCUPS::GetPPD(const char* name) { |
| 213 // cupsGetPPD returns a filename stored in a static buffer in CUPS. | 213 // cupsGetPPD returns a filename stored in a static buffer in CUPS. |
| 214 // Protect this code with lock. | 214 // Protect this code with lock. |
| 215 static Lock ppd_lock; | 215 static Lock ppd_lock; |
| 216 AutoLock ppd_autolock(ppd_lock); | 216 AutoLock ppd_autolock(ppd_lock); |
| 217 FilePath ppd_path; | 217 FilePath ppd_path; |
| 218 const char* ppd_file_path = NULL; | 218 const char* ppd_file_path = NULL; |
| 219 if (print_server_url_.is_empty()) { // Use default (local) print server. | 219 if (print_server_url_.is_empty()) { // Use default (local) print server. |
| 220 ppd_file_path = cupsGetPPD(name); | 220 ppd_file_path = cupsGetPPD(name); |
| 221 if (ppd_file_path) | |
| 222 ppd_path = FilePath(ppd_file_path); | |
| 221 } else { | 223 } else { |
| 224 // cupsGetPPD2 got stuck sometimes for an infinite time due to network | |
|
sanjeevr
2010/12/03 23:46:37
got => gets
Also "for an infinite loop" => "in an
| |
| 225 // configuration/issues. To prevent that, use non-blocking http connection | |
| 226 // here. | |
| 227 // Note: After looking at CUPS sources, it looks like non-blocking | |
| 228 // connection will timeout after 10 secons of no data period. And it will | |
|
sanjeevr
2010/12/03 23:46:37
secons => seconds
| |
| 229 // return the same way as if data was completely and sucessfully downloaded. | |
| 230 // To distinguish error case from the normal return, will check result file | |
| 231 // size agains content length. | |
| 222 HttpConnectionCUPS http(print_server_url_); | 232 HttpConnectionCUPS http(print_server_url_); |
| 233 http.SetBlocking(false); | |
| 223 ppd_file_path = cupsGetPPD2(http.http(), name); | 234 ppd_file_path = cupsGetPPD2(http.http(), name); |
| 235 // Check if the get full PPD, since non-blocking call may simply return | |
| 236 // normally after timeout expired. | |
| 237 if (ppd_file_path) { | |
| 238 ppd_path = FilePath(ppd_file_path); | |
| 239 off_t content_len = httpGetLength2(http.http()); | |
| 240 int64 ppd_size = 0; | |
| 241 if (!file_util::GetFileSize(ppd_path, &ppd_size) || | |
| 242 content_len > ppd_size) { | |
|
sanjeevr
2010/12/03 23:46:37
content_len != ppd_size ?
| |
| 243 LOG(ERROR) << "Error downloading PPD file for: " << name | |
| 244 << ", file size: " << ppd_size | |
| 245 << ", content length: " << content_len; | |
| 246 file_util::Delete(ppd_path, false); | |
| 247 ppd_path.clear(); | |
| 248 } | |
| 249 } | |
| 224 } | 250 } |
| 225 if (ppd_file_path) | |
| 226 ppd_path = FilePath(ppd_file_path); | |
| 227 return ppd_path; | 251 return ppd_path; |
| 228 } | 252 } |
| 229 | 253 |
| 230 } // namespace printing | 254 } // namespace printing |
| OLD | NEW |