Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/mstask/task.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-)
diff --git a/dlls/mstask/task.c b/dlls/mstask/task.c index 69f1e5f95c..54e4912bc7 100644 --- a/dlls/mstask/task.c +++ b/dlls/mstask/task.c @@ -58,6 +58,8 @@ typedef struct LONG ref; ITaskDefinition *task; IExecAction *action; + BYTE *data; + WORD data_count; UUID uuid; LPWSTR task_name; HRESULT status; @@ -87,6 +89,7 @@ static void TaskDestructor(TaskImpl *This) if (This->action) IExecAction_Release(This->action); ITaskDefinition_Release(This->task); + heap_free(This->data); heap_free(This->task_name); heap_free(This->accountName); heap_free(This->trigger); @@ -809,13 +812,32 @@ static HRESULT WINAPI MSTASK_ITask_GetCreator(ITask *iface, LPWSTR *creator) return hr; }
-static HRESULT WINAPI MSTASK_ITask_SetWorkItemData( - ITask* iface, - WORD cBytes, - BYTE rgbData[]) +static HRESULT WINAPI MSTASK_ITask_SetWorkItemData(ITask *iface, WORD count, BYTE data[]) { - FIXME("(%p, %d, %p): stub\n", iface, cBytes, rgbData); - return E_NOTIMPL; + TaskImpl *This = impl_from_ITask(iface); + + TRACE("(%p, %u, %p)\n", iface, count, data); + + if (count) + { + if (!data) return E_INVALIDARG; + + heap_free(This->data); + This->data = heap_alloc(count); + if (!This->data) return E_OUTOFMEMORY; + memcpy(This->data, data, count); + This->data_count = count; + } + else + { + if (data) return E_INVALIDARG; + + heap_free(This->data); + This->data = NULL; + This->data_count = 0; + } + + return S_OK; }
static HRESULT WINAPI MSTASK_ITask_GetWorkItemData( @@ -1865,6 +1887,8 @@ HRESULT TaskConstructor(ITaskService *service, const WCHAR *name, ITask **task) This->IPersistFile_iface.lpVtbl = &MSTASK_IPersistFileVtbl; This->ref = 1; This->task = taskdef; + This->data = NULL; + This->data_count = 0; This->task_name = heap_strdupW(task_name); This->flags = 0; This->status = SCHED_S_TASK_NOT_SCHEDULED;