Francois Gouget : shlwapi: Implement PathCreateFromUrlAlloc().

Alexandre Julliard julliard at winehq.org
Mon Oct 1 13:35:01 CDT 2012


Module: wine
Branch: master
Commit: 58c77f61566a3f2535fa646dc41662e0cad3e752
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=58c77f61566a3f2535fa646dc41662e0cad3e752

Author: Francois Gouget <fgouget at codeweavers.com>
Date:   Mon Oct  1 03:29:55 2012 +0200

shlwapi: Implement PathCreateFromUrlAlloc().

---

 dlls/shlwapi/path.c       |   20 ++++++++++++++++++++
 dlls/shlwapi/shlwapi.spec |    1 +
 dlls/shlwapi/tests/path.c |   14 ++++++++++++++
 include/shlwapi.h         |   10 ++++++----
 4 files changed, 41 insertions(+), 4 deletions(-)

diff --git a/dlls/shlwapi/path.c b/dlls/shlwapi/path.c
index dc7bc4b..415ae29 100644
--- a/dlls/shlwapi/path.c
+++ b/dlls/shlwapi/path.c
@@ -3420,6 +3420,26 @@ HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath,
 }
 
 /*************************************************************************
+ * PathCreateFromUrlAlloc   [SHLWAPI.@]
+ */
+HRESULT WINAPI PathCreateFromUrlAlloc(LPCWSTR pszUrl, LPWSTR *pszPath,
+                                      DWORD dwReserved)
+{
+    WCHAR pathW[MAX_PATH];
+    DWORD size;
+    HRESULT hr;
+
+    size = MAX_PATH;
+    hr = PathCreateFromUrlW(pszUrl, pathW, &size, dwReserved);
+    if (SUCCEEDED(hr))
+    {
+        /* Yes, this is supposed to crash if pszPath is NULL */
+        *pszPath = StrDupW(pathW);
+    }
+    return hr;
+}
+
+/*************************************************************************
  * PathRelativePathToA   [SHLWAPI.@]
  *
  * Create a relative path from one path to another.
diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec
index e0bdcf1..025d48a 100644
--- a/dlls/shlwapi/shlwapi.spec
+++ b/dlls/shlwapi/shlwapi.spec
@@ -586,6 +586,7 @@
 @ stdcall PathCompactPathW(long wstr long)
 @ stdcall PathCreateFromUrlA(str ptr ptr long)
 @ stdcall PathCreateFromUrlW(wstr ptr ptr long)
+@ stdcall PathCreateFromUrlAlloc(wstr ptr long)
 @ stdcall PathFileExistsA (str)
 @ stdcall PathFileExistsW (wstr)
 @ stdcall PathFindExtensionA (str)
diff --git a/dlls/shlwapi/tests/path.c b/dlls/shlwapi/tests/path.c
index 6417988..d9209bd 100644
--- a/dlls/shlwapi/tests/path.c
+++ b/dlls/shlwapi/tests/path.c
@@ -32,6 +32,7 @@ static HRESULT (WINAPI *pPathIsValidCharW)(WCHAR,DWORD);
 static LPWSTR  (WINAPI *pPathCombineW)(LPWSTR, LPCWSTR, LPCWSTR);
 static HRESULT (WINAPI *pPathCreateFromUrlA)(LPCSTR, LPSTR, LPDWORD, DWORD);
 static HRESULT (WINAPI *pPathCreateFromUrlW)(LPCWSTR, LPWSTR, LPDWORD, DWORD);
+static HRESULT (WINAPI *pPathCreateFromUrlAlloc)(LPCWSTR, LPWSTR*, DWORD);
 static BOOL    (WINAPI *pPathAppendA)(LPSTR, LPCSTR);
 
 /* ################ */
@@ -326,6 +327,18 @@ static void test_PathCreateFromUrl(void)
             FreeWideString(pathW);
         }
     }
+
+    if (pPathCreateFromUrlAlloc)
+    {
+        static const WCHAR fileW[] = {'f','i','l','e',':','/','/','f','o','o',0};
+        static const WCHAR fooW[] = {'\\','\\','f','o','o',0};
+
+        pathW = NULL;
+        ret = pPathCreateFromUrlAlloc(fileW, &pathW, 0);
+        ok(ret == S_OK, "got 0x%08x expected S_OK\n", ret);
+        ok(lstrcmpiW(pathW, fooW) == 0, "got %s expected %s\n", wine_dbgstr_w(pathW), wine_dbgstr_w(fooW));
+        HeapFree(GetProcessHeap(), 0, pathW);
+    }
 }
 
 
@@ -1453,6 +1466,7 @@ START_TEST(path)
 
     pPathCreateFromUrlA = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlA");
     pPathCreateFromUrlW = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlW");
+    pPathCreateFromUrlAlloc = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlAlloc");
     pPathCombineW = (void*)GetProcAddress(hShlwapi, "PathCombineW");
     pPathIsValidCharA = (void*)GetProcAddress(hShlwapi, (LPSTR)455);
     pPathIsValidCharW = (void*)GetProcAddress(hShlwapi, (LPSTR)456);
diff --git a/include/shlwapi.h b/include/shlwapi.h
index cbfaabe..067ef7b 100644
--- a/include/shlwapi.h
+++ b/include/shlwapi.h
@@ -372,16 +372,18 @@ int WINAPI PathCommonPrefixA(LPCSTR,LPCSTR,LPSTR);
 int WINAPI PathCommonPrefixW(LPCWSTR,LPCWSTR,LPWSTR);
 #define PathCommonPrefix WINELIB_NAME_AW(PathCommonPrefix)
 
-HRESULT WINAPI PathCreateFromUrlA(LPCSTR pszUrl, LPSTR pszPath, LPDWORD pcchPath, DWORD dwReserved);
-HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwReserved);
+HRESULT WINAPI PathCreateFromUrlA(LPCSTR,LPSTR,LPDWORD,DWORD);
+HRESULT WINAPI PathCreateFromUrlW(LPCWSTR,LPWSTR,LPDWORD,DWORD);
 #define PathCreateFromUrl WINELIB_NAME_AW(PathCreateFromUrl)
 
+HRESULT WINAPI PathCreateFromUrlAlloc(LPCWSTR,LPWSTR*,DWORD);
+
 BOOL WINAPI PathFileExistsA(LPCSTR);
 BOOL WINAPI PathFileExistsW(LPCWSTR);
 #define PathFileExists WINELIB_NAME_AW(PathFileExists)
 
-BOOL WINAPI PathFileExistsAndAttributesA(LPCSTR lpszPath, DWORD *dwAttr);
-BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR lpszPath, DWORD *dwAttr);
+BOOL WINAPI PathFileExistsAndAttributesA(LPCSTR,DWORD*);
+BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR,DWORD*);
 #define PathFileExistsAndAttributes WINELIB_NAME_AW(PathFileExistsAndAttributes)
 
 LPSTR  WINAPI PathFindExtensionA(LPCSTR);




More information about the wine-cvs mailing list