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

Side by Side Diff: printing/printing_context_win.cc

Issue 47823002: De-duplicate job_settings parsing code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Noam's comments Created 7 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
« no previous file with comments | « printing/printing_context_win.h ('k') | no next file » | 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/printing_context_win.h" 5 #include "printing/printing_context_win.h"
6 6
7 #include <winspool.h> 7 #include <winspool.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 if (context_) 301 if (context_)
302 return OK; 302 return OK;
303 } 303 }
304 } 304 }
305 305
306 ResetSettings(); 306 ResetSettings();
307 return FAILED; 307 return FAILED;
308 } 308 }
309 309
310 PrintingContext::Result PrintingContextWin::UpdatePrinterSettings( 310 PrintingContext::Result PrintingContextWin::UpdatePrinterSettings(
311 const DictionaryValue& job_settings, 311 bool target_is_pdf,
312 const PageRanges& ranges) { 312 bool external_preview) {
313 DCHECK(!in_print_job_); 313 DCHECK(!in_print_job_);
314 DCHECK(!external_preview) << "Not implemented";
314 315
315 bool collate; 316 if (target_is_pdf) {
316 int color;
317 bool landscape;
318 bool print_to_pdf;
319 bool is_cloud_dialog;
320 int copies;
321 int duplex_mode;
322 base::string16 device_name;
323
324 if (!job_settings.GetBoolean(kSettingLandscape, &landscape) ||
325 !job_settings.GetBoolean(kSettingCollate, &collate) ||
326 !job_settings.GetInteger(kSettingColor, &color) ||
327 !job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf) ||
328 !job_settings.GetInteger(kSettingDuplexMode, &duplex_mode) ||
329 !job_settings.GetInteger(kSettingCopies, &copies) ||
330 !job_settings.GetString(kSettingDeviceName, &device_name) ||
331 !job_settings.GetBoolean(kSettingCloudPrintDialog, &is_cloud_dialog)) {
332 return OnError();
333 }
334
335 bool print_to_cloud = job_settings.HasKey(kSettingCloudPrintId);
336
337 if (print_to_pdf || print_to_cloud || is_cloud_dialog) {
338 // Default fallback to Letter size. 317 // Default fallback to Letter size.
339 gfx::Size paper_size; 318 gfx::Size paper_size;
340 gfx::Rect paper_rect; 319 gfx::Rect paper_rect;
341 paper_size.SetSize(kPDFLetterWidth, kPDFLetterHeight); 320 paper_size.SetSize(kPDFLetterWidth, kPDFLetterHeight);
342 321
343 // Get settings from locale. Paper type buffer length is at most 4. 322 // Get settings from locale. Paper type buffer length is at most 4.
344 const int paper_type_buffer_len = 4; 323 const int paper_type_buffer_len = 4;
345 wchar_t paper_type_buffer[paper_type_buffer_len] = {0}; 324 wchar_t paper_type_buffer[paper_type_buffer_len] = {0};
346 GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IPAPERSIZE, paper_type_buffer, 325 GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IPAPERSIZE, paper_type_buffer,
347 paper_type_buffer_len); 326 paper_type_buffer_len);
348 if (wcslen(paper_type_buffer)) { // The call succeeded. 327 if (wcslen(paper_type_buffer)) { // The call succeeded.
349 int paper_code = _wtoi(paper_type_buffer); 328 int paper_code = _wtoi(paper_type_buffer);
350 switch (paper_code) { 329 switch (paper_code) {
351 case DMPAPER_LEGAL: 330 case DMPAPER_LEGAL:
352 paper_size.SetSize(kPDFLegalWidth, kPDFLegalHeight); 331 paper_size.SetSize(kPDFLegalWidth, kPDFLegalHeight);
353 break; 332 break;
354 case DMPAPER_A4: 333 case DMPAPER_A4:
355 paper_size.SetSize(kPDFA4Width, kPDFA4Height); 334 paper_size.SetSize(kPDFA4Width, kPDFA4Height);
356 break; 335 break;
357 case DMPAPER_A3: 336 case DMPAPER_A3:
358 paper_size.SetSize(kPDFA3Width, kPDFA3Height); 337 paper_size.SetSize(kPDFA3Width, kPDFA3Height);
359 break; 338 break;
360 default: // DMPAPER_LETTER is used for default fallback. 339 default: // DMPAPER_LETTER is used for default fallback.
361 break; 340 break;
362 } 341 }
363 } 342 }
364 paper_rect.SetRect(0, 0, paper_size.width(), paper_size.height()); 343 paper_rect.SetRect(0, 0, paper_size.width(), paper_size.height());
365 settings_.SetPrinterPrintableArea(paper_size, paper_rect, kPDFDpi); 344 settings_.SetPrinterPrintableArea(paper_size, paper_rect, kPDFDpi, true);
366 settings_.set_dpi(kPDFDpi); 345 settings_.set_dpi(kPDFDpi);
367 settings_.SetOrientation(landscape);
368 settings_.ranges = ranges;
369 return OK; 346 return OK;
370 } 347 }
371 348
372 ScopedPrinterHandle printer; 349 ScopedPrinterHandle printer;
373 LPWSTR device_name_wide = const_cast<wchar_t*>(device_name.c_str()); 350 LPWSTR device_name_wide =
351 const_cast<wchar_t*>(settings_.device_name().c_str());
374 if (!printer.OpenPrinter(device_name_wide)) 352 if (!printer.OpenPrinter(device_name_wide))
375 return OnError(); 353 return OnError();
376 354
377 // Make printer changes local to Chrome. 355 // Make printer changes local to Chrome.
378 // See MSDN documentation regarding DocumentProperties. 356 // See MSDN documentation regarding DocumentProperties.
379 scoped_ptr<uint8[]> buffer; 357 scoped_ptr<uint8[]> buffer;
380 DEVMODE* dev_mode = NULL; 358 DEVMODE* dev_mode = NULL;
381 LONG buffer_size = DocumentProperties(NULL, printer, device_name_wide, 359 LONG buffer_size = DocumentProperties(NULL, printer, device_name_wide,
382 NULL, NULL, 0); 360 NULL, NULL, 0);
383 if (buffer_size > 0) { 361 if (buffer_size > 0) {
384 buffer.reset(new uint8[buffer_size]); 362 buffer.reset(new uint8[buffer_size]);
385 memset(buffer.get(), 0, buffer_size); 363 memset(buffer.get(), 0, buffer_size);
386 if (DocumentProperties(NULL, printer, device_name_wide, 364 if (DocumentProperties(NULL, printer, device_name_wide,
387 reinterpret_cast<PDEVMODE>(buffer.get()), NULL, 365 reinterpret_cast<PDEVMODE>(buffer.get()), NULL,
388 DM_OUT_BUFFER) == IDOK) { 366 DM_OUT_BUFFER) == IDOK) {
389 dev_mode = reinterpret_cast<PDEVMODE>(buffer.get()); 367 dev_mode = reinterpret_cast<PDEVMODE>(buffer.get());
390 } 368 }
391 } 369 }
392 if (dev_mode == NULL) { 370 if (dev_mode == NULL) {
393 buffer.reset(); 371 buffer.reset();
394 return OnError(); 372 return OnError();
395 } 373 }
396 374
397 if (color == GRAY) 375 if (settings_.color() == GRAY)
398 dev_mode->dmColor = DMCOLOR_MONOCHROME; 376 dev_mode->dmColor = DMCOLOR_MONOCHROME;
399 else 377 else
400 dev_mode->dmColor = DMCOLOR_COLOR; 378 dev_mode->dmColor = DMCOLOR_COLOR;
401 379
402 dev_mode->dmCopies = std::max(copies, 1); 380 dev_mode->dmCopies = std::max(settings_.copies(), 1);
403 if (dev_mode->dmCopies > 1) // do not change collate unless multiple copies 381 if (dev_mode->dmCopies > 1) { // do not change collate unless multiple copies
404 dev_mode->dmCollate = collate ? DMCOLLATE_TRUE : DMCOLLATE_FALSE; 382 dev_mode->dmCollate = settings_.collate() ? DMCOLLATE_TRUE :
405 switch (duplex_mode) { 383 DMCOLLATE_FALSE;
384 }
385 switch (settings_.duplex_mode()) {
406 case LONG_EDGE: 386 case LONG_EDGE:
407 dev_mode->dmDuplex = DMDUP_VERTICAL; 387 dev_mode->dmDuplex = DMDUP_VERTICAL;
408 break; 388 break;
409 case SHORT_EDGE: 389 case SHORT_EDGE:
410 dev_mode->dmDuplex = DMDUP_HORIZONTAL; 390 dev_mode->dmDuplex = DMDUP_HORIZONTAL;
411 break; 391 break;
412 case SIMPLEX: 392 case SIMPLEX:
413 dev_mode->dmDuplex = DMDUP_SIMPLEX; 393 dev_mode->dmDuplex = DMDUP_SIMPLEX;
414 break; 394 break;
415 default: // UNKNOWN_DUPLEX_MODE 395 default: // UNKNOWN_DUPLEX_MODE
416 break; 396 break;
417 } 397 }
418 dev_mode->dmOrientation = landscape ? DMORIENT_LANDSCAPE : DMORIENT_PORTRAIT; 398 dev_mode->dmOrientation = settings_.landscape() ? DMORIENT_LANDSCAPE :
399 DMORIENT_PORTRAIT;
419 400
420 // Update data using DocumentProperties. 401 // Update data using DocumentProperties.
421 if (DocumentProperties(NULL, printer, device_name_wide, dev_mode, dev_mode, 402 if (DocumentProperties(NULL, printer, device_name_wide, dev_mode, dev_mode,
422 DM_IN_BUFFER | DM_OUT_BUFFER) != IDOK) { 403 DM_IN_BUFFER | DM_OUT_BUFFER) != IDOK) {
423 return OnError(); 404 return OnError();
424 } 405 }
425 406
426 // Set printer then refresh printer settings. 407 // Set printer then refresh printer settings.
427 if (!AllocateContext(device_name, dev_mode, &context_)) { 408 if (!AllocateContext(settings_.device_name(), dev_mode, &context_)) {
428 return OnError(); 409 return OnError();
429 } 410 }
430 PrintSettingsInitializerWin::InitPrintSettings(context_, *dev_mode, 411 PrintSettingsInitializerWin::InitPrintSettings(context_, *dev_mode,
431 ranges, device_name, 412 &settings_);
432 false, &settings_);
433 return OK; 413 return OK;
434 } 414 }
435 415
436 PrintingContext::Result PrintingContextWin::InitWithSettings( 416 PrintingContext::Result PrintingContextWin::InitWithSettings(
437 const PrintSettings& settings) { 417 const PrintSettings& settings) {
438 DCHECK(!in_print_job_); 418 DCHECK(!in_print_job_);
439 419
440 settings_ = settings; 420 settings_ = settings;
441 421
442 // TODO(maruel): settings_.ToDEVMODE() 422 // TODO(maruel): settings_.ToDEVMODE()
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 ranges_vector.reserve(number_ranges); 599 ranges_vector.reserve(number_ranges);
620 for (int i = 0; i < number_ranges; ++i) { 600 for (int i = 0; i < number_ranges; ++i) {
621 PageRange range; 601 PageRange range;
622 // Transfer from 1-based to 0-based. 602 // Transfer from 1-based to 0-based.
623 range.from = ranges[i].nFromPage - 1; 603 range.from = ranges[i].nFromPage - 1;
624 range.to = ranges[i].nToPage - 1; 604 range.to = ranges[i].nToPage - 1;
625 ranges_vector.push_back(range); 605 ranges_vector.push_back(range);
626 } 606 }
627 } 607 }
628 608
629 PrintSettingsInitializerWin::InitPrintSettings(context_, 609 settings_.set_ranges(ranges_vector);
630 dev_mode, 610 settings_.set_device_name(new_device_name);
631 ranges_vector, 611 settings_.set_selection_only(selection_only);
632 new_device_name, 612 PrintSettingsInitializerWin::InitPrintSettings(context_, dev_mode,
633 selection_only,
634 &settings_); 613 &settings_);
635 614
636 return true; 615 return true;
637 } 616 }
638 617
639 bool PrintingContextWin::GetPrinterSettings(HANDLE printer, 618 bool PrintingContextWin::GetPrinterSettings(HANDLE printer,
640 const std::wstring& device_name) { 619 const std::wstring& device_name) {
641 DCHECK(!in_print_job_); 620 DCHECK(!in_print_job_);
642 621
643 UserDefaultDevMode user_settings; 622 UserDefaultDevMode user_settings;
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 762
784 if (dialog_options.hDevMode != NULL) 763 if (dialog_options.hDevMode != NULL)
785 GlobalFree(dialog_options.hDevMode); 764 GlobalFree(dialog_options.hDevMode);
786 if (dialog_options.hDevNames != NULL) 765 if (dialog_options.hDevNames != NULL)
787 GlobalFree(dialog_options.hDevNames); 766 GlobalFree(dialog_options.hDevNames);
788 767
789 return context_ ? OK : FAILED; 768 return context_ ? OK : FAILED;
790 } 769 }
791 770
792 } // namespace printing 771 } // namespace printing
OLDNEW
« no previous file with comments | « printing/printing_context_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698