Detlef Riekenberg : winspool: Implement Level 6 + 7 for GetPrinter.
Alexandre Julliard
julliard at winehq.org
Wed Feb 27 08:03:21 CST 2008
Module: wine
Branch: master
Commit: ae91e974ebbf1a6a80aa28340df0a80f27165dd1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae91e974ebbf1a6a80aa28340df0a80f27165dd1
Author: Detlef Riekenberg <wine.dev at web.de>
Date: Tue Feb 26 23:09:55 2008 +0100
winspool: Implement Level 6 + 7 for GetPrinter.
---
dlls/winspool.drv/info.c | 76 +++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 75 insertions(+), 1 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index 80b74a5..af02b9e 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -6,7 +6,7 @@
* Copyright 1999 Klaas van Gend
* Copyright 1999, 2000 Huw D M Davies
* Copyright 2001 Marcus Meissner
- * Copyright 2005, 2006, 2007 Detlef Riekenberg
+ * Copyright 2005-2008 Detlef Riekenberg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -216,6 +216,7 @@ static const WCHAR ManufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e
static const WCHAR MonitorW[] = {'M','o','n','i','t','o','r',0};
static const WCHAR MonitorUIW[] = {'M','o','n','i','t','o','r','U','I',0};
static const WCHAR NameW[] = {'N','a','m','e',0};
+static const WCHAR ObjectGUIDW[] = {'O','b','j','e','c','t','G','U','I','D',0};
static const WCHAR OEM_UrlW[] = {'O','E','M',' ','U','r','l',0};
static const WCHAR ParametersW[] = {'P','a','r','a','m','e','t','e','r','s',0};
static const WCHAR PortW[] = {'P','o','r','t',0};
@@ -3996,6 +3997,41 @@ static BOOL WINSPOOL_GetPrinter_5(HKEY hkeyPrinter, PRINTER_INFO_5W *pi5,
return space;
}
+/*********************************************************************
+ * WINSPOOL_GetPrinter_7
+ *
+ * Fills out a PRINTER_INFO_7 struct storing the strings in buf.
+ */
+static BOOL WINSPOOL_GetPrinter_7(HKEY hkeyPrinter, PRINTER_INFO_7W *pi7, 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, ObjectGUIDW, ptr, left, &size, unicode))
+ {
+ if (space && size <= left) {
+ pi7->pszObjectGUID = (LPWSTR)ptr;
+ ptr += size;
+ left -= size;
+ } else
+ space = FALSE;
+ *pcbNeeded += size;
+ }
+ if (pi7) {
+ /* We do not have a Directory Service */
+ pi7->dwAction = DSPRINT_UNPUBLISH;
+ }
+
+ if (!space && pi7) /* zero out pi7 if we can't completely fill buf */
+ memset(pi7, 0, sizeof(*pi7));
+
+ return space;
+}
+
/*****************************************************************************
* WINSPOOL_GetPrinter
*
@@ -4092,6 +4128,44 @@ static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
break;
}
+
+ case 6:
+ {
+ PRINTER_INFO_6 *pi6 = (PRINTER_INFO_6 *) pPrinter;
+
+ size = sizeof(PRINTER_INFO_6);
+ if (size <= cbBuf) {
+ /* FIXME: We do not update the status yet */
+ pi6->dwStatus = WINSPOOL_GetDWORDFromReg(hkeyPrinter, "Status");
+ ret = TRUE;
+ } else {
+ ret = FALSE;
+ }
+
+ needed += size;
+ break;
+ }
+
+ case 7:
+ {
+ PRINTER_INFO_7W *pi7 = (PRINTER_INFO_7W *) pPrinter;
+
+ size = sizeof(PRINTER_INFO_7W);
+ if (size <= cbBuf) {
+ ptr = pPrinter + size;
+ cbBuf -= size;
+ memset(pPrinter, 0, size);
+ } else {
+ pi7 = NULL;
+ cbBuf = 0;
+ }
+
+ ret = WINSPOOL_GetPrinter_7(hkeyPrinter, pi7, ptr, cbBuf, &needed, unicode);
+ needed += size;
+ break;
+ }
+
+
default:
FIXME("Unimplemented level %d\n", Level);
SetLastError(ERROR_INVALID_LEVEL);
More information about the wine-cvs
mailing list