From c5a73badaddd5a09acaf3b71e695221de8f38d69 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sat, 23 Mar 2013 11:03:35 +0400 Subject: [PATCH] hlink: Implement HlinkUpdateStackItem(). --- dlls/hlink/hlink_main.c | 19 +++++--- dlls/hlink/tests/hlink.c | 96 ++++++++++++++++++++++++++++++++++++++-- include/hlink.idl | 1 + 3 files changed, 108 insertions(+), 8 deletions(-) diff --git a/dlls/hlink/hlink_main.c b/dlls/hlink/hlink_main.c index 3bf9d27e9a..1890fd5b1f 100644 --- a/dlls/hlink/hlink_main.c +++ b/dlls/hlink/hlink_main.c @@ -366,12 +366,21 @@ HRESULT WINAPI HlinkTranslateURL(LPCWSTR pwzURL, DWORD grfFlags, LPWSTR *ppwzTra /*********************************************************************** * HlinkUpdateStackItem (HLINK.@) */ -HRESULT WINAPI HlinkUpdateStackItem(IHlinkFrame *pihlframe, IHlinkBrowseContext *pihlbc, - ULONG uHLID, IMoniker *pimkTrgt, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName) +HRESULT WINAPI HlinkUpdateStackItem(IHlinkFrame *frame, IHlinkBrowseContext *bc, + ULONG hlid, IMoniker *target, LPCWSTR location, LPCWSTR friendly_name) { - FIXME("(%p %p %u %p %s %s)\n", pihlframe, pihlbc, uHLID, pimkTrgt, debugstr_w(pwzLocation), - debugstr_w(pwzFriendlyName)); - return E_NOTIMPL; + HRESULT hr; + + TRACE("(%p %p 0x%x %p %s %s)\n", frame, bc, hlid, target, debugstr_w(location), debugstr_w(friendly_name)); + + if (!frame && !bc) return E_INVALIDARG; + + if (frame) + hr = IHlinkFrame_UpdateHlink(frame, hlid, target, location, friendly_name); + else + hr = IHlinkBrowseContext_UpdateHlink(bc, hlid, target, location, friendly_name); + + return hr; } /*********************************************************************** diff --git a/dlls/hlink/tests/hlink.c b/dlls/hlink/tests/hlink.c index 544cc4aa44..91f7c4aa9a 100644 --- a/dlls/hlink/tests/hlink.c +++ b/dlls/hlink/tests/hlink.c @@ -68,12 +68,15 @@ DEFINE_EXPECT(Save); DEFINE_EXPECT(HBC_QueryInterface_IHlinkHistory); DEFINE_EXPECT(HBC_GetObject); +DEFINE_EXPECT(HBC_UpdateHlink); DEFINE_EXPECT(HT_SetBrowseContext); DEFINE_EXPECT(HT_GetBrowseContext); DEFINE_EXPECT(HT_Navigate); DEFINE_EXPECT(HT_GetFriendlyName); +DEFINE_EXPECT(HLF_UpdateHlink); + DEFINE_GUID(IID_IHlinkHistory,0x79eac9c8,0xbaf9,0x11ce,0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b); static const char *debugstr_guid(REFIID riid) @@ -885,10 +888,10 @@ static HRESULT WINAPI HlinkBrowseContext_OnNavigateHlink(IHlinkBrowseContext *if } static HRESULT WINAPI HlinkBrowseContext_UpdateHlink(IHlinkBrowseContext *iface, ULONG uHLID, - IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName) + IMoniker *pimkTarget, LPCWSTR location, LPCWSTR friendly_name) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + CHECK_EXPECT(HBC_UpdateHlink); + return S_OK; } static HRESULT WINAPI HlinkBrowseContext_EnumNavigationStack(IHlinkBrowseContext *iface, @@ -2194,6 +2197,92 @@ static void test_Hlink_Navigate(void) _bctx = NULL; } +static HRESULT WINAPI hlinkframe_QueryInterface(IHlinkFrame *iface, REFIID riid, void **obj) +{ + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IHlinkFrame)) + { + *obj = iface; + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI hlinkframe_AddRef(IHlinkFrame *iface) +{ + return 2; +} + +static ULONG WINAPI hlinkframe_Release(IHlinkFrame *iface) +{ + return 1; +} + +static HRESULT WINAPI hlinkframe_SetBrowseContext(IHlinkFrame *iface, IHlinkBrowseContext *bc) +{ + ok(0, "unexpected %p\n", bc); + return E_NOTIMPL; +} + +static HRESULT WINAPI hlinkframe_GetBrowseContext(IHlinkFrame *iface, IHlinkBrowseContext **bc) +{ + *bc = NULL; + ok(0, "unexpected %p\n", bc); + return E_NOTIMPL; +} + +static HRESULT WINAPI hlinkframe_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPBC pbc, IBindStatusCallback *bsc, IHlink *navigate) +{ + ok(0, "unexpected\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI hlinkframe_OnNavigate(IHlinkFrame *iface, DWORD grfHLNF, IMoniker *target, LPCWSTR location, LPCWSTR friendly_name, + DWORD reserved) +{ + ok(0, "unexpected\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI hlinkframe_UpdateHlink(IHlinkFrame *iface, ULONG uHLID, IMoniker *target, LPCWSTR location, LPCWSTR friendly_name) +{ + CHECK_EXPECT(HLF_UpdateHlink); + return S_OK; +} + +static IHlinkFrameVtbl hlinkframevtbl = { + hlinkframe_QueryInterface, + hlinkframe_AddRef, + hlinkframe_Release, + hlinkframe_SetBrowseContext, + hlinkframe_GetBrowseContext, + hlinkframe_Navigate, + hlinkframe_OnNavigate, + hlinkframe_UpdateHlink +}; + +static IHlinkFrame testframe = { &hlinkframevtbl }; + +static void test_HlinkUpdateStackItem(void) +{ + static const WCHAR location[] = {'l','o','c','a','t','i','o','n',0}; + HRESULT hr; + + hr = HlinkUpdateStackItem(NULL, NULL, HLID_CURRENT, &Moniker, location, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + SET_EXPECT(HBC_UpdateHlink); + hr = HlinkUpdateStackItem(NULL, &HlinkBrowseContext, HLID_CURRENT, &Moniker, location, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + CHECK_CALLED(HBC_UpdateHlink); + + SET_EXPECT(HLF_UpdateHlink); + hr = HlinkUpdateStackItem(&testframe, &HlinkBrowseContext, HLID_CURRENT, &Moniker, location, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + CHECK_CALLED(HLF_UpdateHlink); +} + START_TEST(hlink) { CoInitialize(NULL); @@ -2213,6 +2302,7 @@ START_TEST(hlink) test_HlinkClone(); test_StdHlink(); test_Hlink_Navigate(); + test_HlinkUpdateStackItem(); CoUninitialize(); } diff --git a/include/hlink.idl b/include/hlink.idl index af3f8f5f68..e735987aff 100644 --- a/include/hlink.idl +++ b/include/hlink.idl @@ -37,6 +37,7 @@ cpp_quote("HRESULT WINAPI HlinkIsShortcut(LPCWSTR);") cpp_quote("HRESULT WINAPI HlinkTranslateURL(LPCWSTR,DWORD,LPWSTR*);") cpp_quote("HRESULT WINAPI HlinkParseDisplayName(LPBC,LPCWSTR,BOOL,ULONG*,IMoniker**);") cpp_quote("HRESULT WINAPI HlinkResolveMonikerForData(LPMONIKER,DWORD,LPBC,ULONG,FORMATETC*,IBindStatusCallback*,LPMONIKER);") +cpp_quote("HRESULT WINAPI HlinkUpdateStackItem(IHlinkFrame*, IHlinkBrowseContext*, ULONG, IMoniker*, LPCWSTR, LPCWSTR);") typedef enum _HLSR_NOREDEF10 { HLSR_HOME, -- 2.32.0.93.g670b81a890