Module: wine Branch: master Commit: 39e972b573180ed5f831097bdbc3ce8292cf8506 URL: http://source.winehq.org/git/wine.git/?a=commit;h=39e972b573180ed5f831097bdb...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Mon Apr 7 13:14:19 2014 +0900
taskschd: Make ITaskFolder::CreateFolder, ITaskFolder::GetFolder and ITaskFolder::DeleteFolder use the RPC API.
---
dlls/taskschd/folder.c | 97 ++++++++++++++++++++++++++++++--------- dlls/taskschd/tests/scheduler.c | 1 - 2 files changed, 75 insertions(+), 23 deletions(-)
diff --git a/dlls/taskschd/folder.c b/dlls/taskschd/folder.c index 7caad77..6bb0c38 100644 --- a/dlls/taskschd/folder.c +++ b/dlls/taskschd/folder.c @@ -25,6 +25,7 @@ #include "winreg.h" #include "objbase.h" #include "taskschd.h" +#include "schrpc.h" #include "taskschd_private.h"
#include "wine/unicode.h" @@ -273,9 +274,47 @@ static HRESULT WINAPI TaskFolder_CreateFolder(ITaskFolder *iface, BSTR path, VAR return hr; }
+static WCHAR *get_full_path(const WCHAR *parent, const WCHAR *path) +{ + static const WCHAR bslash[] = { '\', 0 }; + WCHAR *folder_path; + int len = 0; + + if (path) len = strlenW(path); + + if (parent) len += strlenW(parent); + + /* +1 if parent is not '' terminated */ + folder_path = heap_alloc((len + 2) * sizeof(WCHAR)); + if (!folder_path) return NULL; + + folder_path[0] = 0; + + if (parent) + strcpyW(folder_path, parent); + + if (path && *path) + { + len = strlenW(folder_path); + if (!len || folder_path[len - 1] != '\') + strcatW(folder_path, bslash); + + while (*path == '\') path++; + strcatW(folder_path, path); + } + + len = strlenW(folder_path); + if (!len) + strcatW(folder_path, bslash); + + return folder_path; +} + static HRESULT WINAPI TaskFolder_DeleteFolder(ITaskFolder *iface, BSTR name, LONG flags) { TaskFolder *folder = impl_from_ITaskFolder(iface); + WCHAR *folder_path; + HRESULT hr;
TRACE("%p,%s,%x\n", iface, debugstr_w(name), flags);
@@ -284,6 +323,13 @@ static HRESULT WINAPI TaskFolder_DeleteFolder(ITaskFolder *iface, BSTR name, LON if (flags) FIXME("unsupported flags %x\n", flags);
+ folder_path = get_full_path(folder->path, name); + if (!folder_path) return E_OUTOFMEMORY; + + hr = SchRpcDelete(folder_path, 0); + heap_free(folder_path); + if (hr != S_OK) return hr; + return reg_delete_folder(folder->path, name); }
@@ -403,43 +449,50 @@ static const ITaskFolderVtbl TaskFolder_vtbl =
HRESULT TaskFolder_create(const WCHAR *parent, const WCHAR *path, ITaskFolder **obj, BOOL create) { - static const WCHAR bslash[] = { '\', 0 }; TaskFolder *folder; WCHAR *folder_path; - int len = 0; HRESULT hr; HKEY hfolder;
if (path) { - len = strlenW(path); + int len = strlenW(path); if (len && path[len - 1] == '\') return ERROR_INVALID_NAME; }
- if (parent) len += strlenW(parent); - - /* +1 if parent is not '' terminated */ - folder_path = heap_alloc((len + 2) * sizeof(WCHAR)); + folder_path = get_full_path(parent, path); if (!folder_path) return E_OUTOFMEMORY;
- folder_path[0] = 0; - - if (parent) - strcpyW(folder_path, parent); - - if (path && *path) + if (create) { - len = strlenW(folder_path); - if (!len || folder_path[len - 1] != '\') - strcatW(folder_path, bslash); - - while (*path == '\') path++; - strcatW(folder_path, path); + hr = SchRpcCreateFolder(folder_path, NULL, 0); + } + else + { + DWORD start_index, count, i; + TASK_NAMES names; + + start_index = 0; + names = NULL; + hr = SchRpcEnumFolders(folder_path, 0, &start_index, 0, &count, &names); + if (hr == S_OK) + { + for (i = 0; i < count; i++) + MIDL_user_free(names[i]); + MIDL_user_free(names); + } + else + { + if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) + hr = HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND); + } }
- len = strlenW(folder_path); - if (!len) - strcatW(folder_path, bslash); + if (FAILED(hr)) + { + heap_free(folder_path); + return hr; + }
hr = create ? reg_create_folder(folder_path, &hfolder) : reg_open_folder(folder_path, &hfolder); if (hr) diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index 0f89021..7f0669b 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -341,7 +341,6 @@ todo_wine ITaskFolder_Release(subfolder);
hr = ITaskFolder_DeleteFolder(folder, Wine, 0); -todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY), "expected ERROR_DIR_NOT_EMPTY, got %#x\n", hr);
hr = ITaskFolder_DeleteFolder(folder, Wine_Folder1_Folder2, 0);