| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |