From: Jacob Czekalla jczekalla@codeweavers.com
--- dlls/taskschd/regtask.c | 55 +++++++++++++++++++++++++++++++-- dlls/taskschd/tests/scheduler.c | 5 --- 2 files changed, 53 insertions(+), 7 deletions(-)
diff --git a/dlls/taskschd/regtask.c b/dlls/taskschd/regtask.c index bae0d4cb0b2..42ed24337ca 100644 --- a/dlls/taskschd/regtask.c +++ b/dlls/taskschd/regtask.c @@ -471,8 +471,59 @@ static HRESULT WINAPI regtasks_get_Count(IRegisteredTaskCollection *iface, LONG
static HRESULT WINAPI regtasks_get_Item(IRegisteredTaskCollection *iface, VARIANT index, IRegisteredTask **regtask) { - FIXME("%p,%s,%p: stub\n", iface, debugstr_variant(&index), regtask); - return E_NOTIMPL; + HRESULT hr; + VARIANT converted_index; + TASK_NAMES task_names = NULL; + ITaskDefinition *definition = NULL; + RegisteredTaskCollection *collection = NULL; + DWORD start_index = 0, num_tasks = 0; + + collection = impl_from_IRegisteredTaskCollection(iface); + if (!regtask) + return E_POINTER; + *regtask = NULL; + + VariantInit(&converted_index); + hr = VariantChangeType(&converted_index, &index, 0, VT_UI4); + if (FAILED(hr)) + return hr; + + start_index = V_UI4(&index); + if (start_index == 0) + { + VariantClear(&converted_index); + return E_INVALIDARG; + } + start_index -= 1; + + hr = SchRpcEnumTasks(collection->path, 0, &start_index, 1, &num_tasks, &task_names); + if (FAILED(hr)) + { + VariantClear(&converted_index); + return hr; + } + if (!task_names) + { + VariantClear(&converted_index); + return E_INVALIDARG; + } + + hr = TaskDefinition_create(&definition); + if (FAILED(hr)) + { + if(hr != E_OUTOFMEMORY) + ITaskDefinition_Release(definition); + VariantClear(&converted_index); + return hr; + } + + hr = RegisteredTask_create(collection->path, task_names[0], definition, TASK_VALIDATE_ONLY, TASK_LOGON_INTERACTIVE_TOKEN, regtask, FALSE); + + VariantClear(&converted_index); + MIDL_user_free(task_names[0]); + MIDL_user_free(task_names); + ITaskDefinition_Release(definition); + return hr; }
static HRESULT WINAPI regtasks_get__NewEnum(IRegisteredTaskCollection *iface, IUnknown **penum) diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c index 8111e65c88b..a267c587884 100644 --- a/dlls/taskschd/tests/scheduler.c +++ b/dlls/taskschd/tests/scheduler.c @@ -1932,26 +1932,21 @@ static void test_get_Count_and_Item(void) index.uiVal = 1;
hr = IRegisteredTaskCollection_get_Item(tasks, index, NULL); - todo_wine ok(hr == E_POINTER, "expected E_POINTER, got %#lx\n", hr);
index.uiVal = 0; hr = IRegisteredTaskCollection_get_Item(tasks, index, &ret_task1); - todo_wine ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#lx\n", hr);
index.uiVal = 2; hr = IRegisteredTaskCollection_get_Item(tasks, index, &ret_task1); - todo_wine ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got %#lx\n", hr);
index.uiVal = 1; hr = IRegisteredTaskCollection_get_Item(tasks, index, &ret_task1); - todo_wine ok(hr == S_OK, "expected S_OK, got %#lx\n", hr);
IRegisteredTask_get_Name(ret_task1, &ret_task1_name); - todo_wine ok(!lstrcmpW(L"Task1", ret_task1_name), "expected name "Task1", got %ls\n", ret_task1_name);
ITaskFolder_DeleteTask(folder, (BSTR)L"Task1", 0);