[6/9] taskschd: Implement ITaskFolderCollection::get_Item.

Dmitry Timoshkov dmitry at baikal.ru
Mon Jan 27 20:54:45 CST 2014


---
 dlls/taskschd/folder_collection.c | 59 ++++++++++++++++++++++++++++++++++++---
 dlls/taskschd/tests/scheduler.c   | 12 ++++----
 2 files changed, 61 insertions(+), 10 deletions(-)

diff --git a/dlls/taskschd/folder_collection.c b/dlls/taskschd/folder_collection.c
index f1a3f3f..e8e4933 100644
--- a/dlls/taskschd/folder_collection.c
+++ b/dlls/taskschd/folder_collection.c
@@ -127,14 +127,65 @@ static HRESULT WINAPI folders_Invoke(ITaskFolderCollection *iface, DISPID dispid
 
 static HRESULT WINAPI folders_get_Count(ITaskFolderCollection *iface, LONG *count)
 {
-    FIXME("%p,%p: stub\n", iface, count);
-    return E_NOTIMPL;
+    TaskFolderCollection *folders = impl_from_ITaskFolderCollection(iface);
+
+    TRACE("%p,%p\n", iface, count);
+
+    if (!count) return E_POINTER;
+
+    *count = folders->count;
+
+    return S_OK;
+}
+
+static LONG get_var_int(const VARIANT *var)
+{
+    switch(V_VT(var))
+    {
+    case VT_I1:
+    case VT_UI1:
+        return V_UI1(var);
+
+    case VT_I2:
+    case VT_UI2:
+        return V_UI2(var);
+
+    case VT_I4:
+    case VT_UI4:
+        return V_UI4(var);
+
+    case VT_I8:
+    case VT_UI8:
+        return V_UI8(var);
+
+    case VT_INT:
+    case VT_UINT:
+        return V_UINT(var);
+
+    default:
+        FIXME("unsupported variant type %d\n", V_VT(var));
+        return 0;
+    }
 }
 
 static HRESULT WINAPI folders_get_Item(ITaskFolderCollection *iface, VARIANT index, ITaskFolder **folder)
 {
-    FIXME("%p,%s,%p: stub\n", iface, debugstr_variant(&index), folder);
-    return E_NOTIMPL;
+    TaskFolderCollection *folders = impl_from_ITaskFolderCollection(iface);
+    LONG idx;
+
+    TRACE("%p,%s,%p\n", iface, debugstr_variant(&index), folder);
+
+    if (!folder) return E_POINTER;
+
+    if (V_VT(&index) == VT_BSTR)
+        return TaskFolder_create(folders->path, V_BSTR(&index), folder, FALSE);
+
+    idx = get_var_int(&index);
+    /* collections are 1 based */
+    if (idx < 1 || idx > folders->count)
+        return E_INVALIDARG;
+
+    return TaskFolder_create(folders->path, folders->list[idx - 1], folder, FALSE);
 }
 
 static HRESULT WINAPI folders_get__NewEnum(ITaskFolderCollection *iface, IUnknown **penum)
diff --git a/dlls/taskschd/tests/scheduler.c b/dlls/taskschd/tests/scheduler.c
index 700fab2..d9f622e 100644
--- a/dlls/taskschd/tests/scheduler.c
+++ b/dlls/taskschd/tests/scheduler.c
@@ -455,11 +455,12 @@ static void test_FolderCollection(void)
 
     ITaskFolder_Release(folder);
 
+    hr = ITaskFolderCollection_get_Count(folders, NULL);
+    ok (hr == E_POINTER, "expected E_POINTER, got %#x\n", hr);
+
     count = 0;
     hr = ITaskFolderCollection_get_Count(folders, &count);
-todo_wine
     ok(hr == S_OK, "get_Count error %#x\n", hr);
-todo_wine
     ok(count == 2, "expected 2, got %d\n", count);
 
     hr = ITaskFolder_CreateFolder(root, Wine_Folder3, v_null, &subfolder);
@@ -468,12 +469,8 @@ todo_wine
 
     count = 0;
     hr = ITaskFolderCollection_get_Count(folders, &count);
-todo_wine
     ok(hr == S_OK, "get_Count error %#x\n", hr);
-todo_wine
     ok(count == 2, "expected 2, got %d\n", count);
-    /* FIXME: remove once implemented */
-    if (!count) goto failed;
 
     for (i = 0; i < sizeof(vt)/sizeof(vt[0]); i++)
     {
@@ -547,7 +544,10 @@ todo_wine
     ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
 
     hr = ITaskFolderCollection_get__NewEnum(folders, &unknown);
+todo_wine
     ok(hr == S_OK, "get__NewEnum error %#x\n", hr);
+    /* FIXME: remove once implemented */
+    if (hr != S_OK) goto failed;
     hr = IUnknown_QueryInterface(unknown, &IID_IEnumUnknown, (void **)&enumvar);
     ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
     hr = IUnknown_QueryInterface(unknown, &IID_IEnumVARIANT, (void **)&enumvar);
-- 
1.8.5.3




More information about the wine-patches mailing list