summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-16 23:02:15 +0000
committervitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-16 23:02:15 +0000
commitad3b050141388c16418bdabafac8a9e324ce7a5a (patch)
treebc9457658d7c49121ed52f3742d5f948cd731b22
parentd32c02a827060c757864e8053228886dd4910c61 (diff)
downloadchromium_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.cc9
-rw-r--r--printing/backend/print_backend_win.cc40
-rw-r--r--printing/printing_context_win.cc17
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.