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 BackgroundCopyManagerImpl globalMgr
;
28 static HRESULT WINAPI
BITS_IBackgroundCopyManager_QueryInterface(IBackgroundCopyManager
*iface
,
29 REFIID riid
, void **ppv
)
31 TRACE("(%p,%s,%p)\n", iface
, debugstr_guid(riid
), ppv
);
33 if (IsEqualGUID(riid
, &IID_IUnknown
) || IsEqualGUID(riid
, &IID_IBackgroundCopyManager
))
36 IBackgroundCopyManager_AddRef(iface
);
44 static ULONG WINAPI
BITS_IBackgroundCopyManager_AddRef(IBackgroundCopyManager
*iface
)
49 static ULONG WINAPI
BITS_IBackgroundCopyManager_Release(IBackgroundCopyManager
*iface
)
54 /*** IBackgroundCopyManager interface methods ***/
56 static HRESULT WINAPI
BITS_IBackgroundCopyManager_CreateJob(IBackgroundCopyManager
*iface
,
57 LPCWSTR DisplayName
, BG_JOB_TYPE Type
, GUID
*pJobId
, IBackgroundCopyJob
**ppJob
)
59 BackgroundCopyJobImpl
*job
;
63 hres
= BackgroundCopyJobConstructor(DisplayName
, Type
, pJobId
,
68 /* Add a reference to the job to job list */
69 IBackgroundCopyJob_AddRef(*ppJob
);
70 job
= (BackgroundCopyJobImpl
*) *ppJob
;
71 EnterCriticalSection(&globalMgr
.cs
);
72 list_add_head(&globalMgr
.jobs
, &job
->entryFromQmgr
);
73 LeaveCriticalSection(&globalMgr
.cs
);
77 static HRESULT WINAPI
BITS_IBackgroundCopyManager_GetJob(IBackgroundCopyManager
*iface
,
78 REFGUID jobID
, IBackgroundCopyJob
**ppJob
)
80 FIXME("Not implemented\n");
84 static HRESULT WINAPI
BITS_IBackgroundCopyManager_EnumJobs(IBackgroundCopyManager
*iface
,
85 DWORD dwFlags
, IEnumBackgroundCopyJobs
**ppEnum
)
88 return enum_copy_job_create(&globalMgr
, ppEnum
);
91 static HRESULT WINAPI
BITS_IBackgroundCopyManager_GetErrorDescription(IBackgroundCopyManager
*iface
,
92 HRESULT hResult
, DWORD LanguageId
, LPWSTR
*pErrorDescription
)
94 FIXME("Not implemented\n");
99 static const IBackgroundCopyManagerVtbl BITS_IBackgroundCopyManager_Vtbl
=
101 BITS_IBackgroundCopyManager_QueryInterface
,
102 BITS_IBackgroundCopyManager_AddRef
,
103 BITS_IBackgroundCopyManager_Release
,
104 BITS_IBackgroundCopyManager_CreateJob
,
105 BITS_IBackgroundCopyManager_GetJob
,
106 BITS_IBackgroundCopyManager_EnumJobs
,
107 BITS_IBackgroundCopyManager_GetErrorDescription
110 BackgroundCopyManagerImpl globalMgr
= {
111 { &BITS_IBackgroundCopyManager_Vtbl
},
112 { NULL
, -1, 0, 0, 0, 0 },
114 LIST_INIT(globalMgr
.jobs
)
117 /* Constructor for instances of background copy manager */
118 HRESULT
BackgroundCopyManagerConstructor(IUnknown
*pUnkOuter
, LPVOID
*ppObj
)
120 TRACE("(%p,%p)\n", pUnkOuter
, ppObj
);
125 DWORD WINAPI
fileTransfer(void *param
)
127 BackgroundCopyManagerImpl
*qmgr
= &globalMgr
;
130 events
[0] = stop_event
;
131 events
[1] = qmgr
->jobEvent
;
135 BackgroundCopyJobImpl
*job
, *jobCur
;
136 BOOL haveJob
= FALSE
;
138 /* Check if it's the stop_event */
139 if (WaitForMultipleObjects(2, events
, FALSE
, INFINITE
) == WAIT_OBJECT_0
)
141 LIST_FOR_EACH_ENTRY_SAFE(job
, jobCur
, &qmgr
->jobs
, BackgroundCopyJobImpl
, entryFromQmgr
)
143 list_remove(&job
->entryFromQmgr
);
144 IBackgroundCopyJob_Release((IBackgroundCopyJob
*) job
);
149 /* Note that other threads may add files to the job list, but only
150 this thread ever deletes them so we don't need to worry about jobs
151 magically disappearing from the list. */
152 EnterCriticalSection(&qmgr
->cs
);
154 LIST_FOR_EACH_ENTRY_SAFE(job
, jobCur
, &qmgr
->jobs
, BackgroundCopyJobImpl
, entryFromQmgr
)
156 if (job
->state
== BG_JOB_STATE_ACKNOWLEDGED
|| job
->state
== BG_JOB_STATE_CANCELLED
)
158 list_remove(&job
->entryFromQmgr
);
159 IBackgroundCopyJob_Release((IBackgroundCopyJob
*) job
);
161 else if (job
->state
== BG_JOB_STATE_QUEUED
)
166 else if (job
->state
== BG_JOB_STATE_CONNECTING
167 || job
->state
== BG_JOB_STATE_TRANSFERRING
)
169 ERR("Invalid state for job %p: %d\n", job
, job
->state
);
174 ResetEvent(qmgr
->jobEvent
);
176 LeaveCriticalSection(&qmgr
->cs
);