Detlef Riekenberg : localspl: Call DrvDriverEvent in AddPrinterDriverEx.
Alexandre Julliard
julliard at winehq.org
Fri Jan 9 09:52:37 CST 2009
Module: wine
Branch: master
Commit: 8eff8acc46a0dd20b5a904cf8dcf2b5b09769838
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8eff8acc46a0dd20b5a904cf8dcf2b5b09769838
Author: Detlef Riekenberg <wine.dev at web.de>
Date: Thu Jan 8 15:11:29 2009 +0100
localspl: Call DrvDriverEvent in AddPrinterDriverEx.
---
dlls/localspl/localspl_main.c | 56 +++++++++++++++++++++++++++++++++++++++-
1 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/dlls/localspl/localspl_main.c b/dlls/localspl/localspl_main.c
index 4483ac8..7137d97 100644
--- a/dlls/localspl/localspl_main.c
+++ b/dlls/localspl/localspl_main.c
@@ -28,8 +28,9 @@
#include "wingdi.h"
#include "winreg.h"
#include "winspool.h"
-#include "ddk/winsplp.h"
#include "winuser.h"
+#include "ddk/winddiui.h"
+#include "ddk/winsplp.h"
#include "wine/list.h"
#include "wine/debug.h"
@@ -722,6 +723,44 @@ static BOOL WINAPI fpGetPrinterDriverDirectory(LPWSTR pName, LPWSTR pEnvironment
return TRUE;
}
+/******************************************************************
+ * driver_load [internal]
+ *
+ * load a driver user interface dll
+ *
+ * On failure, NULL is returned
+ *
+ */
+
+static HMODULE driver_load(const printenv_t * env, LPWSTR dllname)
+{
+ WCHAR fullname[MAX_PATH];
+ HMODULE hui;
+ DWORD len;
+
+ TRACE("(%p, %s)\n", env, debugstr_w(dllname));
+
+ /* build the driverdir */
+ len = sizeof(fullname) -
+ (lstrlenW(env->versionsubdir) + 1 + lstrlenW(dllname) + 1) * sizeof(WCHAR);
+
+ if (!fpGetPrinterDriverDirectory(NULL, (LPWSTR) env->envname, 1,
+ (LPBYTE) fullname, len, &len)) {
+ /* Should never Fail */
+ SetLastError(ERROR_BUFFER_OVERFLOW);
+ return NULL;
+ }
+
+ lstrcatW(fullname, env->versionsubdir);
+ lstrcatW(fullname, backslashW);
+ lstrcatW(fullname, dllname);
+
+ hui = LoadLibraryW(fullname);
+ TRACE("%p: LoadLibrary(%s) %d\n", hui, debugstr_w(fullname), GetLastError());
+
+ return hui;
+}
+
/******************************************************************************
* myAddPrinterDriverEx [internal]
*
@@ -735,12 +774,15 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo
const printenv_t *env;
apd_data_t apd;
DRIVER_INFO_8W di;
+ BOOL (WINAPI *pDrvDriverEvent)(DWORD, DWORD, LPBYTE, LPARAM);
+ HMODULE hui;
LPWSTR ptr;
HKEY hroot;
HKEY hdrv;
DWORD disposition;
DWORD len;
LONG lres;
+ BOOL res;
/* we need to set all entries in the Registry, independent from the Level of
DRIVER_INFO, that the caller supplied */
@@ -873,7 +915,17 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo
if (level > 5) TRACE("level %u for Driver %s is incomplete\n", level, debugstr_w(di.pName));
RegCloseKey(hdrv);
- TRACE("### DrvDriverEvent(...,DRIVEREVENT_INITIALIZE) not implemented yet\n");
+ hui = driver_load(env, di.pConfigFile);
+ pDrvDriverEvent = (void *)GetProcAddress(hui, "DrvDriverEvent");
+ if (hui && pDrvDriverEvent) {
+
+ /* Support for DrvDriverEvent is optional */
+ TRACE("DRIVER_EVENT_INITIALIZE for %s (%s)\n", debugstr_w(di.pName), debugstr_w(di.pConfigFile));
+ /* MSDN: level for DRIVER_INFO is 1 to 3 */
+ res = pDrvDriverEvent(DRIVER_EVENT_INITIALIZE, 3, (LPBYTE) &di, 0);
+ TRACE("got %d from DRIVER_EVENT_INITIALIZE\n", res);
+ }
+ FreeLibrary(hui);
TRACE("=> TRUE with %u\n", GetLastError());
return TRUE;
More information about the wine-cvs
mailing list