schedsvc: Implement SchRpcEnumTasks.

oldstable
Dmitry Timoshkov 2014-04-04 15:15:29 +09:00 committed by Alexandre Julliard
parent 1f717504cb
commit a67565edc4
1 changed files with 108 additions and 2 deletions

View File

@ -350,6 +350,11 @@ static inline BOOL is_directory(const WIN32_FIND_DATAW *data)
return FALSE;
}
static inline BOOL is_file(const WIN32_FIND_DATAW *data)
{
return !(data->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
}
HRESULT __cdecl SchRpcEnumFolders(const WCHAR *path, DWORD flags, DWORD *start_index, DWORD n_requested,
DWORD *n_names, TASK_NAMES *names)
{
@ -461,8 +466,109 @@ HRESULT __cdecl SchRpcEnumFolders(const WCHAR *path, DWORD flags, DWORD *start_i
HRESULT __cdecl SchRpcEnumTasks(const WCHAR *path, DWORD flags, DWORD *start_index, DWORD n_requested,
DWORD *n_names, TASK_NAMES *names)
{
FIXME("%s,%#x,%p,%u,%p,%p: stub\n", debugstr_w(path), flags, start_index, n_requested, n_names, names);
return E_NOTIMPL;
static const WCHAR allW[] = {'\\','*',0};
HRESULT hr = S_OK;
WCHAR *full_name;
WCHAR pathW[MAX_PATH];
WIN32_FIND_DATAW data;
HANDLE handle;
DWORD allocated, count, index;
TASK_NAMES list;
TRACE("%s,%#x,%u,%u,%p,%p\n", debugstr_w(path), flags, *start_index, n_requested, n_names, names);
*n_names = 0;
*names = NULL;
if (flags & ~TASK_ENUM_HIDDEN) return E_INVALIDARG;
if (!n_requested) n_requested = ~0u;
full_name = get_full_name(path, NULL);
if (!full_name) return E_OUTOFMEMORY;
if (strlenW(full_name) + 2 > MAX_PATH)
{
heap_free(full_name);
return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
}
strcpyW(pathW, full_name);
strcatW(pathW, allW);
heap_free(full_name);
allocated = 64;
list = heap_alloc(allocated * sizeof(list[0]));
if (!list) return E_OUTOFMEMORY;
index = count = 0;
handle = FindFirstFileW(pathW, &data);
if (handle == INVALID_HANDLE_VALUE)
{
heap_free(list);
if (GetLastError() == ERROR_PATH_NOT_FOUND)
return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
return HRESULT_FROM_WIN32(GetLastError());
}
do
{
if (is_file(&data) && index++ >= *start_index)
{
if (count >= allocated)
{
TASK_NAMES new_list;
allocated *= 2;
new_list = heap_realloc(list, allocated * sizeof(list[0]));
if (!new_list)
{
hr = E_OUTOFMEMORY;
break;
}
list = new_list;
}
TRACE("adding %s\n", debugstr_w(data.cFileName));
list[count] = heap_strdupW(data.cFileName);
if (!list[count])
{
hr = E_OUTOFMEMORY;
break;
}
count++;
if (count >= n_requested)
{
hr = S_FALSE;
break;
}
}
} while (FindNextFileW(handle, &data));
FindClose(handle);
if (FAILED(hr))
{
free_list(list, count);
return hr;
}
*n_names = count;
if (count)
{
*names = list;
*start_index = index;
return hr;
}
heap_free(list);
*names = NULL;
return *start_index ? S_FALSE : S_OK;
}
HRESULT __cdecl SchRpcEnumInstances(const WCHAR *path, DWORD flags, DWORD *n_guids, GUID **guids)