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

Side by Side Diff: printing/backend/cups_helper.cc

Issue 1982883002: Use StringPiece in cups_helper.cc. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months 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
« no previous file with comments | « printing/backend/cups_helper.h ('k') | printing/backend/cups_helper_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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/cups_helper.h" 5 #include "printing/backend/cups_helper.h"
6 6
7 #include <cups/ppd.h> 7 #include <cups/ppd.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <string>
11 #include <vector>
12
10 #include "base/base_paths.h" 13 #include "base/base_paths.h"
11 #include "base/files/file_util.h" 14 #include "base/files/file_util.h"
12 #include "base/logging.h" 15 #include "base/logging.h"
13 #include "base/path_service.h" 16 #include "base/path_service.h"
14 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_split.h" 18 #include "base/strings/string_split.h"
16 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
17 #include "base/values.h" 20 #include "base/values.h"
18 #include "printing/backend/print_backend.h" 21 #include "printing/backend/print_backend.h"
19 #include "printing/backend/print_backend_consts.h" 22 #include "printing/backend/print_backend_consts.h"
(...skipping 13 matching lines...) Expand all
33 const char kDraftGray[] = "Draft.Gray"; 36 const char kDraftGray[] = "Draft.Gray";
34 const char kHighGray[] = "High.Gray"; 37 const char kHighGray[] = "High.Gray";
35 38
36 const char kDuplex[] = "Duplex"; 39 const char kDuplex[] = "Duplex";
37 const char kDuplexNone[] = "None"; 40 const char kDuplexNone[] = "None";
38 const char kPageSize[] = "PageSize"; 41 const char kPageSize[] = "PageSize";
39 42
40 const double kMicronsPerPoint = 10.0f * kHundrethsMMPerInch / kPointsPerInch; 43 const double kMicronsPerPoint = 10.0f * kHundrethsMMPerInch / kPointsPerInch;
41 44
42 void ParseLpOptions(const base::FilePath& filepath, 45 void ParseLpOptions(const base::FilePath& filepath,
43 const std::string& printer_name, 46 base::StringPiece printer_name,
44 int* num_options, cups_option_t** options) { 47 int* num_options,
48 cups_option_t** options) {
45 std::string content; 49 std::string content;
46 if (!base::ReadFileToString(filepath, &content)) 50 if (!base::ReadFileToString(filepath, &content))
47 return; 51 return;
48 52
49 const char kDest[] = "dest"; 53 const char kDest[] = "dest";
50 const char kDefault[] = "default"; 54 const char kDefault[] = "default";
51 const size_t kDestLen = sizeof(kDest) - 1; 55 const size_t kDestLen = sizeof(kDest) - 1;
52 const size_t kDefaultLen = sizeof(kDefault) - 1; 56 const size_t kDefaultLen = sizeof(kDefault) - 1;
53 57
54 for (base::StringPiece line : 58 for (base::StringPiece line :
(...skipping 24 matching lines...) Expand all
79 continue; 83 continue;
80 84
81 if (!base::EqualsCaseInsensitiveASCII(printer_name, name)) 85 if (!base::EqualsCaseInsensitiveASCII(printer_name, name))
82 continue; // This is not the required printer. 86 continue; // This is not the required printer.
83 87
84 line = line.substr(space_found + 1); 88 line = line.substr(space_found + 1);
85 // Remove extra spaces. 89 // Remove extra spaces.
86 line = base::TrimWhitespaceASCII(line, base::TRIM_ALL); 90 line = base::TrimWhitespaceASCII(line, base::TRIM_ALL);
87 if (line.empty()) 91 if (line.empty())
88 continue; 92 continue;
93
89 // Parse the selected printer custom options. Need to pass a 94 // Parse the selected printer custom options. Need to pass a
90 // null-terminated string. 95 // null-terminated string.
91 *num_options = cupsParseOptions(line.as_string().c_str(), 0, options); 96 *num_options = cupsParseOptions(line.as_string().c_str(), 0, options);
92 } 97 }
93 } 98 }
94 99
95 void MarkLpOptions(const std::string& printer_name, ppd_file_t** ppd) { 100 void MarkLpOptions(base::StringPiece printer_name, ppd_file_t** ppd) {
96 cups_option_t* options = NULL; 101 cups_option_t* options = nullptr;
97 int num_options = 0; 102 int num_options = 0;
98 103
99 const char kSystemLpOptionPath[] = "/etc/cups/lpoptions"; 104 const char kSystemLpOptionPath[] = "/etc/cups/lpoptions";
100 const char kUserLpOptionPath[] = ".cups/lpoptions"; 105 const char kUserLpOptionPath[] = ".cups/lpoptions";
101 106
102 std::vector<base::FilePath> file_locations; 107 std::vector<base::FilePath> file_locations;
103 file_locations.push_back(base::FilePath(kSystemLpOptionPath)); 108 file_locations.push_back(base::FilePath(kSystemLpOptionPath));
104 base::FilePath homedir; 109 base::FilePath homedir;
105 PathService::Get(base::DIR_HOME, &homedir); 110 PathService::Get(base::DIR_HOME, &homedir);
106 file_locations.push_back(base::FilePath(homedir.Append(kUserLpOptionPath))); 111 file_locations.push_back(base::FilePath(homedir.Append(kUserLpOptionPath)));
107 112
108 for (std::vector<base::FilePath>::const_iterator it = file_locations.begin(); 113 for (const base::FilePath& location : file_locations) {
109 it != file_locations.end(); ++it) {
110 num_options = 0; 114 num_options = 0;
111 options = NULL; 115 options = nullptr;
112 ParseLpOptions(*it, printer_name, &num_options, &options); 116 ParseLpOptions(location, printer_name, &num_options, &options);
113 if (num_options > 0 && options) { 117 if (num_options > 0 && options) {
114 cupsMarkOptions(*ppd, num_options, options); 118 cupsMarkOptions(*ppd, num_options, options);
115 cupsFreeOptions(num_options, options); 119 cupsFreeOptions(num_options, options);
116 } 120 }
117 } 121 }
118 } 122 }
119 123
120 bool GetBasicColorModelSettings(ppd_file_t* ppd, 124 bool GetBasicColorModelSettings(ppd_file_t* ppd,
121 ColorModel* color_model_for_black, 125 ColorModel* color_model_for_black,
122 ColorModel* color_model_for_color, 126 ColorModel* color_model_for_color,
123 bool* color_is_default) { 127 bool* color_is_default) {
124 ppd_option_t* color_model = ppdFindOption(ppd, kColorModel); 128 ppd_option_t* color_model = ppdFindOption(ppd, kColorModel);
125 if (!color_model) 129 if (!color_model)
126 return false; 130 return false;
127 131
128 if (ppdFindChoice(color_model, printing::kBlack)) 132 if (ppdFindChoice(color_model, kBlack))
129 *color_model_for_black = printing::BLACK; 133 *color_model_for_black = BLACK;
130 else if (ppdFindChoice(color_model, printing::kGray)) 134 else if (ppdFindChoice(color_model, kGray))
131 *color_model_for_black = printing::GRAY; 135 *color_model_for_black = GRAY;
132 else if (ppdFindChoice(color_model, printing::kGrayscale)) 136 else if (ppdFindChoice(color_model, kGrayscale))
133 *color_model_for_black = printing::GRAYSCALE; 137 *color_model_for_black = GRAYSCALE;
134 138
135 if (ppdFindChoice(color_model, printing::kColor)) 139 if (ppdFindChoice(color_model, kColor))
136 *color_model_for_color = printing::COLOR; 140 *color_model_for_color = COLOR;
137 else if (ppdFindChoice(color_model, printing::kCMYK)) 141 else if (ppdFindChoice(color_model, kCMYK))
138 *color_model_for_color = printing::CMYK; 142 *color_model_for_color = CMYK;
139 else if (ppdFindChoice(color_model, printing::kRGB)) 143 else if (ppdFindChoice(color_model, kRGB))
140 *color_model_for_color = printing::RGB; 144 *color_model_for_color = RGB;
141 else if (ppdFindChoice(color_model, printing::kRGBA)) 145 else if (ppdFindChoice(color_model, kRGBA))
142 *color_model_for_color = printing::RGBA; 146 *color_model_for_color = RGBA;
143 else if (ppdFindChoice(color_model, printing::kRGB16)) 147 else if (ppdFindChoice(color_model, kRGB16))
144 *color_model_for_color = printing::RGB16; 148 *color_model_for_color = RGB16;
145 else if (ppdFindChoice(color_model, printing::kCMY)) 149 else if (ppdFindChoice(color_model, kCMY))
146 *color_model_for_color = printing::CMY; 150 *color_model_for_color = CMY;
147 else if (ppdFindChoice(color_model, printing::kKCMY)) 151 else if (ppdFindChoice(color_model, kKCMY))
148 *color_model_for_color = printing::KCMY; 152 *color_model_for_color = KCMY;
149 else if (ppdFindChoice(color_model, printing::kCMY_K)) 153 else if (ppdFindChoice(color_model, kCMY_K))
150 *color_model_for_color = printing::CMY_K; 154 *color_model_for_color = CMY_K;
151 155
152 ppd_choice_t* marked_choice = ppdFindMarkedChoice(ppd, kColorModel); 156 ppd_choice_t* marked_choice = ppdFindMarkedChoice(ppd, kColorModel);
153 if (!marked_choice) 157 if (!marked_choice)
154 marked_choice = ppdFindChoice(color_model, color_model->defchoice); 158 marked_choice = ppdFindChoice(color_model, color_model->defchoice);
155 159
156 if (marked_choice) { 160 if (marked_choice) {
157 *color_is_default = 161 *color_is_default =
158 !base::EqualsCaseInsensitiveASCII(marked_choice->choice, 162 !base::EqualsCaseInsensitiveASCII(marked_choice->choice, kBlack) &&
159 printing::kBlack) && 163 !base::EqualsCaseInsensitiveASCII(marked_choice->choice, kGray) &&
160 !base::EqualsCaseInsensitiveASCII(marked_choice->choice, 164 !base::EqualsCaseInsensitiveASCII(marked_choice->choice, kGrayscale);
161 printing::kGray) &&
162 !base::EqualsCaseInsensitiveASCII(marked_choice->choice,
163 printing::kGrayscale);
164 } 165 }
165 return true; 166 return true;
166 } 167 }
167 168
168 bool GetPrintOutModeColorSettings(ppd_file_t* ppd, 169 bool GetPrintOutModeColorSettings(ppd_file_t* ppd,
169 ColorModel* color_model_for_black, 170 ColorModel* color_model_for_black,
170 ColorModel* color_model_for_color, 171 ColorModel* color_model_for_color,
171 bool* color_is_default) { 172 bool* color_is_default) {
172 ppd_option_t* printout_mode = ppdFindOption(ppd, kPrintoutMode); 173 ppd_option_t* printout_mode = ppdFindOption(ppd, kPrintoutMode);
173 if (!printout_mode) 174 if (!printout_mode)
174 return false; 175 return false;
175 176
176 *color_model_for_color = printing::PRINTOUTMODE_NORMAL; 177 *color_model_for_color = PRINTOUTMODE_NORMAL;
177 *color_model_for_black = printing::PRINTOUTMODE_NORMAL; 178 *color_model_for_black = PRINTOUTMODE_NORMAL;
178 179
179 // Check to see if NORMAL_GRAY value is supported by PrintoutMode. 180 // Check to see if NORMAL_GRAY value is supported by PrintoutMode.
180 // If NORMAL_GRAY is not supported, NORMAL value is used to 181 // If NORMAL_GRAY is not supported, NORMAL value is used to
181 // represent grayscale. If NORMAL_GRAY is supported, NORMAL is used to 182 // represent grayscale. If NORMAL_GRAY is supported, NORMAL is used to
182 // represent color. 183 // represent color.
183 if (ppdFindChoice(printout_mode, printing::kNormalGray)) 184 if (ppdFindChoice(printout_mode, kNormalGray))
184 *color_model_for_black = printing::PRINTOUTMODE_NORMAL_GRAY; 185 *color_model_for_black = PRINTOUTMODE_NORMAL_GRAY;
185 186
186 // Get the default marked choice to identify the default color setting 187 // Get the default marked choice to identify the default color setting
187 // value. 188 // value.
188 ppd_choice_t* printout_mode_choice = ppdFindMarkedChoice(ppd, kPrintoutMode); 189 ppd_choice_t* printout_mode_choice = ppdFindMarkedChoice(ppd, kPrintoutMode);
189 if (!printout_mode_choice) { 190 if (!printout_mode_choice) {
190 printout_mode_choice = ppdFindChoice(printout_mode, 191 printout_mode_choice = ppdFindChoice(printout_mode,
191 printout_mode->defchoice); 192 printout_mode->defchoice);
192 } 193 }
193 if (printout_mode_choice) { 194 if (printout_mode_choice) {
194 if (base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice, 195 if (base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice,
195 printing::kNormalGray) || 196 kNormalGray) ||
196 base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice, 197 base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice,
197 kHighGray) || 198 kHighGray) ||
198 base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice, 199 base::EqualsCaseInsensitiveASCII(printout_mode_choice->choice,
199 kDraftGray)) { 200 kDraftGray)) {
200 *color_model_for_black = printing::PRINTOUTMODE_NORMAL_GRAY; 201 *color_model_for_black = PRINTOUTMODE_NORMAL_GRAY;
201 *color_is_default = false; 202 *color_is_default = false;
202 } 203 }
203 } 204 }
204 return true; 205 return true;
205 } 206 }
206 207
207 bool GetColorModeSettings(ppd_file_t* ppd, 208 bool GetColorModeSettings(ppd_file_t* ppd,
208 ColorModel* color_model_for_black, 209 ColorModel* color_model_for_black,
209 ColorModel* color_model_for_color, 210 ColorModel* color_model_for_color,
210 bool* color_is_default) { 211 bool* color_is_default) {
211 // Samsung printers use "ColorMode" attribute in their ppds. 212 // Samsung printers use "ColorMode" attribute in their ppds.
212 ppd_option_t* color_mode_option = ppdFindOption(ppd, kColorMode); 213 ppd_option_t* color_mode_option = ppdFindOption(ppd, kColorMode);
213 if (!color_mode_option) 214 if (!color_mode_option)
214 return false; 215 return false;
215 216
216 if (ppdFindChoice(color_mode_option, printing::kColor)) 217 if (ppdFindChoice(color_mode_option, kColor))
217 *color_model_for_color = printing::COLORMODE_COLOR; 218 *color_model_for_color = COLORMODE_COLOR;
218 219
219 if (ppdFindChoice(color_mode_option, printing::kMonochrome)) 220 if (ppdFindChoice(color_mode_option, kMonochrome))
220 *color_model_for_black = printing::COLORMODE_MONOCHROME; 221 *color_model_for_black = COLORMODE_MONOCHROME;
221 222
222 ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode); 223 ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode);
223 if (!mode_choice) { 224 if (!mode_choice) {
224 mode_choice = ppdFindChoice(color_mode_option, 225 mode_choice = ppdFindChoice(color_mode_option,
225 color_mode_option->defchoice); 226 color_mode_option->defchoice);
226 } 227 }
227 228
228 if (mode_choice) { 229 if (mode_choice) {
229 *color_is_default = base::EqualsCaseInsensitiveASCII( 230 *color_is_default =
230 mode_choice->choice, printing::kColor); 231 base::EqualsCaseInsensitiveASCII(mode_choice->choice, kColor);
231 } 232 }
232 return true; 233 return true;
233 } 234 }
234 235
235 bool GetHPColorSettings(ppd_file_t* ppd, 236 bool GetHPColorSettings(ppd_file_t* ppd,
236 ColorModel* color_model_for_black, 237 ColorModel* color_model_for_black,
237 ColorModel* color_model_for_color, 238 ColorModel* color_model_for_color,
238 bool* color_is_default) { 239 bool* color_is_default) {
239 // HP printers use "Color/Color Model" attribute in their ppds. 240 // HP printers use "Color/Color Model" attribute in their ppds.
240 ppd_option_t* color_mode_option = ppdFindOption(ppd, printing::kColor); 241 ppd_option_t* color_mode_option = ppdFindOption(ppd, kColor);
241 if (!color_mode_option) 242 if (!color_mode_option)
242 return false; 243 return false;
243 244
244 if (ppdFindChoice(color_mode_option, printing::kColor)) 245 if (ppdFindChoice(color_mode_option, kColor))
245 *color_model_for_color = printing::HP_COLOR_COLOR; 246 *color_model_for_color = HP_COLOR_COLOR;
246 if (ppdFindChoice(color_mode_option, printing::kBlack)) 247 if (ppdFindChoice(color_mode_option, kBlack))
247 *color_model_for_black = printing::HP_COLOR_BLACK; 248 *color_model_for_black = HP_COLOR_BLACK;
248 249
249 ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode); 250 ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode);
250 if (!mode_choice) { 251 if (!mode_choice) {
251 mode_choice = ppdFindChoice(color_mode_option, 252 mode_choice = ppdFindChoice(color_mode_option,
252 color_mode_option->defchoice); 253 color_mode_option->defchoice);
253 } 254 }
254 if (mode_choice) { 255 if (mode_choice) {
255 *color_is_default = base::EqualsCaseInsensitiveASCII( 256 *color_is_default =
256 mode_choice->choice, printing::kColor); 257 base::EqualsCaseInsensitiveASCII(mode_choice->choice, kColor);
257 } 258 }
258 return true; 259 return true;
259 } 260 }
260 261
261 bool GetProcessColorModelSettings(ppd_file_t* ppd, 262 bool GetProcessColorModelSettings(ppd_file_t* ppd,
262 ColorModel* color_model_for_black, 263 ColorModel* color_model_for_black,
263 ColorModel* color_model_for_color, 264 ColorModel* color_model_for_color,
264 bool* color_is_default) { 265 bool* color_is_default) {
265 // Canon printers use "ProcessColorModel" attribute in their ppds. 266 // Canon printers use "ProcessColorModel" attribute in their ppds.
266 ppd_option_t* color_mode_option = ppdFindOption(ppd, kProcessColorModel); 267 ppd_option_t* color_mode_option = ppdFindOption(ppd, kProcessColorModel);
267 if (!color_mode_option) 268 if (!color_mode_option)
268 return false; 269 return false;
269 270
270 if (ppdFindChoice(color_mode_option, printing::kRGB)) 271 if (ppdFindChoice(color_mode_option, kRGB))
271 *color_model_for_color = printing::PROCESSCOLORMODEL_RGB; 272 *color_model_for_color = PROCESSCOLORMODEL_RGB;
272 else if (ppdFindChoice(color_mode_option, printing::kCMYK)) 273 else if (ppdFindChoice(color_mode_option, kCMYK))
273 *color_model_for_color = printing::PROCESSCOLORMODEL_CMYK; 274 *color_model_for_color = PROCESSCOLORMODEL_CMYK;
274 275
275 if (ppdFindChoice(color_mode_option, printing::kGreyscale)) 276 if (ppdFindChoice(color_mode_option, kGreyscale))
276 *color_model_for_black = printing::PROCESSCOLORMODEL_GREYSCALE; 277 *color_model_for_black = PROCESSCOLORMODEL_GREYSCALE;
277 278
278 ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kProcessColorModel); 279 ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kProcessColorModel);
279 if (!mode_choice) { 280 if (!mode_choice) {
280 mode_choice = ppdFindChoice(color_mode_option, 281 mode_choice = ppdFindChoice(color_mode_option,
281 color_mode_option->defchoice); 282 color_mode_option->defchoice);
282 } 283 }
283 284
284 if (mode_choice) { 285 if (mode_choice) {
285 *color_is_default = !base::EqualsCaseInsensitiveASCII( 286 *color_is_default =
286 mode_choice->choice, printing::kGreyscale); 287 !base::EqualsCaseInsensitiveASCII(mode_choice->choice, kGreyscale);
287 } 288 }
288 return true; 289 return true;
289 } 290 }
290 291
291 bool GetColorModelSettings(ppd_file_t* ppd, 292 bool GetColorModelSettings(ppd_file_t* ppd,
292 ColorModel* cm_black, 293 ColorModel* cm_black,
293 ColorModel* cm_color, 294 ColorModel* cm_color,
294 bool* is_color) { 295 bool* is_color) {
295 bool is_color_device = false; 296 bool is_color_device = false;
296 ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, NULL); 297 ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, nullptr);
297 if (attr && attr->value) 298 if (attr && attr->value)
298 is_color_device = ppd->color_device; 299 is_color_device = ppd->color_device;
299 300
300 *is_color = is_color_device; 301 *is_color = is_color_device;
301 return (is_color_device && 302 return (is_color_device &&
302 GetBasicColorModelSettings(ppd, cm_black, cm_color, is_color)) || 303 GetBasicColorModelSettings(ppd, cm_black, cm_color, is_color)) ||
303 GetPrintOutModeColorSettings(ppd, cm_black, cm_color, is_color) || 304 GetPrintOutModeColorSettings(ppd, cm_black, cm_color, is_color) ||
304 GetColorModeSettings(ppd, cm_black, cm_color, is_color) || 305 GetColorModeSettings(ppd, cm_black, cm_color, is_color) ||
305 GetHPColorSettings(ppd, cm_black, cm_color, is_color) || 306 GetHPColorSettings(ppd, cm_black, cm_color, is_color) ||
306 GetProcessColorModelSettings(ppd, cm_black, cm_color, is_color); 307 GetProcessColorModelSettings(ppd, cm_black, cm_color, is_color);
307 } 308 }
308 309
309 // Default port for IPP print servers. 310 // Default port for IPP print servers.
310 const int kDefaultIPPServerPort = 631; 311 const int kDefaultIPPServerPort = 631;
311 312
312 } // namespace 313 } // namespace
313 314
314 // Helper wrapper around http_t structure, with connection and cleanup 315 // Helper wrapper around http_t structure, with connection and cleanup
315 // functionality. 316 // functionality.
316 HttpConnectionCUPS::HttpConnectionCUPS(const GURL& print_server_url, 317 HttpConnectionCUPS::HttpConnectionCUPS(const GURL& print_server_url,
317 http_encryption_t encryption) 318 http_encryption_t encryption)
318 : http_(NULL) { 319 : http_(nullptr) {
319 // If we have an empty url, use default print server. 320 // If we have an empty url, use default print server.
320 if (print_server_url.is_empty()) 321 if (print_server_url.is_empty())
321 return; 322 return;
322 323
323 int port = print_server_url.IntPort(); 324 int port = print_server_url.IntPort();
324 if (port == url::PORT_UNSPECIFIED) 325 if (port == url::PORT_UNSPECIFIED)
325 port = kDefaultIPPServerPort; 326 port = kDefaultIPPServerPort;
326 327
327 http_ = httpConnectEncrypt(print_server_url.host().c_str(), port, encryption); 328 http_ = httpConnectEncrypt(print_server_url.host().c_str(), port, encryption);
328 if (http_ == NULL) { 329 if (!http_) {
329 LOG(ERROR) << "CP_CUPS: Failed connecting to print server: " 330 LOG(ERROR) << "CP_CUPS: Failed connecting to print server: "
330 << print_server_url; 331 << print_server_url;
331 } 332 }
332 } 333 }
333 334
334 HttpConnectionCUPS::~HttpConnectionCUPS() { 335 HttpConnectionCUPS::~HttpConnectionCUPS() {
335 if (http_ != NULL) 336 if (http_)
336 httpClose(http_); 337 httpClose(http_);
337 } 338 }
338 339
339 void HttpConnectionCUPS::SetBlocking(bool blocking) { 340 void HttpConnectionCUPS::SetBlocking(bool blocking) {
340 httpBlocking(http_, blocking ? 1 : 0); 341 httpBlocking(http_, blocking ? 1 : 0);
341 } 342 }
342 343
343 http_t* HttpConnectionCUPS::http() { 344 http_t* HttpConnectionCUPS::http() {
344 return http_; 345 return http_;
345 } 346 }
346 347
347 bool ParsePpdCapabilities( 348 bool ParsePpdCapabilities(base::StringPiece printer_name,
348 const std::string& printer_name, 349 base::StringPiece printer_capabilities,
349 const std::string& printer_capabilities, 350 PrinterSemanticCapsAndDefaults* printer_info) {
350 PrinterSemanticCapsAndDefaults* printer_info) {
351 base::FilePath ppd_file_path; 351 base::FilePath ppd_file_path;
352 if (!base::CreateTemporaryFile(&ppd_file_path)) 352 if (!base::CreateTemporaryFile(&ppd_file_path))
353 return false; 353 return false;
354 354
355 int data_size = printer_capabilities.length(); 355 int data_size = printer_capabilities.length();
356 if (data_size != base::WriteFile( 356 if (data_size != base::WriteFile(
357 ppd_file_path, 357 ppd_file_path,
358 printer_capabilities.data(), 358 printer_capabilities.data(),
359 data_size)) { 359 data_size)) {
360 base::DeleteFile(ppd_file_path, false); 360 base::DeleteFile(ppd_file_path, false);
361 return false; 361 return false;
362 } 362 }
363 363
364 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str()); 364 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str());
365 if (!ppd) { 365 if (!ppd) {
366 int line = 0; 366 int line = 0;
367 ppd_status_t ppd_status = ppdLastError(&line); 367 ppd_status_t ppd_status = ppdLastError(&line);
368 LOG(ERROR) << "Failed to open PDD file: error " << ppd_status << " at line " 368 LOG(ERROR) << "Failed to open PDD file: error " << ppd_status << " at line "
369 << line << ", " << ppdErrorString(ppd_status); 369 << line << ", " << ppdErrorString(ppd_status);
370 return false; 370 return false;
371 } 371 }
372 ppdMarkDefaults(ppd); 372 ppdMarkDefaults(ppd);
373 MarkLpOptions(printer_name, &ppd); 373 MarkLpOptions(printer_name, &ppd);
374 374
375 printing::PrinterSemanticCapsAndDefaults caps; 375 PrinterSemanticCapsAndDefaults caps;
376 caps.collate_capable = true; 376 caps.collate_capable = true;
377 caps.collate_default = true; 377 caps.collate_default = true;
378 caps.copies_capable = true; 378 caps.copies_capable = true;
379 379
380 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex); 380 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex);
381 if (!duplex_choice) { 381 if (!duplex_choice) {
382 ppd_option_t* option = ppdFindOption(ppd, kDuplex); 382 ppd_option_t* option = ppdFindOption(ppd, kDuplex);
383 if (option) 383 if (option)
384 duplex_choice = ppdFindChoice(option, option->defchoice); 384 duplex_choice = ppdFindChoice(option, option->defchoice);
385 } 385 }
386 386
387 if (duplex_choice) { 387 if (duplex_choice) {
388 caps.duplex_capable = true; 388 caps.duplex_capable = true;
389 if (!base::EqualsCaseInsensitiveASCII(duplex_choice->choice, kDuplexNone)) 389 if (!base::EqualsCaseInsensitiveASCII(duplex_choice->choice, kDuplexNone))
390 caps.duplex_default = printing::LONG_EDGE; 390 caps.duplex_default = LONG_EDGE;
391 else 391 else
392 caps.duplex_default = printing::SIMPLEX; 392 caps.duplex_default = SIMPLEX;
393 } 393 }
394 394
395 bool is_color = false; 395 bool is_color = false;
396 ColorModel cm_color = UNKNOWN_COLOR_MODEL, cm_black = UNKNOWN_COLOR_MODEL; 396 ColorModel cm_color = UNKNOWN_COLOR_MODEL, cm_black = UNKNOWN_COLOR_MODEL;
397 if (!GetColorModelSettings(ppd, &cm_black, &cm_color, &is_color)) { 397 if (!GetColorModelSettings(ppd, &cm_black, &cm_color, &is_color)) {
398 VLOG(1) << "Unknown printer color model"; 398 VLOG(1) << "Unknown printer color model";
399 } 399 }
400 400
401 caps.color_changeable = ((cm_color != UNKNOWN_COLOR_MODEL) && 401 caps.color_changeable = ((cm_color != UNKNOWN_COLOR_MODEL) &&
402 (cm_black != UNKNOWN_COLOR_MODEL) && 402 (cm_black != UNKNOWN_COLOR_MODEL) &&
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 } 434 }
435 435
436 ppdClose(ppd); 436 ppdClose(ppd);
437 base::DeleteFile(ppd_file_path, false); 437 base::DeleteFile(ppd_file_path, false);
438 438
439 *printer_info = caps; 439 *printer_info = caps;
440 return true; 440 return true;
441 } 441 }
442 442
443 } // namespace printing 443 } // namespace printing
OLDNEW
« no previous file with comments | « printing/backend/cups_helper.h ('k') | printing/backend/cups_helper_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698