2 * Queue Manager (BITS) core functions
4 * Copyright 2007, 2008 Google (Roy Shea, Dan Hipschman)
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.
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.
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
22 #include "wine/debug.h"
24 WINE_DEFAULT_DEBUG_CHANNEL(qmgr);
26 /* Add a reference to the iface pointer */
27 static ULONG WINAPI BITS_IBackgroundCopyManager_AddRef(
28 IBackgroundCopyManager* iface)
33 /* Attempt to provide a new interface to interact with iface */
34 static HRESULT WINAPI BITS_IBackgroundCopyManager_QueryInterface(
35 IBackgroundCopyManager* iface,
39 BackgroundCopyManagerImpl * This = (BackgroundCopyManagerImpl *)iface;
41 TRACE("IID: %s\n", debugstr_guid(riid));
43 if (IsEqualGUID(riid, &IID_IUnknown) ||
44 IsEqualGUID(riid, &IID_IBackgroundCopyManager))
46 *ppvObject = &This->lpVtbl;
47 BITS_IBackgroundCopyManager_AddRef(iface);
55 /* Release an interface to iface */
56 static ULONG WINAPI BITS_IBackgroundCopyManager_Release(
57 IBackgroundCopyManager* iface)
62 /*** IBackgroundCopyManager interface methods ***/
64 static HRESULT WINAPI BITS_IBackgroundCopyManager_CreateJob(
65 IBackgroundCopyManager* iface,
69 IBackgroundCopyJob **ppJob)
71 BackgroundCopyManagerImpl * This = (BackgroundCopyManagerImpl *) iface;
72 BackgroundCopyJobImpl *job;
76 hres = BackgroundCopyJobConstructor(DisplayName, Type, pJobId,
81 /* Add a reference to the job to job list */
82 IBackgroundCopyJob_AddRef(*ppJob);
83 job = (BackgroundCopyJobImpl *) *ppJob;
84 EnterCriticalSection(&This->cs);
85 list_add_head(&This->jobs, &job->entryFromQmgr);
86 LeaveCriticalSection(&This->cs);
90 static HRESULT WINAPI BITS_IBackgroundCopyManager_GetJob(
91 IBackgroundCopyManager* iface,
93 IBackgroundCopyJob **ppJob)
95 FIXME("Not implemented\n");
99 static HRESULT WINAPI BITS_IBackgroundCopyManager_EnumJobs(
100 IBackgroundCopyManager* iface,
102 IEnumBackgroundCopyJobs **ppEnum)
105 return EnumBackgroundCopyJobsConstructor((LPVOID *) ppEnum, iface);
108 static HRESULT WINAPI BITS_IBackgroundCopyManager_GetErrorDescription(
109 IBackgroundCopyManager* iface,
112 LPWSTR *pErrorDescription)
114 FIXME("Not implemented\n");
119 static const IBackgroundCopyManagerVtbl BITS_IBackgroundCopyManager_Vtbl =
121 BITS_IBackgroundCopyManager_QueryInterface,
122 BITS_IBackgroundCopyManager_AddRef,
123 BITS_IBackgroundCopyManager_Release,
124 BITS_IBackgroundCopyManager_CreateJob,
125 BITS_IBackgroundCopyManager_GetJob,
126 BITS_IBackgroundCopyManager_EnumJobs,
127 BITS_IBackgroundCopyManager_GetErrorDescription
130 BackgroundCopyManagerImpl globalMgr = {
131 &BITS_IBackgroundCopyManager_Vtbl,
132 { NULL, -1, 0, 0, 0, 0 },
134 LIST_INIT(globalMgr.jobs)
137 /* Constructor for instances of background copy manager */
138 HRESULT BackgroundCopyManagerConstructor(IUnknown *pUnkOuter, LPVOID *ppObj)
140 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
141 *ppObj = (IBackgroundCopyManager *) &globalMgr;
145 DWORD WINAPI fileTransfer(void *param)
147 BackgroundCopyManagerImpl *qmgr = &globalMgr;
150 events[0] = stop_event;
151 events[1] = qmgr->jobEvent;
155 BackgroundCopyJobImpl *job, *jobCur;
156 BOOL haveJob = FALSE;
158 /* Check if it's the stop_event */
159 if (WaitForMultipleObjects(2, events, FALSE, INFINITE) == WAIT_OBJECT_0)
162 /* Note that other threads may add files to the job list, but only
163 this thread ever deletes them so we don't need to worry about jobs
164 magically disappearing from the list. */
165 EnterCriticalSection(&qmgr->cs);
167 LIST_FOR_EACH_ENTRY_SAFE(job, jobCur, &qmgr->jobs, BackgroundCopyJobImpl, entryFromQmgr)
169 if (job->state == BG_JOB_STATE_ACKNOWLEDGED || job->state == BG_JOB_STATE_CANCELLED)
171 list_remove(&job->entryFromQmgr);
172 IBackgroundCopyJob_Release((IBackgroundCopyJob *) job);
174 else if (job->state == BG_JOB_STATE_QUEUED)
179 else if (job->state == BG_JOB_STATE_CONNECTING
180 || job->state == BG_JOB_STATE_TRANSFERRING)
182 ERR("Invalid state for job %p: %d\n", job, job->state);
187 ResetEvent(qmgr->jobEvent);
189 LeaveCriticalSection(&qmgr->cs);