From 73921e94128290a08598ef479ce5cd7d997e2b34 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 19 Jan 2018 00:23:23 +0100 Subject: [PATCH] [HLINK] Sync with Wine 3.0. CORE-14225 --- dll/win32/hlink/browse_ctx.c | 27 ++++++++++++++++++---- dll/win32/hlink/link.c | 43 ++++++++++++++++++++---------------- media/doc/README.WINE | 2 +- 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/dll/win32/hlink/browse_ctx.c b/dll/win32/hlink/browse_ctx.c index 0e76284544d..00007f6b527 100644 --- a/dll/win32/hlink/browse_ctx.c +++ b/dll/win32/hlink/browse_ctx.c @@ -95,10 +95,11 @@ static ULONG WINAPI IHlinkBC_fnRelease (IHlinkBrowseContext* iface) return ref; } +static const WCHAR szIdent[] = {'W','I','N','E','H','L','I','N','K',0}; + static HRESULT WINAPI IHlinkBC_Register(IHlinkBrowseContext* iface, DWORD dwReserved, IUnknown *piunk, IMoniker *pimk, DWORD *pdwRegister) { - static const WCHAR szIdent[] = {'W','I','N','E','H','L','I','N','K',0}; HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); IMoniker *mon; IMoniker *composite; @@ -122,11 +123,29 @@ static HRESULT WINAPI IHlinkBC_Register(IHlinkBrowseContext* iface, return S_OK; } -static HRESULT WINAPI IHlinkBC_GetObject(IHlinkBrowseContext* face, +static HRESULT WINAPI IHlinkBC_GetObject(IHlinkBrowseContext* iface, IMoniker *pimk, BOOL fBindifRootRegistered, IUnknown **ppiunk) { - FIXME("\n"); - return E_NOTIMPL; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); + IMoniker *mon; + IMoniker *composite; + IRunningObjectTable *ROT; + HRESULT hr; + + TRACE("(%p)->(%p, %d, %p)\n", This, pimk, fBindifRootRegistered, ppiunk); + + hr = CreateItemMoniker(NULL, szIdent, &mon); + if (FAILED(hr)) return hr; + CreateGenericComposite(mon, pimk, &composite); + + GetRunningObjectTable(0, &ROT); + hr = IRunningObjectTable_GetObject(ROT, composite, ppiunk); + + IRunningObjectTable_Release(ROT); + IMoniker_Release(composite); + IMoniker_Release(mon); + + return hr; } static HRESULT WINAPI IHlinkBC_Revoke(IHlinkBrowseContext* iface, diff --git a/dll/win32/hlink/link.c b/dll/win32/hlink/link.c index c240fccd364..88b7093c327 100644 --- a/dll/win32/hlink/link.c +++ b/dll/win32/hlink/link.c @@ -481,25 +481,33 @@ static HRESULT WINAPI IHlink_fnNavigate(IHlink* iface, DWORD grfHLNF, LPBC pbc, if (SUCCEEDED(r)) { - IBindCtx *bcxt; + IBindCtx *bcxt = NULL; IUnknown *unk = NULL; IHlinkTarget *target; - CreateBindCtx(0, &bcxt); - - RegisterBindStatusCallback(bcxt, pbsc, NULL, 0); - - r = IMoniker_BindToObject(mon, bcxt, NULL, &IID_IUnknown, (void**)&unk); - if (r == S_OK) - { - r = IUnknown_QueryInterface(unk, &IID_IHlinkTarget, (void**)&target); - IUnknown_Release(unk); - } - if (r == S_OK) + if (phbc) { - IHlinkTarget_SetBrowseContext(target, phbc); - r = IHlinkTarget_Navigate(target, grfHLNF, This->Location); - IHlinkTarget_Release(target); + r = IHlinkBrowseContext_GetObject(phbc, mon, TRUE, &unk); + if (r == S_FALSE) + { + CreateBindCtx(0, &bcxt); + RegisterBindStatusCallback(bcxt, pbsc, NULL, 0); + r = IMoniker_BindToObject(mon, bcxt, NULL, &IID_IUnknown, (void**)&unk); + } + if (r == S_OK) + { + r = IUnknown_QueryInterface(unk, &IID_IHlinkTarget, (void **)&target); + IUnknown_Release(unk); + } + if (r == S_OK) + { + if (bcxt) IHlinkTarget_SetBrowseContext(target, phbc); + r = IHlinkTarget_Navigate(target, grfHLNF, This->Location); + IHlinkTarget_Release(target); + } + + RevokeBindStatusCallback(bcxt, pbsc); + if (bcxt) IBindCtx_Release(bcxt); } else { @@ -511,12 +519,9 @@ static HRESULT WINAPI IHlink_fnNavigate(IHlink* iface, DWORD grfHLNF, LPBC pbc, { ShellExecuteW(NULL, szOpen, target, NULL, NULL, SW_SHOW); CoTaskMemFree(target); + r = DRAGDROP_S_DROP; } } - - RevokeBindStatusCallback(bcxt, pbsc); - - IBindCtx_Release(bcxt); IMoniker_Release(mon); } diff --git a/media/doc/README.WINE b/media/doc/README.WINE index d6031a54b7b..e67bc01b74f 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -70,7 +70,7 @@ reactos/dll/win32/fontsub # Synced to WineStaging-2.9 reactos/dll/win32/fusion # Synced to Wine-3.0 reactos/dll/win32/gdiplus # Synced to Wine-3.0 reactos/dll/win32/hhctrl.ocx # Synced to Wine-3.0 -reactos/dll/win32/hlink # Synced to WineStaging-2.9 +reactos/dll/win32/hlink # Synced to Wine-3.0 reactos/dll/win32/hnetcfg # Synced to WineStaging-2.9 reactos/dll/win32/httpapi # Synced to WineStaging-2.9 reactos/dll/win32/iccvid # Synced to WineStaging-2.9 -- 2.17.1