James Hawkins : urlmon: Implement URLDownloadToCacheFileW.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jul 12 14:21:10 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: e2bf4ff16449d4c90d2a9fb662dc0f506d7bcbbc
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=e2bf4ff16449d4c90d2a9fb662dc0f506d7bcbbc

Author: James Hawkins <truiken at gmail.com>
Date:   Tue Jul 11 13:27:59 2006 -0700

urlmon: Implement URLDownloadToCacheFileW.

---

 dlls/urlmon/umon.c |   43 ++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c
index 88304ca..b1ca78e 100644
--- a/dlls/urlmon/umon.c
+++ b/dlls/urlmon/umon.c
@@ -1611,9 +1611,46 @@ HRESULT WINAPI URLDownloadToCacheFileA(L
 HRESULT WINAPI URLDownloadToCacheFileW(LPUNKNOWN lpUnkCaller, LPCWSTR szURL, LPWSTR szFileName,
                 DWORD dwBufLength, DWORD dwReserved, LPBINDSTATUSCALLBACK pBSC)
 {
-    FIXME("(%p %s %p %ld %ld %p)\n", lpUnkCaller, debugstr_w(szURL), szFileName,
-            dwBufLength, dwReserved, pBSC);
-    return E_NOTIMPL;
+    WCHAR cache_path[MAX_PATH + 1];
+    FILETIME expire, modified;
+    HRESULT hr;
+    LPWSTR ext;
+
+    static const WCHAR header[] = {
+        'H','T','T','P','/','1','.','0',' ','2','0','0',' ',
+        'O','K','\\','r','\\','n','\\','r','\\','n',0
+    };
+
+    TRACE("(%p, %s, %p, %ld, %ld, %p)\n", lpUnkCaller, debugstr_w(szURL),
+          szFileName, dwBufLength, dwReserved, pBSC);
+
+    if (!szURL || !szFileName)
+        return E_INVALIDARG;
+
+    ext = PathFindExtensionW(szURL);
+
+    if (!CreateUrlCacheEntryW(szURL, 0, ext, cache_path, 0))
+        return E_FAIL;
+
+    hr = URLDownloadToFileW(lpUnkCaller, szURL, cache_path, 0, pBSC);
+    if (FAILED(hr))
+        return hr;
+
+    expire.dwHighDateTime = 0;
+    expire.dwLowDateTime = 0;
+    modified.dwHighDateTime = 0;
+    modified.dwLowDateTime = 0;
+
+    if (!CommitUrlCacheEntryW(szURL, cache_path, expire, modified, NORMAL_CACHE_ENTRY,
+                              (LPWSTR)header, sizeof(header), NULL, NULL))
+        return E_FAIL;
+
+    if (lstrlenW(cache_path) > dwBufLength)
+        return E_OUTOFMEMORY;
+
+    lstrcpyW(szFileName, cache_path);
+
+    return S_OK;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list