Jacek Caban : wininet: Commit cache file as soon as all data is written.
Alexandre Julliard
julliard at winehq.org
Fri Nov 2 15:52:02 CDT 2012
Module: wine
Branch: master
Commit: 54639c5dc5c336662547726ce89322498e85e8be
URL: http://source.winehq.org/git/wine.git/?a=commit;h=54639c5dc5c336662547726ce89322498e85e8be
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Nov 2 13:49:22 2012 +0100
wininet: Commit cache file as soon as all data is written.
---
dlls/wininet/http.c | 51 ++++++++++++++++++++++++++++++---------------
dlls/wininet/tests/http.c | 2 +-
2 files changed, 35 insertions(+), 18 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 73dd991..8937a39 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1815,18 +1815,8 @@ static void HTTPREQ_Destroy(object_header_t *hdr)
TRACE("\n");
if(request->hCacheFile) {
- WCHAR url[INTERNET_MAX_URL_LENGTH];
-
CloseHandle(request->hCacheFile);
-
- if(HTTP_GetRequestURL(request, url)) {
- DWORD headersLen;
-
- headersLen = request->rawHeaders ? strlenW(request->rawHeaders) : 0;
- CommitUrlCacheEntryW(url, request->cacheFile, request->expires,
- request->last_modified, NORMAL_CACHE_ENTRY,
- request->rawHeaders, headersLen, NULL, 0);
- }
+ DeleteFileW(request->cacheFile);
}
heap_free(request->cacheFile);
@@ -2233,6 +2223,25 @@ static DWORD HTTPREQ_SetOption(object_header_t *hdr, DWORD option, void *buffer,
return INET_SetOption(hdr, option, buffer, size);
}
+static void commit_cache_entry(http_request_t *req)
+{
+ WCHAR url[INTERNET_MAX_URL_LENGTH];
+
+ TRACE("%p\n", req);
+
+ CloseHandle(req->hCacheFile);
+ req->hCacheFile = NULL;
+
+ if(HTTP_GetRequestURL(req, url)) {
+ DWORD headersLen;
+
+ headersLen = req->rawHeaders ? strlenW(req->rawHeaders) : 0;
+ CommitUrlCacheEntryW(url, req->cacheFile, req->expires,
+ req->last_modified, NORMAL_CACHE_ENTRY,
+ req->rawHeaders, headersLen, NULL, 0);
+ }
+}
+
static void create_cache_entry(http_request_t *req)
{
WCHAR url[INTERNET_MAX_URL_LENGTH];
@@ -2271,6 +2280,9 @@ static void create_cache_entry(http_request_t *req)
b = WriteFile(req->hCacheFile, req->read_buf+req->read_pos, req->read_size, &written, NULL);
if(!b)
FIXME("WriteFile failed: %u\n", GetLastError());
+
+ if(req->data_stream->vtbl->end_of_data(req->data_stream, req))
+ commit_cache_entry(req);
}
}
@@ -2362,13 +2374,18 @@ static DWORD read_http_stream(http_request_t *req, BYTE *buf, DWORD size, DWORD
res = req->data_stream->vtbl->read(req->data_stream, req, buf, size, read, read_mode);
assert(*read <= size);
- if(*read && req->hCacheFile) {
- BOOL bres;
- DWORD written;
+ if(req->hCacheFile) {
+ if(*read) {
+ BOOL bres;
+ DWORD written;
- bres = WriteFile(req->hCacheFile, buf, *read, &written, NULL);
- if(!bres)
- FIXME("WriteFile failed: %u\n", GetLastError());
+ bres = WriteFile(req->hCacheFile, buf, *read, &written, NULL);
+ if(!bres)
+ FIXME("WriteFile failed: %u\n", GetLastError());
+ }
+
+ if(req->data_stream->vtbl->end_of_data(req->data_stream, req))
+ commit_cache_entry(req);
}
return res;
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 38d1845..c9bd0a4 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -1255,7 +1255,7 @@ static void test_http_cache(void)
ret = InternetQueryOptionA(request, INTERNET_OPTION_DATAFILE_NAME, file_name, &size);
ok(ret, "InternetQueryOptionA(INTERNET_OPTION_DATAFILE_NAME) failed: %u\n", GetLastError());
- file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError());
file_size = GetFileSize(file, NULL);
More information about the wine-cvs
mailing list