Jacek Caban : wininet: Moved request file info to separated struct.
Alexandre Julliard
julliard at winehq.org
Fri Oct 4 15:08:40 CDT 2013
Module: wine
Branch: master
Commit: c58317b5b4adbccfe093ea00c93cade79f0b491f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c58317b5b4adbccfe093ea00c93cade79f0b491f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Oct 4 16:52:43 2013 +0200
wininet: Moved request file info to separated struct.
---
dlls/wininet/http.c | 40 +++++++++++++++++++++++++---------------
dlls/wininet/internet.c | 30 ++++++++++++++++++++++++++++++
dlls/wininet/internet.h | 19 +++++++++++++++++--
3 files changed, 72 insertions(+), 17 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 2d11040..d2bd2d4 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1912,11 +1912,10 @@ static void HTTPREQ_Destroy(object_header_t *hdr)
TRACE("\n");
- if(request->hCacheFile) {
+ if(request->hCacheFile)
CloseHandle(request->hCacheFile);
- DeleteFileW(request->cacheFile);
- }
- heap_free(request->cacheFile);
+ if(request->req_file)
+ req_file_release(request->req_file);
request->read_section.DebugInfo->Spare[0] = 0;
DeleteCriticalSection( &request->read_section );
@@ -2194,25 +2193,25 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe
TRACE("INTERNET_OPTION_DATAFILE_NAME\n");
- if(!req->cacheFile) {
+ if(!req->req_file) {
*size = 0;
return ERROR_INTERNET_ITEM_NOT_FOUND;
}
if(unicode) {
- req_size = (lstrlenW(req->cacheFile)+1) * sizeof(WCHAR);
+ req_size = (lstrlenW(req->req_file->file_name)+1) * sizeof(WCHAR);
if(*size < req_size)
return ERROR_INSUFFICIENT_BUFFER;
*size = req_size;
- memcpy(buffer, req->cacheFile, *size);
+ memcpy(buffer, req->req_file->file_name, *size);
return ERROR_SUCCESS;
}else {
- req_size = WideCharToMultiByte(CP_ACP, 0, req->cacheFile, -1, NULL, 0, NULL, NULL);
+ req_size = WideCharToMultiByte(CP_ACP, 0, req->req_file->file_name, -1, NULL, 0, NULL, NULL);
if (req_size > *size)
return ERROR_INSUFFICIENT_BUFFER;
- *size = WideCharToMultiByte(CP_ACP, 0, req->cacheFile,
+ *size = WideCharToMultiByte(CP_ACP, 0, req->req_file->file_name,
-1, buffer, *size, NULL, NULL);
return ERROR_SUCCESS;
}
@@ -2376,12 +2375,17 @@ static void commit_cache_entry(http_request_t *req)
if(HTTP_GetRequestURL(req, url)) {
WCHAR *header;
DWORD header_len;
+ BOOL res;
header = build_response_header(req, TRUE);
header_len = (header ? strlenW(header) : 0);
- CommitUrlCacheEntryW(url, req->cacheFile, req->expires,
+ res = CommitUrlCacheEntryW(url, req->req_file->file_name, req->expires,
req->last_modified, NORMAL_CACHE_ENTRY,
header, header_len, NULL, 0);
+ if(res)
+ req->req_file->is_committed = TRUE;
+ else
+ WARN("CommitUrlCacheEntry failed: %u\n", GetLastError());
heap_free(header);
}
}
@@ -2396,9 +2400,14 @@ static void create_cache_entry(http_request_t *req)
BOOL b = TRUE;
/* FIXME: We should free previous cache file earlier */
- heap_free(req->cacheFile);
- CloseHandle(req->hCacheFile);
- req->hCacheFile = NULL;
+ if(req->req_file) {
+ req_file_release(req->req_file);
+ req->req_file = NULL;
+ }
+ if(req->hCacheFile) {
+ CloseHandle(req->hCacheFile);
+ req->hCacheFile = NULL;
+ }
if(req->hdr.dwFlags & INTERNET_FLAG_NO_CACHE_WRITE)
b = FALSE;
@@ -2450,8 +2459,9 @@ static void create_cache_entry(http_request_t *req)
return;
}
- req->cacheFile = heap_strdupW(file_name);
- req->hCacheFile = CreateFileW(req->cacheFile, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ create_req_file(file_name, &req->req_file);
+
+ req->hCacheFile = CreateFileW(file_name, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(req->hCacheFile == INVALID_HANDLE_VALUE) {
WARN("Could not create file: %u\n", GetLastError());
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index a54a3df..ace1bfa 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -3901,6 +3901,36 @@ BOOL WINAPI InternetQueryDataAvailable( HINTERNET hFile,
return res == ERROR_SUCCESS;
}
+DWORD create_req_file(const WCHAR *file_name, req_file_t **ret)
+{
+ req_file_t *req_file;
+
+ req_file = heap_alloc_zero(sizeof(*req_file));
+ if(!req_file)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ req_file->ref = 1;
+
+ req_file->file_name = heap_strdupW(file_name);
+ if(!req_file->file_name) {
+ heap_free(req_file);
+ return ERROR_NOT_ENOUGH_MEMORY;
+ }
+
+ *ret = req_file;
+ return ERROR_SUCCESS;
+}
+
+void req_file_release(req_file_t *req_file)
+{
+ if(InterlockedDecrement(&req_file->ref))
+ return;
+
+ if(!req_file->is_committed)
+ DeleteFileW(req_file->file_name);
+ heap_free(req_file->file_name);
+ heap_free(req_file);
+}
/***********************************************************************
* InternetLockRequestFile (WININET.@)
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 246eb95..8cde45e 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -247,6 +247,13 @@ typedef enum
#define INET_OPENURL 0x0001
#define INET_CALLBACKW 0x0002
+typedef struct
+{
+ LONG ref;
+ WCHAR *file_name;
+ BOOL is_committed;
+} req_file_t;
+
typedef struct _object_header_t object_header_t;
typedef struct {
@@ -280,7 +287,6 @@ struct _object_header_t
struct list children;
};
-
typedef struct
{
object_header_t hdr;
@@ -357,7 +363,7 @@ typedef struct
DWORD nCustHeaders;
FILETIME last_modified;
HANDLE hCacheFile;
- LPWSTR cacheFile;
+ req_file_t *req_file;
FILETIME expires;
struct HttpAuthInfo *authInfo;
struct HttpAuthInfo *proxyAuthInfo;
@@ -444,6 +450,15 @@ int sock_get_error(int) DECLSPEC_HIDDEN;
server_t *get_server(const WCHAR*,INTERNET_PORT,BOOL,BOOL);
+DWORD create_req_file(const WCHAR*,req_file_t**) DECLSPEC_HIDDEN;
+void req_file_release(req_file_t*) DECLSPEC_HIDDEN;
+
+static inline req_file_t *req_file_addref(req_file_t *req_file)
+{
+ InterlockedIncrement(&req_file->ref);
+ return req_file;
+}
+
BOOL init_urlcache(void) DECLSPEC_HIDDEN;
void free_urlcache(void) DECLSPEC_HIDDEN;
void free_cookie(void) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list