Index: printing/backend/win_helper.cc |
diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc |
index 6aba7c6a0dec8bcbac46513903aafac76c9504a3..db8d735b2d1d846f15033427131d08d15a171522 100644 |
--- a/printing/backend/win_helper.cc |
+++ b/printing/backend/win_helper.cc |
@@ -488,4 +488,36 @@ scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, |
return out.Pass(); |
} |
+scoped_ptr<DEVMODE, base::FreeDeleter> PromptDevMode( |
+ HANDLE printer, |
+ const base::string16& printer_name, |
+ DEVMODE* in, |
+ HWND window, |
+ bool* canceled) { |
+ LONG buffer_size = |
+ DocumentProperties(window, |
+ printer, |
+ const_cast<wchar_t*>(printer_name.c_str()), |
+ NULL, |
+ NULL, |
+ 0); |
+ if (buffer_size < static_cast<int>(sizeof(DEVMODE))) |
+ return scoped_ptr<DEVMODE, base::FreeDeleter>(); |
+ scoped_ptr<DEVMODE, base::FreeDeleter> out( |
+ reinterpret_cast<DEVMODE*>(malloc(buffer_size))); |
+ DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER | DM_IN_PROMPT; |
+ LONG result = DocumentProperties(window, |
+ printer, |
+ const_cast<wchar_t*>(printer_name.c_str()), |
+ out.get(), |
+ in, |
+ flags); |
+ if (canceled) |
+ *canceled = (result == IDCANCEL); |
+ if (result != IDOK) |
+ return scoped_ptr<DEVMODE, base::FreeDeleter>(); |
+ CHECK_GE(buffer_size, out.get()->dmSize + out.get()->dmDriverExtra); |
+ return out.Pass(); |
+} |
+ |
} // namespace printing |