mstask: Added IEnumWorkItems stub.

This commit is contained in:
Nikolay Sivov 2015-03-20 08:32:36 +03:00 committed by Alexandre Julliard
parent 63dd502c3a
commit 7aa2e9a9d0
2 changed files with 139 additions and 3 deletions

View File

@ -28,11 +28,22 @@ typedef struct
LONG ref; LONG ref;
} TaskSchedulerImpl; } TaskSchedulerImpl;
typedef struct
{
IEnumWorkItems IEnumWorkItems_iface;
LONG ref;
} EnumWorkItemsImpl;
static inline TaskSchedulerImpl *impl_from_ITaskScheduler(ITaskScheduler *iface) static inline TaskSchedulerImpl *impl_from_ITaskScheduler(ITaskScheduler *iface)
{ {
return CONTAINING_RECORD(iface, TaskSchedulerImpl, 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) static void TaskSchedulerDestructor(TaskSchedulerImpl *This)
{ {
TRACE("%p\n", This); TRACE("%p\n", This);
@ -40,6 +51,103 @@ static void TaskSchedulerDestructor(TaskSchedulerImpl *This)
InterlockedDecrement(&dll_ref); 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( static HRESULT WINAPI MSTASK_ITaskScheduler_QueryInterface(
ITaskScheduler* iface, ITaskScheduler* iface,
REFIID riid, REFIID riid,
@ -140,10 +248,16 @@ static HRESULT WINAPI MSTASK_ITaskScheduler_GetTargetComputer(
static HRESULT WINAPI MSTASK_ITaskScheduler_Enum( static HRESULT WINAPI MSTASK_ITaskScheduler_Enum(
ITaskScheduler* iface, ITaskScheduler* iface,
IEnumWorkItems **ppEnumTasks) IEnumWorkItems **tasks)
{ {
FIXME("%p, %p: stub\n", iface, ppEnumTasks); TaskSchedulerImpl *This = impl_from_ITaskScheduler(iface);
return E_NOTIMPL;
TRACE("(%p)->(%p)\n", This, tasks);
if (!tasks)
return E_INVALIDARG;
return create_task_enum(tasks);
} }
static HRESULT WINAPI MSTASK_ITaskScheduler_Activate( static HRESULT WINAPI MSTASK_ITaskScheduler_Activate(

View File

@ -203,6 +203,27 @@ static void test_SetTargetComputer(void)
return; 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) START_TEST(task_scheduler)
{ {
@ -211,5 +232,6 @@ START_TEST(task_scheduler)
test_Activate(); test_Activate();
test_GetTargetComputer(); test_GetTargetComputer();
test_SetTargetComputer(); test_SetTargetComputer();
test_Enum();
CoUninitialize(); CoUninitialize();
} }