summaryrefslogtreecommitdiffstats
path: root/printing/backend/win_helper.cc
diff options
context:
space:
mode:
authorsanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-10 17:38:06 +0000
committersanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-10 17:38:06 +0000
commitecdc9d4c11a997c23b2e8cbb588732ceea823047 (patch)
tree807f488f60df6249e1d1fa2b5af3e0661b166786 /printing/backend/win_helper.cc
parent15a3ebf01a2e6ea982c1d952abfa60e14e7e0357 (diff)
downloadchromium_src-ecdc9d4c11a997c23b2e8cbb588732ceea823047.zip
chromium_src-ecdc9d4c11a997c23b2e8cbb588732ceea823047.tar.gz
chromium_src-ecdc9d4c11a997c23b2e8cbb588732ceea823047.tar.bz2
Used GetProcAddress to load exported functions from prntvpt.dll instead of using DELAYLOAD.
BUG=62421 TEST=ui_tests on XP without the XPS Framework installed should run. Review URL: http://codereview.chromium.org/4637004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65678 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing/backend/win_helper.cc')
-rw-r--r--printing/backend/win_helper.cc167
1 files changed, 164 insertions, 3 deletions
diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc
index a5f515f..72f2528 100644
--- a/printing/backend/win_helper.cc
+++ b/printing/backend/win_helper.cc
@@ -4,14 +4,175 @@
#include "printing/backend/win_helper.h"
+#include "base/logging.h"
-#include <windows.h>
+namespace {
+typedef HRESULT (WINAPI *PTOpenProviderProc)(PCWSTR printer_name,
+ DWORD version,
+ HPTPROVIDER *provider);
+typedef HRESULT (WINAPI *PTGetPrintCapabilitiesProc)(HPTPROVIDER provider,
+ IStream *print_ticket,
+ IStream *capabilities,
+ BSTR* error_message);
+typedef HRESULT (WINAPI *PTConvertDevModeToPrintTicketProc)(
+ HPTPROVIDER provider,
+ ULONG devmode_size_in_bytes,
+ PDEVMODE devmode,
+ EPrintTicketScope scope,
+ IStream* print_ticket);
+typedef HRESULT (WINAPI *PTConvertPrintTicketToDevModeProc)(
+ HPTPROVIDER provider,
+ IStream* print_ticket,
+ EDefaultDevmodeType base_devmode_type,
+ EPrintTicketScope scope,
+ ULONG* devmode_byte_count,
+ PDEVMODE *devmode,
+ BSTR* error_message);
+typedef HRESULT (WINAPI *PTMergeAndValidatePrintTicketProc)(
+ HPTPROVIDER provider,
+ IStream* base_ticket,
+ IStream* delta_ticket,
+ EPrintTicketScope scope,
+ IStream* result_ticket,
+ BSTR* error_message);
+typedef HRESULT (WINAPI *PTReleaseMemoryProc)(PVOID buffer);
+typedef HRESULT (WINAPI *PTCloseProviderProc)(HPTPROVIDER provider);
+
+PTOpenProviderProc g_open_provider_proc = NULL;
+PTGetPrintCapabilitiesProc g_get_print_capabilities_proc = NULL;
+PTConvertDevModeToPrintTicketProc g_convert_devmode_to_print_ticket_proc = NULL;
+PTConvertPrintTicketToDevModeProc g_convert_print_ticket_to_devmode_proc = NULL;
+PTMergeAndValidatePrintTicketProc g_merge_and_validate_print_ticket_proc = NULL;
+PTReleaseMemoryProc g_release_memory_proc = NULL;
+PTCloseProviderProc g_close_provider_proc = NULL;
+}
namespace printing {
-bool InitXPSModule() {
+bool XPSModule::Init() {
+ static bool initialized = InitImpl();
+ return initialized;
+}
+
+bool XPSModule::InitImpl() {
HMODULE prntvpt_module = LoadLibrary(L"prntvpt.dll");
- return (NULL != prntvpt_module);
+ if (prntvpt_module == NULL)
+ return false;
+ g_open_provider_proc = reinterpret_cast<PTOpenProviderProc>(
+ GetProcAddress(prntvpt_module, "PTOpenProvider"));
+ if (!g_open_provider_proc) {
+ NOTREACHED();
+ return false;
+ }
+ g_get_print_capabilities_proc = reinterpret_cast<PTGetPrintCapabilitiesProc>(
+ GetProcAddress(prntvpt_module, "PTGetPrintCapabilities"));
+ if (!g_get_print_capabilities_proc) {
+ NOTREACHED();
+ return false;
+ }
+ g_convert_devmode_to_print_ticket_proc =
+ reinterpret_cast<PTConvertDevModeToPrintTicketProc>(
+ GetProcAddress(prntvpt_module, "PTConvertDevModeToPrintTicket"));
+ if (!g_convert_devmode_to_print_ticket_proc) {
+ NOTREACHED();
+ return false;
+ }
+ g_convert_print_ticket_to_devmode_proc =
+ reinterpret_cast<PTConvertPrintTicketToDevModeProc>(
+ GetProcAddress(prntvpt_module, "PTConvertPrintTicketToDevMode"));
+ if (!g_convert_print_ticket_to_devmode_proc) {
+ NOTREACHED();
+ return false;
+ }
+ g_merge_and_validate_print_ticket_proc =
+ reinterpret_cast<PTMergeAndValidatePrintTicketProc>(
+ GetProcAddress(prntvpt_module, "PTMergeAndValidatePrintTicket"));
+ if (!g_merge_and_validate_print_ticket_proc) {
+ NOTREACHED();
+ return false;
+ }
+ g_release_memory_proc =
+ reinterpret_cast<PTReleaseMemoryProc>(
+ GetProcAddress(prntvpt_module, "PTReleaseMemory"));
+ if (!g_release_memory_proc) {
+ NOTREACHED();
+ return false;
+ }
+ g_close_provider_proc =
+ reinterpret_cast<PTCloseProviderProc>(
+ GetProcAddress(prntvpt_module, "PTCloseProvider"));
+ if (!g_close_provider_proc) {
+ NOTREACHED();
+ return false;
+ }
+ return true;
+}
+
+HRESULT XPSModule::OpenProvider(const string16& printer_name,
+ DWORD version,
+ HPTPROVIDER *provider) {
+ return g_open_provider_proc(printer_name.c_str(), version, provider);
+}
+
+HRESULT XPSModule::GetPrintCapabilities(HPTPROVIDER provider,
+ IStream *print_ticket,
+ IStream *capabilities,
+ BSTR* error_message) {
+ return g_get_print_capabilities_proc(provider,
+ print_ticket,
+ capabilities,
+ error_message);
+}
+
+HRESULT XPSModule::ConvertDevModeToPrintTicket(HPTPROVIDER provider,
+ ULONG devmode_size_in_bytes,
+ PDEVMODE devmode,
+ EPrintTicketScope scope,
+ IStream* print_ticket) {
+ return g_convert_devmode_to_print_ticket_proc(provider,
+ devmode_size_in_bytes,
+ devmode,
+ scope,
+ print_ticket);
+}
+
+HRESULT XPSModule::ConvertPrintTicketToDevMode(
+ HPTPROVIDER provider,
+ IStream* print_ticket,
+ EDefaultDevmodeType base_devmode_type,
+ EPrintTicketScope scope,
+ ULONG* devmode_byte_count,
+ PDEVMODE *devmode,
+ BSTR* error_message) {
+ return g_convert_print_ticket_to_devmode_proc(provider,
+ print_ticket,
+ base_devmode_type,
+ scope,
+ devmode_byte_count,
+ devmode,
+ error_message);
+}
+
+HRESULT XPSModule::MergeAndValidatePrintTicket(HPTPROVIDER provider,
+ IStream* base_ticket,
+ IStream* delta_ticket,
+ EPrintTicketScope scope,
+ IStream* result_ticket,
+ BSTR* error_message) {
+ return g_merge_and_validate_print_ticket_proc(provider,
+ base_ticket,
+ delta_ticket,
+ scope,
+ result_ticket,
+ error_message);
+}
+
+HRESULT XPSModule::ReleaseMemory(PVOID buffer) {
+ return g_release_memory_proc(buffer);
+}
+
+HRESULT XPSModule::CloseProvider(HPTPROVIDER provider) {
+ return g_close_provider_proc(provider);
}
} // namespace printing