ReactOS 0.4.16-dev-197-g92996da
qmgr.c
Go to the documentation of this file.
1/*
2 * Queue Manager (BITS) core functions
3 *
4 * Copyright 2007, 2008 Google (Roy Shea, Dan Hipschman)
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include "qmgr.h"
22#include "wine/debug.h"
23
25
27
29 REFIID riid, void **ppv)
30{
31 TRACE("(%s, %p)\n", debugstr_guid(riid), ppv);
32
33 if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IBackgroundCopyManager))
34 {
35 *ppv = iface;
36 IBackgroundCopyManager_AddRef(iface);
37 return S_OK;
38 }
39
40 *ppv = NULL;
41 return E_NOINTERFACE;
42}
43
45{
46 return 2;
47}
48
50{
51 return 1;
52}
53
54/*** IBackgroundCopyManager interface methods ***/
55
57 LPCWSTR DisplayName, BG_JOB_TYPE Type, GUID *pJobId, IBackgroundCopyJob **ppJob)
58{
61
62 TRACE("(%s %d %p %p)\n", debugstr_w(DisplayName), Type, pJobId, ppJob);
63
64 hres = BackgroundCopyJobConstructor(DisplayName, Type, pJobId, &job);
65 if (FAILED(hres))
66 return hres;
67
68 /* Add a reference to the job to job list */
69 *ppJob = (IBackgroundCopyJob *)&job->IBackgroundCopyJob3_iface;
70 IBackgroundCopyJob_AddRef(*ppJob);
72 list_add_head(&globalMgr.jobs, &job->entryFromQmgr);
74 return S_OK;
75}
76
79{
83
84 TRACE("(%s %p)\n", debugstr_guid(jobID), job);
85
86 if (!job || !jobID) return E_INVALIDARG;
87
88 *job = NULL;
89
91
92 LIST_FOR_EACH_ENTRY(cur, &qmgr->jobs, BackgroundCopyJobImpl, entryFromQmgr)
93 {
94 if (IsEqualGUID(&cur->jobId, jobID))
95 {
96 *job = (IBackgroundCopyJob *)&cur->IBackgroundCopyJob3_iface;
97 IBackgroundCopyJob3_AddRef(&cur->IBackgroundCopyJob3_iface);
98 hr = S_OK;
99 break;
100 }
101 }
102
103 LeaveCriticalSection(&qmgr->cs);
104
105 return hr;
106}
107
110{
111 TRACE("(0x%x %p)\n", flags, ppEnum);
112 return enum_copy_job_create(&globalMgr, ppEnum);
113}
114
116 HRESULT hr, DWORD langid, LPWSTR *error_description)
117{
118 FIXME("(0x%08x 0x%x %p): stub\n", hr, langid, error_description);
119 return E_NOTIMPL;
120}
121
122static const IBackgroundCopyManagerVtbl BackgroundCopyManagerVtbl =
123{
131};
132
135 { NULL, -1, 0, 0, 0, 0 },
136 NULL,
138};
139
140/* Constructor for instances of background copy manager */
142{
143 TRACE("(%p)\n", ppObj);
144 *ppObj = &globalMgr;
145 return S_OK;
146}
147
149{
151 HANDLE events[2];
152
153 events[0] = stop_event;
154 events[1] = qmgr->jobEvent;
155
156 for (;;)
157 {
158 BackgroundCopyJobImpl *job, *jobCur;
159 BOOL haveJob = FALSE;
160
161 /* Check if it's the stop_event */
163 {
164 LIST_FOR_EACH_ENTRY_SAFE(job, jobCur, &qmgr->jobs, BackgroundCopyJobImpl, entryFromQmgr)
165 {
166 list_remove(&job->entryFromQmgr);
167 IBackgroundCopyJob3_Release(&job->IBackgroundCopyJob3_iface);
168 }
169 return 0;
170 }
171
172 /* Note that other threads may add files to the job list, but only
173 this thread ever deletes them so we don't need to worry about jobs
174 magically disappearing from the list. */
175 EnterCriticalSection(&qmgr->cs);
176
177 LIST_FOR_EACH_ENTRY_SAFE(job, jobCur, &qmgr->jobs, BackgroundCopyJobImpl, entryFromQmgr)
178 {
179 if (job->state == BG_JOB_STATE_ACKNOWLEDGED || job->state == BG_JOB_STATE_CANCELLED)
180 {
181 list_remove(&job->entryFromQmgr);
182 IBackgroundCopyJob3_Release(&job->IBackgroundCopyJob3_iface);
183 }
184 else if (job->state == BG_JOB_STATE_QUEUED)
185 {
186 haveJob = TRUE;
187 break;
188 }
189 else if (job->state == BG_JOB_STATE_CONNECTING
190 || job->state == BG_JOB_STATE_TRANSFERRING)
191 {
192 ERR("Invalid state for job %p: %d\n", job, job->state);
193 }
194 }
195
196 if (!haveJob)
197 ResetEvent(qmgr->jobEvent);
198
199 LeaveCriticalSection(&qmgr->cs);
200
201 if (haveJob)
203 }
204}
Type
Definition: Type.h:7
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
#define BG_E_NOT_FOUND
Definition: bitsmsg.h:38
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HRESULT enum_copy_job_create(BackgroundCopyManagerImpl *qmgr, IEnumBackgroundCopyJobs **enumjob)
Definition: enum_jobs.c:179
HRESULT BackgroundCopyJobConstructor(LPCWSTR displayName, BG_JOB_TYPE type, GUID *job_id, BackgroundCopyJobImpl **job)
Definition: job.c:1197
void processJob(BackgroundCopyJobImpl *job)
Definition: job.c:1265
static ULONG WINAPI BackgroundCopyManager_AddRef(IBackgroundCopyManager *iface)
Definition: qmgr.c:44
static HRESULT WINAPI BackgroundCopyManager_QueryInterface(IBackgroundCopyManager *iface, REFIID riid, void **ppv)
Definition: qmgr.c:28
DWORD WINAPI fileTransfer(void *param)
Definition: qmgr.c:148
static HRESULT WINAPI BackgroundCopyManager_GetErrorDescription(IBackgroundCopyManager *iface, HRESULT hr, DWORD langid, LPWSTR *error_description)
Definition: qmgr.c:115
static HRESULT WINAPI BackgroundCopyManager_CreateJob(IBackgroundCopyManager *iface, LPCWSTR DisplayName, BG_JOB_TYPE Type, GUID *pJobId, IBackgroundCopyJob **ppJob)
Definition: qmgr.c:56
BackgroundCopyManagerImpl globalMgr
Definition: qmgr.c:26
static ULONG WINAPI BackgroundCopyManager_Release(IBackgroundCopyManager *iface)
Definition: qmgr.c:49
static const IBackgroundCopyManagerVtbl BackgroundCopyManagerVtbl
Definition: qmgr.c:122
static HRESULT WINAPI BackgroundCopyManager_GetJob(IBackgroundCopyManager *iface, REFGUID jobID, IBackgroundCopyJob **job)
Definition: qmgr.c:77
static HRESULT WINAPI BackgroundCopyManager_EnumJobs(IBackgroundCopyManager *iface, DWORD flags, IEnumBackgroundCopyJobs **ppEnum)
Definition: qmgr.c:108
HRESULT BackgroundCopyManagerConstructor(LPVOID *ppObj)
Definition: qmgr.c:141
#define INFINITE
Definition: serial.h:102
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxCollectionEntry * cur
GLbitfield flags
Definition: glext.h:7161
GLfloat param
Definition: glext.h:5796
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
HANDLE events[2]
Definition: event.c:4
HRESULT hres
Definition: protocol.c:465
static HANDLE job
Definition: process.c:77
LANGID langid
Definition: msctf.idl:644
HANDLE stop_event
Definition: nfs41_daemon.c:55
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
struct list jobs
Definition: qmgr.h:91
CRITICAL_SECTION cs
Definition: qmgr.h:89
Definition: scsiwmi.h:51
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:714
#define LIST_INIT(head)
Definition: queue.h:197
uint32_t ULONG
Definition: typedefs.h:59
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define WAIT_OBJECT_0
Definition: winbase.h:431
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185