Jacek Caban : hlink: Added HlinkGetSpecialReference implementation.

Alexandre Julliard julliard at winehq.org
Tue Nov 13 08:34:42 CST 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Nov 12 19:17:45 2007 +0100

hlink: Added HlinkGetSpecialReference implementation.

---

 dlls/hlink/hlink_main.c  |   53 ++++++++++++++++++++++++++++++++++++++++++++-
 dlls/hlink/tests/hlink.c |   31 ++++++++++++++++++++++++++
 2 files changed, 82 insertions(+), 2 deletions(-)

diff --git a/dlls/hlink/hlink_main.c b/dlls/hlink/hlink_main.c
index b0b407a..a786b62 100644
--- a/dlls/hlink/hlink_main.c
+++ b/dlls/hlink/hlink_main.c
@@ -278,8 +278,57 @@ HRESULT WINAPI HlinkIsShortcut(LPCWSTR pwzFileName)
 
 HRESULT WINAPI HlinkGetSpecialReference(ULONG uReference, LPWSTR *ppwzReference)
 {
-    FIXME("(%u %p) stub\n", uReference, ppwzReference);
-    return E_NOTIMPL;
+    DWORD res, type, size = 100;
+    LPCWSTR value_name;
+    WCHAR *buf;
+    HKEY hkey;
+
+    static const WCHAR start_pageW[] = {'S','t','a','r','t',' ','P','a','g','e',0};
+    static const WCHAR search_pageW[] = {'S','e','a','r','c','h',' ','P','a','g','e',0};
+
+    static const WCHAR ie_main_keyW[] =
+        {'S','o','f','t','w','a','r','e',
+         '\\','M','i','c','r','o','s','o','f','t','\\',
+         'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',
+         '\\','M','a','i','n',0};
+
+    TRACE("(%u %p)\n", uReference, ppwzReference);
+
+    *ppwzReference = NULL;
+
+    switch(uReference) {
+    case HLSR_HOME:
+        value_name = start_pageW;
+        break;
+    case HLSR_SEARCHPAGE:
+        value_name = search_pageW;
+        break;
+    case HLSR_HISTORYFOLDER:
+        return E_NOTIMPL;
+    default:
+        return E_INVALIDARG;
+    }
+
+    res = RegOpenKeyW(HKEY_CURRENT_USER, ie_main_keyW, &hkey);
+    if(res != ERROR_SUCCESS) {
+        WARN("Could not open key: %u\n", res);
+        return HRESULT_FROM_WIN32(res);
+    }
+
+    buf = CoTaskMemAlloc(size);
+    res = RegQueryValueExW(hkey, value_name, NULL, &type, (PBYTE)buf, &size);
+    buf = CoTaskMemRealloc(buf, size);
+    if(res == ERROR_MORE_DATA)
+        res = RegQueryValueExW(hkey, value_name, NULL, &type, (PBYTE)buf, &size);
+    RegCloseKey(hkey);
+    if(res != ERROR_SUCCESS) {
+        WARN("Could not query value %s: %u\n", debugstr_w(value_name), res);
+        CoTaskMemFree(buf);
+        return HRESULT_FROM_WIN32(res);
+    }
+
+    *ppwzReference = buf;
+    return S_OK;
 }
 
 HRESULT WINAPI HlinkTranslateURL(LPCWSTR pwzURL, DWORD grfFlags, LPWSTR *ppwzTranslatedURL)
diff --git a/dlls/hlink/tests/hlink.c b/dlls/hlink/tests/hlink.c
index 172d7b7..4d3a3e2 100644
--- a/dlls/hlink/tests/hlink.c
+++ b/dlls/hlink/tests/hlink.c
@@ -316,6 +316,36 @@ static void test_persist(void)
     IHlink_Release(lnk);
 }
 
+static void test_special_reference(void)
+{
+    LPWSTR ref;
+    HRESULT hres;
+
+    hres = HlinkGetSpecialReference(HLSR_HOME, &ref);
+    todo_wine
+    ok(hres == S_OK, "HlinkGetSpecialReference(HLSR_HOME) failed: %08x\n", hres);
+    todo_wine
+    ok(ref != NULL, "ref == NULL\n");
+    CoTaskMemFree(ref);
+
+    hres = HlinkGetSpecialReference(HLSR_SEARCHPAGE, &ref);
+    todo_wine
+    ok(hres == S_OK, "HlinkGetSpecialReference(HLSR_SEARCHPAGE) failed: %08x\n", hres);
+    todo_wine
+    ok(ref != NULL, "ref == NULL\n");
+    CoTaskMemFree(ref);
+
+    ref = (void*)0xdeadbeef;
+    hres = HlinkGetSpecialReference(HLSR_HISTORYFOLDER, &ref);
+    ok(hres == E_NOTIMPL, "HlinkGetSpecialReference(HLSR_HISTORYFOLDER) failed: %08x\n", hres);
+    ok(ref == NULL, "ref=%p\n", ref);
+
+    ref = (void*)0xdeadbeef;
+    hres = HlinkGetSpecialReference(4, &ref);
+    ok(hres == E_INVALIDARG, "HlinkGetSpecialReference(HLSR_HISTORYFOLDER) failed: %08x\n", hres);
+    ok(ref == NULL, "ref=%p\n", ref);
+}
+
 START_TEST(hlink)
 {
     CoInitialize(NULL);
@@ -323,6 +353,7 @@ START_TEST(hlink)
     test_HlinkIsShortcut();
     test_reference();
     test_persist();
+    test_special_reference();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list