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