Commit f81c82d4 authored by Dmitry Timoshkov's avatar Dmitry Timoshkov Committed by Alexandre Julliard

winspool.drv: Implement OpenPrinter2.

parent 70ad65d8
...@@ -1990,32 +1990,9 @@ BOOL WINAPI IsValidDevmodeW(PDEVMODEW dm, SIZE_T size) ...@@ -1990,32 +1990,9 @@ BOOL WINAPI IsValidDevmodeW(PDEVMODEW dm, SIZE_T size)
* See OpenPrinterW. * See OpenPrinterW.
* *
*/ */
BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter, BOOL WINAPI OpenPrinterA(LPSTR name, HANDLE *printer, PRINTER_DEFAULTSA *defaults)
LPPRINTER_DEFAULTSA pDefault)
{ {
UNICODE_STRING lpPrinterNameW; return OpenPrinter2A(name, printer, defaults, NULL);
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;
} }
/****************************************************************** /******************************************************************
...@@ -2045,22 +2022,73 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter, ...@@ -2045,22 +2022,73 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter,
*| pDefaults is ignored *| 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; 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 */ /* NT: FALSE with ERROR_INVALID_PARAMETER, 9x: TRUE */
SetLastError(ERROR_INVALID_PARAMETER); SetLastError( ERROR_INVALID_PARAMETER );
return FALSE; return FALSE;
} }
/* Get the unique handle of the printer or Printserver */ /* 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 deleting = 0, size = sizeof( deleting ), type;
DWORD status; DWORD status;
...@@ -2070,12 +2098,12 @@ BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter, LPPRINTER_DEFAU ...@@ -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 ); set_reg_DWORD( key, L"Status", status & ~PRINTER_STATUS_DRIVER_UPDATE_NEEDED );
ReleaseMutex( init_mutex ); ReleaseMutex( init_mutex );
if (!deleting && (status & PRINTER_STATUS_DRIVER_UPDATE_NEEDED)) if (!deleting && (status & PRINTER_STATUS_DRIVER_UPDATE_NEEDED))
update_driver( *phPrinter ); update_driver( *printer );
RegCloseKey( key ); RegCloseKey( key );
} }
TRACE("returning %d with %lu and %p\n", *phPrinter != NULL, GetLastError(), *phPrinter); TRACE("returning %d with %lu and %p\n", *printer != NULL, GetLastError(), *printer);
return (*phPrinter != 0); return (*printer != NULL);
} }
/****************************************************************** /******************************************************************
......
...@@ -149,6 +149,8 @@ ...@@ -149,6 +149,8 @@
@ stdcall IsValidDevmodeW(ptr long) @ stdcall IsValidDevmodeW(ptr long)
@ stdcall OpenPrinterA(str ptr ptr) @ stdcall OpenPrinterA(str ptr ptr)
@ stdcall OpenPrinterW(wstr ptr ptr) @ stdcall OpenPrinterW(wstr ptr ptr)
@ stdcall OpenPrinter2A(str ptr ptr ptr)
@ stdcall OpenPrinter2W(wstr ptr ptr ptr)
@ stdcall PerfClose() @ stdcall PerfClose()
@ stdcall PerfCollect(wstr ptr ptr ptr) @ stdcall PerfCollect(wstr ptr ptr ptr)
@ stdcall PerfOpen(wstr) @ stdcall PerfOpen(wstr)
......
...@@ -1143,6 +1143,30 @@ typedef struct _BIDI_RESPONSE_CONTAINER { ...@@ -1143,6 +1143,30 @@ typedef struct _BIDI_RESPONSE_CONTAINER {
BIDI_RESPONSE_DATA aData[1]; BIDI_RESPONSE_DATA aData[1];
} BIDI_RESPONSE_CONTAINER, *LPBIDI_RESPONSE_CONTAINER, *PBIDI_RESPONSE_CONTAINER; } 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 */ /* string constants */
#define SPLREG_DEFAULT_SPOOL_DIRECTORYA "DefaultSpoolDirectory" #define SPLREG_DEFAULT_SPOOL_DIRECTORYA "DefaultSpoolDirectory"
...@@ -1400,9 +1424,12 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter, ...@@ -1400,9 +1424,12 @@ BOOL WINAPI OpenPrinterA(LPSTR lpPrinterName,HANDLE *phPrinter,
LPPRINTER_DEFAULTSA pDefault); LPPRINTER_DEFAULTSA pDefault);
BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter, BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter,
LPPRINTER_DEFAULTSW pDefault); LPPRINTER_DEFAULTSW pDefault);
#define OpenPrinter WINELIB_NAME_AW(OpenPrinter) #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 ResetPrinterA(HANDLE hPrinter, LPPRINTER_DEFAULTSA pDefault);
BOOL WINAPI ResetPrinterW(HANDLE hPrinter, LPPRINTER_DEFAULTSW pDefault); BOOL WINAPI ResetPrinterW(HANDLE hPrinter, LPPRINTER_DEFAULTSW pDefault);
#define ResetPrinter WINELIB_NAME_AW(ResetPrinter) #define ResetPrinter WINELIB_NAME_AW(ResetPrinter)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment