Detlef Riekenberg : shdocvw: Implement ParseURLFromOutsideSource.

Alexandre Julliard julliard at winehq.org
Fri Dec 26 12:35:23 CST 2008


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

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Tue Dec 23 11:42:07 2008 +0100

shdocvw: Implement ParseURLFromOutsideSource.

---

 dlls/shdocvw/shdocvw.spec   |    4 +-
 dlls/shdocvw/shdocvw_main.c |  101 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 103 insertions(+), 2 deletions(-)

diff --git a/dlls/shdocvw/shdocvw.spec b/dlls/shdocvw/shdocvw.spec
index 1cf297d..f47ecb4 100644
--- a/dlls/shdocvw/shdocvw.spec
+++ b/dlls/shdocvw/shdocvw.spec
@@ -49,8 +49,8 @@
 164 stub -noname ResetProfileSharing
 165 stub -noname URLSubstitution
 167 stub -noname IsIEDefaultBrowser
-169 stub -noname ParseURLFromOutsideSourceA
-170 stub -noname ParseURLFromOutsideSourceW
+169 stdcall -noname ParseURLFromOutsideSourceA(str ptr ptr ptr)
+170 stdcall -noname ParseURLFromOutsideSourceW(wstr ptr ptr ptr)
 171 stub -noname _DeletePidlDPA
 172 stub -noname IURLQualify
 173 stub -noname SHIsRestricted
diff --git a/dlls/shdocvw/shdocvw_main.c b/dlls/shdocvw/shdocvw_main.c
index c9deff1..8640600 100644
--- a/dlls/shdocvw/shdocvw_main.c
+++ b/dlls/shdocvw/shdocvw_main.c
@@ -295,3 +295,104 @@ HRESULT WINAPI URLSubRegQueryA(LPCSTR regpath, LPCSTR name, DWORD type,
 
     return E_FAIL;
 }
+
+/******************************************************************
+ *  ParseURLFromOutsideSourceW (SHDOCVW.170)
+ */
+DWORD WINAPI ParseURLFromOutsideSourceW(LPCWSTR url, LPWSTR out, LPDWORD plen, LPDWORD unknown)
+{
+    WCHAR buffer_in[INTERNET_MAX_URL_LENGTH];
+    WCHAR buffer_out[INTERNET_MAX_URL_LENGTH];
+    LPCWSTR ptr = url;
+    HRESULT hr;
+    DWORD needed;
+    DWORD len;
+    DWORD res = 0;
+
+
+    TRACE("(%s, %p, %p, %p) len: %d, unknown: 0x%x\n", debugstr_w(url), out, plen, unknown,
+            plen ? *plen : 0, unknown ? *unknown : 0);
+
+    if (!PathIsURLW(ptr)) {
+        len = sizeof(buffer_in) / sizeof(buffer_in[0]);
+        buffer_in[0] = 0;
+        hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_GUESSSCHEME);
+        TRACE("got 0x%x with %s\n", hr, debugstr_w(buffer_in));
+        if (hr != S_OK) {
+            /* when we can't guess the scheme, use the default scheme */
+            len = sizeof(buffer_in) / sizeof(buffer_in[0]);
+            hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_DEFAULT);
+        }
+
+        if (hr == S_OK) {
+            /* we parsed the url to buffer_in */
+            ptr = buffer_in;
+        }
+        else
+        {
+            FIXME("call search hook for %s\n", debugstr_w(ptr));
+        }
+    }
+
+    len = sizeof(buffer_out) / sizeof(buffer_out[0]);
+    buffer_out[0] = '\0';
+    hr = UrlCanonicalizeW(ptr, buffer_out, &len, URL_ESCAPE_SPACES_ONLY);
+    needed = lstrlenW(buffer_out)+1;
+    TRACE("got 0x%x with %s (need %d)\n", hr, debugstr_w(buffer_out), needed);
+
+    if (*plen >= needed) {
+        if (out != NULL) {
+            lstrcpyW(out, buffer_out);
+            res++;
+        }
+        needed--;
+    }
+
+    *plen = needed;
+
+    TRACE("=> %d\n", res);
+    return res;
+}
+
+/******************************************************************
+ *  ParseURLFromOutsideSourceA (SHDOCVW.169)
+ *
+ * See ParseURLFromOutsideSourceW
+ */
+DWORD WINAPI ParseURLFromOutsideSourceA(LPCSTR url, LPSTR out, LPDWORD plen, LPDWORD unknown)
+{
+    WCHAR buffer[INTERNET_MAX_URL_LENGTH];
+    LPWSTR urlW = NULL;
+    DWORD needed;
+    DWORD res;
+    DWORD len;
+
+    TRACE("(%s, %p, %p, %p) len: %d, unknown: 0x%x\n", debugstr_a(url), out, plen, unknown,
+            plen ? *plen : 0, unknown ? *unknown : 0);
+
+    if (url) {
+        len = MultiByteToWideChar(CP_ACP, 0, url, -1, NULL, 0);
+        urlW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, url, -1, urlW, len);
+    }
+
+    len = sizeof(buffer) / sizeof(buffer[0]);
+    res = ParseURLFromOutsideSourceW(urlW, buffer, &len, unknown);
+    HeapFree(GetProcessHeap(), 0, urlW);
+
+    needed = WideCharToMultiByte(CP_ACP, 0, buffer, -1, NULL, 0, NULL, NULL);
+
+    res = 0;
+    if (*plen >= needed) {
+        if (out != NULL) {
+            WideCharToMultiByte(CP_ACP, 0, buffer, -1, out, *plen, NULL, NULL);
+            res = needed;
+        }
+        needed--;
+    }
+
+    *plen = needed;
+
+    TRACE("=> %d\n", res);
+    return res;
+}




More information about the wine-cvs mailing list