Huw Davies : wineps: Retrieve the printer's devmode using GetPrinter.
Alexandre Julliard
julliard at winehq.org
Wed Apr 11 12:56:47 CDT 2012
Module: wine
Branch: master
Commit: a7f42d32810d7720b9a451daad070bdebac3792c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a7f42d32810d7720b9a451daad070bdebac3792c
Author: Huw Davies <huw at codeweavers.com>
Date: Wed Apr 11 12:36:19 2012 +0100
wineps: Retrieve the printer's devmode using GetPrinter.
---
dlls/wineps.drv/init.c | 80 ++++++++++++++++++++++++++++++++++-------------
1 files changed, 58 insertions(+), 22 deletions(-)
diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c
index affbcbc..cc950e3 100644
--- a/dlls/wineps.drv/init.c
+++ b/dlls/wineps.drv/init.c
@@ -555,6 +555,61 @@ static PRINTER_ENUM_VALUESA *load_font_sub_table( HANDLE printer, DWORD *num_ent
return table;
}
+static PSDRV_DEVMODEA *get_printer_devmode( HANDLE printer )
+{
+ DWORD needed, dm_size;
+ BOOL res;
+ PRINTER_INFO_9A *info;
+ PSDRV_DEVMODEA *dm;
+
+ GetPrinterA( printer, 9, NULL, 0, &needed );
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return NULL;
+
+ info = HeapAlloc( PSDRV_Heap, 0, needed );
+ res = GetPrinterA( printer, 9, (BYTE *)info, needed, &needed );
+ if (!res || !info->pDevMode)
+ {
+ HeapFree( PSDRV_Heap, 0, info );
+ return NULL;
+ }
+
+ /* sanity check the sizes */
+ dm_size = info->pDevMode->dmSize + info->pDevMode->dmDriverExtra;
+ if ((char *)info->pDevMode - (char *)info + dm_size > needed)
+ {
+ HeapFree( PSDRV_Heap, 0, info );
+ return NULL;
+ }
+
+ dm = (PSDRV_DEVMODEA*)info;
+ memmove( dm, info->pDevMode, dm_size );
+ return dm;
+}
+
+static PSDRV_DEVMODEA *get_devmode( HANDLE printer, const char *nameA, BOOL *is_default )
+{
+ PSDRV_DEVMODEA *dm = get_printer_devmode( printer );
+
+ *is_default = FALSE;
+
+ if (dm && dm->dmPublic.dmSize + dm->dmPublic.dmDriverExtra >= sizeof(DefaultDevmode))
+ {
+ TRACE( "Retrieved devmode from winspool\n" );
+ return dm;
+ }
+ HeapFree( PSDRV_Heap, 0, dm );
+
+ TRACE( "Using default devmode\n" );
+ dm = HeapAlloc( PSDRV_Heap, 0, sizeof(DefaultDevmode) );
+ if (dm)
+ {
+ *dm = DefaultDevmode;
+ lstrcpynA((LPSTR)dm->dmPublic.dmDeviceName, nameA, CCHDEVICENAME);
+ *is_default = TRUE;
+ }
+ return dm;
+}
+
static struct list printer_list = LIST_INIT( printer_list );
/**********************************************************************
@@ -562,7 +617,7 @@ static struct list printer_list = LIST_INIT( printer_list );
*/
PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
{
- DWORD type = REG_BINARY, needed, res, dwPaperSize;
+ DWORD needed, res, dwPaperSize;
PRINTERINFO *pi;
FONTNAME *font;
const AFM *afm;
@@ -597,27 +652,8 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCWSTR name)
nameA = HeapAlloc( GetProcessHeap(), 0, len );
WideCharToMultiByte( CP_ACP, 0, name, -1, nameA, len, NULL, NULL );
- needed = 0;
- res = GetPrinterDataExA(hPrinter, NULL, default_devmodeA, &type, NULL, 0, &needed);
-
- if (needed < sizeof(DefaultDevmode)) {
- pi->Devmode = HeapAlloc( PSDRV_Heap, 0, sizeof(DefaultDevmode) );
- if (pi->Devmode == NULL)
- goto closeprinter;
-
- *pi->Devmode = DefaultDevmode;
- lstrcpynA((LPSTR)pi->Devmode->dmPublic.dmDeviceName, nameA, CCHDEVICENAME);
- using_default_devmode = TRUE;
- }
- else {
- pi->Devmode = HeapAlloc( PSDRV_Heap, 0, needed );
- if (pi->Devmode == NULL)
- goto closeprinter;
-
- GetPrinterDataExA(hPrinter, NULL, default_devmodeA, &type, (LPBYTE)pi->Devmode, needed, &needed);
- }
-
-
+ pi->Devmode = get_devmode( hPrinter, nameA, &using_default_devmode );
+ if (!pi->Devmode) goto closeprinter;
#ifdef SONAME_LIBCUPS
if (cupshandle != (void*)-1) {
More information about the wine-cvs
mailing list