Module: wine Branch: master Commit: 0bc112cfe48fecd86ce6538f62d611ed0d448342 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0bc112cfe48fecd86ce6538f62...
Author: Detlef Riekenberg wine.dev@web.de Date: Thu May 7 00:11:33 2009 +0200
winspool: Move remaining Xcv support to the backend.
---
dlls/localspl/provider.c | 69 +++++++++++++++++++++++++++++++++++- dlls/winspool.drv/info.c | 88 ++++------------------------------------------ 2 files changed, 75 insertions(+), 82 deletions(-)
diff --git a/dlls/localspl/provider.c b/dlls/localspl/provider.c index 4e3289d..79541db 100644 --- a/dlls/localspl/provider.c +++ b/dlls/localspl/provider.c @@ -1724,6 +1724,73 @@ static BOOL WINAPI fpOpenPrinter(LPWSTR lpPrinterName, HANDLE *pPrinter, return (*pPrinter != 0); }
+/****************************************************************************** + * fpXcvData [exported through PRINTPROVIDOR] + * + * Execute commands in the Printmonitor DLL + * + * PARAMS + * hXcv [i] Handle from fpOpenPrinter (with XcvMonitor or XcvPort) + * pszDataName [i] Name of the command to execute + * pInputData [i] Buffer for extra Input Data (needed only for some commands) + * cbInputData [i] Size in Bytes of Buffer at pInputData + * pOutputData [o] Buffer to receive additional Data (needed only for some commands) + * cbOutputData [i] Size in Bytes of Buffer at pOutputData + * pcbOutputNeeded [o] PTR to receive the minimal Size in Bytes of the Buffer at pOutputData + * pdwStatus [o] PTR to receive the win32 error code from the Printmonitor DLL + * + * RETURNS + * Success: TRUE + * Failure: FALSE + * + * NOTES + * Returning "TRUE" does mean, that the Printmonitor DLL was called successful. + * The execution of the command can still fail (check pdwStatus for ERROR_SUCCESS). + * + * Minimal List of commands, that a Printmonitor DLL should support: + * + *| "MonitorUI" : Return the Name of the Userinterface-DLL as WSTR in pOutputData + *| "AddPort" : Add a Port + *| "DeletePort": Delete a Port + * + * Many Printmonitors support additional commands. Examples for localspl.dll: + * "GetDefaultCommConfig", "SetDefaultCommConfig", + * "GetTransmissionRetryTimeout", "ConfigureLPTPortCommandOK" + * + */ +static BOOL WINAPI fpXcvData(HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData, + DWORD cbInputData, PBYTE pOutputData, DWORD cbOutputData, + PDWORD pcbOutputNeeded, PDWORD pdwStatus) +{ + printer_t *printer = (printer_t * ) hXcv; + + TRACE("(%p, %s, %p, %d, %p, %d, %p, %p)\n", hXcv, debugstr_w(pszDataName), + pInputData, cbInputData, pOutputData, + cbOutputData, pcbOutputNeeded, pdwStatus); + + if (!printer || (!printer->hXcv)) { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + if (!pcbOutputNeeded) { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if (!pszDataName || !pdwStatus || (!pOutputData && (cbOutputData > 0))) { + SetLastError(RPC_X_NULL_REF_POINTER); + return FALSE; + } + + *pcbOutputNeeded = 0; + + *pdwStatus = printer->pm->monitor->pfnXcvDataPort(printer->hXcv, pszDataName, + pInputData, cbInputData, pOutputData, cbOutputData, pcbOutputNeeded); + + return TRUE; +} + /***************************************************** * setup_provider [internal] */ @@ -1806,7 +1873,7 @@ void setup_provider(void) NULL, /* fpAddPerMachineConnection */ NULL, /* fpDeletePerMachineConnection */ NULL, /* fpEnumPerMachineConnections */ - NULL, /* fpXcvData */ + fpXcvData, fpAddPrinterDriverEx, NULL, /* fpSplReadPrinter */ NULL, /* fpDriverUnloadComplete */ diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index d2a40d0..95908b3 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -109,8 +109,6 @@ typedef struct { typedef struct { LPWSTR name; LPWSTR printername; - monitor_t *pm; - HANDLE hXcv; HANDLE backend_printer; jobqueue_t *queue; started_doc_t *doc; @@ -244,8 +242,6 @@ static const WCHAR deviceW[] = {'d','e','v','i','c','e',0}; static const WCHAR devicesW[] = {'d','e','v','i','c','e','s',0}; static const WCHAR windowsW[] = {'w','i','n','d','o','w','s',0}; static const WCHAR emptyStringW[] = {0}; -static const WCHAR XcvMonitorW[] = {',','X','c','v','M','o','n','i','t','o','r',' ',0}; -static const WCHAR XcvPortW[] = {',','X','c','v','P','o','r','t',' ',0};
static const WCHAR May_Delete_Value[] = {'W','i','n','e','M','a','y','D','e','l','e','t','e','M','e',0};
@@ -1127,9 +1123,6 @@ static HANDLE get_opened_printer_entry(LPWSTR name, LPPRINTER_DEFAULTSW pDefault opened_printer_t *printer = NULL; LPWSTR servername; LPCWSTR printername; - HKEY hkeyPrinters; - HKEY hkeyPrinter; - DWORD len;
if ((backend == NULL) && !load_backend()) return NULL;
@@ -1207,69 +1200,6 @@ static HANDLE get_opened_printer_entry(LPWSTR name, LPPRINTER_DEFAULTSW pDefault goto end; }
- if (printername) { - len = sizeof(XcvMonitorW)/sizeof(WCHAR) - 1; - if (strncmpW(printername, XcvMonitorW, len) == 0) { - /* OpenPrinter(",XcvMonitor " detected */ - TRACE(",XcvMonitor: %s\n", debugstr_w(&printername[len])); - printer->pm = monitor_load(&printername[len], NULL); - if (printer->pm == NULL) { - SetLastError(ERROR_UNKNOWN_PORT); - handle = 0; - goto end; - } - } - else - { - len = sizeof(XcvPortW)/sizeof(WCHAR) - 1; - if (strncmpW( printername, XcvPortW, len) == 0) { - /* OpenPrinter(",XcvPort " detected */ - TRACE(",XcvPort: %s\n", debugstr_w(&printername[len])); - printer->pm = monitor_load_by_port(&printername[len]); - if (printer->pm == NULL) { - SetLastError(ERROR_UNKNOWN_PORT); - handle = 0; - goto end; - } - } - } - - if (printer->pm) { - if ((printer->pm->monitor) && (printer->pm->monitor->pfnXcvOpenPort)) { - printer->pm->monitor->pfnXcvOpenPort(&printername[len], - pDefault ? pDefault->DesiredAccess : 0, - &printer->hXcv); - } - if (printer->hXcv == NULL) { - SetLastError(ERROR_INVALID_PARAMETER); - handle = 0; - goto end; - } - } - else - { - /* Does the Printer exist? */ - if (RegCreateKeyW(HKEY_LOCAL_MACHINE, PrintersW, &hkeyPrinters) != ERROR_SUCCESS) { - ERR("Can't create Printers key\n"); - handle = 0; - goto end; - } - if (RegOpenKeyW(hkeyPrinters, printername, &hkeyPrinter) != ERROR_SUCCESS) { - WARN("Printer not found in Registry: %s\n", debugstr_w(printername)); - RegCloseKey(hkeyPrinters); - SetLastError(ERROR_INVALID_PRINTER_NAME); - handle = 0; - goto end; - } - RegCloseKey(hkeyPrinter); - RegCloseKey(hkeyPrinters); - } - } - else - { - TRACE("using the local printserver\n"); - } - if(queue) printer->queue = queue; else @@ -1290,8 +1220,6 @@ end: LeaveCriticalSection(&printer_handles_cs); if (!handle && printer) { /* Something failed: Free all resources */ - if (printer->hXcv) printer->pm->monitor->pfnXcvClosePort(printer->hXcv); - monitor_unload(printer->pm); HeapFree(GetProcessHeap(), 0, printer->printername); HeapFree(GetProcessHeap(), 0, printer->name); if (!queue) HeapFree(GetProcessHeap(), 0, printer->queue); @@ -2897,9 +2825,7 @@ BOOL WINAPI ClosePrinter(HANDLE hPrinter) { struct list *cursor, *cursor2;
- TRACE("%p: %s (hXcv: %p) for %s (doc: %p)\n", printer->pm, - debugstr_w(printer->pm ? printer->pm->dllname : NULL), - printer->hXcv, debugstr_w(printer->name), printer->doc ); + TRACE("closing %s (doc: %p)\n", debugstr_w(printer->name), printer->doc);
if (printer->backend_printer) { backend->fpClosePrinter(printer->backend_printer); @@ -2917,8 +2843,7 @@ BOOL WINAPI ClosePrinter(HANDLE hPrinter) } HeapFree(GetProcessHeap(), 0, printer->queue); } - if (printer->hXcv) printer->pm->monitor->pfnXcvClosePort(printer->hXcv); - monitor_unload(printer->pm); + HeapFree(GetProcessHeap(), 0, printer->printername); HeapFree(GetProcessHeap(), 0, printer->name); HeapFree(GetProcessHeap(), 0, printer); @@ -7088,8 +7013,10 @@ BOOL WINAPI XcvDataW( HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData, pInputData, cbInputData, pOutputData, cbOutputData, pcbOutputNeeded, pdwStatus);
+ if ((backend == NULL) && !load_backend()) return FALSE; + printer = get_opened_printer(hXcv); - if (!printer || (!printer->hXcv)) { + if (!printer || (!printer->backend_printer)) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } @@ -7106,10 +7033,9 @@ BOOL WINAPI XcvDataW( HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData,
*pcbOutputNeeded = 0;
- *pdwStatus = printer->pm->monitor->pfnXcvDataPort(printer->hXcv, pszDataName, - pInputData, cbInputData, pOutputData, cbOutputData, pcbOutputNeeded); + return backend->fpXcvData(printer->backend_printer, pszDataName, pInputData, + cbInputData, pOutputData, cbOutputData, pcbOutputNeeded, pdwStatus);
- return TRUE; }
/*****************************************************************************