summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/service/cloud_print/cdd_conversion_win.cc2
-rw-r--r--chrome/service/cloud_print/print_system_win.cc2
-rw-r--r--printing/backend/print_backend_win.cc13
-rw-r--r--printing/backend/printing_info_win.cc19
-rw-r--r--printing/backend/printing_info_win.h25
-rw-r--r--printing/backend/win_helper.cc2
-rw-r--r--printing/backend/win_helper.h5
-rw-r--r--printing/printing_context_win.cc41
-rw-r--r--printing/printing_context_win_unittest.cc35
9 files changed, 91 insertions, 53 deletions
diff --git a/chrome/service/cloud_print/cdd_conversion_win.cc b/chrome/service/cloud_print/cdd_conversion_win.cc
index b57ae90..f71ed64 100644
--- a/chrome/service/cloud_print/cdd_conversion_win.cc
+++ b/chrome/service/cloud_print/cdd_conversion_win.cc
@@ -23,7 +23,7 @@ scoped_ptr<DEVMODE[]> CjtToDevMode(const base::string16& printer_name,
return scoped_ptr<DEVMODE[]>();
printing::ScopedPrinterHandle printer;
- if (!printer.OpenPrinter(printer_name))
+ if (!printer.OpenPrinter(printer_name.c_str()))
return scoped_ptr<DEVMODE[]>();
scoped_ptr<DEVMODE[]> scoped_dev_mode;
diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc
index 56a4425..8d585d3 100644
--- a/chrome/service/cloud_print/print_system_win.cc
+++ b/chrome/service/cloud_print/print_system_win.cc
@@ -756,7 +756,7 @@ bool PrintSystemWin::GetJobDetails(const std::string& printer_name,
DCHECK(job_details);
printing::ScopedPrinterHandle printer_handle;
std::wstring printer_name_wide = base::UTF8ToWide(printer_name);
- printer_handle.OpenPrinter(printer_name_wide);
+ printer_handle.OpenPrinter(printer_name_wide.c_str());
DCHECK(printer_handle.IsValid());
bool ret = false;
if (printer_handle.IsValid()) {
diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc
index ec52c99..b23407c 100644
--- a/printing/backend/print_backend_win.cc
+++ b/printing/backend/print_backend_win.cc
@@ -213,7 +213,7 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults(
const std::string& printer_name,
PrinterSemanticCapsAndDefaults* printer_info) {
ScopedPrinterHandle printer_handle;
- if (!printer_handle.OpenPrinter(base::UTF8ToWide(printer_name))) {
+ if (!printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) {
LOG(WARNING) << "Failed to open printer, error = " << GetLastError();
return false;
}
@@ -226,9 +226,8 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults(
DCHECK_EQ(name, base::UTF8ToUTF16(printer_name));
PrinterSemanticCapsAndDefaults caps;
-
- scoped_ptr<DEVMODE[]> user_settings = CreateDevMode(printer_handle, NULL);
- if (user_settings) {
+ UserDefaultDevMode user_settings;
+ if (user_settings.Init(printer_handle)) {
if (user_settings.get()->dmFields & DM_COLOR)
caps.color_default = (user_settings.get()->dmColor == DMCOLOR_COLOR);
@@ -313,7 +312,7 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults(
printer_info->caps_mime_type = "text/xml";
}
ScopedPrinterHandle printer_handle;
- if (printer_handle.OpenPrinter(printer_name_wide)) {
+ if (printer_handle.OpenPrinter(printer_name_wide.c_str())) {
scoped_ptr<DEVMODE[]> devmode_out(CreateDevMode(printer_handle, NULL));
if (!devmode_out)
return false;
@@ -344,7 +343,7 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults(
std::string PrintBackendWin::GetPrinterDriverInfo(
const std::string& printer_name) {
ScopedPrinterHandle printer;
- if (!printer.OpenPrinter(base::UTF8ToWide(printer_name))) {
+ if (!printer.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) {
return std::string();
}
return GetDriverInfo(printer);
@@ -352,7 +351,7 @@ std::string PrintBackendWin::GetPrinterDriverInfo(
bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) {
ScopedPrinterHandle printer_handle;
- return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name));
+ return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str());
}
scoped_refptr<PrintBackend> PrintBackend::CreateInstance(
diff --git a/printing/backend/printing_info_win.cc b/printing/backend/printing_info_win.cc
index e759639..0e45094 100644
--- a/printing/backend/printing_info_win.cc
+++ b/printing/backend/printing_info_win.cc
@@ -44,4 +44,23 @@ uint8* GetPrinterInfo(HANDLE printer, int level) {
} // namespace internal
+UserDefaultDevMode::UserDefaultDevMode() : dev_mode_(NULL) {
+}
+
+bool UserDefaultDevMode::Init(HANDLE printer) {
+ if (info_9_.Init(printer))
+ dev_mode_ = info_9_.get()->pDevMode;
+
+ if (!dev_mode_ && info_8_.Init(printer))
+ dev_mode_ = info_8_.get()->pDevMode;
+
+ if (!dev_mode_ && info_2_.Init(printer))
+ dev_mode_ = info_2_.get()->pDevMode;
+
+ return dev_mode_ != NULL;
+}
+
+UserDefaultDevMode::~UserDefaultDevMode() {
+}
+
} // namespace printing
diff --git a/printing/backend/printing_info_win.h b/printing/backend/printing_info_win.h
index 1134194..931ae6d 100644
--- a/printing/backend/printing_info_win.h
+++ b/printing/backend/printing_info_win.h
@@ -58,9 +58,34 @@ class DriverInfo {
typedef internal::PrinterInfo<PRINTER_INFO_2, 2> PrinterInfo2;
typedef internal::PrinterInfo<PRINTER_INFO_5, 5> PrinterInfo5;
+typedef internal::PrinterInfo<PRINTER_INFO_8, 8> PrinterInfo8;
+typedef internal::PrinterInfo<PRINTER_INFO_9, 9> PrinterInfo9;
typedef internal::DriverInfo<DRIVER_INFO_6, 6> DriverInfo6;
+// Retrieves DEVMODE from PRINTER_INFO_* structures.
+// Requests in following order:
+// 9 (user-default),
+// 8 (admin-default),
+// 2 (printer-default).
+class PRINTING_EXPORT UserDefaultDevMode {
+ public:
+ UserDefaultDevMode();
+ ~UserDefaultDevMode();
+
+ bool Init(HANDLE printer);
+
+ const DEVMODE* get() const {
+ return dev_mode_;
+ }
+
+ private:
+ PrinterInfo2 info_2_;
+ PrinterInfo8 info_8_;
+ PrinterInfo9 info_9_;
+ const DEVMODE* dev_mode_;
+};
+
} // namespace printing
#endif // PRINTING_BACKEND_PRINTING_INFO_WIN_H_
diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc
index 53ccf58..a16228b 100644
--- a/printing/backend/win_helper.cc
+++ b/printing/backend/win_helper.cc
@@ -395,7 +395,7 @@ scoped_ptr<DEVMODE[]> XpsTicketToDevMode(const base::string16& printer_name,
}
printing::ScopedPrinterHandle printer;
- if (!printer.OpenPrinter(printer_name))
+ if (!printer.OpenPrinter(printer_name.c_str()))
return scoped_dev_mode.Pass();
base::win::ScopedComPtr<IStream> pt_stream;
diff --git a/printing/backend/win_helper.h b/printing/backend/win_helper.h
index ef407b3..9b998d7 100644
--- a/printing/backend/win_helper.h
+++ b/printing/backend/win_helper.h
@@ -46,11 +46,10 @@ class ScopedPrinterHandle
: public base::win::GenericScopedHandle<PrinterHandleTraits,
base::win::VerifierTraits> {
public:
- bool OpenPrinter(const base::string16& printer) {
+ bool OpenPrinter(const wchar_t* printer) {
HANDLE temp_handle;
// ::OpenPrinter may return error but assign some value into handle.
- if (::OpenPrinter(const_cast<wchar_t*>(printer.c_str()), &temp_handle,
- NULL)) {
+ if (::OpenPrinter(const_cast<LPTSTR>(printer), &temp_handle, NULL)) {
Set(temp_handle);
}
return IsValid();
diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc
index 2c4b290..fbadfe4 100644
--- a/printing/printing_context_win.cc
+++ b/printing/printing_context_win.cc
@@ -269,7 +269,7 @@ PrintingContext::Result PrintingContextWin::UseDefaultSettings() {
(void)::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,
NULL, 2, NULL, 0, &bytes_needed, &count_returned);
if (bytes_needed) {
- DCHECK_GE(bytes_needed, count_returned * sizeof(PRINTER_INFO_2));
+ DCHECK(bytes_needed >= count_returned * sizeof(PRINTER_INFO_2));
scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]);
BOOL ret = ::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,
NULL, 2, printer_info_buffer.get(),
@@ -277,21 +277,17 @@ PrintingContext::Result PrintingContextWin::UseDefaultSettings() {
&count_returned);
if (ret && count_returned) { // have printers
// Open the first successfully found printer.
- const PRINTER_INFO_2* info_2 =
- reinterpret_cast<PRINTER_INFO_2*>(printer_info_buffer.get());
- const PRINTER_INFO_2* info_2_end = info_2 + count_returned;
- for (; info_2 < info_2_end; ++info_2) {
- ScopedPrinterHandle printer;
- if (!printer.OpenPrinter(info_2->pPrinterName))
+ for (DWORD count = 0; count < count_returned; ++count) {
+ PRINTER_INFO_2* info_2 = reinterpret_cast<PRINTER_INFO_2*>(
+ printer_info_buffer.get() + count * sizeof(PRINTER_INFO_2));
+ std::wstring printer_name = info_2->pPrinterName;
+ if (info_2->pDevMode == NULL || printer_name.length() == 0)
continue;
- scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL);
- if (!dev_mode || !AllocateContext(info_2->pPrinterName, dev_mode.get(),
- &context_)) {
- continue;
- }
- if (InitializeSettings(*dev_mode.get(), info_2->pPrinterName, NULL, 0,
- false)) {
- return OK;
+ if (!AllocateContext(printer_name, info_2->pDevMode, &context_))
+ break;
+ if (InitializeSettings(*info_2->pDevMode, printer_name,
+ NULL, 0, false)) {
+ break;
}
ReleaseContext();
}
@@ -340,13 +336,15 @@ PrintingContext::Result PrintingContextWin::UpdatePrinterSettings(
DCHECK(!external_preview) << "Not implemented";
ScopedPrinterHandle printer;
- if (!printer.OpenPrinter(settings_.device_name()))
+ LPWSTR device_name_wide =
+ const_cast<wchar_t*>(settings_.device_name().c_str());
+ if (!printer.OpenPrinter(device_name_wide))
return OnError();
// Make printer changes local to Chrome.
// See MSDN documentation regarding DocumentProperties.
scoped_ptr<DEVMODE[]> scoped_dev_mode =
- CreateDevModeWithColor(printer, settings_.device_name(),
+ CreateDevModeWithColor(printer, device_name_wide,
settings_.color() != GRAY);
if (!scoped_dev_mode)
return OnError();
@@ -406,7 +404,7 @@ PrintingContext::Result PrintingContextWin::InitWithSettings(
// TODO(maruel): settings_.ToDEVMODE()
ScopedPrinterHandle printer;
- if (!printer.OpenPrinter(settings_.device_name())) {
+ if (!printer.OpenPrinter(settings_.device_name().c_str())) {
return FAILED;
}
@@ -590,14 +588,15 @@ bool PrintingContextWin::GetPrinterSettings(HANDLE printer,
const std::wstring& device_name) {
DCHECK(!in_print_job_);
- scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL);
+ UserDefaultDevMode user_settings;
- if (!dev_mode || !AllocateContext(device_name, dev_mode.get(), &context_)) {
+ if (!user_settings.Init(printer) ||
+ !AllocateContext(device_name, user_settings.get(), &context_)) {
ResetSettings();
return false;
}
- return InitializeSettings(*dev_mode.get(), device_name, NULL, 0, false);
+ return InitializeSettings(*user_settings.get(), device_name, NULL, 0, false);
}
// static
diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc
index b28d996..0590229 100644
--- a/printing/printing_context_win_unittest.cc
+++ b/printing/printing_context_win_unittest.cc
@@ -12,27 +12,24 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "printing/backend/printing_info_win.h"
-#include "printing/backend/win_helper.h"
#include "printing/printing_test.h"
#include "printing/printing_context.h"
#include "printing/printing_context_win.h"
#include "printing/print_settings.h"
#include "testing/gtest/include/gtest/gtest.h"
-namespace printing {
-
// This test is automatically disabled if no printer is available.
class PrintingContextTest : public PrintingTest<testing::Test> {
public:
- void PrintSettingsCallback(PrintingContext::Result result) {
+ void PrintSettingsCallback(printing::PrintingContext::Result result) {
result_ = result;
}
protected:
- PrintingContext::Result result() const { return result_; }
+ printing::PrintingContext::Result result() const { return result_; }
private:
- PrintingContext::Result result_;
+ printing::PrintingContext::Result result_;
};
// This is a fake PrintDlgEx implementation that sets the right fields in
@@ -49,9 +46,9 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) {
lppd->lpPageRanges[0].nToPage = 5;
// Painful paperwork.
- base::string16 printer_name = PrintingContextTest::GetDefaultPrinter();
- ScopedPrinterHandle printer;
- if (!printer.OpenPrinter(printer_name))
+ std::wstring printer_name = PrintingContextTest::GetDefaultPrinter();
+ HANDLE printer;
+ if (!OpenPrinter(const_cast<wchar_t*>(printer_name.c_str()), &printer, NULL))
return E_FAIL;
scoped_ptr<uint8[]> buffer;
@@ -61,7 +58,7 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) {
lppd->hDevMode = NULL;
lppd->hDevNames = NULL;
- PrinterInfo2 info_2;
+ printing::PrinterInfo2 info_2;
if (info_2.Init(printer)) {
dev_mode = info_2.get()->pDevMode;
}
@@ -70,7 +67,7 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) {
goto Cleanup;
}
- if (!PrintingContextWin::AllocateContext(printer_name, dev_mode,
+ if (!printing::PrintingContextWin::AllocateContext(printer_name, dev_mode,
&lppd->hDC)) {
result = E_FAIL;
goto Cleanup;
@@ -140,6 +137,7 @@ Cleanup:
GlobalFree(lppd->hDevNames);
}
}
+ ClosePrinter(printer);
return result;
}
@@ -147,11 +145,12 @@ TEST_F(PrintingContextTest, Base) {
if (IsTestCaseDisabled())
return;
- PrintSettings settings;
+ printing::PrintSettings settings;
settings.set_device_name(GetDefaultPrinter());
// Initialize it.
- scoped_ptr<PrintingContext> context(PrintingContext::Create(std::string()));
- EXPECT_EQ(PrintingContext::OK, context->InitWithSettings(settings));
+ scoped_ptr<printing::PrintingContext> context(
+ printing::PrintingContext::Create(std::string()));
+ EXPECT_EQ(printing::PrintingContext::OK, context->InitWithSettings(settings));
// The print may lie to use and may not support world transformation.
// Verify right now.
@@ -166,14 +165,12 @@ TEST_F(PrintingContextTest, PrintAll) {
return;
std::string dummy_locale;
- PrintingContextWin context(dummy_locale);
+ printing::PrintingContextWin context(dummy_locale);
context.SetPrintDialog(&PrintDlgExMock);
context.AskUserForSettings(
NULL, 123, false, base::Bind(&PrintingContextTest::PrintSettingsCallback,
base::Unretained(this)));
- EXPECT_EQ(PrintingContext::OK, result());
- PrintSettings settings = context.settings();
+ EXPECT_EQ(printing::PrintingContext::OK, result());
+ printing::PrintSettings settings = context.settings();
EXPECT_EQ(settings.ranges().size(), 0);
}
-
-} // namespace printing