Dmitry Timoshkov : taskschd: Reimplement ITaskFolderCollection enumeration using SchRpcEnumFolders.

Alexandre Julliard julliard at winehq.org
Mon Apr 7 13:20:08 CDT 2014


Module: wine
Branch: master
Commit: de8ce034b8e0a0b84f6e9dd65c1d1e01564fbcee
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=de8ce034b8e0a0b84f6e9dd65c1d1e01564fbcee

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Apr  7 13:14:33 2014 +0900

taskschd: Reimplement ITaskFolderCollection enumeration using SchRpcEnumFolders.

---

 dlls/taskschd/folder_collection.c |  106 +++++--------------------------------
 1 file changed, 12 insertions(+), 94 deletions(-)

diff --git a/dlls/taskschd/folder_collection.c b/dlls/taskschd/folder_collection.c
index 004a977..47c9620 100644
--- a/dlls/taskschd/folder_collection.c
+++ b/dlls/taskschd/folder_collection.c
@@ -24,6 +24,7 @@
 #include "winbase.h"
 #include "objbase.h"
 #include "taskschd.h"
+#include "schrpc.h"
 #include "taskschd_private.h"
 
 #include "wine/unicode.h"
@@ -31,15 +32,13 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(taskschd);
 
-static const char root[] = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Schedule\\TaskCache\\Tree";
-
 typedef struct
 {
     ITaskFolderCollection ITaskFolderCollection_iface;
     LONG ref;
     WCHAR *path;
-    LPWSTR *list;
-    LONG count;
+    TASK_NAMES list;
+    DWORD count;
 } TaskFolderCollection;
 
 static HRESULT NewEnum_create(TaskFolderCollection *folders, IUnknown **obj);
@@ -55,14 +54,14 @@ static ULONG WINAPI folders_AddRef(ITaskFolderCollection *iface)
     return InterlockedIncrement(&folders->ref);
 }
 
-static void free_list(LPWSTR *list, LONG count)
+static void free_list(LPWSTR *list, DWORD count)
 {
     LONG i;
 
     for (i = 0; i < count; i++)
-        heap_free(list[i]);
+        MIDL_user_free(list[i]);
 
-    heap_free(list);
+    MIDL_user_free(list);
 }
 
 static ULONG WINAPI folders_Release(ITaskFolderCollection *iface)
@@ -216,98 +215,17 @@ static const ITaskFolderCollectionVtbl TaskFolderCollection_vtbl =
     folders_get__NewEnum
 };
 
-static HRESULT reg_open_folder(const WCHAR *path, HKEY *hfolder)
-{
-    HKEY hroot;
-    DWORD ret;
-
-    ret = RegCreateKeyA(HKEY_LOCAL_MACHINE, root, &hroot);
-    if (ret) return HRESULT_FROM_WIN32(ret);
-
-    while (*path == '\\') path++;
-    ret = RegOpenKeyExW(hroot, path, 0, KEY_ALL_ACCESS, hfolder);
-    if (ret == ERROR_FILE_NOT_FOUND)
-        ret = ERROR_PATH_NOT_FOUND;
-
-    RegCloseKey(hroot);
-
-    return HRESULT_FROM_WIN32(ret);
-}
-
-static inline void reg_close_folder(HKEY hfolder)
-{
-    RegCloseKey(hfolder);
-}
-
-static HRESULT create_folders_list(const WCHAR *path, LPWSTR **folders_list, LONG *folders_count)
-{
-    HRESULT hr;
-    HKEY hfolder;
-    WCHAR name[MAX_PATH];
-    LONG ret, idx, allocated, count;
-    LPWSTR *list;
-
-    *folders_list = NULL;
-    *folders_count = 0;
-
-    hr = reg_open_folder(path, &hfolder);
-    if (hr) return hr;
-
-    allocated = 64;
-    list = heap_alloc(allocated * sizeof(LPWSTR));
-    if (!list)
-    {
-        reg_close_folder(hfolder);
-        return E_OUTOFMEMORY;
-    }
-
-    idx = count = 0;
-
-    while (!(ret = RegEnumKeyW(hfolder, idx++, name, MAX_PATH)))
-    {
-        /* FIXME: differentiate between folders and tasks */
-        if (count >= allocated)
-        {
-            LPWSTR *new_list;
-            allocated *= 2;
-            new_list = heap_realloc(list, allocated * sizeof(LPWSTR));
-            if (!new_list)
-            {
-                reg_close_folder(hfolder);
-                free_list(list, count);
-                return E_OUTOFMEMORY;
-            }
-            list = new_list;
-        }
-
-        list[count] = heap_strdupW(name);
-        if (!list[count])
-        {
-            reg_close_folder(hfolder);
-            free_list(list, count);
-            return E_OUTOFMEMORY;
-        }
-
-        count++;
-    }
-
-    reg_close_folder(hfolder);
-
-    *folders_list = list;
-    *folders_count = count;
-
-    return S_OK;
-}
-
 HRESULT TaskFolderCollection_create(const WCHAR *path, ITaskFolderCollection **obj)
 {
     TaskFolderCollection *folders;
     HRESULT hr;
-    LPWSTR *list;
-    LONG count;
+    TASK_NAMES list;
+    DWORD start_index, count;
 
-    hr = create_folders_list(path, &list, &count);
-    if (hr) return hr;
+    start_index = 0;
+    list = NULL;
+    hr = SchRpcEnumFolders(path, 0, &start_index, 0, &count, &list);
+    if (hr != S_OK) return hr;
 
     folders = heap_alloc(sizeof(*folders));
     if (!folders)




More information about the wine-cvs mailing list