[MSTASK] Sync with Wine Staging 1.7.47. CORE-9924
authorAmine Khaldi <amine.khaldi@reactos.org>
Sun, 19 Jul 2015 23:05:56 +0000 (23:05 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sun, 19 Jul 2015 23:05:56 +0000 (23:05 +0000)
svn path=/trunk/; revision=68463

reactos/dll/win32/mstask/task_scheduler.c
reactos/media/doc/README.WINE

index 9b98108..f2103b9 100644 (file)
@@ -26,11 +26,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);
@@ -38,6 +49,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,
@@ -138,10 +246,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(
index 9993b93..5e9aa45 100644 (file)
@@ -127,7 +127,7 @@ reactos/dll/win32/mspatcha            # Synced to WineStaging-1.7.37
 reactos/dll/win32/msrle32             # Synced to WineStaging-1.7.37
 reactos/dll/win32/mssign32            # Synced to WineStaging-1.7.37
 reactos/dll/win32/mssip32             # Synced to WineStaging-1.7.37
-reactos/dll/win32/mstask              # Synced to WineStaging-1.7.37
+reactos/dll/win32/mstask              # Synced to WineStaging-1.7.47
 reactos/dll/win32/msvcrt20            # Out of sync
 reactos/dll/win32/msvcrt40            # Out of sync
 reactos/dll/win32/msvfw32             # Synced to WineStaging-1.7.37