From 7aa2e9a9d057e61f3a9672d54819c8fd7e6fe943 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 20 Mar 2015 08:32:36 +0300 Subject: [PATCH] mstask: Added IEnumWorkItems stub. --- dlls/mstask/task_scheduler.c | 120 ++++++++++++++++++++++++++++- dlls/mstask/tests/task_scheduler.c | 22 ++++++ 2 files changed, 139 insertions(+), 3 deletions(-) diff --git a/dlls/mstask/task_scheduler.c b/dlls/mstask/task_scheduler.c index 5657e43a578..1f367edb3d7 100644 --- a/dlls/mstask/task_scheduler.c +++ b/dlls/mstask/task_scheduler.c @@ -28,11 +28,22 @@ typedef struct LONG ref; } TaskSchedulerImpl; +typedef struct +{ + IEnumWorkItems IEnumWorkItems_iface; + LONG ref; +} EnumWorkItemsImpl; + static inline TaskSchedulerImpl *impl_from_ITaskScheduler(ITaskScheduler *iface) { return CONTAINING_RECORD(iface, TaskSchedulerImpl, ITaskScheduler_iface); } +static inline EnumWorkItemsImpl *impl_from_IEnumWorkItems(IEnumWorkItems *iface) +{ + return CONTAINING_RECORD(iface, EnumWorkItemsImpl, IEnumWorkItems_iface); +} + static void TaskSchedulerDestructor(TaskSchedulerImpl *This) { TRACE("%p\n", This); @@ -40,6 +51,103 @@ static void TaskSchedulerDestructor(TaskSchedulerImpl *This) InterlockedDecrement(&dll_ref); } +static HRESULT WINAPI EnumWorkItems_QueryInterface(IEnumWorkItems *iface, REFIID riid, void **obj) +{ + EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); + + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj); + + if (IsEqualGUID(riid, &IID_IEnumWorkItems) || IsEqualGUID(riid, &IID_IUnknown)) + { + *obj = &This->IEnumWorkItems_iface; + IEnumWorkItems_AddRef(iface); + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI EnumWorkItems_AddRef(IEnumWorkItems *iface) +{ + EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); + ULONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p)->(%u)\n", This, ref); + return ref; +} + +static ULONG WINAPI EnumWorkItems_Release(IEnumWorkItems *iface) +{ + EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(%u)\n", This, ref); + + if (ref == 0) + { + HeapFree(GetProcessHeap(), 0, This); + InterlockedDecrement(&dll_ref); + } + + return ref; +} + +static HRESULT WINAPI EnumWorkItems_Next(IEnumWorkItems *iface, ULONG count, LPWSTR **names, ULONG *fetched) +{ + EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); + FIXME("(%p)->(%u %p %p): stub\n", This, count, names, fetched); + return E_NOTIMPL; +} + +static HRESULT WINAPI EnumWorkItems_Skip(IEnumWorkItems *iface, ULONG count) +{ + EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); + FIXME("(%p)->(%u): stub\n", This, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI EnumWorkItems_Reset(IEnumWorkItems *iface) +{ + EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); + FIXME("(%p): stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI EnumWorkItems_Clone(IEnumWorkItems *iface, IEnumWorkItems **cloned) +{ + EnumWorkItemsImpl *This = impl_from_IEnumWorkItems(iface); + FIXME("(%p)->(%p): stub\n", This, cloned); + return E_NOTIMPL; +} + +static const IEnumWorkItemsVtbl EnumWorkItemsVtbl = { + EnumWorkItems_QueryInterface, + EnumWorkItems_AddRef, + EnumWorkItems_Release, + EnumWorkItems_Next, + EnumWorkItems_Skip, + EnumWorkItems_Reset, + EnumWorkItems_Clone +}; + +static HRESULT create_task_enum(IEnumWorkItems **ret) +{ + EnumWorkItemsImpl *tasks; + + *ret = NULL; + + tasks = HeapAlloc(GetProcessHeap(), 0, sizeof(*tasks)); + if (!tasks) + return E_OUTOFMEMORY; + + tasks->IEnumWorkItems_iface.lpVtbl = &EnumWorkItemsVtbl; + tasks->ref = 1; + + *ret = &tasks->IEnumWorkItems_iface; + InterlockedIncrement(&dll_ref); + return S_OK; +} + static HRESULT WINAPI MSTASK_ITaskScheduler_QueryInterface( ITaskScheduler* iface, REFIID riid, @@ -140,10 +248,16 @@ static HRESULT WINAPI MSTASK_ITaskScheduler_GetTargetComputer( static HRESULT WINAPI MSTASK_ITaskScheduler_Enum( ITaskScheduler* iface, - IEnumWorkItems **ppEnumTasks) + IEnumWorkItems **tasks) { - FIXME("%p, %p: stub\n", iface, ppEnumTasks); - return E_NOTIMPL; + TaskSchedulerImpl *This = impl_from_ITaskScheduler(iface); + + TRACE("(%p)->(%p)\n", This, tasks); + + if (!tasks) + return E_INVALIDARG; + + return create_task_enum(tasks); } static HRESULT WINAPI MSTASK_ITaskScheduler_Activate( diff --git a/dlls/mstask/tests/task_scheduler.c b/dlls/mstask/tests/task_scheduler.c index 428bf8cb57d..3bf660f94d9 100644 --- a/dlls/mstask/tests/task_scheduler.c +++ b/dlls/mstask/tests/task_scheduler.c @@ -203,6 +203,27 @@ static void test_SetTargetComputer(void) return; } +static void test_Enum(void) +{ + ITaskScheduler *scheduler; + IEnumWorkItems *tasks; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, + &IID_ITaskScheduler, (void **)&scheduler); + ok(hr == S_OK, "got 0x%08x\n", hr); + +if (0) { /* crashes on win2k */ + hr = ITaskScheduler_Enum(scheduler, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); +} + + hr = ITaskScheduler_Enum(scheduler, &tasks); + ok(hr == S_OK, "got 0x%08x\n", hr); + IEnumWorkItems_Release(tasks); + + ITaskScheduler_Release(scheduler); +} START_TEST(task_scheduler) { @@ -211,5 +232,6 @@ START_TEST(task_scheduler) test_Activate(); test_GetTargetComputer(); test_SetTargetComputer(); + test_Enum(); CoUninitialize(); }