From 47f490e1f6fa7b756289d09718ab15850c052718 Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek@codeweavers.com>
Date: Fri, 4 Oct 2013 16:53:22 +0200
Subject: [PATCH] wininet: Added support for locking HTTP request files.

---
 dlls/wininet/http.c     | 12 ++++++++++--
 dlls/wininet/internet.c |  9 +++++++++
 dlls/wininet/internet.h |  1 +
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 26156ce97dd..ec746cd6db4 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -3255,8 +3255,16 @@ done:
 static DWORD HTTPREQ_LockRequestFile(object_header_t *hdr, req_file_t **ret)
 {
     http_request_t *req = (http_request_t*)hdr;
-    FIXME("(%p)\n", req);
-    return ERROR_NOT_SUPPORTED;
+
+    TRACE("(%p)\n", req);
+
+    if(!req->req_file) {
+        WARN("No cache file name available\n");
+        return ERROR_FILE_NOT_FOUND;
+    }
+
+    *ret = req_file_addref(req->req_file);
+    return ERROR_SUCCESS;
 }
 
 static const object_vtbl_t HTTPREQVtbl = {
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 5448eb41f34..954e891d7b0 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -3917,6 +3917,13 @@ DWORD create_req_file(const WCHAR *file_name, req_file_t **ret)
         return ERROR_NOT_ENOUGH_MEMORY;
     }
 
+    req_file->file_handle = CreateFileW(req_file->file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,
+              NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+    if(req_file->file_handle == INVALID_HANDLE_VALUE) {
+        req_file_release(req_file);
+        return GetLastError();
+    }
+
     *ret = req_file;
     return ERROR_SUCCESS;
 }
@@ -3928,6 +3935,8 @@ void req_file_release(req_file_t *req_file)
 
     if(!req_file->is_committed)
         DeleteFileW(req_file->file_name);
+    if(req_file->file_handle && req_file->file_handle != INVALID_HANDLE_VALUE)
+        CloseHandle(req_file->file_handle);
     heap_free(req_file->file_name);
     heap_free(req_file);
 }
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 2195897d4ba..3d948cf1a33 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -250,6 +250,7 @@ typedef enum
 typedef struct
 {
     LONG ref;
+    HANDLE file_handle;
     WCHAR *file_name;
     BOOL is_committed;
 } req_file_t;
-- 
GitLab