From a916f744769e2292adc21c3f7e5429fe904427de Mon Sep 17 00:00:00 2001 From: Detlef Riekenberg Date: Wed, 30 Sep 2009 09:57:11 +0200 Subject: [PATCH] winspool: Use the backend for AddPortExW. --- dlls/winspool.drv/info.c | 240 +-------------------------------------- 1 file changed, 2 insertions(+), 238 deletions(-) diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 67c12526c37..4bd88a262b9 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -64,16 +64,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(winspool); /* ############################### */ -static CRITICAL_SECTION monitor_handles_cs; -static CRITICAL_SECTION_DEBUG monitor_handles_cs_debug = -{ - 0, 0, &monitor_handles_cs, - { &monitor_handles_cs_debug.ProcessLocksList, &monitor_handles_cs_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": monitor_handles_cs") } -}; -static CRITICAL_SECTION monitor_handles_cs = { &monitor_handles_cs_debug, -1, 0, 0, 0, 0 }; - - static CRITICAL_SECTION printer_handles_cs; static CRITICAL_SECTION_DEBUG printer_handles_cs_debug = { @@ -85,17 +75,6 @@ static CRITICAL_SECTION printer_handles_cs = { &printer_handles_cs_debug, -1, 0, /* ############################### */ -typedef struct { - struct list entry; - LPWSTR name; - LPWSTR dllname; - PMONITORUI monitorUI; - LPMONITOR monitor; - HMODULE hdll; - DWORD refcount; - DWORD dwMonitorSize; -} monitor_t; - typedef struct { DWORD job_id; HANDLE hf; @@ -132,9 +111,6 @@ typedef struct { /* ############################### */ -static struct list monitor_handles = LIST_INIT( monitor_handles ); -static monitor_t * pm_localport; - static opened_printer_t **printer_handles; static UINT nb_printer_handles; static LONG next_job_id = 1; @@ -154,12 +130,6 @@ static const WCHAR DriversW[] = { 'S','y','s','t','e','m','\\', 'E','n','v','i','r','o','n','m','e','n','t','s','\\', '%','s','\\','D','r','i','v','e','r','s','%','s',0 }; -static const WCHAR MonitorsW[] = { 'S','y','s','t','e','m','\\', - 'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', - 'C','o','n','t','r','o','l','\\', - 'P','r','i','n','t','\\', - 'M','o','n','i','t','o','r','s','\\',0}; - static const WCHAR PrintersW[] = {'S','y','s','t','e','m','\\', 'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', 'C','o','n','t','r','o','l','\\', @@ -760,190 +730,6 @@ static inline DWORD set_reg_szW(HKEY hkey, const WCHAR *keyname, const WCHAR *va return ERROR_FILE_NOT_FOUND; } -/****************************************************************** - * monitor_unload [internal] - * - * release a printmonitor and unload it from memory, when needed - * - */ -static void monitor_unload(monitor_t * pm) -{ - if (pm == NULL) return; - TRACE("%p (refcount: %d) %s\n", pm, pm->refcount, debugstr_w(pm->name)); - - EnterCriticalSection(&monitor_handles_cs); - - if (pm->refcount) pm->refcount--; - - if (pm->refcount == 0) { - list_remove(&pm->entry); - FreeLibrary(pm->hdll); - HeapFree(GetProcessHeap(), 0, pm->name); - HeapFree(GetProcessHeap(), 0, pm->dllname); - HeapFree(GetProcessHeap(), 0, pm); - } - LeaveCriticalSection(&monitor_handles_cs); -} - -/****************************************************************** - * monitor_load [internal] - * - * load a printmonitor, get the dllname from the registry, when needed - * initialize the monitor and dump found function-pointers - * - * On failure, SetLastError() is called and NULL is returned - */ - -static monitor_t * monitor_load(LPCWSTR name, LPWSTR dllname) -{ - LPMONITOR2 (WINAPI *pInitializePrintMonitor2) (PMONITORINIT, LPHANDLE); - PMONITORUI (WINAPI *pInitializePrintMonitorUI)(VOID); - LPMONITOREX (WINAPI *pInitializePrintMonitor) (LPWSTR); - DWORD (WINAPI *pInitializeMonitorEx)(LPWSTR, LPMONITOR); - DWORD (WINAPI *pInitializeMonitor) (LPWSTR); - - monitor_t * pm = NULL; - monitor_t * cursor; - LPWSTR regroot = NULL; - LPWSTR driver = dllname; - - TRACE("(%s, %s)\n", debugstr_w(name), debugstr_w(dllname)); - /* Is the Monitor already loaded? */ - EnterCriticalSection(&monitor_handles_cs); - - if (name) { - LIST_FOR_EACH_ENTRY(cursor, &monitor_handles, monitor_t, entry) - { - if (cursor->name && (lstrcmpW(name, cursor->name) == 0)) { - pm = cursor; - break; - } - } - } - - if (pm == NULL) { - pm = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(monitor_t)); - if (pm == NULL) goto cleanup; - list_add_tail(&monitor_handles, &pm->entry); - } - pm->refcount++; - - if (pm->name == NULL) { - /* Load the monitor */ - LPMONITOREX pmonitorEx; - DWORD len; - - if (name) { - len = lstrlenW(MonitorsW) + lstrlenW(name) + 2; - regroot = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); - } - - if (regroot) { - lstrcpyW(regroot, MonitorsW); - lstrcatW(regroot, name); - /* Get the Driver from the Registry */ - if (driver == NULL) { - HKEY hroot; - DWORD namesize; - if (RegOpenKeyW(HKEY_LOCAL_MACHINE, regroot, &hroot) == ERROR_SUCCESS) { - if (RegQueryValueExW(hroot, DriverW, NULL, NULL, NULL, - &namesize) == ERROR_SUCCESS) { - driver = HeapAlloc(GetProcessHeap(), 0, namesize); - RegQueryValueExW(hroot, DriverW, NULL, NULL, (LPBYTE) driver, &namesize) ; - } - RegCloseKey(hroot); - } - } - } - - pm->name = strdupW(name); - pm->dllname = strdupW(driver); - - if ((name && (!regroot || !pm->name)) || !pm->dllname) { - monitor_unload(pm); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - pm = NULL; - goto cleanup; - } - - pm->hdll = LoadLibraryW(driver); - TRACE("%p: LoadLibrary(%s) => %d\n", pm->hdll, debugstr_w(driver), GetLastError()); - - if (pm->hdll == NULL) { - monitor_unload(pm); - SetLastError(ERROR_MOD_NOT_FOUND); - pm = NULL; - goto cleanup; - } - - pInitializePrintMonitor2 = (void *)GetProcAddress(pm->hdll, "InitializePrintMonitor2"); - pInitializePrintMonitorUI = (void *)GetProcAddress(pm->hdll, "InitializePrintMonitorUI"); - pInitializePrintMonitor = (void *)GetProcAddress(pm->hdll, "InitializePrintMonitor"); - pInitializeMonitorEx = (void *)GetProcAddress(pm->hdll, "InitializeMonitorEx"); - pInitializeMonitor = (void *)GetProcAddress(pm->hdll, "InitializeMonitor"); - - - TRACE("%p: %s,pInitializePrintMonitor2\n", pInitializePrintMonitor2, debugstr_w(driver)); - TRACE("%p: %s,pInitializePrintMonitorUI\n", pInitializePrintMonitorUI, debugstr_w(driver)); - TRACE("%p: %s,pInitializePrintMonitor\n", pInitializePrintMonitor, debugstr_w(driver)); - TRACE("%p: %s,pInitializeMonitorEx\n", pInitializeMonitorEx, debugstr_w(driver)); - TRACE("%p: %s,pInitializeMonitor\n", pInitializeMonitor, debugstr_w(driver)); - - if (pInitializePrintMonitorUI != NULL) { - pm->monitorUI = pInitializePrintMonitorUI(); - TRACE("%p: MONITORUI from %s,InitializePrintMonitorUI()\n", pm->monitorUI, debugstr_w(driver)); - if (pm->monitorUI) { - TRACE( "0x%08x: dwMonitorSize (%d)\n", - pm->monitorUI->dwMonitorUISize, pm->monitorUI->dwMonitorUISize ); - - } - } - - if (pInitializePrintMonitor && regroot) { - pmonitorEx = pInitializePrintMonitor(regroot); - TRACE( "%p: LPMONITOREX from %s,InitializePrintMonitor(%s)\n", - pmonitorEx, debugstr_w(driver), debugstr_w(regroot)); - - if (pmonitorEx) { - pm->dwMonitorSize = pmonitorEx->dwMonitorSize; - pm->monitor = &(pmonitorEx->Monitor); - } - } - - if (pm->monitor) { - TRACE( "0x%08x: dwMonitorSize (%d)\n", pm->dwMonitorSize, pm->dwMonitorSize ); - - } - - if (!pm->monitor && regroot) { - if (pInitializePrintMonitor2 != NULL) { - FIXME("%s,InitializePrintMonitor2 not implemented\n", debugstr_w(driver)); - } - if (pInitializeMonitorEx != NULL) { - FIXME("%s,InitializeMonitorEx not implemented\n", debugstr_w(driver)); - } - if (pInitializeMonitor != NULL) { - FIXME("%s,InitializeMonitor not implemented\n", debugstr_w(driver)); - } - } - if (!pm->monitor && !pm->monitorUI) { - monitor_unload(pm); - SetLastError(ERROR_PROC_NOT_FOUND); - pm = NULL; - } - } -cleanup: - if ((pm_localport == NULL) && (pm != NULL) && (lstrcmpW(pm->name, LocalPortW) == 0)) { - pm->refcount++; - pm_localport = pm; - } - LeaveCriticalSection(&monitor_handles_cs); - if (driver != dllname) HeapFree(GetProcessHeap(), 0, driver); - HeapFree(GetProcessHeap(), 0, regroot); - TRACE("=> %p\n", pm); - return pm; -} - /****************************************************************** * get_servername_from_name (internal) * @@ -6080,8 +5866,6 @@ BOOL WINAPI AddPortExA(LPSTR pName, DWORD level, LPBYTE pBuffer, LPSTR pMonitorN BOOL WINAPI AddPortExW(LPWSTR pName, DWORD level, LPBYTE pBuffer, LPWSTR pMonitorName) { PORT_INFO_2W * pi2; - monitor_t * pm; - DWORD res = FALSE; pi2 = (PORT_INFO_2W *) pBuffer; @@ -6090,34 +5874,14 @@ BOOL WINAPI AddPortExW(LPWSTR pName, DWORD level, LPBYTE pBuffer, LPWSTR pMonito debugstr_w(((level > 1) && pi2) ? pi2->pMonitorName : NULL), debugstr_w(((level > 1) && pi2) ? pi2->pDescription : NULL)); - - if ((level < 1) || (level > 2)) { - SetLastError(ERROR_INVALID_LEVEL); - return FALSE; - } + if ((backend == NULL) && !load_backend()) return FALSE; if ((!pi2) || (!pMonitorName) || (!pMonitorName[0])) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - /* load the Monitor */ - pm = monitor_load(pMonitorName, NULL); - if (!pm) { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if (pm->monitor && pm->monitor->pfnAddPortEx) { - res = pm->monitor->pfnAddPortEx(pName, level, pBuffer, pMonitorName); - TRACE("got %u with %u\n", res, GetLastError()); - } - else - { - FIXME("not implemented for %s (%p)\n", debugstr_w(pMonitorName), pm->monitor); - } - monitor_unload(pm); - return res; + return backend->fpAddPortEx(pName, level, pBuffer, pMonitorName); } /******************************************************************************