Commit 4f655475 authored by Lei Zhang's avatar Lei Zhang Committed by Commit Bot

Fix some nits in Windows printing backend code.

Change-Id: I1ca7920be4c0b2e5888d30239d733244b498f800
Reviewed-on: https://chromium-review.googlesource.com/786634
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: default avatarRebekah Potter <rbpotter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#519801}
parent 7c2e70a2
...@@ -30,7 +30,7 @@ namespace { ...@@ -30,7 +30,7 @@ namespace {
HRESULT StreamOnHGlobalToString(IStream* stream, std::string* out) { HRESULT StreamOnHGlobalToString(IStream* stream, std::string* out) {
DCHECK(stream); DCHECK(stream);
DCHECK(out); DCHECK(out);
HGLOBAL hdata = NULL; HGLOBAL hdata = nullptr;
HRESULT hr = GetHGlobalFromStream(stream, &hdata); HRESULT hr = GetHGlobalFromStream(stream, &hdata);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
DCHECK(hdata); DCHECK(hdata);
...@@ -45,16 +45,18 @@ void GetDeviceCapabilityArray(const wchar_t* printer, ...@@ -45,16 +45,18 @@ void GetDeviceCapabilityArray(const wchar_t* printer,
const wchar_t* port, const wchar_t* port,
WORD id, WORD id,
std::vector<T>* result) { std::vector<T>* result) {
int count = DeviceCapabilities(printer, port, id, NULL, NULL); int count = DeviceCapabilities(printer, port, id, nullptr, nullptr);
if (count <= 0) if (count <= 0)
return; return;
std::vector<T> tmp; std::vector<T> tmp;
tmp.resize(count * 2); tmp.resize(count * 2);
count = DeviceCapabilities(printer, port, id, count = DeviceCapabilities(printer, port, id,
reinterpret_cast<LPTSTR>(tmp.data()), NULL); reinterpret_cast<LPTSTR>(tmp.data()), nullptr);
if (count <= 0) if (count <= 0)
return; return;
CHECK_LE(count, base::checked_cast<int>(tmp.size()));
CHECK_LE(static_cast<size_t>(count), tmp.size());
tmp.resize(count); tmp.resize(count);
result->swap(tmp); result->swap(tmp);
} }
...@@ -105,31 +107,32 @@ void LoadPaper(const wchar_t* printer, ...@@ -105,31 +107,32 @@ void LoadPaper(const wchar_t* printer,
caps->papers.push_back(paper); caps->papers.push_back(paper);
} }
if (devmode) { if (!devmode)
// Copy paper with the same ID as default paper. return;
if (devmode->dmFields & DM_PAPERSIZE) {
for (size_t i = 0; i < ids.size(); ++i) { // Copy paper with the same ID as default paper.
if (ids[i] == devmode->dmPaperSize) { if (devmode->dmFields & DM_PAPERSIZE) {
DCHECK_EQ(ids.size(), caps->papers.size()); for (size_t i = 0; i < ids.size(); ++i) {
caps->default_paper = caps->papers[i]; if (ids[i] == devmode->dmPaperSize) {
break; DCHECK_EQ(ids.size(), caps->papers.size());
} caps->default_paper = caps->papers[i];
break;
} }
} }
}
gfx::Size default_size; gfx::Size default_size;
if (devmode->dmFields & DM_PAPERWIDTH) if (devmode->dmFields & DM_PAPERWIDTH)
default_size.set_width(devmode->dmPaperWidth * kToUm); default_size.set_width(devmode->dmPaperWidth * kToUm);
if (devmode->dmFields & DM_PAPERLENGTH) if (devmode->dmFields & DM_PAPERLENGTH)
default_size.set_height(devmode->dmPaperLength * kToUm); default_size.set_height(devmode->dmPaperLength * kToUm);
if (!default_size.IsEmpty()) { if (!default_size.IsEmpty()) {
// Reset default paper if |dmPaperWidth| or |dmPaperLength| does not // Reset default paper if |dmPaperWidth| or |dmPaperLength| does not
// match default paper set by. // match default paper set by.
if (default_size != caps->default_paper.size_um) if (default_size != caps->default_paper.size_um)
caps->default_paper = PrinterSemanticCapsAndDefaults::Paper(); caps->default_paper = PrinterSemanticCapsAndDefaults::Paper();
caps->default_paper.size_um = default_size; caps->default_paper.size_um = default_size;
}
} }
} }
...@@ -140,16 +143,16 @@ void LoadDpi(const wchar_t* printer, ...@@ -140,16 +143,16 @@ void LoadDpi(const wchar_t* printer,
std::vector<POINT> dpis; std::vector<POINT> dpis;
GetDeviceCapabilityArray(printer, port, DC_ENUMRESOLUTIONS, &dpis); GetDeviceCapabilityArray(printer, port, DC_ENUMRESOLUTIONS, &dpis);
for (size_t i = 0; i < dpis.size() ; ++i) for (size_t i = 0; i < dpis.size(); ++i)
caps->dpis.push_back(gfx::Size(dpis[i].x, dpis[i].y)); caps->dpis.push_back(gfx::Size(dpis[i].x, dpis[i].y));
if (devmode) { if (!devmode)
if ((devmode->dmFields & DM_PRINTQUALITY) && devmode->dmPrintQuality > 0) { return;
caps->default_dpi.SetSize(devmode->dmPrintQuality,
devmode->dmPrintQuality); if ((devmode->dmFields & DM_PRINTQUALITY) && devmode->dmPrintQuality > 0) {
if (devmode->dmFields & DM_YRESOLUTION) { caps->default_dpi.SetSize(devmode->dmPrintQuality, devmode->dmPrintQuality);
caps->default_dpi.set_height(devmode->dmYResolution); if (devmode->dmFields & DM_YRESOLUTION) {
} caps->default_dpi.set_height(devmode->dmYResolution);
} }
} }
} }
...@@ -254,7 +257,7 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( ...@@ -254,7 +257,7 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults(
PrinterSemanticCapsAndDefaults caps; PrinterSemanticCapsAndDefaults caps;
std::unique_ptr<DEVMODE, base::FreeDeleter> user_settings = std::unique_ptr<DEVMODE, base::FreeDeleter> user_settings =
CreateDevMode(printer_handle.Get(), NULL); CreateDevMode(printer_handle.Get(), nullptr);
if (user_settings) { if (user_settings) {
if (user_settings->dmFields & DM_COLOR) if (user_settings->dmFields & DM_COLOR)
caps.color_default = (user_settings->dmColor == DMCOLOR_COLOR); caps.color_default = (user_settings->dmColor == DMCOLOR_COLOR);
...@@ -286,18 +289,18 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( ...@@ -286,18 +289,18 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults(
// Get printer capabilities. For more info see here: // Get printer capabilities. For more info see here:
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183552(v=vs.85).aspx // http://msdn.microsoft.com/en-us/library/windows/desktop/dd183552(v=vs.85).aspx
caps.color_changeable = caps.color_changeable =
(DeviceCapabilities(name, port, DC_COLORDEVICE, NULL, NULL) == 1); (DeviceCapabilities(name, port, DC_COLORDEVICE, nullptr, nullptr) == 1);
caps.color_model = printing::COLOR; caps.color_model = printing::COLOR;
caps.bw_model = printing::GRAY; caps.bw_model = printing::GRAY;
caps.duplex_capable = caps.duplex_capable =
(DeviceCapabilities(name, port, DC_DUPLEX, NULL, NULL) == 1); (DeviceCapabilities(name, port, DC_DUPLEX, nullptr, nullptr) == 1);
caps.collate_capable = caps.collate_capable =
(DeviceCapabilities(name, port, DC_COLLATE, NULL, NULL) == 1); (DeviceCapabilities(name, port, DC_COLLATE, nullptr, nullptr) == 1);
caps.copies_capable = caps.copies_capable =
(DeviceCapabilities(name, port, DC_COPIES, NULL, NULL) > 1); (DeviceCapabilities(name, port, DC_COPIES, nullptr, nullptr) > 1);
LoadPaper(name, port, user_settings.get(), &caps); LoadPaper(name, port, user_settings.get(), &caps);
LoadDpi(name, port, user_settings.get(), &caps); LoadDpi(name, port, user_settings.get(), &caps);
...@@ -374,9 +377,8 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults( ...@@ -374,9 +377,8 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults(
std::string PrintBackendWin::GetPrinterDriverInfo( std::string PrintBackendWin::GetPrinterDriverInfo(
const std::string& printer_name) { const std::string& printer_name) {
ScopedPrinterHandle printer; ScopedPrinterHandle printer;
if (!printer.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) { if (!printer.OpenPrinter(base::UTF8ToWide(printer_name).c_str()))
return std::string(); return std::string();
}
return GetDriverInfo(printer.Get()); return GetDriverInfo(printer.Get());
} }
...@@ -388,7 +390,7 @@ bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) { ...@@ -388,7 +390,7 @@ bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) {
// static // static
scoped_refptr<PrintBackend> PrintBackend::CreateInstanceImpl( scoped_refptr<PrintBackend> PrintBackend::CreateInstanceImpl(
const base::DictionaryValue* print_backend_settings) { const base::DictionaryValue* print_backend_settings) {
return new PrintBackendWin; return base::MakeRefCounted<PrintBackendWin>();
} }
} // namespace printing } // namespace printing
...@@ -75,19 +75,22 @@ typedef HRESULT (WINAPI* StartXpsPrintJobProc)( ...@@ -75,19 +75,22 @@ typedef HRESULT (WINAPI* StartXpsPrintJobProc)(
IXpsPrintJobStream** document_stream, IXpsPrintJobStream** document_stream,
IXpsPrintJobStream** print_ticket_stream); IXpsPrintJobStream** print_ticket_stream);
PTOpenProviderProc g_open_provider_proc = NULL; PTOpenProviderProc g_open_provider_proc = nullptr;
PTGetPrintCapabilitiesProc g_get_print_capabilities_proc = NULL; PTGetPrintCapabilitiesProc g_get_print_capabilities_proc = nullptr;
PTConvertDevModeToPrintTicketProc g_convert_devmode_to_print_ticket_proc = NULL; PTConvertDevModeToPrintTicketProc g_convert_devmode_to_print_ticket_proc =
PTConvertPrintTicketToDevModeProc g_convert_print_ticket_to_devmode_proc = NULL; nullptr;
PTMergeAndValidatePrintTicketProc g_merge_and_validate_print_ticket_proc = NULL; PTConvertPrintTicketToDevModeProc g_convert_print_ticket_to_devmode_proc =
PTReleaseMemoryProc g_release_memory_proc = NULL; nullptr;
PTCloseProviderProc g_close_provider_proc = NULL; PTMergeAndValidatePrintTicketProc g_merge_and_validate_print_ticket_proc =
StartXpsPrintJobProc g_start_xps_print_job_proc = NULL; nullptr;
PTReleaseMemoryProc g_release_memory_proc = nullptr;
PTCloseProviderProc g_close_provider_proc = nullptr;
StartXpsPrintJobProc g_start_xps_print_job_proc = nullptr;
HRESULT StreamFromPrintTicket(const std::string& print_ticket, HRESULT StreamFromPrintTicket(const std::string& print_ticket,
IStream** stream) { IStream** stream) {
DCHECK(stream); DCHECK(stream);
HRESULT hr = CreateStreamOnHGlobal(NULL, TRUE, stream); HRESULT hr = CreateStreamOnHGlobal(nullptr, TRUE, stream);
if (FAILED(hr)) { if (FAILED(hr)) {
return hr; return hr;
} }
...@@ -132,7 +135,7 @@ bool XPSModule::Init() { ...@@ -132,7 +135,7 @@ bool XPSModule::Init() {
bool XPSModule::InitImpl() { bool XPSModule::InitImpl() {
HMODULE prntvpt_module = LoadLibrary(L"prntvpt.dll"); HMODULE prntvpt_module = LoadLibrary(L"prntvpt.dll");
if (prntvpt_module == NULL) if (!prntvpt_module)
return false; return false;
g_open_provider_proc = reinterpret_cast<PTOpenProviderProc>( g_open_provider_proc = reinterpret_cast<PTOpenProviderProc>(
GetProcAddress(prntvpt_module, "PTOpenProvider")); GetProcAddress(prntvpt_module, "PTOpenProvider"));
...@@ -265,14 +268,14 @@ ScopedXPSInitializer::ScopedXPSInitializer() : initialized_(false) { ...@@ -265,14 +268,14 @@ ScopedXPSInitializer::ScopedXPSInitializer() : initialized_(false) {
// crash. To protect ourselves from such drivers we make sure we always have // crash. To protect ourselves from such drivers we make sure we always have
// an extra CoInitialize (calls to CoInitialize/CoUninitialize are // an extra CoInitialize (calls to CoInitialize/CoUninitialize are
// refcounted). // refcounted).
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
// If this succeeded we are done because the PTOpenProvider call will provide // If this succeeded we are done because the PTOpenProvider call will provide
// the extra refcount on the apartment. If it failed because someone already // the extra refcount on the apartment. If it failed because someone already
// called CoInitializeEx with COINIT_APARTMENTTHREADED, we try the other model // called CoInitializeEx with COINIT_APARTMENTTHREADED, we try the other model
// to provide the additional refcount (since we don't know which model buggy // to provide the additional refcount (since we don't know which model buggy
// printer drivers will use). // printer drivers will use).
if (!SUCCEEDED(hr)) if (!SUCCEEDED(hr))
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
DCHECK(SUCCEEDED(hr)); DCHECK(SUCCEEDED(hr));
initialized_ = true; initialized_ = true;
} }
...@@ -290,7 +293,7 @@ bool XPSPrintModule::Init() { ...@@ -290,7 +293,7 @@ bool XPSPrintModule::Init() {
bool XPSPrintModule::InitImpl() { bool XPSPrintModule::InitImpl() {
HMODULE xpsprint_module = LoadLibrary(L"xpsprint.dll"); HMODULE xpsprint_module = LoadLibrary(L"xpsprint.dll");
if (xpsprint_module == NULL) if (!xpsprint_module)
return false; return false;
g_start_xps_print_job_proc = reinterpret_cast<StartXpsPrintJobProc>( g_start_xps_print_job_proc = reinterpret_cast<StartXpsPrintJobProc>(
GetProcAddress(xpsprint_module, "StartXpsPrintJob")); GetProcAddress(xpsprint_module, "StartXpsPrintJob"));
...@@ -394,13 +397,13 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( ...@@ -394,13 +397,13 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode(
const base::string16& printer_name, const base::string16& printer_name,
const std::string& print_ticket) { const std::string& print_ticket) {
std::unique_ptr<DEVMODE, base::FreeDeleter> dev_mode; std::unique_ptr<DEVMODE, base::FreeDeleter> dev_mode;
printing::ScopedXPSInitializer xps_initializer; ScopedXPSInitializer xps_initializer;
if (!xps_initializer.initialized()) { if (!xps_initializer.initialized()) {
// TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll)
return dev_mode; return dev_mode;
} }
printing::ScopedPrinterHandle printer; ScopedPrinterHandle printer;
if (!printer.OpenPrinter(printer_name.c_str())) if (!printer.OpenPrinter(printer_name.c_str()))
return dev_mode; return dev_mode;
...@@ -409,22 +412,22 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( ...@@ -409,22 +412,22 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode(
if (FAILED(hr)) if (FAILED(hr))
return dev_mode; return dev_mode;
HPTPROVIDER provider = NULL; HPTPROVIDER provider = nullptr;
hr = printing::XPSModule::OpenProvider(printer_name, 1, &provider); hr = XPSModule::OpenProvider(printer_name, 1, &provider);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
ULONG size = 0; ULONG size = 0;
DEVMODE* dm = NULL; DEVMODE* dm = nullptr;
// Use kPTJobScope, because kPTDocumentScope breaks duplex. // Use kPTJobScope, because kPTDocumentScope breaks duplex.
hr = printing::XPSModule::ConvertPrintTicketToDevMode( hr = XPSModule::ConvertPrintTicketToDevMode(
provider, pt_stream.Get(), kUserDefaultDevmode, kPTJobScope, &size, &dm, provider, pt_stream.Get(), kUserDefaultDevmode, kPTJobScope, &size, &dm,
NULL); nullptr);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
// Correct DEVMODE using DocumentProperties. See documentation for // Correct DEVMODE using DocumentProperties. See documentation for
// PTConvertPrintTicketToDevMode. // PTConvertPrintTicketToDevMode.
dev_mode = CreateDevMode(printer.Get(), dm); dev_mode = CreateDevMode(printer.Get(), dm);
printing::XPSModule::ReleaseMemory(dm); XPSModule::ReleaseMemory(dm);
} }
printing::XPSModule::CloseProvider(provider); XPSModule::CloseProvider(provider);
} }
return dev_mode; return dev_mode;
} }
...@@ -434,7 +437,7 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( ...@@ -434,7 +437,7 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor(
const base::string16& printer_name, const base::string16& printer_name,
bool color) { bool color) {
std::unique_ptr<DEVMODE, base::FreeDeleter> default_ticket = std::unique_ptr<DEVMODE, base::FreeDeleter> default_ticket =
CreateDevMode(printer, NULL); CreateDevMode(printer, nullptr);
if (!default_ticket) if (!default_ticket)
return default_ticket; return default_ticket;
...@@ -457,14 +460,14 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( ...@@ -457,14 +460,14 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor(
return default_ticket; return default_ticket;
// Need XPS for this workaround. // Need XPS for this workaround.
printing::ScopedXPSInitializer xps_initializer; ScopedXPSInitializer xps_initializer;
if (!xps_initializer.initialized()) if (!xps_initializer.initialized())
return default_ticket; return default_ticket;
const char* xps_color = color ? kXpsTicketColor : kXpsTicketMonochrome; const char* xps_color = color ? kXpsTicketColor : kXpsTicketMonochrome;
std::string xps_ticket = base::StringPrintf(kXpsTicketTemplate, xps_color); std::string xps_ticket = base::StringPrintf(kXpsTicketTemplate, xps_color);
std::unique_ptr<DEVMODE, base::FreeDeleter> ticket = std::unique_ptr<DEVMODE, base::FreeDeleter> ticket =
printing::XpsTicketToDevMode(printer_name, xps_ticket); XpsTicketToDevMode(printer_name, xps_ticket);
if (!ticket) if (!ticket)
return default_ticket; return default_ticket;
...@@ -477,8 +480,9 @@ bool PrinterHasValidPaperSize(const wchar_t* name, const wchar_t* port) { ...@@ -477,8 +480,9 @@ bool PrinterHasValidPaperSize(const wchar_t* name, const wchar_t* port) {
std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer,
DEVMODE* in) { DEVMODE* in) {
LONG buffer_size = DocumentProperties( wchar_t* device_name_ptr = const_cast<wchar_t*>(L"");
NULL, printer, const_cast<wchar_t*>(L""), NULL, NULL, 0); LONG buffer_size = DocumentProperties(nullptr, printer, device_name_ptr,
nullptr, nullptr, 0);
if (buffer_size < static_cast<int>(sizeof(DEVMODE))) if (buffer_size < static_cast<int>(sizeof(DEVMODE)))
return nullptr; return nullptr;
...@@ -493,21 +497,21 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, ...@@ -493,21 +497,21 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer,
PrinterInfo5 info_5; PrinterInfo5 info_5;
if (!info_5.Init(printer)) if (!info_5.Init(printer))
return nullptr; return nullptr;
const wchar_t* name = info_5.get()->pPrinterName;
const wchar_t* port = info_5.get()->pPortName;
// Check that valid paper sizes exist; some old drivers return no paper sizes // Check that valid paper sizes exist; some old drivers return no paper sizes
// and crash in DocumentProperties if used with Win10. See crbug.com/679160, // and crash in DocumentProperties if used with Win10. See crbug.com/679160,
// crbug.com/724595 // crbug.com/724595
const wchar_t* name = info_5.get()->pPrinterName;
const wchar_t* port = info_5.get()->pPortName;
if (!PrinterHasValidPaperSize(name, port)) { if (!PrinterHasValidPaperSize(name, port)) {
return nullptr; return nullptr;
} }
if (DocumentProperties( if (DocumentProperties(nullptr, printer, device_name_ptr, out.get(), in,
NULL, printer, const_cast<wchar_t*>(L""), out.get(), in, flags) != flags) != IDOK) {
IDOK) {
return nullptr; return nullptr;
} }
int size = out->dmSize; int size = out->dmSize;
int extra_size = out->dmDriverExtra; int extra_size = out->dmDriverExtra;
CHECK_GE(buffer_size, size + extra_size); CHECK_GE(buffer_size, size + extra_size);
...@@ -520,13 +524,9 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode( ...@@ -520,13 +524,9 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode(
DEVMODE* in, DEVMODE* in,
HWND window, HWND window,
bool* canceled) { bool* canceled) {
LONG buffer_size = wchar_t* printer_name_ptr = const_cast<wchar_t*>(printer_name.c_str());
DocumentProperties(window, LONG buffer_size = DocumentProperties(window, printer, printer_name_ptr,
printer, nullptr, nullptr, 0);
const_cast<wchar_t*>(printer_name.c_str()),
NULL,
NULL,
0);
if (buffer_size < static_cast<int>(sizeof(DEVMODE))) if (buffer_size < static_cast<int>(sizeof(DEVMODE)))
return std::unique_ptr<DEVMODE, base::FreeDeleter>(); return std::unique_ptr<DEVMODE, base::FreeDeleter>();
...@@ -537,16 +537,13 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode( ...@@ -537,16 +537,13 @@ std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode(
std::unique_ptr<DEVMODE, base::FreeDeleter> out( std::unique_ptr<DEVMODE, base::FreeDeleter> out(
reinterpret_cast<DEVMODE*>(calloc(buffer_size, 1))); reinterpret_cast<DEVMODE*>(calloc(buffer_size, 1)));
DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER | DM_IN_PROMPT; DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER | DM_IN_PROMPT;
LONG result = DocumentProperties(window, LONG result = DocumentProperties(window, printer, printer_name_ptr, out.get(),
printer, in, flags);
const_cast<wchar_t*>(printer_name.c_str()),
out.get(),
in,
flags);
if (canceled) if (canceled)
*canceled = (result == IDCANCEL); *canceled = (result == IDCANCEL);
if (result != IDOK) if (result != IDOK)
return std::unique_ptr<DEVMODE, base::FreeDeleter>(); return std::unique_ptr<DEVMODE, base::FreeDeleter>();
int size = out->dmSize; int size = out->dmSize;
int extra_size = out->dmDriverExtra; int extra_size = out->dmDriverExtra;
CHECK_GE(buffer_size, size + extra_size); CHECK_GE(buffer_size, size + extra_size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment