[1/4] qmgr: Implement IEnumBackgroundCopyJobs_GetCount.

Dan Hipschman dsh at linux.ucla.edu
Mon Mar 3 18:46:08 CST 2008


Implements IEnumBackgroundCopyJobs_GetCount.

From: Roy Shea <roy at cs.hmc.edu>
Date: Thu Dec 20 18:38:31 CST 2007

---
 dlls/qmgr/enum_jobs.c       |   39 +++++++++++-
 dlls/qmgr/qmgr.h            |    3 +
 dlls/qmgr/tests/Makefile.in |    1 +
 dlls/qmgr/tests/enum_jobs.c |  152 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 193 insertions(+), 2 deletions(-)
 create mode 100644 dlls/qmgr/tests/enum_jobs.c

diff --git a/dlls/qmgr/enum_jobs.c b/dlls/qmgr/enum_jobs.c
index 54ecaab..6d14791 100644
--- a/dlls/qmgr/enum_jobs.c
+++ b/dlls/qmgr/enum_jobs.c
@@ -25,6 +25,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(qmgr);
 
 static void EnumBackgroundCopyJobsDestructor(EnumBackgroundCopyJobsImpl *This)
 {
+    ULONG i;
+
+    for(i = 0; i < This->numJobs; i++)
+        IBackgroundCopyJob_Release(This->jobs[i]);
+
+    HeapFree(GetProcessHeap(), 0, This->jobs);
     HeapFree(GetProcessHeap(), 0, This);
 }
 
@@ -105,8 +111,9 @@ static HRESULT WINAPI BITS_IEnumBackgroundCopyJobs_GetCount(
     IEnumBackgroundCopyJobs* iface,
     ULONG *puCount)
 {
-    FIXME("Not implemented\n");
-    return E_NOTIMPL;
+    EnumBackgroundCopyJobsImpl *This = (EnumBackgroundCopyJobsImpl *) iface;
+    *puCount = This->numJobs;
+    return S_OK;
 }
 
 static const IEnumBackgroundCopyJobsVtbl BITS_IEnumBackgroundCopyJobs_Vtbl =
