From e1635e9a63b4d22e1926b776c93b23cd953e1bca Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 28 Feb 2001 05:26:08 +0000 Subject: [PATCH] Removed dependency on comctl32. --- dlls/winspool/info.c | 194 ++++++++++++----------------------------- dlls/winspool/wspool.c | 12 --- 2 files changed, 54 insertions(+), 152 deletions(-) diff --git a/dlls/winspool/info.c b/dlls/winspool/info.c index f5d96109f3c..73c2aa9a0f0 100644 --- a/dlls/winspool/info.c +++ b/dlls/winspool/info.c @@ -20,23 +20,12 @@ #include "wine/unicode.h" #include "debugtools.h" #include "heap.h" -#include "commctrl.h" #include "winnls.h" DEFAULT_DEBUG_CHANNEL(winspool); -typedef struct _OPENEDPRINTER -{ - LPWSTR lpsPrinterName; - HANDLE hPrinter; -} OPENEDPRINTER, *LPOPENEDPRINTER; - -/* The OpenedPrinter Table dynamic array */ -static HDPA pOpenedPrinterDPA = NULL; - -extern HDPA WINAPI (*WINSPOOL_DPA_CreateEx) (INT, HANDLE); -extern LPVOID WINAPI (*WINSPOOL_DPA_GetPtr) (const HDPA, INT); -extern INT WINAPI (*WINSPOOL_DPA_InsertPtr) (const HDPA, INT, LPVOID); +static LPWSTR *printer_array; +static int nb_printers; static DWORD WINAPI (*GDI_CallDeviceCapabilities16)( LPCSTR lpszDevice, LPCSTR lpszPort, WORD fwCapability, LPSTR lpszOutput, @@ -84,73 +73,42 @@ static WCHAR WinPrintW[] = {'W','i','n','P','r','i','n','t',0}; * WINSPOOL_GetOpenedPrinterEntry * Get the first place empty in the opened printer table */ -static LPOPENEDPRINTER WINSPOOL_GetOpenedPrinterEntry() +static HANDLE WINSPOOL_GetOpenedPrinterEntry( LPCWSTR name ) { int i; - LPOPENEDPRINTER pOpenedPrinter; - /* - * Create the opened printers' handle dynamic array. - */ - if (!pOpenedPrinterDPA) + for (i = 0; i < nb_printers; i++) if (!printer_array[i]) break; + + if (i >= nb_printers) { - pOpenedPrinterDPA = WINSPOOL_DPA_CreateEx(10, GetProcessHeap()); - for (i = 0; i < 10; i++) - { - pOpenedPrinter = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(OPENEDPRINTER)); - pOpenedPrinter->hPrinter = -1; - WINSPOOL_DPA_InsertPtr(pOpenedPrinterDPA, i, pOpenedPrinter); - } + LPWSTR *new_array = HeapReAlloc( GetProcessHeap(), 0, printer_array, + (nb_printers + 16) * sizeof(*new_array) ); + if (!new_array) return 0; + printer_array = new_array; + nb_printers += 16; } - /* - * Search for a handle not yet allocated. - */ - for (i = 0; i < pOpenedPrinterDPA->nItemCount; i++) + if ((printer_array[i] = HeapAlloc( GetProcessHeap(), 0, (strlenW(name)+1)*sizeof(WCHAR) ))) { - pOpenedPrinter = WINSPOOL_DPA_GetPtr(pOpenedPrinterDPA, i); - - if (pOpenedPrinter->hPrinter == -1) - { - pOpenedPrinter->hPrinter = i + 1; - return pOpenedPrinter; - } + strcpyW( printer_array[i], name ); + return (HANDLE)(i + 1); } - - /* - * Didn't find one, insert new element in the array. - */ - if (i == pOpenedPrinterDPA->nItemCount) - { - pOpenedPrinter = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(OPENEDPRINTER)); - pOpenedPrinter->hPrinter = i + 1; - WINSPOOL_DPA_InsertPtr(pOpenedPrinterDPA, i, pOpenedPrinter); - return pOpenedPrinter; - } - - return NULL; + return 0; } /****************************************************************** * WINSPOOL_GetOpenedPrinter * Get the pointer to the opened printer referred by the handle */ -static LPOPENEDPRINTER WINSPOOL_GetOpenedPrinter(int printerHandle) +static LPCWSTR WINSPOOL_GetOpenedPrinter(HANDLE printerHandle) { - LPOPENEDPRINTER pOpenedPrinter; - - if(!pOpenedPrinterDPA) return NULL; - if((printerHandle <=0) || - (printerHandle > (pOpenedPrinterDPA->nItemCount - 1))) + int idx = (int)printerHandle; + if ((idx <= 0) || (idx > nb_printers)) + { + SetLastError(ERROR_INVALID_HANDLE); return NULL; - - pOpenedPrinter = WINSPOOL_DPA_GetPtr(pOpenedPrinterDPA, printerHandle-1); - - return pOpenedPrinter; + } + return printer_array[idx - 1]; } /****************************************************************** @@ -159,21 +117,20 @@ static LPOPENEDPRINTER WINSPOOL_GetOpenedPrinter(int printerHandle) */ static DWORD WINSPOOL_GetOpenedPrinterRegKey(HANDLE hPrinter, HKEY *phkey) { - LPOPENEDPRINTER lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter); + LPCWSTR name = WINSPOOL_GetOpenedPrinter(hPrinter); DWORD ret; HKEY hkeyPrinters; - if(!lpOpenedPrinter) - return ERROR_INVALID_HANDLE; + if(!name) return ERROR_INVALID_HANDLE; if((ret = RegCreateKeyA(HKEY_LOCAL_MACHINE, Printers, &hkeyPrinters)) != ERROR_SUCCESS) return ret; - if(RegOpenKeyW(hkeyPrinters, lpOpenedPrinter->lpsPrinterName, phkey) - != ERROR_SUCCESS) { + if(RegOpenKeyW(hkeyPrinters, name, phkey) != ERROR_SUCCESS) + { ERR("Can't find opened printer %s in registry\n", - debugstr_w(lpOpenedPrinter->lpsPrinterName)); + debugstr_w(name)); RegCloseKey(hkeyPrinters); return ERROR_INVALID_PRINTER_NAME; /* ? */ } @@ -408,7 +365,6 @@ LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter, LPSTR pDeviceName, LPDEVMODEA pDevModeOutput, LPDEVMODEA pDevModeInput,DWORD fMode ) { - LPOPENEDPRINTER lpOpenedPrinter; LPSTR lpName = pDeviceName; LONG ret; @@ -417,13 +373,8 @@ LONG WINAPI DocumentPropertiesA(HWND hWnd,HANDLE hPrinter, ); if(!pDeviceName) { - LPWSTR lpNameW; - lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter); - if(!lpOpenedPrinter) { - SetLastError(ERROR_INVALID_HANDLE); - return -1; - } - lpNameW = lpOpenedPrinter->lpsPrinterName; + LPCWSTR lpNameW = WINSPOOL_GetOpenedPrinter(hPrinter); + if(!lpNameW) return -1; lpName = HEAP_strdupWtoA(GetProcessHeap(),0,lpNameW); } @@ -512,7 +463,6 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter, BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter, LPPRINTER_DEFAULTSW pDefault) { - LPOPENEDPRINTER lpOpenedPrinter; HKEY hkeyPrinters, hkeyPrinter; if (!lpPrinterName) { @@ -545,21 +495,8 @@ BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter, if(!phPrinter) /* This seems to be what win95 does anyway */ return TRUE; - /* Get a place in the opened printer buffer*/ - lpOpenedPrinter = WINSPOOL_GetOpenedPrinterEntry(); - if(!lpOpenedPrinter) { - ERR("Can't allocate printer slot\n"); - SetLastError(ERROR_OUTOFMEMORY); - return FALSE; - } - - /* Get the name of the printer */ - lpOpenedPrinter->lpsPrinterName = HeapAlloc( GetProcessHeap(), 0, - (strlenW(lpPrinterName)+1)*sizeof(WCHAR) ); - strcpyW( lpOpenedPrinter->lpsPrinterName, lpPrinterName ); - /* Get the unique handle of the printer*/ - *phPrinter = lpOpenedPrinter->hPrinter; + *phPrinter = WINSPOOL_GetOpenedPrinterEntry( lpPrinterName ); if (pDefault != NULL) FIXME("Not handling pDefault\n"); @@ -915,23 +852,14 @@ HANDLE WINAPI AddPrinterA(LPSTR pName, DWORD Level, LPBYTE pPrinter) */ BOOL WINAPI ClosePrinter(HANDLE hPrinter) { - LPOPENEDPRINTER lpOpenedPrinter; + int i = (int)hPrinter; TRACE("Handle %d\n", hPrinter); - if (!pOpenedPrinterDPA) - return FALSE; - - if ((hPrinter != -1) && (hPrinter < (pOpenedPrinterDPA->nItemCount - 1))) - { - lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter); - HeapFree(GetProcessHeap(), 0, lpOpenedPrinter->lpsPrinterName); - lpOpenedPrinter->lpsPrinterName = NULL; - lpOpenedPrinter->hPrinter = -1; - - return TRUE; - } - return FALSE; + if ((i <= 0) || (i > nb_printers)) return FALSE; + HeapFree( GetProcessHeap(), 0, printer_array[i - 1] ); + printer_array[i - 1] = NULL; + return TRUE; } /***************************************************************************** @@ -957,15 +885,10 @@ BOOL WINAPI DeleteFormW(HANDLE hPrinter, LPWSTR pFormName) */ BOOL WINAPI DeletePrinter(HANDLE hPrinter) { - LPWSTR lpNameW; + LPCWSTR lpNameW = WINSPOOL_GetOpenedPrinter(hPrinter); HKEY hkeyPrinters; - LPOPENEDPRINTER lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter); - if(!lpOpenedPrinter) { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - lpNameW = lpOpenedPrinter->lpsPrinterName; + if(!lpNameW) return FALSE; if(RegOpenKeyA(HKEY_LOCAL_MACHINE, Printers, &hkeyPrinters) != ERROR_SUCCESS) { ERR("Can't open Printers key\n"); @@ -1410,7 +1333,7 @@ static BOOL WINSPOOL_GetPrinter_5(HKEY hkeyPrinter, PRINTER_INFO_5W *pi5, static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter, DWORD cbBuf, LPDWORD pcbNeeded, BOOL unicode) { - OPENEDPRINTER *lpOpenedPrinter; + LPCWSTR name; DWORD size, needed = 0; LPBYTE ptr = NULL; HKEY hkeyPrinter, hkeyPrinters; @@ -1418,20 +1341,16 @@ static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter, TRACE("(%d,%ld,%p,%ld,%p)\n",hPrinter,Level,pPrinter,cbBuf, pcbNeeded); - lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter); - if(!lpOpenedPrinter) { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } + if (!(name = WINSPOOL_GetOpenedPrinter(hPrinter))) return FALSE; + if(RegCreateKeyA(HKEY_LOCAL_MACHINE, Printers, &hkeyPrinters) != ERROR_SUCCESS) { ERR("Can't create Printers key\n"); return FALSE; } - if(RegOpenKeyW(hkeyPrinters, lpOpenedPrinter->lpsPrinterName, &hkeyPrinter) - != ERROR_SUCCESS) { - ERR("Can't find opened printer %s in registry\n", - debugstr_w(lpOpenedPrinter->lpsPrinterName)); + if(RegOpenKeyW(hkeyPrinters, name, &hkeyPrinter) != ERROR_SUCCESS) + { + ERR("Can't find opened printer %s in registry\n", debugstr_w(name)); RegCloseKey(hkeyPrinters); SetLastError(ERROR_INVALID_PRINTER_NAME); /* ? */ return FALSE; @@ -1707,9 +1626,9 @@ static BOOL WINSPOOL_EnumPrinters(DWORD dwType, LPWSTR lpszName, * lpbPrinters buffer. * * If level set to 3 or 6+: - * returns zero (faillure!) + * returns zero (failure!) * - * Returns nonzero (TRUE) on succes, or zero on faillure, use GetLastError + * Returns nonzero (TRUE) on success, or zero on failure, use GetLastError * for information. * * BUGS: @@ -1933,7 +1852,7 @@ static BOOL WINSPOOL_GetPrinterDriver(HANDLE hPrinter, LPWSTR pEnvironment, DWORD cbBuf, LPDWORD pcbNeeded, BOOL unicode) { - OPENEDPRINTER *lpOpenedPrinter; + LPCWSTR name; WCHAR DriverName[100]; DWORD ret, type, size, needed = 0; LPBYTE ptr = NULL; @@ -1944,11 +1863,8 @@ static BOOL WINSPOOL_GetPrinterDriver(HANDLE hPrinter, LPWSTR pEnvironment, ZeroMemory(pDriverInfo, cbBuf); - lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter); - if(!lpOpenedPrinter) { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } + if (!(name = WINSPOOL_GetOpenedPrinter(hPrinter))) return FALSE; + if(Level < 1 || Level > 3) { SetLastError(ERROR_INVALID_LEVEL); return FALSE; @@ -1958,10 +1874,9 @@ static BOOL WINSPOOL_GetPrinterDriver(HANDLE hPrinter, LPWSTR pEnvironment, ERR("Can't create Printers key\n"); return FALSE; } - if(RegOpenKeyW(hkeyPrinters, lpOpenedPrinter->lpsPrinterName, &hkeyPrinter) + if(RegOpenKeyW(hkeyPrinters, name, &hkeyPrinter) != ERROR_SUCCESS) { - ERR("Can't find opened printer %s in registry\n", - debugstr_w(lpOpenedPrinter->lpsPrinterName)); + ERR("Can't find opened printer %s in registry\n", debugstr_w(name)); RegCloseKey(hkeyPrinters); SetLastError(ERROR_INVALID_PRINTER_NAME); /* ? */ return FALSE; @@ -1972,8 +1887,7 @@ static BOOL WINSPOOL_GetPrinterDriver(HANDLE hPrinter, LPWSTR pEnvironment, RegCloseKey(hkeyPrinter); RegCloseKey(hkeyPrinters); if(ret != ERROR_SUCCESS) { - ERR("Can't get DriverName for printer %s\n", - debugstr_w(lpOpenedPrinter->lpsPrinterName)); + ERR("Can't get DriverName for printer %s\n", debugstr_w(name)); return FALSE; } @@ -2202,7 +2116,7 @@ BOOL WINAPI AddPrinterDriverW(LPWSTR printerName,DWORD level, * Displays a dialog to set the properties of the printer. * * RETURNS - * nonzero on succes or zero on faillure + * nonzero on success or zero on failure * * BUGS * implemented as stub only @@ -2247,11 +2161,11 @@ BOOL WINAPI EnumJobsW(HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs, /***************************************************************************** * WINSPOOL_EnumPrinterDrivers [internal] * - * Delivers information about all installed printer drivers installed on + * Delivers information about all printer drivers installed on the * localhost or a given server * * RETURNS - * nonzero on succes or zero on failure, if the buffer for the returned + * nonzero on success or zero on failure. If the buffer for the returned * information is too small the function will return an error * * BUGS diff --git a/dlls/winspool/wspool.c b/dlls/winspool/wspool.c index 23a93201b44..93b5b4f1345 100644 --- a/dlls/winspool/wspool.c +++ b/dlls/winspool/wspool.c @@ -5,15 +5,10 @@ * Copyright 1999 Thuy Nguyen */ -#include "commctrl.h" #include "debugtools.h" DEFAULT_DEBUG_CHANNEL(winspool); -HINSTANCE hcomctl32 = 0; -HDPA WINAPI (*WINSPOOL_DPA_CreateEx)(INT, HANDLE); -LPVOID WINAPI (*WINSPOOL_DPA_GetPtr)(const HDPA, INT); -INT WINAPI (*WINSPOOL_DPA_InsertPtr)(const HDPA, INT, LPVOID); /****************************************************************************** * WINSPOOL_EntryPoint @@ -28,16 +23,9 @@ BOOL WINAPI WINSPOOL_EntryPoint(HINSTANCE hInstance, switch (reason) { case DLL_PROCESS_ATTACH: - - hcomctl32 = LoadLibraryA("COMCTL32.DLL"); - - WINSPOOL_DPA_CreateEx = (void*)GetProcAddress(hcomctl32, (LPCSTR)340L); - WINSPOOL_DPA_GetPtr = (void*)GetProcAddress(hcomctl32, (LPCSTR)332L); - WINSPOOL_DPA_InsertPtr = (void*)GetProcAddress(hcomctl32, (LPCSTR)334L); break; case DLL_PROCESS_DETACH: - FreeLibrary(hcomctl32); break; }