From f2e9854483eb98e7423c95815ad33f73d5999d8a Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 28 Nov 2013 09:31:24 +0400 Subject: [PATCH] qmgr: Implement Get/SetNotifyInterface(). --- dlls/qmgr/job.c | 42 ++++++++++++++++++++++++++++++++++++---- dlls/qmgr/qmgr.h | 6 +++++- dlls/qmgr/qmgr_local.idl | 1 + dlls/qmgr/tests/job.c | 12 ++++++++++++ 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/dlls/qmgr/job.c b/dlls/qmgr/job.c index 52c7b7f988f..fdbf23410b3 100644 --- a/dlls/qmgr/job.c +++ b/dlls/qmgr/job.c @@ -77,6 +77,8 @@ static ULONG WINAPI BackgroundCopyJob_Release(IBackgroundCopyJob2 *iface) { This->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->cs); + if (This->callback) + IBackgroundCopyCallback2_Release(This->callback); HeapFree(GetProcessHeap(), 0, This->displayName); HeapFree(GetProcessHeap(), 0, This->description); HeapFree(GetProcessHeap(), 0, This); @@ -418,6 +420,7 @@ static HRESULT WINAPI BackgroundCopyJob_SetNotifyFlags( TRACE("(%p)->(0x%x)\n", This, Val); + if (is_job_done(This)) return BG_E_INVALID_STATE; if (Val & ~valid_flags) return E_NOTIMPL; This->notify_flags = Val; return S_OK; @@ -443,8 +446,29 @@ static HRESULT WINAPI BackgroundCopyJob_SetNotifyInterface( IUnknown *Val) { BackgroundCopyJobImpl *This = impl_from_IBackgroundCopyJob2(iface); - FIXME("(%p)->(%p): stub\n", This, Val); - return E_NOTIMPL; + HRESULT hr = S_OK; + + TRACE("(%p)->(%p)\n", This, Val); + + if (is_job_done(This)) return BG_E_INVALID_STATE; + + if (This->callback) + { + IBackgroundCopyCallback2_Release(This->callback); + This->callback = NULL; + This->callback2 = FALSE; + } + + if (Val) + { + hr = IUnknown_QueryInterface(Val, &IID_IBackgroundCopyCallback2, (void**)&This->callback); + if (FAILED(hr)) + hr = IUnknown_QueryInterface(Val, &IID_IBackgroundCopyCallback, (void**)&This->callback); + else + This->callback2 = TRUE; + } + + return hr; } static HRESULT WINAPI BackgroundCopyJob_GetNotifyInterface( @@ -452,8 +476,16 @@ static HRESULT WINAPI BackgroundCopyJob_GetNotifyInterface( IUnknown **pVal) { BackgroundCopyJobImpl *This = impl_from_IBackgroundCopyJob2(iface); - FIXME("(%p)->(%p): stub\n", This, pVal); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, pVal); + + if (!pVal) return E_INVALIDARG; + + *pVal = (IUnknown*)This->callback; + if (*pVal) + IUnknown_AddRef(*pVal); + + return S_OK; } static HRESULT WINAPI BackgroundCopyJob_SetMinimumRetryDelay( @@ -705,6 +737,8 @@ HRESULT BackgroundCopyJobConstructor(LPCWSTR displayName, BG_JOB_TYPE type, GUID This->state = BG_JOB_STATE_SUSPENDED; This->description = NULL; This->notify_flags = BG_NOTIFY_JOB_ERROR | BG_NOTIFY_JOB_TRANSFERRED; + This->callback = NULL; + This->callback2 = FALSE; *job = This; diff --git a/dlls/qmgr/qmgr.h b/dlls/qmgr/qmgr.h index eb982a04cbc..4a9bb152692 100644 --- a/dlls/qmgr/qmgr.h +++ b/dlls/qmgr/qmgr.h @@ -22,10 +22,12 @@ #define __QMGR_H__ #include "windef.h" -#include "objbase.h" #define COBJMACROS +#include "objbase.h" + #include "bits1_5.h" +#include "bits3_0.h" #include #include "wine/list.h" @@ -44,6 +46,8 @@ typedef struct BG_JOB_PROGRESS jobProgress; BG_JOB_STATE state; ULONG notify_flags; + IBackgroundCopyCallback2 *callback; + BOOL callback2; /* IBackgroundCopyCallback2 is supported in addition to IBackgroundCopyCallback */ /* Protects file list, and progress */ CRITICAL_SECTION cs; struct list entryFromQmgr; diff --git a/dlls/qmgr/qmgr_local.idl b/dlls/qmgr/qmgr_local.idl index 4bbcf7b4669..edbe71eacde 100644 --- a/dlls/qmgr/qmgr_local.idl +++ b/dlls/qmgr/qmgr_local.idl @@ -22,3 +22,4 @@ #define DO_NO_IMPORTS #include "bits1_5.idl" +#include "bits3_0.idl" diff --git a/dlls/qmgr/tests/job.c b/dlls/qmgr/tests/job.c index 108bf6b9f14..d42e3a5c9c2 100644 --- a/dlls/qmgr/tests/job.c +++ b/dlls/qmgr/tests/job.c @@ -446,6 +446,17 @@ static void test_NotifyFlags(void) ok(flags == (BG_NOTIFY_JOB_ERROR | BG_NOTIFY_JOB_TRANSFERRED), "flags 0x%08x\n", flags); } +static void test_NotifyInterface(void) +{ + HRESULT hr; + IUnknown *unk; + + unk = (IUnknown*)0xdeadbeef; + hr = IBackgroundCopyJob_GetNotifyInterface(test_job, &unk); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(unk == NULL, "got %p\n", unk); +} + typedef void (*test_t)(void); START_TEST(job) @@ -458,6 +469,7 @@ START_TEST(job) test_GetState, test_ResumeEmpty, test_NotifyFlags, + test_NotifyInterface, 0 }; static const test_t tests_bits20[] = {