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 |