taskschd: Reimplement ITaskFolderCollection enumeration using SchRpcEnumFolders.

This commit is contained in:
Dmitry Timoshkov 2014-04-07 13:14:33 +09:00 committed by Alexandre Julliard
parent 39e972b573
commit de8ce034b8
1 changed files with 12 additions and 94 deletions

View File

@ -24,6 +24,7 @@
#include "winbase.h" #include "winbase.h"
#include "objbase.h" #include "objbase.h"
#include "taskschd.h" #include "taskschd.h"
#include "schrpc.h"
#include "taskschd_private.h" #include "taskschd_private.h"
#include "wine/unicode.h" #include "wine/unicode.h"
@ -31,15 +32,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(taskschd); WINE_DEFAULT_DEBUG_CHANNEL(taskschd);
static const char root[] = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Schedule\\TaskCache\\Tree";
typedef struct typedef struct
{ {
ITaskFolderCollection ITaskFolderCollection_iface; ITaskFolderCollection ITaskFolderCollection_iface;
LONG ref; LONG ref;
WCHAR *path; WCHAR *path;
LPWSTR *list; TASK_NAMES list;
LONG count; DWORD count;
} TaskFolderCollection; } TaskFolderCollection;
static HRESULT NewEnum_create(TaskFolderCollection *folders, IUnknown **obj); static HRESULT NewEnum_create(TaskFolderCollection *folders, IUnknown **obj);
@ -55,14 +54,14 @@ static ULONG WINAPI folders_AddRef(ITaskFolderCollection *iface)
return InterlockedIncrement(&folders->ref); return InterlockedIncrement(&folders->ref);
} }
static void free_list(LPWSTR *list, LONG count) static void free_list(LPWSTR *list, DWORD count)
{ {
LONG i; LONG i;
for (i = 0; i < count; 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) static ULONG WINAPI folders_Release(ITaskFolderCollection *iface)
@ -216,98 +215,17 @@ static const ITaskFolderCollectionVtbl TaskFolderCollection_vtbl =
folders_get__NewEnum 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) HRESULT TaskFolderCollection_create(const WCHAR *path, ITaskFolderCollection **obj)
{ {
TaskFolderCollection *folders; TaskFolderCollection *folders;
HRESULT hr; HRESULT hr;
LPWSTR *list; TASK_NAMES list;
LONG count; DWORD start_index, count;
hr = create_folders_list(path, &list, &count); start_index = 0;
if (hr) return hr; list = NULL;
hr = SchRpcEnumFolders(path, 0, &start_index, 0, &count, &list);
if (hr != S_OK) return hr;
folders = heap_alloc(sizeof(*folders)); folders = heap_alloc(sizeof(*folders));
if (!folders) if (!folders)