Huw Davies : winspool: Add a helper to set devmode data in the registry.
Alexandre Julliard
julliard at winehq.org
Thu Apr 5 12:31:47 CDT 2012
Module: wine
Branch: master
Commit: 607b5d77bc761fd6832e873706bb271b8857a7b7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=607b5d77bc761fd6832e873706bb271b8857a7b7
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Apr 5 13:25:50 2012 +0100
winspool: Add a helper to set devmode data in the registry.
---
dlls/winspool.drv/info.c | 133 +++++++++++++++++++++++++---------------------
1 files changed, 72 insertions(+), 61 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 9083d4d..72fa8f0 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -349,6 +349,46 @@ static DEVMODEW *dup_devmode( const DEVMODEW *dm )
return ret;
}
+/***********************************************************
+ * DEVMODEdupWtoA
+ * Creates an ansi copy of supplied devmode
+ */
+static DEVMODEA *DEVMODEdupWtoA( const DEVMODEW *dmW )
+{
+ LPDEVMODEA dmA;
+ DWORD size;
+
+ if (!dmW) return NULL;
+ size = dmW->dmSize - CCHDEVICENAME -
+ ((dmW->dmSize > FIELD_OFFSET( DEVMODEW, dmFormName )) ? CCHFORMNAME : 0);
+
+ dmA = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size + dmW->dmDriverExtra );
+ if (!dmA) return NULL;
+
+ WideCharToMultiByte( CP_ACP, 0, dmW->dmDeviceName, -1,
+ (LPSTR)dmA->dmDeviceName, CCHDEVICENAME, NULL, NULL );
+
+ if (FIELD_OFFSET( DEVMODEW, dmFormName ) >= dmW->dmSize)
+ {
+ memcpy( &dmA->dmSpecVersion, &dmW->dmSpecVersion,
+ dmW->dmSize - FIELD_OFFSET( DEVMODEW, dmSpecVersion ) );
+ }
+ else
+ {
+ memcpy( &dmA->dmSpecVersion, &dmW->dmSpecVersion,
+ FIELD_OFFSET( DEVMODEW, dmFormName ) - FIELD_OFFSET( DEVMODEW, dmSpecVersion ) );
+ WideCharToMultiByte( CP_ACP, 0, dmW->dmFormName, -1,
+ (LPSTR)dmA->dmFormName, CCHFORMNAME, NULL, NULL );
+
+ memcpy( &dmA->dmLogPixels, &dmW->dmLogPixels, dmW->dmSize - FIELD_OFFSET( DEVMODEW, dmLogPixels ) );
+ }
+
+ dmA->dmSize = size;
+ memcpy( (char *)dmA + dmA->dmSize, (const char *)dmW + dmW->dmSize, dmW->dmDriverExtra );
+ return dmA;
+}
+
+
/******************************************************************
* verify, that the filename is a local file
*
@@ -712,6 +752,26 @@ static inline DWORD set_reg_szW(HKEY hkey, const WCHAR *keyname, const WCHAR *va
return ERROR_FILE_NOT_FOUND;
}
+static inline DWORD set_reg_devmode( HKEY key, const WCHAR *name, const DEVMODEW *dm )
+{
+ DEVMODEA *dmA = DEVMODEdupWtoA( dm );
+ DWORD ret = ERROR_FILE_NOT_FOUND;
+
+ /* FIXME: Write DEVMODEA not DEVMODEW into reg. This is what win9x does
+ and we support these drivers. NT writes DEVMODEW so somehow
+ we'll need to distinguish between these when we support NT
+ drivers */
+
+ if (dmA)
+ {
+ ret = RegSetValueExW( key, name, 0, REG_BINARY,
+ (LPBYTE)dmA, dmA->dmSize + dmA->dmDriverExtra );
+ HeapFree( GetProcessHeap(), 0, dmA );
+ }
+
+ return ret;
+}
+
/******************************************************************
* get_servername_from_name (internal)
*
@@ -1102,44 +1162,6 @@ static LPDEVMODEW DEVMODEcpyAtoW(DEVMODEW *dmW, const DEVMODEA *dmA)
return dmW;
}
-/***********************************************************
- * DEVMODEdupWtoA
- * Creates an ansi copy of supplied devmode
- */
-static LPDEVMODEA DEVMODEdupWtoA(const DEVMODEW *dmW)
-{
- LPDEVMODEA dmA;
- DWORD size;
-
- if (!dmW) return NULL;
- size = dmW->dmSize - CCHDEVICENAME -
- ((dmW->dmSize > FIELD_OFFSET(DEVMODEW, dmFormName)) ? CCHFORMNAME : 0);
-
- dmA = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + dmW->dmDriverExtra);
- if (!dmA) return NULL;
-
- WideCharToMultiByte(CP_ACP, 0, dmW->dmDeviceName, -1,
- (LPSTR)dmA->dmDeviceName, CCHDEVICENAME, NULL, NULL);
-
- if (FIELD_OFFSET(DEVMODEW, dmFormName) >= dmW->dmSize) {
- memcpy(&dmA->dmSpecVersion, &dmW->dmSpecVersion,
- dmW->dmSize - FIELD_OFFSET(DEVMODEW, dmSpecVersion));
- }
- else
- {
- memcpy(&dmA->dmSpecVersion, &dmW->dmSpecVersion,
- FIELD_OFFSET(DEVMODEW, dmFormName) - FIELD_OFFSET(DEVMODEW, dmSpecVersion));
- WideCharToMultiByte(CP_ACP, 0, dmW->dmFormName, -1,
- (LPSTR)dmA->dmFormName, CCHFORMNAME, NULL, NULL);
-
- memcpy(&dmA->dmLogPixels, &dmW->dmLogPixels, dmW->dmSize - FIELD_OFFSET(DEVMODEW, dmLogPixels));
- }
-
- dmA->dmSize = size;
- memcpy((char *)dmA + dmA->dmSize, (const char *)dmW + dmW->dmSize, dmW->dmDriverExtra);
- return dmA;
-}
-
/******************************************************************
* convert_printerinfo_W_to_A [internal]
*
@@ -2560,8 +2582,7 @@ static void set_devices_and_printerports(PRINTER_INFO_2W *pi)
HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
{
PRINTER_INFO_2W *pi = (PRINTER_INFO_2W *) pPrinter;
- LPDEVMODEA dmA;
- LPDEVMODEW dmW;
+ LPDEVMODEW dm;
HANDLE retval;
HKEY hkeyPrinter, hkeyPrinters, hkeyDriver, hkeyDrivers;
LONG size;
@@ -2643,7 +2664,7 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
*
* FIXME:
* Note that DocumentPropertiesW will briefly try to open the printer we
- * just create to find a DEVMODEA struct (it will use the WINEPS default
+ * just create to find a DEVMODE struct (it will use the WINEPS default
* one in case it is not there, so we are ok).
*/
size = DocumentPropertiesW(0, 0, pi->pPrinterName, NULL, NULL, 0);
@@ -2653,37 +2674,27 @@ HANDLE WINAPI AddPrinterW(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
size = sizeof(DEVMODEW);
}
if(pi->pDevMode)
- dmW = pi->pDevMode;
+ dm = pi->pDevMode;
else
{
- dmW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
- dmW->dmSize = size;
- if (0>DocumentPropertiesW(0,0,pi->pPrinterName,dmW,NULL,DM_OUT_BUFFER))
+ dm = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
+ dm->dmSize = size;
+ if (DocumentPropertiesW(0, 0, pi->pPrinterName, dm, NULL, DM_OUT_BUFFER) < 0)
{
WARN("DocumentPropertiesW on printer %s failed!\n", debugstr_w(pi->pPrinterName));
- HeapFree(GetProcessHeap(),0,dmW);
- dmW=NULL;
+ HeapFree( GetProcessHeap(), 0, dm );
+ dm = NULL;
}
else
{
/* set devmode to printer name */
- lstrcpynW(dmW->dmDeviceName, pi->pPrinterName, CCHDEVICENAME);
+ lstrcpynW( dm->dmDeviceName, pi->pPrinterName, CCHDEVICENAME );
}
}
- /* Write DEVMODEA not DEVMODEW into reg. This is what win9x does
- and we support these drivers. NT writes DEVMODEW so somehow
- we'll need to distinguish between these when we support NT
- drivers */
- if (dmW)
- {
- dmA = DEVMODEdupWtoA(dmW);
- RegSetValueExW(hkeyPrinter, default_devmodeW, 0, REG_BINARY,
- (LPBYTE)dmA, dmA->dmSize + dmA->dmDriverExtra);
- HeapFree(GetProcessHeap(), 0, dmA);
- if(!pi->pDevMode)
- HeapFree(GetProcessHeap(), 0, dmW);
- }
+ set_reg_devmode( hkeyPrinter, default_devmodeW, dm );
+ if (!pi->pDevMode) HeapFree( GetProcessHeap(), 0, dm );
+
set_reg_szW(hkeyPrinter, DescriptionW, pi->pComment);
set_reg_szW(hkeyPrinter, LocationW, pi->pLocation);
set_reg_szW(hkeyPrinter, NameW, pi->pPrinterName);
More information about the wine-cvs
mailing list