1
0
mirror of https://github.com/wine-mirror/wine synced 2024-06-29 06:14:34 +00:00

winspool.drv: Implement OpenPrinter2.

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Dmitry Timoshkov 2022-07-15 13:53:58 +03:00 committed by Alexandre Julliard
parent 70ad65d8d1
commit f81c82d49e
3 changed files with 92 additions and 35 deletions

View File

@ -1990,32 +1990,9 @@ BOOL WINAPI IsValidDevmodeW(PDEVMODEW dm, SIZE_T size)
* See OpenPrinterW.
*
*/
BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter,
LPPRINTER_DEFAULTSA pDefault)
BOOL WINAPI OpenPrinterA(LPSTR name, HANDLE *printer, PRINTER_DEFAULTSA *defaults)
{
UNICODE_STRING lpPrinterNameW;
UNICODE_STRING usBuffer;
PRINTER_DEFAULTSW DefaultW, *pDefaultW = NULL;
PWSTR pwstrPrinterNameW;
BOOL ret;
TRACE("%s,%p,%p\n", debugstr_a(lpPrinterName), phPrinter, pDefault);
pwstrPrinterNameW = asciitounicode(&lpPrinterNameW,lpPrinterName);
if(pDefault) {
DefaultW.pDatatype = asciitounicode(&usBuffer,pDefault->pDatatype);
DefaultW.pDevMode = pDefault->pDevMode ? GdiConvertToDevmodeW(pDefault->pDevMode) : NULL;
DefaultW.DesiredAccess = pDefault->DesiredAccess;
pDefaultW = &DefaultW;
}
ret = OpenPrinterW(pwstrPrinterNameW, phPrinter, pDefaultW);
if(pDefault) {
RtlFreeUnicodeString(&usBuffer);
HeapFree(GetProcessHeap(), 0, DefaultW.pDevMode);
}
RtlFreeUnicodeString(&lpPrinterNameW);
return ret;
return OpenPrinter2A(name, printer, defaults, NULL);
}
/******************************************************************
@ -2045,22 +2022,73 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter,
*| pDefaults is ignored
*
*/
BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter, LPPRINTER_DEFAULTSW pDefault)
BOOL WINAPI OpenPrinterW(LPWSTR name, HANDLE *printer, PRINTER_DEFAULTSW *defaults)
{
return OpenPrinter2W(name, printer, defaults, NULL);
}
BOOL WINAPI OpenPrinter2A(LPSTR name, HANDLE *printer,
PRINTER_DEFAULTSA *defaults, PRINTER_OPTIONSA *options)
{
UNICODE_STRING nameU;
UNICODE_STRING datatypeU;
PRINTER_DEFAULTSW defaultsW, *p_defaultsW = NULL;
PRINTER_OPTIONSW optionsW, *p_optionsW = NULL;
WCHAR *nameW;
BOOL ret;
TRACE("(%s,%p,%p,%p)\n", debugstr_a(name), printer, defaults, options);
nameW = asciitounicode(&nameU, name);
if (options)
{
optionsW.cbSize = sizeof(optionsW);
optionsW.dwFlags = options->dwFlags;
p_optionsW = &optionsW;
}
if (defaults)
{
defaultsW.pDatatype = asciitounicode(&datatypeU, defaults->pDatatype);
defaultsW.pDevMode = defaults->pDevMode ? GdiConvertToDevmodeW(defaults->pDevMode) : NULL;
defaultsW.DesiredAccess = defaults->DesiredAccess;
p_defaultsW = &defaultsW;
}
ret = OpenPrinter2W(nameW, printer, p_defaultsW, p_optionsW);
if (p_defaultsW)
{
RtlFreeUnicodeString(&datatypeU);
HeapFree(GetProcessHeap(), 0, defaultsW.pDevMode);
}
RtlFreeUnicodeString(&nameU);
return ret;
}
BOOL WINAPI OpenPrinter2W(LPWSTR name, HANDLE *printer,
PRINTER_DEFAULTSW *defaults, PRINTER_OPTIONSW *options)
{
HKEY key;
TRACE("(%s, %p, %p)\n", debugstr_w(lpPrinterName), phPrinter, pDefault);
TRACE("(%s,%p,%p,%p)\n", debugstr_w(name), printer, defaults, options);
if(!phPrinter) {
if (options)
FIXME("flags %08lx ignored\n", options->dwFlags);
if(!printer)
{
/* NT: FALSE with ERROR_INVALID_PARAMETER, 9x: TRUE */
SetLastError(ERROR_INVALID_PARAMETER);
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
/* Get the unique handle of the printer or Printserver */
*phPrinter = get_opened_printer_entry(lpPrinterName, pDefault);
*printer = get_opened_printer_entry( name, defaults );
if (*phPrinter && WINSPOOL_GetOpenedPrinterRegKey( *phPrinter, &key ) == ERROR_SUCCESS)
if (*printer && WINSPOOL_GetOpenedPrinterRegKey( *printer, &key ) == ERROR_SUCCESS)
{
DWORD deleting = 0, size = sizeof( deleting ), type;
DWORD status;
@ -2070,12 +2098,12 @@ BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter, LPPRINTER_DEFAU
set_reg_DWORD( key, L"Status", status & ~PRINTER_STATUS_DRIVER_UPDATE_NEEDED );
ReleaseMutex( init_mutex );
if (!deleting && (status & PRINTER_STATUS_DRIVER_UPDATE_NEEDED))
update_driver( *phPrinter );
update_driver( *printer );
RegCloseKey( key );
}
TRACE("returning %d with %lu and %p\n", *phPrinter != NULL, GetLastError(), *phPrinter);
return (*phPrinter != 0);
TRACE("returning %d with %lu and %p\n", *printer != NULL, GetLastError(), *printer);
return (*printer != NULL);
}
/******************************************************************

View File

@ -149,6 +149,8 @@
@ stdcall IsValidDevmodeW(ptr long)
@ stdcall OpenPrinterA(str ptr ptr)
@ stdcall OpenPrinterW(wstr ptr ptr)
@ stdcall OpenPrinter2A(str ptr ptr ptr)
@ stdcall OpenPrinter2W(wstr ptr ptr ptr)
@ stdcall PerfClose()
@ stdcall PerfCollect(wstr ptr ptr ptr)
@ stdcall PerfOpen(wstr)

View File

@ -1143,6 +1143,30 @@ typedef struct _BIDI_RESPONSE_CONTAINER {
BIDI_RESPONSE_DATA aData[1];
} BIDI_RESPONSE_CONTAINER, *LPBIDI_RESPONSE_CONTAINER, *PBIDI_RESPONSE_CONTAINER;
typedef enum _PRINTER_OPTION_FLAGS
{
PRINTER_OPTION_NO_CACHE = 1 << 0,
PRINTER_OPTION_CACHE = 1 << 1,
PRINTER_OPTION_CLIENT_CHANGE = 1 << 2,
PRINTER_OPTION_NO_CLIENT_DATA = 1 << 3,
} PRINTER_OPTION_FLAGS;
typedef struct _PRINTER_OPTIONSA
{
UINT cbSize;
DWORD dwFlags;
} PRINTER_OPTIONSA, *PPRINTER_OPTIONSA, *LPPRINTER_OPTIONSA;
typedef struct _PRINTER_OPTIONSW
{
UINT cbSize;
DWORD dwFlags;
} PRINTER_OPTIONSW, *PPRINTER_OPTIONSW, *LPPRINTER_OPTIONSW;
DECL_WINELIB_TYPE_AW(PRINTER_OPTIONS)
DECL_WINELIB_TYPE_AW(PPRINTER_OPTIONS)
DECL_WINELIB_TYPE_AW(LPPRINTER_OPTIONS)
/* string constants */
#define SPLREG_DEFAULT_SPOOL_DIRECTORYA "DefaultSpoolDirectory"
@ -1400,9 +1424,12 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter,
LPPRINTER_DEFAULTSA pDefault);
BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter,
LPPRINTER_DEFAULTSW pDefault);
#define OpenPrinter WINELIB_NAME_AW(OpenPrinter)
BOOL WINAPI OpenPrinter2A(LPSTR,HANDLE *,PRINTER_DEFAULTSA *,PRINTER_OPTIONSA *);
BOOL WINAPI OpenPrinter2W(LPWSTR,HANDLE *,PRINTER_DEFAULTSW *,PRINTER_OPTIONSW *);
#define OpenPrinter2 WINELIB_NAME_AW(OpenPrinter2)
BOOL WINAPI ResetPrinterA(HANDLE hPrinter, LPPRINTER_DEFAULTSA pDefault);
BOOL WINAPI ResetPrinterW(HANDLE hPrinter, LPPRINTER_DEFAULTSW pDefault);
#define ResetPrinter WINELIB_NAME_AW(ResetPrinter)