Piotr Caban : hlink: Improve file protocol handling in HlinkParseDisplayName.

Alexandre Julliard julliard at winehq.org
Tue Mar 4 14:08:51 CST 2014


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Mar  4 16:53:05 2014 +0100

hlink: Improve file protocol handling in HlinkParseDisplayName.

---

 dlls/hlink/hlink_main.c  |   26 +++++++++++++++++++-------
 dlls/hlink/tests/hlink.c |   20 +++++++++++++++++++-
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/dlls/hlink/hlink_main.c b/dlls/hlink/hlink_main.c
index 6df3781..1cfa6a6 100644
--- a/dlls/hlink/hlink_main.c
+++ b/dlls/hlink/hlink_main.c
@@ -380,6 +380,8 @@ HRESULT WINAPI HlinkUpdateStackItem(IHlinkFrame *frame, IHlinkBrowseContext *bc,
 HRESULT WINAPI HlinkParseDisplayName(LPBC pibc, LPCWSTR pwzDisplayName, BOOL fNoForceAbs,
         ULONG *pcchEaten, IMoniker **ppimk)
 {
+    static const WCHAR file_colonW[] = {'f','i','l','e',':'};
+    ULONG eaten = 0;
     HRESULT hres;
 
     TRACE("(%p %s %x %p %p)\n", pibc, debugstr_w(pwzDisplayName), fNoForceAbs, pcchEaten, ppimk);
@@ -387,17 +389,27 @@ HRESULT WINAPI HlinkParseDisplayName(LPBC pibc, LPCWSTR pwzDisplayName, BOOL fNo
     if(fNoForceAbs)
         FIXME("Unsupported fNoForceAbs\n");
 
-    hres = MkParseDisplayNameEx(pibc, pwzDisplayName, pcchEaten, ppimk);
-    if(SUCCEEDED(hres))
-        return hres;
+    if(!strncmpiW(pwzDisplayName, file_colonW, sizeof(file_colonW)/sizeof(WCHAR))) {
+        pwzDisplayName += sizeof(file_colonW)/sizeof(WCHAR);
+        eaten += sizeof(file_colonW)/sizeof(WCHAR);
 
-    hres = MkParseDisplayName(pibc, pwzDisplayName, pcchEaten, ppimk);
-    if(SUCCEEDED(hres))
-        return hres;
+        while(*pwzDisplayName == '/') {
+            pwzDisplayName++;
+            eaten++;
+        }
+    }else {
+        hres = MkParseDisplayNameEx(pibc, pwzDisplayName, pcchEaten, ppimk);
+        if(SUCCEEDED(hres))
+            return hres;
+
+        hres = MkParseDisplayName(pibc, pwzDisplayName, pcchEaten, ppimk);
+        if(SUCCEEDED(hres))
+            return hres;
+    }
 
     hres = CreateFileMoniker(pwzDisplayName, ppimk);
     if(SUCCEEDED(hres))
-        *pcchEaten = strlenW(pwzDisplayName);
+        *pcchEaten = eaten + strlenW(pwzDisplayName);
 
     return hres;
 }
diff --git a/dlls/hlink/tests/hlink.c b/dlls/hlink/tests/hlink.c
index 0b01aef..fc84b54 100644
--- a/dlls/hlink/tests/hlink.c
+++ b/dlls/hlink/tests/hlink.c
@@ -626,6 +626,8 @@ static void test_HlinkParseDisplayName(void)
     static const WCHAR clsid_nameW[] = {'c','l','s','i','d',':',
             '2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','8',
             '-','0','8','0','0','2','B','3','0','3','0','9','D',':',0};
+    static const WCHAR file_urlW[] =
+            {'f','i','l','e',':','/','/','/','c',':','\\','f','i','l','e','.','t','x','t',0};
 
     CreateBindCtx(0, &bctx);
 
@@ -657,7 +659,7 @@ static void test_HlinkParseDisplayName(void)
     IMoniker_Release(mon);
 
     hres = HlinkParseDisplayName(bctx, invalid_urlW, FALSE, &eaten, &mon);
-     ok(hres == S_OK, "HlinkParseDisplayName failed: %08x\n", hres);
+    ok(hres == S_OK, "HlinkParseDisplayName failed: %08x\n", hres);
     ok(eaten == sizeof(invalid_urlW)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
     ok(mon != NULL, "mon == NULL\n");
 
@@ -671,6 +673,22 @@ static void test_HlinkParseDisplayName(void)
     ok(issys == MKSYS_FILEMONIKER, "issys=%x\n", issys);
 
     IMoniker_Release(mon);
+
+    hres = HlinkParseDisplayName(bctx, file_urlW, FALSE, &eaten, &mon);
+    ok(hres == S_OK, "HlinkParseDisplayName failed: %08x\n", hres);
+    ok(eaten == sizeof(file_urlW)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
+    ok(mon != NULL, "mon == NULL\n");
+
+    hres = IMoniker_GetDisplayName(mon, bctx, 0, &name);
+    ok(hres == S_OK, "GetDiasplayName failed: %08x\n", hres);
+    ok(!lstrcmpW(name, file_urlW+8), "wrong display name %s\n", wine_dbgstr_w(name));
+    CoTaskMemFree(name);
+
+    hres = IMoniker_IsSystemMoniker(mon, &issys);
+    ok(hres == S_OK, "IsSystemMoniker failed: %08x\n", hres);
+    ok(issys == MKSYS_FILEMONIKER, "issys=%x\n", issys);
+
+    IMoniker_Release(mon);
     IBindCtx_Release(bctx);
 }
 




More information about the wine-cvs mailing list