Module: wine Branch: master Commit: 09a2c89a6088c3b3dfbe73e26da7621d6ed514e6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=09a2c89a6088c3b3dfbe73e26d...
Author: Huw Davies huw@codeweavers.com Date: Thu Apr 12 14:08:22 2007 +0100
winspool.drv: Implement level 1 support for EnumPrinters.
---
dlls/winspool.drv/info.c | 74 +++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 67 insertions(+), 7 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 7fc3e73..8ecf795 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -3615,6 +3615,63 @@ static BOOL WINSPOOL_GetDevModeFromReg(HKEY hkey, LPCWSTR ValueName, }
/********************************************************************* + * WINSPOOL_GetPrinter_1 + * + * Fills out a PRINTER_INFO_1A|W struct storing the strings in buf. + * The strings are either stored as unicode or ascii. + */ +static BOOL WINSPOOL_GetPrinter_1(HKEY hkeyPrinter, PRINTER_INFO_1W *pi1, + LPBYTE buf, DWORD cbBuf, LPDWORD pcbNeeded, + BOOL unicode) +{ + DWORD size, left = cbBuf; + BOOL space = (cbBuf > 0); + LPBYTE ptr = buf; + + *pcbNeeded = 0; + + if(WINSPOOL_GetStringFromReg(hkeyPrinter, NameW, ptr, left, &size, + unicode)) { + if(space && size <= left) { + pi1->pName = (LPWSTR)ptr; + ptr += size; + left -= size; + } else + space = FALSE; + *pcbNeeded += size; + } + + /* FIXME: pDescription should be something like "Name,Driver_Name,". */ + if(WINSPOOL_GetStringFromReg(hkeyPrinter, NameW, ptr, left, &size, + unicode)) { + if(space && size <= left) { + pi1->pDescription = (LPWSTR)ptr; + ptr += size; + left -= size; + } else + space = FALSE; + *pcbNeeded += size; + } + + if(WINSPOOL_GetStringFromReg(hkeyPrinter, DescriptionW, ptr, left, &size, + unicode)) { + if(space && size <= left) { + pi1->pComment = (LPWSTR)ptr; + ptr += size; + left -= size; + } else + space = FALSE; + *pcbNeeded += size; + } + + if(pi1) pi1->Flags = PRINTER_ENUM_ICON8; /* We're a printer */ + + if(!space && pi1) /* zero out pi1 if we can't completely fill buf */ + memset(pi1, 0, sizeof(*pi1)); + + return space; +} +/********************************************************************* * WINSPOOL_GetPrinter_2 * * Fills out a PRINTER_INFO_2A|W struct storing the strings in buf. @@ -4046,11 +4103,8 @@ static BOOL WINSPOOL_EnumPrinters(DWORD dwType, LPWSTR lpszName,
switch(dwLevel) { case 1: - RegCloseKey(hkeyPrinters); - if (lpdwReturned) - *lpdwReturned = number; - return TRUE; - + used = number * sizeof(PRINTER_INFO_1W); + break; case 2: used = number * sizeof(PRINTER_INFO_2W); break; @@ -4092,6 +4146,12 @@ static BOOL WINSPOOL_EnumPrinters(DWORD dwType, LPWSTR lpszName, }
switch(dwLevel) { + case 1: + WINSPOOL_GetPrinter_1(hkeyPrinter, (PRINTER_INFO_1W *)pi, buf, + left, &needed, unicode); + used += needed; + if(pi) pi += sizeof(PRINTER_INFO_1W); + break; case 2: WINSPOOL_GetPrinter_2(hkeyPrinter, (PRINTER_INFO_2W *)pi, buf, left, &needed, unicode); @@ -4145,8 +4205,8 @@ static BOOL WINSPOOL_EnumPrinters(DWORD dwType, LPWSTR lpszName, * RETURNS: * * If level is set to 1: - * Not implemented yet! - * Returns TRUE with an empty list. + * Returns an array of PRINTER_INFO_1 data structures in the + * lpbPrinters buffer. * * If level is set to 2: * Possible flags: PRINTER_ENUM_CONNECTIONS, PRINTER_ENUM_LOCAL.