winspool: Implement DeleteMonitor.
diff --git a/dlls/winspool/info.c b/dlls/winspool/info.c
index 115b51e..0288269 100644
--- a/dlls/winspool/info.c
+++ b/dlls/winspool/info.c
@@ -200,6 +200,7 @@
DWORD cbBuf, LPDWORD pcbNeeded,
BOOL unicode);
static DWORD WINSPOOL_GetOpenedPrinterRegKey(HANDLE hPrinter, HKEY *phkey);
+static DWORD WINSPOOL_SHDeleteKeyW(HKEY hKey, LPCWSTR lpszSubKey);
/******************************************************************
* validate the user-supplied printing-environment [internal]
@@ -1506,13 +1507,37 @@
* See DeleteMonitorW.
*
*/
-BOOL WINAPI
-DeleteMonitorA (LPSTR pName, LPSTR pEnvironment, LPSTR pMonitorName)
+BOOL WINAPI DeleteMonitorA (LPSTR pName, LPSTR pEnvironment, LPSTR pMonitorName)
{
- FIXME("(%s,%s,%s):stub\n",debugstr_a(pName),debugstr_a(pEnvironment),
- debugstr_a(pMonitorName));
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ LPWSTR nameW = NULL;
+ LPWSTR EnvironmentW = NULL;
+ LPWSTR MonitorNameW = NULL;
+ BOOL res;
+ INT len;
+
+ if (pName) {
+ len = MultiByteToWideChar(CP_ACP, 0, pName, -1, NULL, 0);
+ nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, pName, -1, nameW, len);
+ }
+
+ if (pEnvironment) {
+ len = MultiByteToWideChar(CP_ACP, 0, pEnvironment, -1, NULL, 0);
+ EnvironmentW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, pEnvironment, -1, EnvironmentW, len);
+ }
+ if (pMonitorName) {
+ len = MultiByteToWideChar(CP_ACP, 0, pMonitorName, -1, NULL, 0);
+ MonitorNameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, pMonitorName, -1, MonitorNameW, len);
+ }
+
+ res = DeleteMonitorW(nameW, EnvironmentW, MonitorNameW);
+
+ HeapFree(GetProcessHeap(), 0, MonitorNameW);
+ HeapFree(GetProcessHeap(), 0, EnvironmentW);
+ HeapFree(GetProcessHeap(), 0, nameW);
+ return (res);
}
/******************************************************************
@@ -1529,17 +1554,50 @@
* Success: TRUE
* Failure: FALSE
*
- * BUGS
- * only a Stub
+ * NOTES
+ * 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)
{
- FIXME("(%s,%s,%s):stub\n",debugstr_w(pName),debugstr_w(pEnvironment),
- debugstr_w(pMonitorName));
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ 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;
+ }
+
+ /* 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;
+ }
+
+ /* change this, when advapi32.dll/RegDeleteTree is implemented */
+ if(WINSPOOL_SHDeleteKeyW(hroot, pMonitorName) == ERROR_SUCCESS) {
+ TRACE("monitor %s deleted\n", debugstr_w(pMonitorName));
+ RegCloseKey(hroot);
+ return TRUE;
+ }
+
+ WARN("monitor %s does not exists\n", debugstr_w(pMonitorName));
+ RegCloseKey(hroot);
+
+ /* NT: ERROR_UNKNOWN_PRINT_MONITOR (3000), 9x: ERROR_INVALID_PARAMETER (87) */
+ SetLastError(ERROR_UNKNOWN_PRINT_MONITOR);
+ return (FALSE);
}
/******************************************************************