@@ -124,7 +131,10 @@ static const IEnumBackgroundCopyJobsVtbl BITS_IEnumBackgroundCopyJobs_Vtbl =
 HRESULT EnumBackgroundCopyJobsConstructor(LPVOID *ppObj,
                                           IBackgroundCopyManager* copyManager)
 {
+    BackgroundCopyManagerImpl *qmgr = (BackgroundCopyManagerImpl *) copyManager;
     EnumBackgroundCopyJobsImpl *This;
+    BackgroundCopyJobImpl *job;
+    ULONG i;
 
     TRACE("%p, %p)\n", ppObj, copyManager);
 
@@ -134,6 +144,31 @@ HRESULT EnumBackgroundCopyJobsConstructor(LPVOID *ppObj,
     This->lpVtbl = &BITS_IEnumBackgroundCopyJobs_Vtbl;
     This->ref = 1;
 
+    /* Create array of jobs */
+    This->indexJobs = 0;
+    This->numJobs = list_count(&qmgr->jobs);
+
+    if (0 < This->numJobs)
+    {
+        This->jobs = HeapAlloc(GetProcessHeap(), 0,
+                               This->numJobs * sizeof *This->jobs);
+        if (!This->jobs)
+        {
+            HeapFree(GetProcessHeap(), 0, This);
+            return E_OUTOFMEMORY;
+        }
+    }
+    else
+        This->jobs = NULL;
+
+    i = 0;
+    LIST_FOR_EACH_ENTRY(job, &qmgr->jobs, BackgroundCopyJobImpl, entryFromQmgr)
+    {
+        IBackgroundCopyJob *iJob = (IBackgroundCopyJob *) job;
+        IBackgroundCopyJob_AddRef(iJob);
+        This->jobs[i++] = iJob;
+    }
+
     *ppObj = &This->lpVtbl;
     return S_OK;
 }
diff --git a/dlls/qmgr/qmgr.h b/dlls/qmgr/qmgr.h
index f5629c6..2ab3f57 100644
--- a/dlls/qmgr/qmgr.h
+++ b/dlls/qmgr/qmgr.h
@@ -48,6 +48,9 @@ typedef struct
 {
     const IEnumBackgroundCopyJobsVtbl *lpVtbl;
     LONG ref;
+    IBackgroundCopyJob **jobs;
+    ULONG numJobs;
+    ULONG indexJobs;
 } EnumBackgroundCopyJobsImpl;
 
 /* Enum background copy files vtbl and related data */
diff --git a/dlls/qmgr/tests/Makefile.in b/dlls/qmgr/tests/Makefile.in
index 840676d..9a3c596 100644
--- a/dlls/qmgr/tests/Makefile.in
+++ b/dlls/qmgr/tests/Makefile.in
@@ -7,6 +7,7 @@ IMPORTS   = ole32 shlwapi user32 kernel32
 
 CTESTS = \
 	enum_files.c \
+	enum_jobs.c \
 	file.c \
 	job.c \
 	qmgr.c
diff --git a/dlls/qmgr/tests/enum_jobs.c b/dlls/qmgr/tests/enum_jobs.c
new file mode 100644
index 0000000..20344d3
--- /dev/null
+++ b/dlls/qmgr/tests/enum_jobs.c
@@ -0,0 +1,152 @@
+/*
+ * Unit test suite for Enum Background Copy Jobs Interface
+ *
+ * Copyright 2007 Google (Roy Shea)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+
+#define COBJMACROS
+
+#include "wine/test.h"
+#include "bits.h"
+
+/* Globals used by many tests */
+static const WCHAR test_displayNameA[] = {'T','e','s','t','A', 0};
+static const WCHAR test_displayNameB[] = {'T','e','s','t','B', 0};
+static IBackgroundCopyManager *test_manager;
+static IBackgroundCopyJob *test_jobA;
+static IBackgroundCopyJob *test_jobB;
+static IEnumBackgroundCopyJobs *test_enumJobsA;
+static IEnumBackgroundCopyJobs *test_enumJobsB;
+static GUID test_jobIdA;
+static GUID test_jobIdB;
+
+/* Generic test setup */
+static BOOL setup(void)
+{
+    HRESULT hres;
+
+    test_manager = NULL;
+    test_jobA = NULL;
+    test_jobB = NULL;
+    memset(&test_jobIdA, 0, sizeof test_jobIdA);
+    memset(&test_jobIdB, 0, sizeof test_jobIdB);
+
+    hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL,
+                            CLSCTX_LOCAL_SERVER, &IID_IBackgroundCopyManager,
+                            (void **) &test_manager);
+    if(hres != S_OK)
+        return FALSE;
+
+    hres = IBackgroundCopyManager_CreateJob(test_manager, test_displayNameA,
+                                            BG_JOB_TYPE_DOWNLOAD, &test_jobIdA,
+                                            &test_jobA);
+    if(hres != S_OK)
+        return FALSE;
+
+    hres = IBackgroundCopyManager_EnumJobs(test_manager, 0, &test_enumJobsA);
+    if(hres != S_OK)
+        return FALSE;
+
+    hres = IBackgroundCopyManager_CreateJob(test_manager, test_displayNameB,
+                                            BG_JOB_TYPE_DOWNLOAD, &test_jobIdB,
+                                            &test_jobB);
+    if(hres != S_OK)
+        return FALSE;
+
+    hres = IBackgroundCopyManager_EnumJobs(test_manager, 0, &test_enumJobsB);
+    if(hres != S_OK)
+        return FALSE;
+
+    return TRUE;
+}
+
+/* Generic test cleanup */
+static void teardown(void)
+{
+    if (test_enumJobsB)
+        IEnumBackgroundCopyJobs_Release(test_enumJobsB);
+    test_enumJobsB = NULL;
+    if (test_jobB)
+        IBackgroundCopyJob_Release(test_jobB);
+    test_jobB = NULL;
+    if (test_enumJobsA)
+        IEnumBackgroundCopyJobs_Release(test_enumJobsA);
+    test_enumJobsA = NULL;
+    if (test_jobA)
+        IBackgroundCopyJob_Release(test_jobA);
+    test_jobA = NULL;
+    if (test_manager)
+        IBackgroundCopyManager_Release(test_manager);
+    test_manager = NULL;
+}
+
+/* We can't assume the job count will start at any fixed number since esp
+   when testing on Windows there may be other jobs created by other
+   processes.  Even this approach of creating two jobs and checking the
+   difference in counts could fail if a job was created in between, but
+   it's probably not worth worrying about in sane test environments.  */
+static void test_GetCount(void)
+{
+    HRESULT hres;
+    ULONG jobCountA, jobCountB;
+
+    hres = IEnumBackgroundCopyJobs_GetCount(test_enumJobsA, &jobCountA);
+    ok(hres == S_OK, "GetCount failed: %08x\n", hres);
+    if(hres != S_OK)
+    {
+        skip("Couldn't get job count\n");
+        return;
+    }
+
+    hres = IEnumBackgroundCopyJobs_GetCount(test_enumJobsB, &jobCountB);
+    ok(hres == S_OK, "GetCount failed: %08x\n", hres);
+    if(hres != S_OK)
+    {
+        skip("Couldn't get job count\n");
+        return;
+    }
+
+    ok(jobCountB == jobCountA + 1, "Got incorrect count\n");
+}
+
+typedef void (*test_t)(void);
+
+START_TEST(enum_jobs)
+{
+    static const test_t tests[] = {
+        test_GetCount,
+        0
+    };
+    const test_t *test;
+
+    CoInitialize(NULL);
+    for (test = tests; *test; ++test)
+    {
+        /* Keep state seperate between tests.  */
+        if (!setup())
+        {
+            teardown();
+            skip("Unable to setup test\n");
+            break;
+        }
+        (*test)();
+        teardown();
+    }
+    CoUninitialize();
+}



More information about the wine-patches mailing list