diff options
author | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-16 23:02:15 +0000 |
---|---|---|
committer | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-16 23:02:15 +0000 |
commit | ad3b050141388c16418bdabafac8a9e324ce7a5a (patch) | |
tree | bc9457658d7c49121ed52f3742d5f948cd731b22 | |
parent | d32c02a827060c757864e8053228886dd4910c61 (diff) | |
download | chromium_src-ad3b050141388c16418bdabafac8a9e324ce7a5a.zip chromium_src-ad3b050141388c16418bdabafac8a9e324ce7a5a.tar.gz chromium_src-ad3b050141388c16418bdabafac8a9e324ce7a5a.tar.bz2 |
Add paper size support for local printing on Windows.
Set windows paper is as ventor_id.
Use windows paper id in Cloud Print Connector.
BUG=239879,382338
Review URL: https://codereview.chromium.org/333993003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@277562 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/service/cloud_print/cdd_conversion_win.cc | 9 | ||||
-rw-r--r-- | printing/backend/print_backend_win.cc | 40 | ||||
-rw-r--r-- | printing/printing_context_win.cc | 17 |
3 files changed, 42 insertions, 24 deletions
diff --git a/chrome/service/cloud_print/cdd_conversion_win.cc b/chrome/service/cloud_print/cdd_conversion_win.cc index bfcb920..4ab9c46 100644 --- a/chrome/service/cloud_print/cdd_conversion_win.cc +++ b/chrome/service/cloud_print/cdd_conversion_win.cc @@ -4,6 +4,7 @@ #include "chrome/service/cloud_print/cdd_conversion_win.h" +#include "base/strings/string_number_conversions.h" #include "components/cloud_devices/common/printer_description.h" #include "printing/backend/win_helper.h" @@ -111,11 +112,13 @@ scoped_ptr<DEVMODE, base::FreeDeleter> CjtToDevMode( static const size_t kFromUm = 100; // Windows uses 0.1mm. int width = media.value().width_um / kFromUm; int height = media.value().height_um / kFromUm; - if (width > 0) { + unsigned id = 0; + if (base::StringToUint(media.value().vendor_id, &id) && id) { + dev_mode->dmFields |= DM_PAPERSIZE; + dev_mode->dmPaperSize = static_cast<short>(id); + } else if (width > 0 && height > 0) { dev_mode->dmFields |= DM_PAPERWIDTH; dev_mode->dmPaperWidth = width; - } - if (height > 0) { dev_mode->dmFields |= DM_PAPERLENGTH; dev_mode->dmPaperLength = height; } diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc index 287a1f0..a8139f3 100644 --- a/printing/backend/print_backend_win.cc +++ b/printing/backend/print_backend_win.cc @@ -9,6 +9,7 @@ #include "base/memory/scoped_ptr.h" #include "base/numerics/safe_conversions.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" #include "base/win/scoped_bstr.h" @@ -95,37 +96,34 @@ void LoadPaper(const wchar_t* printer, tmp_name = tmp_name.c_str(); paper.display_name = base::WideToUTF8(tmp_name); } + if (!ids.empty()) + paper.vendor_id = base::UintToString(ids[i]); caps->papers.push_back(paper); } if (devmode) { - short default_id = 0; - gfx::Size default_size; + // Copy paper with the same ID as default paper. + if (devmode->dmFields & DM_PAPERSIZE) { + for (size_t i = 0; i < ids.size(); ++i) { + if (ids[i] == devmode->dmPaperSize) { + DCHECK_EQ(ids.size(), caps->papers.size()); + caps->default_paper = caps->papers[i]; + break; + } + } + } - if (devmode->dmFields & DM_PAPERSIZE) - default_id = devmode->dmPaperSize; + gfx::Size default_size; if (devmode->dmFields & DM_PAPERWIDTH) default_size.set_width(devmode->dmPaperWidth * kToUm); if (devmode->dmFields & DM_PAPERLENGTH) default_size.set_height(devmode->dmPaperLength * kToUm); - if (default_size.IsEmpty()) { - for (size_t i = 0; i < ids.size(); ++i) { - if (ids[i] == default_id) { - PrinterSemanticCapsAndDefaults::Paper paper; - paper.size_um.SetSize(sizes[i].x * kToUm, sizes[i].y * kToUm); - if (!names.empty()) { - const wchar_t* name_start = names[i].chars; - base::string16 tmp_name(name_start, kMaxPaperName); - // Trim trailing zeros. - tmp_name = tmp_name.c_str(); - paper.display_name = base::WideToUTF8(tmp_name); - } - caps->default_paper = paper; - break; - } - } - } else { + if (!default_size.IsEmpty()) { + // Reset default paper if |dmPaperWidth| or |dmPaperLength| does not + // match default paper set by. + if (default_size != caps->default_paper.size_um) + caps->default_paper = PrinterSemanticCapsAndDefaults::Paper(); caps->default_paper.size_um = default_size; } } diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index 6d81cd9..b32b3d2 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -10,6 +10,7 @@ #include "base/message_loop/message_loop.h" #include "base/metrics/histogram.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "printing/backend/print_backend.h" @@ -343,6 +344,22 @@ PrintingContext::Result PrintingContextWin::UpdatePrinterSettings( dev_mode->dmFields |= DM_ORIENTATION; dev_mode->dmOrientation = settings_.landscape() ? DMORIENT_LANDSCAPE : DMORIENT_PORTRAIT; + + const PrintSettings::RequestedMedia& requested_media = + settings_.requested_media(); + static const int kFromUm = 100; // Windows uses 0.1mm. + int width = requested_media.size_microns.width() / kFromUm; + int height = requested_media.size_microns.height() / kFromUm; + unsigned id = 0; + if (base::StringToUint(requested_media.vendor_id, &id) && id) { + dev_mode->dmFields |= DM_PAPERSIZE; + dev_mode->dmPaperSize = static_cast<short>(id); + } else if (width > 0 && height > 0) { + dev_mode->dmFields |= DM_PAPERWIDTH; + dev_mode->dmPaperWidth = width; + dev_mode->dmFields |= DM_PAPERLENGTH; + dev_mode->dmPaperLength = height; + } } // Update data using DocumentProperties. |