Nikolay Sivov : hlink: Implement HlinkUpdateStackItem().

Alexandre Julliard julliard at winehq.org
Tue Mar 26 15:11:11 CDT 2013


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Mar 23 11:03:35 2013 +0400

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 3bf9d27..1890fd5 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 544cc4a..91f7c4a 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 af3f8f5..e735987 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,




More information about the wine-cvs mailing list