[PATCH] wininet: Return proper cache path from GetUrlCacheConfigInfo.
Dmitry Timoshkov
dmitry at baikal.ru
Sat Dec 29 05:44:49 CST 2018
This patch makes an application with built-in internet shop work.
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
dlls/wininet/tests/urlcache.c | 53 ++++++++++++++++
dlls/wininet/urlcache.c | 113 +++++++++++++++++++++++++++++++---
2 files changed, 158 insertions(+), 8 deletions(-)
diff --git a/dlls/wininet/tests/urlcache.c b/dlls/wininet/tests/urlcache.c
index 3799500489..4794cb0b6e 100644
--- a/dlls/wininet/tests/urlcache.c
+++ b/dlls/wininet/tests/urlcache.c
@@ -18,6 +18,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
@@ -1100,6 +1103,55 @@ static void test_trailing_slash(void)
DeleteFileA(filename);
}
+static void test_GetUrlCacheConfigInfo(void)
+{
+ INTERNET_CACHE_CONFIG_INFOA info;
+ struct
+ {
+ INTERNET_CACHE_CONFIG_INFOA *info;
+ DWORD dwStructSize;
+ DWORD flags;
+ BOOL ret;
+ DWORD error;
+ } td[] =
+ {
+#if 0 /* crashes under Vista */
+ { NULL, 0, 0, FALSE, ERROR_INVALID_PARAMETER },
+#endif
+ { &info, 0, 0, TRUE },
+ { &info, sizeof(info) - 1, 0, TRUE },
+ { &info, sizeof(info) + 1, 0, TRUE },
+ { &info, 0, CACHE_CONFIG_CONTENT_PATHS_FC, TRUE },
+ { &info, sizeof(info), CACHE_CONFIG_CONTENT_PATHS_FC, TRUE },
+ { &info, 0, CACHE_CONFIG_COOKIES_PATHS_FC, TRUE },
+ { &info, sizeof(info), CACHE_CONFIG_COOKIES_PATHS_FC, TRUE },
+ { &info, 0, CACHE_CONFIG_HISTORY_PATHS_FC, TRUE },
+ { &info, sizeof(info), CACHE_CONFIG_HISTORY_PATHS_FC, TRUE },
+ };
+ int i;
+ BOOL ret;
+
+ for (i = 0; i < ARRAY_SIZE(td); i++)
+ {
+ if (td[i].info)
+ {
+ memset(&info, 0, sizeof(*td[i].info));
+ info.dwStructSize = td[i].dwStructSize;
+ }
+
+ SetLastError(0xdeadbeef);
+ ret = GetUrlCacheConfigInfoA(td[i].info, NULL, td[i].flags);
+ ok(ret == td[i].ret, "%d: expected %d, got %d\n", i, td[i].ret, ret);
+ if (!ret)
+ ok(GetLastError() == td[i].error, "%d: expected %u, got %u\n", i, td[i].error, GetLastError());
+ else
+ {
+ ok(info.dwStructSize == td[i].dwStructSize, "got %u\n", info.dwStructSize);
+ ok(info.u.s.CachePath[0], "%d: got empty path\n", i);
+ }
+ }
+}
+
START_TEST(urlcache)
{
HMODULE hdll;
@@ -1124,4 +1176,5 @@ START_TEST(urlcache)
test_FindCloseUrlCache();
test_GetDiskInfoA();
test_trailing_slash();
+ test_GetUrlCacheConfigInfo();
}
diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c
index f26fa3468d..c8d141e3d9 100644
--- a/dlls/wininet/urlcache.c
+++ b/dlls/wininet/urlcache.c
@@ -23,6 +23,7 @@
*/
#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
#include "ws2tcpip.h"
@@ -3764,21 +3765,117 @@ BOOL WINAPI SetUrlCacheEntryGroupW(LPCWSTR lpszUrlName, DWORD dwFlags,
/***********************************************************************
* GetUrlCacheConfigInfoW (WININET.@)
*/
-BOOL WINAPI GetUrlCacheConfigInfoW(LPINTERNET_CACHE_CONFIG_INFOW CacheInfo, LPDWORD size, DWORD bitmask)
+BOOL WINAPI GetUrlCacheConfigInfoW(LPINTERNET_CACHE_CONFIG_INFOW info, LPDWORD size, DWORD flags)
{
- FIXME("(%p, %p, %x)\n", CacheInfo, size, bitmask);
- INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
+ cache_container *container;
+
+ FIXME("(%p, %p, %x): semi-stub\n", info, size, flags);
+
+ if (!info)
+ {
+ INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ info->dwContainer = 0;
+ info->dwQuota = 0x3e800;
+ info->dwReserved4 = 0;
+ info->fPerUser = TRUE;
+ info->dwSyncMode = 0;
+ info->dwNumCachePaths = 1;
+ info->dwNormalUsage = 0;
+ info->dwExemptUsage = 0;
+
+ info->u.s.CachePath[0] = 0;
+ info->u.s.dwCacheSize = 0x3e800; /* FIXME */
+
+ LIST_FOR_EACH_ENTRY(container, &UrlContainers, cache_container, entry)
+ {
+ switch (flags & (CACHE_CONFIG_CONTENT_PATHS_FC | CACHE_CONFIG_COOKIES_PATHS_FC | CACHE_CONFIG_HISTORY_PATHS_FC))
+ {
+ case 0:
+ case CACHE_CONFIG_CONTENT_PATHS_FC:
+ if (container->default_entry_type == NORMAL_CACHE_ENTRY)
+ lstrcpynW(info->u.s.CachePath, container->path, MAX_PATH);
+ break;
+
+ case CACHE_CONFIG_COOKIES_PATHS_FC:
+ if (container->default_entry_type == COOKIE_CACHE_ENTRY)
+ lstrcpynW(info->u.s.CachePath, container->path, MAX_PATH);
+ break;
+
+ case CACHE_CONFIG_HISTORY_PATHS_FC:
+ if (container->default_entry_type == URLHISTORY_CACHE_ENTRY)
+ lstrcpynW(info->u.s.CachePath, container->path, MAX_PATH);
+ break;
+
+ default:
+ FIXME("flags %08x not handled\n", flags);
+ break;
+ }
+ }
+
+ TRACE("CachePath %s\n", debugstr_w(info->u.s.CachePath));
+
+ return TRUE;
}
/***********************************************************************
* GetUrlCacheConfigInfoA (WININET.@)
*/
-BOOL WINAPI GetUrlCacheConfigInfoA(LPINTERNET_CACHE_CONFIG_INFOA CacheInfo, LPDWORD size, DWORD bitmask)
+BOOL WINAPI GetUrlCacheConfigInfoA(LPINTERNET_CACHE_CONFIG_INFOA info, LPDWORD size, DWORD flags)
{
- FIXME("(%p, %p, %x)\n", CacheInfo, size, bitmask);
- INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
+ cache_container *container;
+
+ FIXME("(%p, %p, %x): semi-stub\n", info, size, flags);
+
+ if (!info)
+ {
+ INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ info->dwContainer = 0;
+ info->dwQuota = 0x3e800;
+ info->dwReserved4 = 0;
+ info->fPerUser = TRUE;
+ info->dwSyncMode = 0;
+ info->dwNumCachePaths = 1;
+ info->dwNormalUsage = 0;
+ info->dwExemptUsage = 0;
+
+ info->u.s.CachePath[0] = 0;
+ info->u.s.dwCacheSize = 0x3e800; /* FIXME */
+
+ LIST_FOR_EACH_ENTRY(container, &UrlContainers, cache_container, entry)
+ {
+ switch (flags & (CACHE_CONFIG_CONTENT_PATHS_FC | CACHE_CONFIG_COOKIES_PATHS_FC | CACHE_CONFIG_HISTORY_PATHS_FC))
+ {
+ case 0:
+ case CACHE_CONFIG_CONTENT_PATHS_FC:
+ if (container->default_entry_type == NORMAL_CACHE_ENTRY)
+ WideCharToMultiByte(CP_ACP, 0, container->path, -1, info->u.s.CachePath, MAX_PATH, NULL, NULL);
+ break;
+
+ case CACHE_CONFIG_COOKIES_PATHS_FC:
+ if (container->default_entry_type == COOKIE_CACHE_ENTRY)
+ WideCharToMultiByte(CP_ACP, 0, container->path, -1, info->u.s.CachePath, MAX_PATH, NULL, NULL);
+ break;
+
+ case CACHE_CONFIG_HISTORY_PATHS_FC:
+ if (container->default_entry_type == URLHISTORY_CACHE_ENTRY)
+ WideCharToMultiByte(CP_ACP, 0, container->path, -1, info->u.s.CachePath, MAX_PATH, NULL, NULL);
+ break;
+
+ default:
+ FIXME("flags %08x not handled\n", flags);
+ break;
+ }
+ }
+
+ TRACE("CachePath %s\n", debugstr_a(info->u.s.CachePath));
+
+ return TRUE;
}
BOOL WINAPI GetUrlCacheGroupAttributeA( GROUPID gid, DWORD dwFlags, DWORD dwAttributes,
--
2.19.2
More information about the wine-devel
mailing list