ReactOS  0.4.14-dev-50-g13bb5e2
file.c
Go to the documentation of this file.
1 /*
2  * Queue Manager (BITS) File
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 <stdarg.h>
22 
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "winreg.h"
27 #include "winhttp.h"
28 #define COBJMACROS
29 #include "qmgr.h"
30 #include "wine/debug.h"
31 
33 
35  IBackgroundCopyFile2 *iface)
36 {
37  return CONTAINING_RECORD(iface, BackgroundCopyFileImpl, IBackgroundCopyFile2_iface);
38 }
39 
41  IBackgroundCopyFile2 *iface,
42  REFIID riid,
43  void **obj)
44 {
46 
47  TRACE("(%p)->(%s %p)\n", file, debugstr_guid(riid), obj);
48 
49  if (IsEqualGUID(riid, &IID_IUnknown) ||
50  IsEqualGUID(riid, &IID_IBackgroundCopyFile) ||
51  IsEqualGUID(riid, &IID_IBackgroundCopyFile2))
52  {
53  *obj = iface;
54  }
55  else
56  {
57  *obj = NULL;
58  return E_NOINTERFACE;
59  }
60 
61  IBackgroundCopyFile2_AddRef(iface);
62  return S_OK;
63 }
64 
66  IBackgroundCopyFile2 *iface)
67 {
70  TRACE("(%p)->(%d)\n", file, ref);
71  return ref;
72 }
73 
75  IBackgroundCopyFile2 *iface)
76 {
79 
80  TRACE("(%p)->(%d)\n", file, ref);
81 
82  if (ref == 0)
83  {
84  IBackgroundCopyJob3_Release(&file->owner->IBackgroundCopyJob3_iface);
85  HeapFree(GetProcessHeap(), 0, file->info.LocalName);
86  HeapFree(GetProcessHeap(), 0, file->info.RemoteName);
88  }
89 
90  return ref;
91 }
92 
93 /* Get the remote name of a background copy file */
95  IBackgroundCopyFile2 *iface,
96  LPWSTR *pVal)
97 {
99 
100  TRACE("(%p)->(%p)\n", file, pVal);
101 
102  return return_strval(file->info.RemoteName, pVal);
103 }
104 
106  IBackgroundCopyFile2 *iface,
107  LPWSTR *pVal)
108 {
110 
111  TRACE("(%p)->(%p)\n", file, pVal);
112 
113  return return_strval(file->info.LocalName, pVal);
114 }
115 
117  IBackgroundCopyFile2 *iface,
118  BG_FILE_PROGRESS *pVal)
119 {
121 
122  TRACE("(%p)->(%p)\n", file, pVal);
123 
124  EnterCriticalSection(&file->owner->cs);
125  *pVal = file->fileProgress;
126  LeaveCriticalSection(&file->owner->cs);
127 
128  return S_OK;
129 }
130 
132  IBackgroundCopyFile2 *iface,
133  DWORD *RangeCount,
134  BG_FILE_RANGE **Ranges)
135 {
137  FIXME("(%p)->(%p %p)\n", file, RangeCount, Ranges);
138  return E_NOTIMPL;
139 }
140 
142  IBackgroundCopyFile2 *iface,
143  LPCWSTR Val)
144 {
146  FIXME("(%p)->(%s)\n", file, debugstr_w(Val));
147  return E_NOTIMPL;
148 }
149 
150 static const IBackgroundCopyFile2Vtbl BackgroundCopyFile2Vtbl =
151 {
160 };
161 
163  LPCWSTR remoteName, LPCWSTR localName,
165 {
167 
168  TRACE("(%s, %s, %p)\n", debugstr_w(remoteName), debugstr_w(localName), file);
169 
170  This = HeapAlloc(GetProcessHeap(), 0, sizeof *This);
171  if (!This)
172  return E_OUTOFMEMORY;
173 
174  This->info.RemoteName = strdupW(remoteName);
175  if (!This->info.RemoteName)
176  {
178  return E_OUTOFMEMORY;
179  }
180 
181  This->info.LocalName = strdupW(localName);
182  if (!This->info.LocalName)
183  {
184  HeapFree(GetProcessHeap(), 0, This->info.RemoteName);
186  return E_OUTOFMEMORY;
187  }
188 
189  This->IBackgroundCopyFile2_iface.lpVtbl = &BackgroundCopyFile2Vtbl;
190  This->ref = 1;
191 
192  This->fileProgress.BytesTotal = BG_SIZE_UNKNOWN;
193  This->fileProgress.BytesTransferred = 0;
194  This->fileProgress.Completed = FALSE;
195  This->owner = owner;
196  This->read_size = 0;
197  This->tempFileName[0] = 0;
198  IBackgroundCopyJob3_AddRef(&owner->IBackgroundCopyJob3_iface);
199 
200  *file = This;
201  return S_OK;
202 }
203 
205 {
206  switch (code)
207  {
208  case 200: return S_OK;
209  case 400: return BG_E_HTTP_ERROR_400;
210  case 401: return BG_E_HTTP_ERROR_401;
211  case 404: return BG_E_HTTP_ERROR_404;
212  case 407: return BG_E_HTTP_ERROR_407;
213  case 414: return BG_E_HTTP_ERROR_414;
214  case 501: return BG_E_HTTP_ERROR_501;
215  case 503: return BG_E_HTTP_ERROR_503;
216  case 504: return BG_E_HTTP_ERROR_504;
217  case 505: return BG_E_HTTP_ERROR_505;
218  default:
219  FIXME("unhandled response code %u\n", code);
220  return S_OK;
221  }
222 }
223 
225  LPVOID buf, DWORD buflen)
226 {
228  BackgroundCopyJobImpl *job = file->owner;
229 
230  TRACE("%p, %p, %x, %p, %u\n", handle, file, status, buf, buflen);
231 
232  switch (status)
233  {
235  {
236  DWORD code, len, size;
237 
238  size = sizeof(code);
240  NULL, &code, &size, NULL))
241  {
242  if ((job->error.code = hresult_from_http_response(code)))
243  {
245 
246  job->error.context = BG_ERROR_CONTEXT_REMOTE_FILE;
247  if (job->error.file) IBackgroundCopyFile2_Release(job->error.file);
248  job->error.file = &file->IBackgroundCopyFile2_iface;
249  IBackgroundCopyFile2_AddRef(job->error.file);
250 
252  transitionJobState(job, BG_JOB_STATE_TRANSFERRING, BG_JOB_STATE_ERROR);
253  }
254  else
255  {
257 
258  job->error.context = 0;
259  if (job->error.file)
260  {
261  IBackgroundCopyFile2_Release(job->error.file);
262  job->error.file = NULL;
263  }
264 
266  }
267  }
268  size = sizeof(len);
270  NULL, &len, &size, NULL))
271  {
272  file->fileProgress.BytesTotal = len;
273  }
274  break;
275  }
277  {
278  file->read_size = buflen;
279  break;
280  }
282  {
284  job->error.code = HRESULT_FROM_WIN32(result->dwError);
285  transitionJobState(job, BG_JOB_STATE_TRANSFERRING, BG_JOB_STATE_ERROR);
286  break;
287  }
288  default: break;
289  }
290 
291  SetEvent(job->wait);
292 }
293 
295 {
296  HANDLE handles[2] = {job->wait, job->cancel};
298 
300  {
301  case WAIT_OBJECT_0:
302  break;
303 
304  case WAIT_OBJECT_0 + 1:
306  transitionJobState(job, BG_JOB_STATE_TRANSFERRING, BG_JOB_STATE_CANCELLED);
307  break;
308 
309  default:
310  error = GetLastError();
311  transitionJobState(job, BG_JOB_STATE_TRANSFERRING, BG_JOB_STATE_ERROR);
312  break;
313  }
314 
315  return error;
316 }
317 
319 {
320  switch (index)
321  {
322  case 0: return WINHTTP_AUTH_TARGET_SERVER;
323  case 1: return WINHTTP_AUTH_TARGET_PROXY;
324  default:
325  ERR("unhandled index %u\n", index);
326  break;
327  }
328  return 0;
329 }
330 
332 {
333  switch (index)
334  {
335  case 0: return WINHTTP_AUTH_SCHEME_BASIC;
336  case 1: return WINHTTP_AUTH_SCHEME_NTLM;
337  case 2: return WINHTTP_AUTH_SCHEME_PASSPORT;
338  case 3: return WINHTTP_AUTH_SCHEME_DIGEST;
339  case 4: return WINHTTP_AUTH_SCHEME_NEGOTIATE;
340  default:
341  ERR("unhandled index %u\n", index);
342  break;
343  }
344  return 0;
345 }
346 
348 {
349  UINT i, j;
350 
351  for (i = 0; i < BG_AUTH_TARGET_PROXY; i++)
352  {
354  for (j = 0; j < BG_AUTH_SCHEME_PASSPORT; j++)
355  {
357  const WCHAR *username = job->http_options.creds[i][j].Credentials.Basic.UserName;
358  const WCHAR *password = job->http_options.creds[i][j].Credentials.Basic.Password;
359 
360  if (!username) continue;
362  }
363  }
364  return TRUE;
365 }
366 
368  const WCHAR *tmpfile)
369 {
370  BackgroundCopyJobImpl *job = file->owner;
371  HANDLE handle;
372  HINTERNET ses, con = NULL, req = NULL;
374  char buf[4096];
375  BOOL ret = FALSE;
376  DWORD written;
377 
378  transitionJobState(job, BG_JOB_STATE_QUEUED, BG_JOB_STATE_CONNECTING);
379 
380  if (!(ses = WinHttpOpen(NULL, 0, NULL, NULL, WINHTTP_FLAG_ASYNC))) return FALSE;
382  if (!WinHttpSetOption(ses, WINHTTP_OPTION_CONTEXT_VALUE, &file, sizeof(file))) goto done;
383 
384  if (!(con = WinHttpConnect(ses, uc->lpszHostName, uc->nPort, 0))) goto done;
385  if (!(req = WinHttpOpenRequest(con, NULL, uc->lpszUrlPath, NULL, NULL, NULL, flags))) goto done;
386  if (!set_request_credentials(req, job)) goto done;
387 
388  if (!(WinHttpSendRequest(req, job->http_options.headers, ~0u, NULL, 0, 0, (DWORD_PTR)file))) goto done;
389  if (wait_for_completion(job) || FAILED(job->error.code)) goto done;
390 
391  if (!(WinHttpReceiveResponse(req, NULL))) goto done;
392  if (wait_for_completion(job) || FAILED(job->error.code)) goto done;
393 
394  transitionJobState(job, BG_JOB_STATE_CONNECTING, BG_JOB_STATE_TRANSFERRING);
395 
397  if (handle == INVALID_HANDLE_VALUE) goto done;
398 
399  for (;;)
400  {
401  file->read_size = 0;
402  if (!(ret = WinHttpReadData(req, buf, sizeof(buf), NULL))) break;
403  if (wait_for_completion(job) || FAILED(job->error.code))
404  {
405  ret = FALSE;
406  break;
407  }
408  if (!file->read_size) break;
409  if (!(ret = WriteFile(handle, buf, file->read_size, &written, NULL))) break;
410 
412  file->fileProgress.BytesTransferred += file->read_size;
413  job->jobProgress.BytesTransferred += file->read_size;
415  }
416 
418 
419 done:
420  WinHttpCloseHandle(req);
421  WinHttpCloseHandle(con);
422  WinHttpCloseHandle(ses);
423  if (!ret && !transitionJobState(job, BG_JOB_STATE_CONNECTING, BG_JOB_STATE_ERROR))
424  transitionJobState(job, BG_JOB_STATE_TRANSFERRING, BG_JOB_STATE_ERROR);
425 
426  SetEvent(job->done);
427  return ret;
428 }
429 
431  LARGE_INTEGER streamSize, LARGE_INTEGER streamTransferred,
432  DWORD streamNum, DWORD reason, HANDLE srcFile,
433  HANDLE dstFile, LPVOID obj)
434 {
436  BackgroundCopyJobImpl *job = file->owner;
437  ULONG64 diff;
438 
440  diff = (file->fileProgress.BytesTotal == BG_SIZE_UNKNOWN
441  ? totalTransferred.QuadPart
442  : totalTransferred.QuadPart - file->fileProgress.BytesTransferred);
443  file->fileProgress.BytesTotal = totalSize.QuadPart;
444  file->fileProgress.BytesTransferred = totalTransferred.QuadPart;
445  job->jobProgress.BytesTransferred += diff;
447 
448  return (job->state == BG_JOB_STATE_TRANSFERRING
450  : PROGRESS_CANCEL);
451 }
452 
454 {
455  static const WCHAR fileW[] = {'f','i','l','e',':','/','/',0};
456  BackgroundCopyJobImpl *job = file->owner;
457  const WCHAR *ptr;
458  BOOL ret;
459 
460  transitionJobState(job, BG_JOB_STATE_QUEUED, BG_JOB_STATE_TRANSFERRING);
461 
462  if (strlenW(file->info.RemoteName) > 7 && !memicmpW(file->info.RemoteName, fileW, 7))
463  ptr = file->info.RemoteName + 7;
464  else
465  ptr = file->info.RemoteName;
466 
467  if (!(ret = CopyFileExW(ptr, tmpname, progress_callback_local, file, NULL, 0)))
468  {
469  WARN("Local file copy failed: error %u\n", GetLastError());
470  transitionJobState(job, BG_JOB_STATE_TRANSFERRING, BG_JOB_STATE_ERROR);
471  }
472 
473  SetEvent(job->done);
474  return ret;
475 }
476 
478 {
479  static const WCHAR prefix[] = {'B','I','T', 0};
480  WCHAR tmpDir[MAX_PATH], tmpName[MAX_PATH];
482  URL_COMPONENTSW uc;
483  BOOL ret;
484 
485  if (!GetTempPathW(MAX_PATH, tmpDir))
486  {
487  ERR("Couldn't create temp file name: %d\n", GetLastError());
488  /* Guessing on what state this should give us */
489  transitionJobState(job, BG_JOB_STATE_QUEUED, BG_JOB_STATE_TRANSIENT_ERROR);
490  return FALSE;
491  }
492 
493  if (!GetTempFileNameW(tmpDir, prefix, 0, tmpName))
494  {
495  ERR("Couldn't create temp file: %d\n", GetLastError());
496  /* Guessing on what state this should give us */
497  transitionJobState(job, BG_JOB_STATE_QUEUED, BG_JOB_STATE_TRANSIENT_ERROR);
498  return FALSE;
499  }
500 
502  file->fileProgress.BytesTotal = BG_SIZE_UNKNOWN;
503  file->fileProgress.BytesTransferred = 0;
504  file->fileProgress.Completed = FALSE;
506 
507  TRACE("Transferring: %s -> %s -> %s\n",
508  debugstr_w(file->info.RemoteName),
510  debugstr_w(file->info.LocalName));
511 
512  uc.dwStructSize = sizeof(uc);
513  uc.nScheme = 0;
514  uc.lpszScheme = NULL;
515  uc.dwSchemeLength = 0;
516  uc.lpszUserName = NULL;
517  uc.dwUserNameLength = 0;
518  uc.lpszPassword = NULL;
519  uc.dwPasswordLength = 0;
520  uc.lpszHostName = host;
522  uc.nPort = 0;
523  uc.lpszUrlPath = NULL;
524  uc.dwUrlPathLength = ~0u;
525  uc.lpszExtraInfo = NULL;
526  uc.dwExtraInfoLength = 0;
527  ret = WinHttpCrackUrl(file->info.RemoteName, 0, 0, &uc);
528  if (!ret)
529  {
530  TRACE("WinHttpCrackUrl failed, trying local file copy\n");
531  if (!transfer_file_local(file, tmpName)) WARN("local transfer failed\n");
532  }
533  else if (!transfer_file_http(file, &uc, tmpName)) WARN("HTTP transfer failed\n");
534 
535  if (transitionJobState(job, BG_JOB_STATE_CONNECTING, BG_JOB_STATE_QUEUED) ||
536  transitionJobState(job, BG_JOB_STATE_TRANSFERRING, BG_JOB_STATE_QUEUED))
537  {
538  lstrcpyW(file->tempFileName, tmpName);
539 
541  file->fileProgress.Completed = TRUE;
542  job->jobProgress.FilesTransferred++;
544 
545  return TRUE;
546  }
547  else
548  {
550  return FALSE;
551  }
552 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
HINTERNET WINAPI WinHttpConnect(HINTERNET hsession, LPCWSTR server, INTERNET_PORT port, DWORD reserved)
Definition: session.c:524
IBackgroundCopyJob3 IBackgroundCopyJob3_iface
Definition: qmgr.h:39
static HANDLE job
Definition: process.c:77
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
Definition: sock.c:82
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define BG_E_HTTP_ERROR_504
Definition: bitsmsg.h:35
#define CloseHandle
Definition: compat.h:398
#define E_NOINTERFACE
Definition: winerror.h:2364
BOOL WINAPI WinHttpCloseHandle(HINTERNET handle)
Definition: session.c:1153
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
BOOL transitionJobState(BackgroundCopyJobImpl *job, BG_JOB_STATE from, BG_JOB_STATE to)
Definition: job.c:30
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
Definition: unicode.h:212
Char tmpName[FILE_NAME_LEN]
Definition: bzip2.c:207
#define ERROR_SUCCESS
Definition: deptool.c:10
#define error(str)
Definition: mkdosfs.c:1605
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
DWORD dwStructSize
Definition: wininet.h:211
static HRESULT WINAPI BackgroundCopyFile_GetFileRanges(IBackgroundCopyFile2 *iface, DWORD *RangeCount, BG_FILE_RANGE **Ranges)
Definition: file.c:131
Definition: http.c:6587
static DWORD CALLBACK progress_callback_local(LARGE_INTEGER totalSize, LARGE_INTEGER totalTransferred, LARGE_INTEGER streamSize, LARGE_INTEGER streamTransferred, DWORD streamNum, DWORD reason, HANDLE srcFile, HANDLE dstFile, LPVOID obj)
Definition: file.c:430
static HRESULT WINAPI BackgroundCopyFile_SetRemoteName(IBackgroundCopyFile2 *iface, LPCWSTR Val)
Definition: file.c:141
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
static WCHAR * strdupW(const WCHAR *src)
Definition: main.c:92
REFIID riid
Definition: precomp.h:44
#define WARN(fmt,...)
Definition: debug.h:111
#define BG_E_HTTP_ERROR_404
Definition: bitsmsg.h:30
static UINT scheme_from_index(UINT index)
Definition: file.c:331
char * host
Definition: whois.c:55
#define CALLBACK
Definition: compat.h:27
#define WINHTTP_CALLBACK_STATUS_REQUEST_ERROR
Definition: winhttp.h:400
DWORD scheme
#define WINHTTP_QUERY_STATUS_CODE
Definition: winhttp.h:317
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
DWORD dwUserNameLength
Definition: wininet.h:219
#define BG_E_HTTP_ERROR_503
Definition: bitsmsg.h:34
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
LPWSTR lpszHostName
Definition: wininet.h:215
Definition: send.c:47
#define WINHTTP_AUTH_SCHEME_NTLM
Definition: winhttp.h:453
#define BG_E_HTTP_ERROR_505
Definition: bitsmsg.h:36
static void CALLBACK progress_callback_http(HINTERNET handle, DWORD_PTR context, DWORD status, LPVOID buf, DWORD buflen)
Definition: file.c:224
GLsizei GLsizei GLuint * obj
Definition: glext.h:6042
LPWSTR lpszExtraInfo
Definition: wininet.h:224
static HRESULT hresult_from_http_response(DWORD code)
Definition: file.c:204
static HRESULT WINAPI BackgroundCopyFile_QueryInterface(IBackgroundCopyFile2 *iface, REFIID riid, void **obj)
Definition: file.c:40
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
BOOL WINAPI WinHttpQueryHeaders(HINTERNET hrequest, DWORD level, LPCWSTR name, LPVOID buffer, LPDWORD buflen, LPDWORD index)
Definition: request.c:831
DWORD dwSchemeLength
Definition: wininet.h:213
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2079
INTERNET_PORT nPort
Definition: wininet.h:217
unsigned int BOOL
Definition: ntddk_ex.h:94
static const IBackgroundCopyFile2Vtbl BackgroundCopyFile2Vtbl
Definition: file.c:150
static HRESULT return_strval(const WCHAR *str, WCHAR **ret)
Definition: qmgr.h:133
FILE *CDECL tmpfile(void)
Definition: file.c:3912
#define GENERIC_WRITE
Definition: nt_native.h:90
#define debugstr_w
Definition: kernel32.h:32
BOOL WINAPI WinHttpReceiveResponse(HINTERNET hrequest, LPVOID reserved)
Definition: request.c:2692
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
static PVOID ptr
Definition: dispmode.c:27
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
HRESULT BackgroundCopyFileConstructor(BackgroundCopyJobImpl *owner, LPCWSTR remoteName, LPCWSTR localName, BackgroundCopyFileImpl **file)
Definition: file.c:162
#define WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS
Definition: winhttp.h:418
smooth NULL
Definition: ftsmooth.c:416
GLuint index
Definition: glext.h:6031
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define WINHTTP_FLAG_SECURE
Definition: winhttp.h:60
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
static WCHAR username[]
Definition: url.c:32
BOOL WINAPI WinHttpCrackUrl(LPCWSTR url, DWORD len, DWORD flags, LPURL_COMPONENTSW uc)
Definition: url.c:183
#define TRACE(s)
Definition: solgame.cpp:4
#define WAIT_OBJECT_0
Definition: winbase.h:387
GLsizeiptr size
Definition: glext.h:5919
#define PROGRESS_CANCEL
Definition: winbase.h:147
static BOOL transfer_file_local(BackgroundCopyFileImpl *file, const WCHAR *tmpname)
Definition: file.c:453
#define GetProcessHeap()
Definition: compat.h:395
#define BG_E_HTTP_ERROR_501
Definition: bitsmsg.h:33
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
static object_header_t ** handles
Definition: handle.c:46
LPWSTR lpszScheme
Definition: wininet.h:212
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define PROGRESS_CONTINUE
Definition: winbase.h:146
#define WINHTTP_AUTH_SCHEME_PASSPORT
Definition: winhttp.h:454
static BOOL transfer_file_http(BackgroundCopyFileImpl *file, URL_COMPONENTSW *uc, const WCHAR *tmpfile)
Definition: file.c:367
LONG HRESULT
Definition: typedefs.h:77
#define WINHTTP_QUERY_FLAG_NUMBER
Definition: winhttp.h:377
static ULONG WINAPI BackgroundCopyFile_AddRef(IBackgroundCopyFile2 *iface)
Definition: file.c:65
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG code
Definition: file.c:100
const GUID IID_IUnknown
INTERNET_SCHEME nScheme
Definition: wininet.h:214
static HRESULT WINAPI BackgroundCopyFile_GetProgress(IBackgroundCopyFile2 *iface, BG_FILE_PROGRESS *pVal)
Definition: file.c:116
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
UINT WINAPI GetTempFileNameW(IN LPCWSTR lpPathName, IN LPCWSTR lpPrefixString, IN UINT uUnique, OUT LPWSTR lpTempFileName)
Definition: filename.c:84
static BOOL set_request_credentials(HINTERNET req, BackgroundCopyJobImpl *job)
Definition: file.c:347
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WINHTTP_OPTION_CONTEXT_VALUE
Definition: winhttp.h:112
GLbitfield flags
Definition: glext.h:7161
BG_LENGTH_TO_EOF(UINT64) struct _BG_FILE_RANGE BG_FILE_RANGE
#define WINHTTP_QUERY_CONTENT_LENGTH
Definition: winhttp.h:303
DWORD dwPasswordLength
Definition: wininet.h:221
DWORD dwHostNameLength
Definition: wininet.h:216
static BackgroundCopyFileImpl * impl_from_IBackgroundCopyFile2(IBackgroundCopyFile2 *iface)
Definition: file.c:34
WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback(HINTERNET handle, WINHTTP_STATUS_CALLBACK callback, DWORD flags, DWORD_PTR reserved)
Definition: session.c:2022
static WCHAR reason[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1904
unsigned __int64 ULONG64
Definition: imports.h:198
int ret
#define WINHTTP_AUTH_SCHEME_NEGOTIATE
Definition: winhttp.h:456
WINE_DEFAULT_DEBUG_CHANNEL(qmgr)
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
LPWSTR lpszUserName
Definition: wininet.h:218
#define InterlockedDecrement
Definition: armddk.h:52
T1_FIELD_DICT_PRIVATE password
Definition: t1tokens.h:64
LPWSTR lpszUrlPath
Definition: wininet.h:222
GLenum GLsizei len
Definition: glext.h:6722
BOOL WINAPI CopyFileExW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN LPPROGRESS_ROUTINE lpProgressRoutine OPTIONAL, IN LPVOID lpData OPTIONAL, IN LPBOOL pbCancel OPTIONAL, IN DWORD dwCopyFlags)
Definition: copy.c:318
BOOL WINAPI WinHttpSetCredentials(HINTERNET hrequest, DWORD target, DWORD scheme, LPCWSTR username, LPCWSTR password, LPVOID params)
Definition: request.c:2260
#define WINHTTP_AUTH_SCHEME_BASIC
Definition: winhttp.h:452
#define WINHTTP_CALLBACK_STATUS_READ_COMPLETE
Definition: winhttp.h:398
uint32_t DWORD_PTR
Definition: typedefs.h:63
BOOL WINAPI WinHttpSetOption(HINTERNET handle, DWORD option, LPVOID buffer, DWORD buflen)
Definition: session.c:1270
LONG ref
Definition: filesystem.c:119
#define BG_E_HTTP_ERROR_407
Definition: bitsmsg.h:31
DWORD dwUrlPathLength
Definition: wininet.h:223
#define ERR(fmt,...)
Definition: debug.h:109
#define S_OK
Definition: intsafe.h:59
#define CREATE_ALWAYS
Definition: disk.h:72
#define InterlockedIncrement
Definition: armddk.h:53
#define lstrcpyW
Definition: compat.h:406
#define ERROR_CANCELLED
Definition: winerror.h:726
#define ARRAY_SIZE(a)
Definition: main.h:24
#define E_NOTIMPL
Definition: ddrawi.h:99
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
#define CreateFileW
Definition: compat.h:400
HINTERNET WINAPI WinHttpOpen(LPCWSTR agent, DWORD access, LPCWSTR proxy, LPCWSTR bypass, DWORD flags)
Definition: session.c:246
static ULONG WINAPI BackgroundCopyFile_Release(IBackgroundCopyFile2 *iface)
Definition: file.c:74
#define BG_E_HTTP_ERROR_400
Definition: bitsmsg.h:28
#define BG_E_HTTP_ERROR_401
Definition: bitsmsg.h:29
unsigned int ULONG
Definition: retypes.h:1
GLenum target
Definition: glext.h:7315
#define WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE
Definition: winhttp.h:396
#define BG_E_HTTP_ERROR_414
Definition: bitsmsg.h:32
#define memicmpW(s1, s2, n)
Definition: unicode.h:27
#define WINHTTP_AUTH_TARGET_PROXY
Definition: winhttp.h:459
BOOL processFile(BackgroundCopyFileImpl *file, BackgroundCopyJobImpl *job)
Definition: file.c:477
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define WINHTTP_FLAG_ASYNC
Definition: winhttp.h:51
#define INFINITE
Definition: serial.h:102
static HRESULT WINAPI BackgroundCopyFile_GetRemoteName(IBackgroundCopyFile2 *iface, LPWSTR *pVal)
Definition: file.c:94
static HRESULT WINAPI BackgroundCopyFile_GetLocalName(IBackgroundCopyFile2 *iface, LPWSTR *pVal)
Definition: file.c:105
HINTERNET WINAPI WinHttpOpenRequest(HINTERNET hconnect, LPCWSTR verb, LPCWSTR object, LPCWSTR version, LPCWSTR referrer, LPCWSTR *types, DWORD flags)
Definition: session.c:1061
GLuint64EXT * result
Definition: glext.h:11304
static const WCHAR fileW[]
Definition: url.c:111
BOOL WINAPI WinHttpSendRequest(HINTERNET hrequest, LPCWSTR headers, DWORD headers_len, LPVOID optional, DWORD optional_len, DWORD total_len, DWORD_PTR context)
Definition: request.c:2168
static UINT target_from_index(UINT index)
Definition: file.c:318
#define HeapFree(x, y, z)
Definition: compat.h:394
LPWSTR lpszPassword
Definition: wininet.h:220
static DWORD wait_for_completion(BackgroundCopyJobImpl *job)
Definition: file.c:294
BOOL WINAPI WinHttpReadData(HINTERNET hrequest, LPVOID buffer, DWORD to_read, LPDWORD read)
Definition: request.c:2811
LONGLONG QuadPart
Definition: typedefs.h:112
#define WINHTTP_AUTH_SCHEME_DIGEST
Definition: winhttp.h:455
#define WINHTTP_AUTH_TARGET_SERVER
Definition: winhttp.h:458
DWORD dwExtraInfoLength
Definition: wininet.h:225
Definition: fci.c:126
Definition: ps.c:97