| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <ocidl.h> | 5 #include <ocidl.h> |
| 6 #include <commdlg.h> | 6 #include <commdlg.h> |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "printing/backend/printing_info_win.h" |
| 13 #include "printing/printing_test.h" | 14 #include "printing/printing_test.h" |
| 14 #include "printing/printing_context.h" | 15 #include "printing/printing_context.h" |
| 15 #include "printing/printing_context_win.h" | 16 #include "printing/printing_context_win.h" |
| 16 #include "printing/print_settings.h" | 17 #include "printing/print_settings.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 19 |
| 19 // This test is automatically disabled if no printer is available. | 20 // This test is automatically disabled if no printer is available. |
| 20 class PrintingContextTest : public PrintingTest<testing::Test> { | 21 class PrintingContextTest : public PrintingTest<testing::Test> { |
| 21 public: | 22 public: |
| 22 void PrintSettingsCallback(printing::PrintingContext::Result result) { | 23 void PrintSettingsCallback(printing::PrintingContext::Result result) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 43 lppd->lpPageRanges[0].nFromPage = 1; | 44 lppd->lpPageRanges[0].nFromPage = 1; |
| 44 lppd->lpPageRanges[0].nToPage = 5; | 45 lppd->lpPageRanges[0].nToPage = 5; |
| 45 | 46 |
| 46 // Painful paperwork. | 47 // Painful paperwork. |
| 47 std::wstring printer_name = PrintingContextTest::GetDefaultPrinter(); | 48 std::wstring printer_name = PrintingContextTest::GetDefaultPrinter(); |
| 48 HANDLE printer; | 49 HANDLE printer; |
| 49 if (!OpenPrinter(const_cast<wchar_t*>(printer_name.c_str()), &printer, NULL)) | 50 if (!OpenPrinter(const_cast<wchar_t*>(printer_name.c_str()), &printer, NULL)) |
| 50 return E_FAIL; | 51 return E_FAIL; |
| 51 | 52 |
| 52 scoped_array<uint8> buffer; | 53 scoped_array<uint8> buffer; |
| 53 DEVMODE* dev_mode = NULL; | 54 const DEVMODE* dev_mode = NULL; |
| 54 PRINTER_INFO_2* info_2 = NULL; | |
| 55 HRESULT result = S_OK; | 55 HRESULT result = S_OK; |
| 56 lppd->hDC = NULL; | 56 lppd->hDC = NULL; |
| 57 lppd->hDevMode = NULL; | 57 lppd->hDevMode = NULL; |
| 58 lppd->hDevNames = NULL; | 58 lppd->hDevNames = NULL; |
| 59 | 59 |
| 60 printing::PrintingContextWin::GetPrinterHelper(printer, 2, &buffer); | 60 printing::PrinterInfo2 info_2; |
| 61 if (buffer.get()) { | 61 if (info_2.Init(printer)) { |
| 62 info_2 = reinterpret_cast<PRINTER_INFO_2*>(buffer.get()); | 62 dev_mode = info_2.get()->pDevMode; |
| 63 if (info_2->pDevMode != NULL) | |
| 64 dev_mode = info_2->pDevMode; | |
| 65 } | 63 } |
| 66 if (!dev_mode) { | 64 if (!dev_mode) { |
| 67 result = E_FAIL; | 65 result = E_FAIL; |
| 68 goto Cleanup; | 66 goto Cleanup; |
| 69 } | 67 } |
| 70 | 68 |
| 71 if (!printing::PrintingContextWin::AllocateContext(printer_name, dev_mode, | 69 if (!printing::PrintingContextWin::AllocateContext(printer_name, dev_mode, |
| 72 &lppd->hDC)) { | 70 &lppd->hDC)) { |
| 73 result = E_FAIL; | 71 result = E_FAIL; |
| 74 goto Cleanup; | 72 goto Cleanup; |
| 75 } | 73 } |
| 76 | 74 |
| 77 size_t dev_mode_size = dev_mode->dmSize + dev_mode->dmDriverExtra; | 75 size_t dev_mode_size = dev_mode->dmSize + dev_mode->dmDriverExtra; |
| 78 lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, dev_mode_size); | 76 lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, dev_mode_size); |
| 79 if (!lppd->hDevMode) { | 77 if (!lppd->hDevMode) { |
| 80 result = E_FAIL; | 78 result = E_FAIL; |
| 81 goto Cleanup; | 79 goto Cleanup; |
| 82 } | 80 } |
| 83 void* dev_mode_ptr = GlobalLock(lppd->hDevMode); | 81 void* dev_mode_ptr = GlobalLock(lppd->hDevMode); |
| 84 if (!dev_mode_ptr) { | 82 if (!dev_mode_ptr) { |
| 85 result = E_FAIL; | 83 result = E_FAIL; |
| 86 goto Cleanup; | 84 goto Cleanup; |
| 87 } | 85 } |
| 88 memcpy(dev_mode_ptr, dev_mode, dev_mode_size); | 86 memcpy(dev_mode_ptr, dev_mode, dev_mode_size); |
| 89 GlobalUnlock(lppd->hDevMode); | 87 GlobalUnlock(lppd->hDevMode); |
| 90 dev_mode_ptr = NULL; | 88 dev_mode_ptr = NULL; |
| 91 | 89 |
| 92 size_t driver_size = 2 + sizeof(wchar_t) * lstrlen(info_2->pDriverName); | 90 size_t driver_size = 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pDriverName); |
| 93 size_t printer_size = 2 + sizeof(wchar_t) * lstrlen(info_2->pPrinterName); | 91 size_t printer_size = 2 + sizeof(wchar_t) * |
| 94 size_t port_size = 2 + sizeof(wchar_t) * lstrlen(info_2->pPortName); | 92 lstrlen(info_2.get()->pPrinterName); |
| 93 size_t port_size = 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pPortName); |
| 95 size_t dev_names_size = sizeof(DEVNAMES) + driver_size + printer_size + | 94 size_t dev_names_size = sizeof(DEVNAMES) + driver_size + printer_size + |
| 96 port_size; | 95 port_size; |
| 97 lppd->hDevNames = GlobalAlloc(GHND, dev_names_size); | 96 lppd->hDevNames = GlobalAlloc(GHND, dev_names_size); |
| 98 if (!lppd->hDevNames) { | 97 if (!lppd->hDevNames) { |
| 99 result = E_FAIL; | 98 result = E_FAIL; |
| 100 goto Cleanup; | 99 goto Cleanup; |
| 101 } | 100 } |
| 102 void* dev_names_ptr = GlobalLock(lppd->hDevNames); | 101 void* dev_names_ptr = GlobalLock(lppd->hDevNames); |
| 103 if (!dev_names_ptr) { | 102 if (!dev_names_ptr) { |
| 104 result = E_FAIL; | 103 result = E_FAIL; |
| 105 goto Cleanup; | 104 goto Cleanup; |
| 106 } | 105 } |
| 107 DEVNAMES* dev_names = reinterpret_cast<DEVNAMES*>(dev_names_ptr); | 106 DEVNAMES* dev_names = reinterpret_cast<DEVNAMES*>(dev_names_ptr); |
| 108 dev_names->wDefault = 1; | 107 dev_names->wDefault = 1; |
| 109 dev_names->wDriverOffset = sizeof(DEVNAMES); | 108 dev_names->wDriverOffset = sizeof(DEVNAMES); |
| 110 memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wDriverOffset, | 109 memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wDriverOffset, |
| 111 info_2->pDriverName, driver_size); | 110 info_2.get()->pDriverName, driver_size); |
| 112 dev_names->wDeviceOffset = dev_names->wDriverOffset + driver_size; | 111 dev_names->wDeviceOffset = dev_names->wDriverOffset + driver_size; |
| 113 memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wDeviceOffset, | 112 memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wDeviceOffset, |
| 114 info_2->pPrinterName, printer_size); | 113 info_2.get()->pPrinterName, printer_size); |
| 115 dev_names->wOutputOffset = dev_names->wDeviceOffset + printer_size; | 114 dev_names->wOutputOffset = dev_names->wDeviceOffset + printer_size; |
| 116 memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wOutputOffset, | 115 memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wOutputOffset, |
| 117 info_2->pPortName, port_size); | 116 info_2.get()->pPortName, port_size); |
| 118 GlobalUnlock(lppd->hDevNames); | 117 GlobalUnlock(lppd->hDevNames); |
| 119 dev_names_ptr = NULL; | 118 dev_names_ptr = NULL; |
| 120 | 119 |
| 121 Cleanup: | 120 Cleanup: |
| 122 // Note: This section does proper deallocation/free of DC/global handles. We | 121 // Note: This section does proper deallocation/free of DC/global handles. We |
| 123 // did not use ScopedHGlobal or ScopedHandle because they did not | 122 // did not use ScopedHGlobal or ScopedHandle because they did not |
| 124 // perform what we need. Goto's are used based on Windows programming | 123 // perform what we need. Goto's are used based on Windows programming |
| 125 // idiom, to avoid deeply nested if's, and try-catch-finally is not | 124 // idiom, to avoid deeply nested if's, and try-catch-finally is not |
| 126 // allowed in Chromium. | 125 // allowed in Chromium. |
| 127 if (FAILED(result)) { | 126 if (FAILED(result)) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 std::string dummy_locale; | 165 std::string dummy_locale; |
| 167 printing::PrintingContextWin context(dummy_locale); | 166 printing::PrintingContextWin context(dummy_locale); |
| 168 context.SetPrintDialog(&PrintDlgExMock); | 167 context.SetPrintDialog(&PrintDlgExMock); |
| 169 context.AskUserForSettings( | 168 context.AskUserForSettings( |
| 170 NULL, 123, false, base::Bind(&PrintingContextTest::PrintSettingsCallback, | 169 NULL, 123, false, base::Bind(&PrintingContextTest::PrintSettingsCallback, |
| 171 base::Unretained(this))); | 170 base::Unretained(this))); |
| 172 EXPECT_EQ(printing::PrintingContext::OK, result()); | 171 EXPECT_EQ(printing::PrintingContext::OK, result()); |
| 173 printing::PrintSettings settings = context.settings(); | 172 printing::PrintSettings settings = context.settings(); |
| 174 EXPECT_EQ(settings.ranges.size(), 0); | 173 EXPECT_EQ(settings.ranges.size(), 0); |
| 175 } | 174 } |
| OLD | NEW |