Jacek Caban : taskschd: Added ITaskDefinition:: get_Triggers implementation.

Alexandre Julliard julliard at winehq.org
Tue Sep 6 10:47:31 CDT 2016


Module: wine
Branch: master
Commit: 67abe79de009d06a92841e7774f90771f5b05cdd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=67abe79de009d06a92841e7774f90771f5b05cdd

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep  6 13:00:38 2016 +0200

taskschd: Added ITaskDefinition::get_Triggers implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/taskschd/task.c            | 163 +++++++++++++++++++++++++++++++++++++++-
 dlls/taskschd/tests/scheduler.c |  11 +++
 2 files changed, 172 insertions(+), 2 deletions(-)

diff --git a/dlls/taskschd/task.c b/dlls/taskschd/task.c
index c33cda1..d77ffc8 100644
--- a/dlls/taskschd/task.c
+++ b/dlls/taskschd/task.c
@@ -37,6 +37,149 @@ WINE_DEFAULT_DEBUG_CHANNEL(taskschd);
 
 typedef struct
 {
+    ITriggerCollection ITriggerCollection_iface;
+    LONG ref;
+} trigger_collection;
+
+static inline trigger_collection *impl_from_ITriggerCollection(ITriggerCollection *iface)
+{
+    return CONTAINING_RECORD(iface, trigger_collection, ITriggerCollection_iface);
+}
+
+static HRESULT WINAPI TriggerCollection_QueryInterface(ITriggerCollection *iface, REFIID riid, void **ppv)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+
+    if(IsEqualGUID(&IID_IUnknown, riid) ||
+       IsEqualGUID(&IID_IDispatch, riid) ||
+       IsEqualGUID(&IID_ITriggerCollection, riid)) {
+        *ppv = &This->ITriggerCollection_iface;
+    }else {
+        FIXME("unimplemented interface %s\n", debugstr_guid(riid));
+        *ppv = NULL;
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI TriggerCollection_AddRef(ITriggerCollection *iface)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI TriggerCollection_Release(ITriggerCollection *iface)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if(!ref)
+        heap_free(This);
+
+    return ref;
+}
+
+static HRESULT WINAPI TriggerCollection_GetTypeInfoCount(ITriggerCollection *iface, UINT *count)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%p)\n", This, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_GetTypeInfo(ITriggerCollection *iface, UINT index, LCID lcid, ITypeInfo **info)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%u %u %p)\n", This, index, lcid, info);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_GetIDsOfNames(ITriggerCollection *iface, REFIID riid, LPOLESTR *names,
+                                                   UINT count, LCID lcid, DISPID *dispid)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), names, count, lcid, dispid);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_Invoke(ITriggerCollection *iface, DISPID dispid, REFIID riid, LCID lcid, WORD flags,
+                                               DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *argerr)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%d %s %x %x %p %p %p %p)\n", This, dispid, debugstr_guid(riid), lcid, flags,
+          params, result, excepinfo, argerr);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_get_Count(ITriggerCollection *iface, LONG *count)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%p)\n", This, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_get_Item(ITriggerCollection *iface, LONG index, ITrigger **trigger)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%d %p)\n", This, index, trigger);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_get__NewEnum(ITriggerCollection *iface, IUnknown **penum)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%p)\n", This, penum);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_Create(ITriggerCollection *iface, TASK_TRIGGER_TYPE2 type, ITrigger **trigger)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%d %p)\n", This, type, trigger);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_Remove(ITriggerCollection *iface, VARIANT index)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)->(%s)\n", This, debugstr_variant(&index));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TriggerCollection_Clear(ITriggerCollection *iface)
+{
+    trigger_collection *This = impl_from_ITriggerCollection(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static const ITriggerCollectionVtbl TriggerCollection_vtbl = {
+    TriggerCollection_QueryInterface,
+    TriggerCollection_AddRef,
+    TriggerCollection_Release,
+    TriggerCollection_GetTypeInfoCount,
+    TriggerCollection_GetTypeInfo,
+    TriggerCollection_GetIDsOfNames,
+    TriggerCollection_Invoke,
+    TriggerCollection_get_Count,
+    TriggerCollection_get_Item,
+    TriggerCollection_get__NewEnum,
+    TriggerCollection_Create,
+    TriggerCollection_Remove,
+    TriggerCollection_Clear
+};
+
+typedef struct
+{
     IRegistrationInfo IRegistrationInfo_iface;
     LONG ref;
     WCHAR *description, *author, *version, *date, *documentation, *uri, *source;
@@ -1072,8 +1215,24 @@ static HRESULT WINAPI TaskDefinition_put_RegistrationInfo(ITaskDefinition *iface
 
 static HRESULT WINAPI TaskDefinition_get_Triggers(ITaskDefinition *iface, ITriggerCollection **triggers)
 {
-    FIXME("%p,%p: stub\n", iface, triggers);
-    return E_NOTIMPL;
+    TaskDefinition *This = impl_from_ITaskDefinition(iface);
+
+    TRACE("%p,%p\n", This, triggers);
+
+    if (!This->triggers)
+    {
+        trigger_collection *collection;
+
+        collection = heap_alloc(sizeof(*collection));
+        if (!collection) return E_OUTOFMEMORY;
+
+        collection->ITriggerCollection_iface.lpVtbl = &TriggerCollection_vtbl;
+        collection->ref = 1;
+        This->triggers = &collection->ITriggerCollection_iface;
+    }
+
+    ITriggerCollection_AddRef(*triggers = This->triggers);
+    return S_OK;
 }
 
 static HRESULT WINAPI TaskDefinition_put_Triggers(ITaskDefinition *iface, ITriggerCollection *triggers)
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c
index 94d9b29..5ddc96f 100644
--- a/dlls/taskschd/tests/scheduler.c
+++ b/dlls/taskschd/tests/scheduler.c
@@ -1291,6 +1291,7 @@ static void test_TaskDefinition(void)
         100, 1, TASK_INSTANCES_STOP_EXISTING, TASK_COMPATIBILITY_V1, VARIANT_FALSE, VARIANT_FALSE,
         VARIANT_FALSE, VARIANT_FALSE, VARIANT_TRUE, VARIANT_TRUE, VARIANT_FALSE, VARIANT_TRUE,
         VARIANT_TRUE, VARIANT_TRUE };
+    ITriggerCollection *trigger_col, *trigger_col2;
     HRESULT hr;
     ITaskService *service;
     ITaskDefinition *taskdef;
@@ -1418,6 +1419,16 @@ if (hr == S_OK)
 if (hr == S_OK)
     ok(!bstr, "expected NULL, got %s\n", wine_dbgstr_w(bstr));
 
+    hr = ITaskDefinition_get_Triggers(taskdef, &trigger_col);
+    ok(hr == S_OK, "get_Triggers failed: %08x\n", hr);
+    ok(trigger_col != NULL, "Trigers = NULL\n");
+    ITriggerCollection_Release(trigger_col);
+
+    hr = ITaskDefinition_get_Triggers(taskdef, &trigger_col2);
+    ok(hr == S_OK, "get_Triggers failed: %08x\n", hr);
+    ok(trigger_col == trigger_col2, "Trigers = NULL\n");
+    ITriggerCollection_Release(trigger_col2);
+
     IRegistrationInfo_Release(reginfo);
     ITaskDefinition_Release(taskdef);
     ITaskService_Release(service);




More information about the wine-cvs mailing list