[1/2] wininet: Implement GetDiskInfoA.

Hans Leidekker hans at codeweavers.com
Wed May 13 03:50:58 CDT 2009


diff --git a/dlls/wininet/tests/urlcache.c b/dlls/wininet/tests/urlcache.c
index d135976..5f42717 100644
--- a/dlls/wininet/tests/urlcache.c
+++ b/dlls/wininet/tests/urlcache.c
@@ -25,6 +25,7 @@
 #include "windef.h"
 #include "winbase.h"
 #include "wininet.h"
+#include "winineti.h"
 
 #include "wine/test.h"
 
@@ -219,6 +220,45 @@ static void test_FindCloseUrlCache(void)
     ok(ERROR_INVALID_HANDLE == err, "expected %d, got %d\n", ERROR_INVALID_HANDLE, err);
 }
 
+static void test_GetDiskInfoA(void)
+{
+    BOOL ret;
+    DWORD error, cluster_size;
+    DWORDLONG free, total;
+    char path[MAX_PATH], *p;
+
+    GetSystemDirectoryA(path, MAX_PATH);
+    if ((p = strchr(path, '\\'))) *++p = 0;
+
+    ret = GetDiskInfoA(path, &cluster_size, &free, &total);
+    ok(ret, "GetDiskInfoA failed %u\n", GetLastError());
+
+    ret = GetDiskInfoA(path, &cluster_size, &free, NULL);
+    ok(ret, "GetDiskInfoA failed %u\n", GetLastError());
+
+    ret = GetDiskInfoA(path, &cluster_size, NULL, NULL);
+    ok(ret, "GetDiskInfoA failed %u\n", GetLastError());
+
+    ret = GetDiskInfoA(path, NULL, NULL, NULL);
+    ok(ret, "GetDiskInfoA failed %u\n", GetLastError());
+
+    ret = GetDiskInfoA(path, NULL, NULL, NULL);
+    ok(ret, "GetDiskInfoA failed %u\n", GetLastError());
+
+    SetLastError(0xdeadbeef);
+    strcpy(p, "nonexistingpath");
+    ret = GetDiskInfoA(path, NULL, NULL, NULL);
+    error = GetLastError();
+    ok(!ret, "GetDiskInfoA succeeded\n");
+    todo_wine ok(error == ERROR_PATH_NOT_FOUND, "got %u expected ERROR_PATH_NOT_FOUND\n", error);
+
+    SetLastError(0xdeadbeef);
+    ret = GetDiskInfoA(NULL, NULL, NULL, NULL);
+    error = GetLastError();
+    ok(!ret, "GetDiskInfoA succeeded\n");
+    ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error);
+}
+
 START_TEST(urlcache)
 {
     HMODULE hdll;
@@ -227,4 +267,5 @@ START_TEST(urlcache)
     pUnlockUrlCacheEntryFileA = (void*)GetProcAddress(hdll, "UnlockUrlCacheEntryFileA");
     test_urlcacheA();
     test_FindCloseUrlCache();
+    test_GetDiskInfoA();
 }
diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c
index 5e1541d..d51deb6 100644
--- a/dlls/wininet/urlcache.c
+++ b/dlls/wininet/urlcache.c
@@ -3624,10 +3624,26 @@ BOOL WINAPI IsUrlCacheEntryExpiredW( LPCWSTR url, DWORD dwFlags, FILETIME* pftLa
 /***********************************************************************
  *           GetDiskInfoA (WININET.@)
  */
-DWORD WINAPI GetDiskInfoA(void *p0, void *p1, void *p2, void *p3)
+BOOL WINAPI GetDiskInfoA(PCSTR path, PDWORD cluster_size, PDWORDLONG free, PDWORDLONG total)
 {
-    FIXME("(%p, %p, %p, %p)\n", p0, p1, p2, p3);
-    return 0;
+    BOOL ret;
+    DWORD cluster_sectors, sector_bytes, free_clusters, total_clusters;
+
+    TRACE("(%s, %p, %p, %p)\n", debugstr_a(path), cluster_size, free, total);
+
+    if (!path)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    if ((ret = GetDiskFreeSpaceA(path, &cluster_sectors, &sector_bytes, &free_clusters, &total_clusters)))
+    {
+        if (cluster_size) *cluster_size = 1;
+        if (free) *free = free_clusters * cluster_sectors * sector_bytes;
+        if (total) *total = total_clusters * cluster_sectors * sector_bytes;
+    }
+    return ret;
 }
 
 /***********************************************************************
diff --git a/dlls/wininet/wininet.spec b/dlls/wininet/wininet.spec
index 61beaf4..9506b6c 100644
--- a/dlls/wininet/wininet.spec
+++ b/dlls/wininet/wininet.spec
@@ -1,5 +1,5 @@
 101 stub -noname DoConnectoidsExist
-102 stdcall -noname GetDiskInfoA(ptr ptr ptr ptr)
+102 stdcall -noname GetDiskInfoA(str ptr ptr ptr)
 103 stub -noname PerformOperationOverUrlCacheA
 104 stub -noname HttpCheckDavComplianceA
 105 stub -noname HttpCheckDavComplianceW
diff --git a/include/winineti.h b/include/winineti.h
index 98cba3b..32951ff 100644
--- a/include/winineti.h
+++ b/include/winineti.h
@@ -90,6 +90,7 @@ extern "C" {
 #endif
 
 DWORD       WINAPI DeleteIE3Cache(HWND,HINSTANCE,LPSTR,int);
+BOOL        WINAPI GetDiskInfoA(PCSTR,PDWORD,PDWORDLONG,PDWORDLONG);
 BOOL        WINAPI GetUrlCacheConfigInfoA(LPINTERNET_CACHE_CONFIG_INFOA,LPDWORD,DWORD);
 BOOL        WINAPI GetUrlCacheConfigInfoW(LPINTERNET_CACHE_CONFIG_INFOW,LPDWORD,DWORD);
 #define     GetUrlCacheConfigInfo WINELIB_NAME_AW(GetUrlCacheConfigInfo)



More information about the wine-patches mailing list