static void test_reference(void) { HRESULT r; IHlink *lnk = NULL; IMoniker *mk = NULL; const WCHAR url[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0 }; const WCHAR url2[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g','/',0 }; LPWSTR str = NULL; r = HlinkCreateFromString(url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); ok(r == S_OK, "failed to create link\n"); if (FAILED(r)) return; r = IHlink_GetMonikerReference(lnk, HLINKGETREF_DEFAULT, NULL, NULL); ok(r == S_OK, "failed\n"); r = IHlink_GetMonikerReference(lnk, HLINKGETREF_DEFAULT, &mk, &str); ok(r == S_OK, "failed\n"); ok(mk != NULL, "no moniker\n"); ok(str == NULL, "string should be null\n"); r = IMoniker_Release(mk); ok( r == 1, "moniker refcount wrong\n"); r = IHlink_GetStringReference(lnk, -1, &str, NULL); ok(r == S_OK, "failed\n"); CoTaskMemFree(str); r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, &str, NULL); ok(r == S_OK, "failed\n"); todo_wine { ok(!lstrcmpW(str, url2), "url wrong\n"); } CoTaskMemFree(str); r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, NULL, NULL); ok(r == S_OK, "failed\n"); r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, NULL, &str); ok(r == S_OK, "failed\n"); ok(str == NULL, "string should be null\n"); /* Unimplented functions checks */ r = IHlink_GetAdditionalParams(lnk, NULL); ok(r == E_NOTIMPL, "failed\n"); r = IHlink_SetAdditionalParams(lnk, NULL); ok(r == E_NOTIMPL, "failed\n"); IHlink_Release(lnk); }
static ULONG WINAPI IHlinkBC_fnRelease (IHlinkBrowseContext* iface) { HlinkBCImpl *This = (HlinkBCImpl*)iface; ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(count=%lu)\n", This, refCount + 1); if (refCount) return refCount; TRACE("-- destroying IHlinkBrowseContext (%p)\n", This); HeapFree(GetProcessHeap(), 0, This->BrowseWindowInfo); if (This->CurrentPage) IHlink_Release(This->CurrentPage); HeapFree(GetProcessHeap(), 0, This); return 0; }
static HRESULT WINAPI IHlinkBC_SetInitialHlink(IHlinkBrowseContext* iface, IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName) { HlinkBCImpl *This = (HlinkBCImpl*)iface; FIXME("(%p)->(%p %s %s)\n", This, pimkTarget, debugstr_w(pwzLocation), debugstr_w(pwzFriendlyName)); if (This->CurrentPage) IHlink_Release(This->CurrentPage); HlinkCreateFromMoniker(pimkTarget, pwzLocation, pwzFriendlyName, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &This->CurrentPage); return S_OK; }
static ULONG WINAPI IHlinkBC_fnRelease (IHlinkBrowseContext* iface) { HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(count=%u)\n", This, refCount + 1); if (refCount) return refCount; TRACE("-- destroying IHlinkBrowseContext (%p)\n", This); heap_free(This->BrowseWindowInfo); if (This->CurrentPage) IHlink_Release(This->CurrentPage); heap_free(This); return 0; }
/*********************************************************************** * HlinkNavigateToStringReference (HLINK.@) */ HRESULT WINAPI HlinkNavigateToStringReference( LPCWSTR pwzTarget, LPCWSTR pwzLocation, IHlinkSite *pihlsite, DWORD dwSiteData, IHlinkFrame *pihlframe, DWORD grfHLNF, LPBC pibc, IBindStatusCallback *pibsc, IHlinkBrowseContext *pihlbc) { HRESULT r; IHlink *hlink = NULL; TRACE("%s %s %p %08x %p %08x %p %p %p\n", debugstr_w(pwzTarget), debugstr_w(pwzLocation), pihlsite, dwSiteData, pihlframe, grfHLNF, pibc, pibsc, pihlbc); r = HlinkCreateFromString( pwzTarget, pwzLocation, NULL, pihlsite, dwSiteData, NULL, &IID_IHlink, (LPVOID*) &hlink ); if (SUCCEEDED(r)) { r = HlinkNavigate(hlink, pihlframe, grfHLNF, pibc, pibsc, pihlbc); IHlink_Release(hlink); } return r; }
static HRESULT WINAPI IHlinkBC_UpdateHlink(IHlinkBrowseContext* iface, ULONG hlid, IMoniker *target, LPCWSTR location, LPCWSTR friendly_name) { HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); struct link_entry *entry = context_get_entry(This, hlid); IHlink *link; HRESULT hr; TRACE("(%p)->(0x%x %p %s %s)\n", This, hlid, target, debugstr_w(location), debugstr_w(friendly_name)); if (!entry) return E_INVALIDARG; hr = HlinkCreateFromMoniker(target, location, friendly_name, NULL, 0, NULL, &IID_IHlink, (void**)&link); if (FAILED(hr)) return hr; IHlink_Release(entry->link); entry->link = link; return S_OK; }
static ULONG WINAPI IHlinkBC_fnRelease (IHlinkBrowseContext* iface) { HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(count=%u)\n", This, ref + 1); if (!ref) { struct link_entry *link, *link2; LIST_FOR_EACH_ENTRY_SAFE(link, link2, &This->links, struct link_entry, entry) { list_remove(&link->entry); IHlink_Release(link->link); heap_free(link); } heap_free(This->BrowseWindowInfo); heap_free(This); } return ref; }
static ULONG WINAPI IPersistStream_fnRelease (IPersistStream* iface) { HlinkImpl *This = impl_from_IPersistStream(iface); TRACE("(%p)\n", This); return IHlink_Release(&This->IHlink_iface); }
static ULONG WINAPI IDataObject_fnRelease (IDataObject* iface) { HlinkImpl *This = impl_from_IDataObject(iface); TRACE("%p\n", This); return IHlink_Release(&This->IHlink_iface); }
static void test_persist(void) { static const WCHAR url[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0 }; static const WCHAR rel_url[] = { 'i','n','d','e','x','.','h','t','m','l',0 }; static const WCHAR filename[] = { 'c',':','\\',0 }; static const WCHAR friendly_name[] = { 'W','i','n','e',' ','H','Q',0 }; static const WCHAR location[] = { '_','b','l','a','n','k',0 }; static const WCHAR target_frame_name[] = { 't','g','t','f','r','m',0 }; HRESULT hr; IHlink *lnk; hr = HlinkCreateFromString(url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); ok(hr == S_OK, "IHlinkCreateFromString failed with error 0x%08x\n", hr); if (!lnk) { skip("Can't create lnk, skipping test_persist. Was wineprefixcreate run properly?\n"); return; } test_persist_save_data("url only", lnk, expected_hlink_data, sizeof(expected_hlink_data), expected_hlink_data_ie7, sizeof(expected_hlink_data_ie7)); IHlink_Release(lnk); hr = HlinkCreateFromString(url, NULL, friendly_name, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("url + friendly name", lnk, expected_hlink_data2, sizeof(expected_hlink_data2), expected_hlink_data2_ie7, sizeof(expected_hlink_data2_ie7)); IHlink_Release(lnk); hr = HlinkCreateFromString(url, location, friendly_name, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("url + friendly_name + location", lnk, expected_hlink_data3, sizeof(expected_hlink_data3), expected_hlink_data3_ie7, sizeof(expected_hlink_data3_ie7)); IHlink_Release(lnk); hr = HlinkCreateFromString(rel_url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("relative url", lnk, expected_hlink_data4, sizeof(expected_hlink_data4), expected_hlink_data4, sizeof(expected_hlink_data4)); IHlink_Release(lnk); hr = HlinkCreateFromString(url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); hr = IHlink_SetTargetFrameName(lnk, target_frame_name); ok(hr == S_OK, "IHlink_SetTargetFrameName failed with error 0x%08x\n", hr); test_persist_save_data("url + target frame name", lnk, expected_hlink_data5, sizeof(expected_hlink_data5), expected_hlink_data5_ie7, sizeof(expected_hlink_data5_ie7)); IHlink_Release(lnk); hr = HlinkCreateFromString(filename, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("filename", lnk, expected_hlink_data6, sizeof(expected_hlink_data6), expected_hlink_data6, sizeof(expected_hlink_data6)); IHlink_Release(lnk); }