diff --git a/dlls/qmgr/qmgr.c b/dlls/qmgr/qmgr.c index c6f3db120f7..fdfd30cfb79 100644 --- a/dlls/qmgr/qmgr.c +++ b/dlls/qmgr/qmgr.c @@ -26,7 +26,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(qmgr); /* Destructor for instances of background copy manager */ static void BackgroundCopyManagerDestructor(BackgroundCopyManagerImpl *This) { + BackgroundCopyJobImpl *job; TRACE("%p\n", This); + + LIST_FOR_EACH_ENTRY(job, &This->jobs, BackgroundCopyJobImpl, entryFromQmgr) + job->lpVtbl->Release((IBackgroundCopyJob *) job); + HeapFree(GetProcessHeap(), 0, This); } @@ -91,9 +96,21 @@ static HRESULT WINAPI BITS_IBackgroundCopyManager_CreateJob( GUID *pJobId, IBackgroundCopyJob **ppJob) { + BackgroundCopyManagerImpl * This = (BackgroundCopyManagerImpl *) iface; + BackgroundCopyJobImpl *job; + HRESULT hres; TRACE("\n"); - return BackgroundCopyJobConstructor(DisplayName, Type, pJobId, + + hres = BackgroundCopyJobConstructor(DisplayName, Type, pJobId, (LPVOID *) ppJob); + if (FAILED(hres)) + return hres; + + /* Add a reference to the job to job list */ + IBackgroundCopyJob_AddRef(*ppJob); + job = (BackgroundCopyJobImpl *) *ppJob; + list_add_head(&This->jobs, &job->entryFromQmgr); + return S_OK; } static HRESULT WINAPI BITS_IBackgroundCopyManager_GetJob( @@ -151,6 +168,7 @@ HRESULT BackgroundCopyManagerConstructor(IUnknown *pUnkOuter, LPVOID *ppObj) This->lpVtbl = &BITS_IBackgroundCopyManager_Vtbl; This->ref = 1; + list_init(&This->jobs); *ppObj = &This->lpVtbl; return S_OK; diff --git a/dlls/qmgr/qmgr.h b/dlls/qmgr/qmgr.h index ddf9eeeae53..f5629c6c887 100644 --- a/dlls/qmgr/qmgr.h +++ b/dlls/qmgr/qmgr.h @@ -40,6 +40,7 @@ typedef struct GUID jobId; struct list files; BG_JOB_PROGRESS jobProgress; + struct list entryFromQmgr; } BackgroundCopyJobImpl; /* Enum background copy jobs vtbl and related data */ @@ -74,6 +75,7 @@ typedef struct { const IBackgroundCopyManagerVtbl *lpVtbl; LONG ref; + struct list jobs; } BackgroundCopyManagerImpl; typedef struct