summaryrefslogtreecommitdiffstats
path: root/printing/backend/print_backend_cups.cc
diff options
context:
space:
mode:
authorgene@google.com <gene@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-03 23:53:27 +0000
committergene@google.com <gene@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-03 23:53:27 +0000
commitcfde8643578c778c94cc56d3e3d97d477daa9ce5 (patch)
tree7196913d590920d1aac9fd962cbae27543ca8b36 /printing/backend/print_backend_cups.cc
parent0675e71a3b61b8c4855d82d49e929b54b44c7eac (diff)
downloadchromium_src-cfde8643578c778c94cc56d3e3d97d477daa9ce5.zip
chromium_src-cfde8643578c778c94cc56d3e3d97d477daa9ce5.tar.gz
chromium_src-cfde8643578c778c94cc56d3e3d97d477daa9ce5.tar.bz2
Added CUPS error handling.
BUG=none TEST=none Review URL: http://codereview.chromium.org/6250144 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@73706 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing/backend/print_backend_cups.cc')
-rw-r--r--printing/backend/print_backend_cups.cc36
1 files changed, 21 insertions, 15 deletions
diff --git a/printing/backend/print_backend_cups.cc b/printing/backend/print_backend_cups.cc
index 3b38c3f..ee8907e 100644
--- a/printing/backend/print_backend_cups.cc
+++ b/printing/backend/print_backend_cups.cc
@@ -113,8 +113,13 @@ bool PrintBackendCUPS::EnumeratePrinters(PrinterList* printer_list) {
cups_dest_t* destinations = NULL;
int num_dests = GetDests(&destinations);
- // TODO(gene): Figure out how to get an error code from cupsGetDests so we can
- // differentiate between the enumeration failing and there being 0 printers.
+ if ((num_dests == 0) && (cupsLastError() > IPP_OK_EVENTS_COMPLETE)) {
+ VLOG(1) << "CP_CUPS: Error getting printers from CUPS server. Server: "
+ << print_server_url_
+ << " Error: "
+ << static_cast<int>(cupsLastError());
+ return false;
+ }
for (int printer_index = 0; printer_index < num_dests; printer_index++) {
const cups_dest_t& printer = destinations[printer_index];
@@ -238,27 +243,28 @@ FilePath PrintBackendCUPS::GetPPD(const char* name) {
// Note: After looking at CUPS sources, it looks like non-blocking
// connection will timeout after 10 seconds of no data period. And it will
// return the same way as if data was completely and sucessfully downloaded.
- // To distinguish error case from the normal return, will check result file
- // size agains content length.
HttpConnectionCUPS http(print_server_url_);
http.SetBlocking(blocking_);
ppd_file_path = cupsGetPPD2(http.http(), name);
// Check if the get full PPD, since non-blocking call may simply return
// normally after timeout expired.
if (ppd_file_path) {
+ // There is no reliable way right now to detect full and complete PPD
+ // get downloaded. If we reach http timeout, it may simply return
+ // downloaded part as a full response. It might be good enough to check
+ // http->data_remaining or http->_data_remaining, unfortunately http_t
+ // is an internal structure and fields are not exposed in CUPS headers.
+ // httpGetLength or httpGetLength2 returning the full content size.
+ // Comparing file size against that content length might be unreliable
+ // since some http reponses are encoded and content_length > file size.
+ // Let's just check for the obvious CUPS and http errors here.
ppd_path = FilePath(ppd_file_path);
- off_t content_len = httpGetLength2(http.http());
- int64 ppd_size = 0;
- // This is a heuristic to detect if we reached timeout. If we see content
- // length is larger that the actual file we downloaded it means timeout
- // reached. Sometimes http can be compressed, and in that case the
- // the content length will be smaller than the actual payload (not sure
- // if CUPS support such responses).
- if (!file_util::GetFileSize(ppd_path, &ppd_size) ||
- content_len > ppd_size) {
+ ipp_status_t error_code = cupsLastError();
+ int http_error = httpError(http.http());
+ if (error_code > IPP_OK_EVENTS_COMPLETE || http_error != 0) {
LOG(ERROR) << "Error downloading PPD file for: " << name
- << ", file size: " << ppd_size
- << ", content length: " << content_len;
+ << ", CUPS error: " << static_cast<int>(error_code)
+ << ", HTTP error: " << http_error;
file_util::Delete(ppd_path, false);
ppd_path.clear();
}