diff --git a/dlls/localspl/localspl_main.c b/dlls/localspl/localspl_main.c index cf208f074b7..a6a798055c9 100644 --- a/dlls/localspl/localspl_main.c +++ b/dlls/localspl/localspl_main.c @@ -696,6 +696,65 @@ static BOOL WINAPI fpAddPrinterDriverEx(LPWSTR pName, DWORD level, LPBYTE pDrive return myAddPrinterDriverEx(level, pDriverInfo, dwFileCopyFlags, TRUE); } +/****************************************************************** + * fpDeleteMonitor [exported through PRINTPROVIDOR] + * + * Delete a specific Printmonitor from a Printing-Environment + * + * PARAMS + * pName [I] Servername or NULL (local Computer) + * pEnvironment [I] Printing-Environment of the Monitor or NULL (Default) + * pMonitorName [I] Name of the Monitor, that should be deleted + * + * RETURNS + * Success: TRUE + * Failure: FALSE + * + * NOTES + * pEnvironment is ignored in Windows for the local Computer. + * + */ + +BOOL WINAPI fpDeleteMonitor(LPWSTR pName, LPWSTR pEnvironment, LPWSTR pMonitorName) +{ + HKEY hroot = NULL; + LONG lres; + + TRACE("(%s, %s, %s)\n",debugstr_w(pName),debugstr_w(pEnvironment), + debugstr_w(pMonitorName)); + + lres = copy_servername_from_name(pName, NULL); + if (lres) { + FIXME("server %s not supported\n", debugstr_w(pName)); + SetLastError(ERROR_INVALID_NAME); + return FALSE; + } + + /* pEnvironment is ignored in Windows for the local Computer */ + if (!pMonitorName || !pMonitorName[0]) { + TRACE("pMonitorName %s is invalid\n", debugstr_w(pMonitorName)); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + if(RegCreateKeyW(HKEY_LOCAL_MACHINE, monitorsW, &hroot) != ERROR_SUCCESS) { + ERR("unable to create key %s\n", debugstr_w(monitorsW)); + return FALSE; + } + + if(RegDeleteTreeW(hroot, pMonitorName) == ERROR_SUCCESS) { + TRACE("%s deleted\n", debugstr_w(pMonitorName)); + RegCloseKey(hroot); + return TRUE; + } + + TRACE("%s does not exist\n", debugstr_w(pMonitorName)); + RegCloseKey(hroot); + + /* NT: ERROR_UNKNOWN_PRINT_MONITOR (3000), 9x: ERROR_INVALID_PARAMETER (87) */ + SetLastError(ERROR_UNKNOWN_PRINT_MONITOR); + return FALSE; +} /***************************************************************************** * fpEnumMonitors [exported through PRINTPROVIDOR] @@ -821,7 +880,7 @@ static const PRINTPROVIDOR * get_backend(void) NULL, /* fpDeletePrinterConnection */ NULL, /* fpPrinterMessageBox */ NULL, /* fpAddMonitor */ - NULL, /* fpDeleteMonitor */ + fpDeleteMonitor, NULL, /* fpResetPrinter */ NULL, /* fpGetPrinterDriverEx */ NULL, /* fpFindFirstPrinterChangeNotification */ diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 8ecddf0cf97..81d6b61af61 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -2441,47 +2441,18 @@ BOOL WINAPI DeleteMonitorA (LPSTR pName, LPSTR pEnvironment, LPSTR pMonitorName) * pEnvironment is ignored in Windows for the local Computer. * */ - -BOOL WINAPI DeleteMonitorW (LPWSTR pName, LPWSTR pEnvironment, LPWSTR pMonitorName) +BOOL WINAPI DeleteMonitorW(LPWSTR pName, LPWSTR pEnvironment, LPWSTR pMonitorName) { - HKEY hroot = NULL; TRACE("(%s, %s, %s)\n",debugstr_w(pName),debugstr_w(pEnvironment), debugstr_w(pMonitorName)); - if (pName && (pName[0])) { - FIXME("for server %s not implemented\n", debugstr_w(pName)); - SetLastError(ERROR_ACCESS_DENIED); - return FALSE; - } + if ((backend == NULL) && !load_backend()) return FALSE; - /* pEnvironment is ignored in Windows for the local Computer */ - - if (!pMonitorName || !pMonitorName[0]) { - WARN("pMonitorName %s is invalid\n", debugstr_w(pMonitorName)); - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - if(RegCreateKeyW(HKEY_LOCAL_MACHINE, MonitorsW, &hroot) != ERROR_SUCCESS) { - ERR("unable to create key %s\n", debugstr_w(MonitorsW)); - return FALSE; - } - - if(RegDeleteTreeW(hroot, pMonitorName) == ERROR_SUCCESS) { - TRACE("monitor %s deleted\n", debugstr_w(pMonitorName)); - RegCloseKey(hroot); - return TRUE; - } - - WARN("monitor %s does not exist\n", debugstr_w(pMonitorName)); - RegCloseKey(hroot); - - /* NT: ERROR_UNKNOWN_PRINT_MONITOR (3000), 9x: ERROR_INVALID_PARAMETER (87) */ - SetLastError(ERROR_UNKNOWN_PRINT_MONITOR); - return (FALSE); + return backend->fpDeleteMonitor(pName, pEnvironment, pMonitorName); } + /****************************************************************** * DeletePortA [WINSPOOL.@] *