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

Side by Side Diff: chrome/browser/ui/webui/print_preview_handler.cc

Issue 7859007: Reland 100233 PrintPreview: Added code to identify the printer default duplex value. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Initialize cups_duplex_mode in print_dialog_gtk.cc Created 9 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/ui/webui/print_preview_handler.h" 5 #include "chrome/browser/ui/webui/print_preview_handler.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #if !defined(OS_CHROMEOS) 10 #if !defined(OS_CHROMEOS)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 52
53 #include "base/file_util.h" 53 #include "base/file_util.h"
54 #endif 54 #endif
55 55
56 namespace { 56 namespace {
57 57
58 const char kDisableColorOption[] = "disableColorOption"; 58 const char kDisableColorOption[] = "disableColorOption";
59 const char kSetColorAsDefault[] = "setColorAsDefault"; 59 const char kSetColorAsDefault[] = "setColorAsDefault";
60 const char kSetDuplexAsDefault[] = "setDuplexAsDefault"; 60 const char kSetDuplexAsDefault[] = "setDuplexAsDefault";
61 const char kPrinterColorModelForColor[] = "printerColorModelForColor"; 61 const char kPrinterColorModelForColor[] = "printerColorModelForColor";
62 const char kPrinterDefaultDuplexValue[] = "printerDefaultDuplexValue";
62 63
63 #if defined(USE_CUPS) 64 #if defined(USE_CUPS)
64 const char kColorDevice[] = "ColorDevice"; 65 const char kColorDevice[] = "ColorDevice";
65 const char kColorModel[] = "ColorModel"; 66 const char kColorModel[] = "ColorModel";
66 const char kColorModelForColor[] = "Color"; 67 const char kColorModelForColor[] = "Color";
67 const char kCMYK[] = "CMYK"; 68 const char kCMYK[] = "CMYK";
68 const char kDuplex[] = "Duplex"; 69 const char kDuplex[] = "Duplex";
69 const char kDuplexNone[] = "None"; 70 const char kDuplexNone[] = "None";
70 #elif defined(OS_WIN) 71 #elif defined(OS_WIN)
71 const char kPskColor[] = "psk:Color"; 72 const char kPskColor[] = "psk:Color";
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 } 275 }
275 delete printers; 276 delete printers;
276 } 277 }
277 278
278 void GetPrinterCapabilities(const std::string& printer_name) { 279 void GetPrinterCapabilities(const std::string& printer_name) {
279 VLOG(1) << "Get printer capabilities start for " << printer_name; 280 VLOG(1) << "Get printer capabilities start for " << printer_name;
280 printing::PrinterCapsAndDefaults printer_info; 281 printing::PrinterCapsAndDefaults printer_info;
281 bool supports_color = true; 282 bool supports_color = true;
282 bool set_duplex_as_default = false; 283 bool set_duplex_as_default = false;
283 int printer_color_space = printing::GRAY; 284 int printer_color_space = printing::GRAY;
285 int default_duplex_setting_value = printing::UNKNOWN_DUPLEX_MODE;
284 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name, 286 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name,
285 &printer_info)) { 287 &printer_info)) {
286 return; 288 return;
287 } 289 }
288 290
289 #if defined(USE_CUPS) 291 #if defined(USE_CUPS)
290 FilePath ppd_file_path; 292 FilePath ppd_file_path;
291 if (!file_util::CreateTemporaryFile(&ppd_file_path)) 293 if (!file_util::CreateTemporaryFile(&ppd_file_path))
292 return; 294 return;
293 295
294 int data_size = printer_info.printer_capabilities.length(); 296 int data_size = printer_info.printer_capabilities.length();
295 if (data_size != file_util::WriteFile( 297 if (data_size != file_util::WriteFile(
296 ppd_file_path, 298 ppd_file_path,
297 printer_info.printer_capabilities.data(), 299 printer_info.printer_capabilities.data(),
298 data_size)) { 300 data_size)) {
299 file_util::Delete(ppd_file_path, false); 301 file_util::Delete(ppd_file_path, false);
300 return; 302 return;
301 } 303 }
302 304
303 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str()); 305 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str());
304 if (ppd) { 306 if (ppd) {
305 ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, NULL); 307 ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, NULL);
306 if (attr && attr->value) 308 if (attr && attr->value)
307 supports_color = ppd->color_device; 309 supports_color = ppd->color_device;
308 310
309 ppd_choice_t* ch = ppdFindMarkedChoice(ppd, kDuplex); 311 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex);
310 if (ch == NULL) { 312 if (duplex_choice == NULL) {
311 ppd_option_t* option = ppdFindOption(ppd, kDuplex); 313 ppd_option_t* option = ppdFindOption(ppd, kDuplex);
312 if (option != NULL) 314 if (option != NULL)
313 ch = ppdFindChoice(option, option->defchoice); 315 duplex_choice = ppdFindChoice(option, option->defchoice);
314 } 316 }
315 317
316 if (ch != NULL && strcmp(ch->choice, kDuplexNone) != 0) 318 if (duplex_choice != NULL &&
319 strcmp(duplex_choice->choice, kDuplexNone) != 0)
317 set_duplex_as_default = true; 320 set_duplex_as_default = true;
318 321
322 if (duplex_choice != NULL) {
323 if (strcmp(duplex_choice->choice, kDuplexNone) != 0)
324 default_duplex_setting_value = printing::LONG_EDGE;
325 else
326 default_duplex_setting_value = printing::SIMPLEX;
327 }
328
319 if (supports_color) { 329 if (supports_color) {
320 // Identify the color space (COLOR/CMYK) for this printer. 330 // Identify the color space (COLOR/CMYK) for this printer.
321 ppd_option_t* color_model = ppdFindOption(ppd, kColorModel); 331 ppd_option_t* color_model = ppdFindOption(ppd, kColorModel);
322 if (color_model != NULL) { 332 if (color_model != NULL) {
323 if (ppdFindChoice(color_model, kColorModelForColor)) 333 if (ppdFindChoice(color_model, kColorModelForColor))
324 printer_color_space = printing::COLOR; 334 printer_color_space = printing::COLOR;
325 else if (ppdFindChoice(color_model, kCMYK)) 335 else if (ppdFindChoice(color_model, kCMYK))
326 printer_color_space = printing::CMYK; 336 printer_color_space = printing::CMYK;
327 } 337 }
328 } 338 }
329
330 ppdClose(ppd); 339 ppdClose(ppd);
331 } 340 }
332 file_util::Delete(ppd_file_path, false); 341 file_util::Delete(ppd_file_path, false);
333 #elif defined(OS_WIN) 342 #elif defined(OS_WIN)
334 // According to XPS 1.0 spec, only color printers have psk:Color. 343 // According to XPS 1.0 spec, only color printers have psk:Color.
335 // Therefore we don't need to parse the whole XML file, we just need to 344 // Therefore we don't need to parse the whole XML file, we just need to
336 // search the string. The spec can be found at: 345 // search the string. The spec can be found at:
337 // http://msdn.microsoft.com/en-us/windows/hardware/gg463431. 346 // http://msdn.microsoft.com/en-us/windows/hardware/gg463431.
338 supports_color = (printer_info.printer_capabilities.find(kPskColor) != 347 supports_color = (printer_info.printer_capabilities.find(kPskColor) !=
339 std::string::npos); 348 std::string::npos);
340 if (supports_color) 349 if (supports_color)
341 printer_color_space = printing::COLOR; 350 printer_color_space = printing::COLOR;
342 351
343 set_duplex_as_default = 352 set_duplex_as_default =
344 (printer_info.printer_defaults.find(kPskDuplexFeature) != 353 (printer_info.printer_defaults.find(kPskDuplexFeature) !=
345 std::string::npos) && 354 std::string::npos) &&
346 (printer_info.printer_defaults.find(kPskTwoSided) != 355 (printer_info.printer_defaults.find(kPskTwoSided) !=
347 std::string::npos); 356 std::string::npos);
357
358 if (printer_info.printer_defaults.find(kPskDuplexFeature) !=
359 std::string::npos) {
360 if (printer_info.printer_defaults.find(kPskTwoSided) !=
361 std::string::npos) {
362 default_duplex_setting_value = printing::LONG_EDGE;
363 } else {
364 default_duplex_setting_value = printing::SIMPLEX;
365 }
366 }
348 #else 367 #else
349 NOTIMPLEMENTED(); 368 NOTIMPLEMENTED();
350 #endif 369 #endif
351 370
352 DictionaryValue settings_info; 371 DictionaryValue settings_info;
353 settings_info.SetBoolean(kDisableColorOption, !supports_color); 372 settings_info.SetBoolean(kDisableColorOption, !supports_color);
354 if (!supports_color) { 373 if (!supports_color) {
355 settings_info.SetBoolean(kSetColorAsDefault, false); 374 settings_info.SetBoolean(kSetColorAsDefault, false);
356 } else { 375 } else {
357 settings_info.SetBoolean(kSetColorAsDefault, 376 settings_info.SetBoolean(kSetColorAsDefault,
358 PrintPreviewHandler::last_used_color_setting_); 377 PrintPreviewHandler::last_used_color_setting_);
359 } 378 }
360 settings_info.SetBoolean(kSetDuplexAsDefault, set_duplex_as_default); 379 settings_info.SetBoolean(kSetDuplexAsDefault, set_duplex_as_default);
361 settings_info.SetInteger(kPrinterColorModelForColor, printer_color_space); 380 settings_info.SetInteger(kPrinterColorModelForColor, printer_color_space);
381 settings_info.SetInteger(kPrinterDefaultDuplexValue,
382 default_duplex_setting_value);
362 BrowserThread::PostTask( 383 BrowserThread::PostTask(
363 BrowserThread::UI, FROM_HERE, 384 BrowserThread::UI, FROM_HERE,
364 NewRunnableMethod(this, 385 NewRunnableMethod(this,
365 &PrintSystemTaskProxy::SendPrinterCapabilities, 386 &PrintSystemTaskProxy::SendPrinterCapabilities,
366 settings_info.DeepCopy())); 387 settings_info.DeepCopy()));
367 } 388 }
368 389
369 void SendPrinterCapabilities(DictionaryValue* settings_info) { 390 void SendPrinterCapabilities(DictionaryValue* settings_info) {
370 if (handler_) 391 if (handler_)
371 handler_->SendPrinterCapabilities(*settings_info); 392 handler_->SendPrinterCapabilities(*settings_info);
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 return; 1019 return;
999 1020
1000 // We no longer require the initiator tab details. Remove those details 1021 // We no longer require the initiator tab details. Remove those details
1001 // associated with the preview tab to allow the initiator tab to create 1022 // associated with the preview tab to allow the initiator tab to create
1002 // another preview tab. 1023 // another preview tab.
1003 printing::PrintPreviewTabController* tab_controller = 1024 printing::PrintPreviewTabController* tab_controller =
1004 printing::PrintPreviewTabController::GetInstance(); 1025 printing::PrintPreviewTabController::GetInstance();
1005 if (tab_controller) 1026 if (tab_controller)
1006 tab_controller->EraseInitiatorTabInfo(preview_tab_wrapper()); 1027 tab_controller->EraseInitiatorTabInfo(preview_tab_wrapper());
1007 } 1028 }
OLDNEW
« no previous file with comments | « chrome/browser/resources/print_preview/print_preview.js ('k') | chrome/test/data/webui/print_preview.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698