Thomas Mullaly : urlmon: Added pluggable protocol support to CoInternetParseIUri.

Alexandre Julliard julliard at winehq.org
Thu Dec 9 12:26:24 CST 2010


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

Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date:   Wed Dec  8 21:28:46 2010 -0500

urlmon: Added pluggable protocol support to CoInternetParseIUri.

---

 dlls/urlmon/tests/uri.c |   53 +++++++++++++++++++++++++++++++++++++++++++++-
 dlls/urlmon/uri.c       |   41 +++++++++++++++---------------------
 2 files changed, 68 insertions(+), 26 deletions(-)

diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c
index c069d84..fd9099c 100644
--- a/dlls/urlmon/tests/uri.c
+++ b/dlls/urlmon/tests/uri.c
@@ -62,6 +62,7 @@
     }while(0)
 
 DEFINE_EXPECT(CombineUrl);
+DEFINE_EXPECT(ParseUrl);
 
 static HRESULT (WINAPI *pCreateUri)(LPCWSTR, DWORD, DWORD_PTR, IUri**);
 static HRESULT (WINAPI *pCreateUriWithFragment)(LPCWSTR, LPCWSTR, DWORD, DWORD_PTR, IUri**);
@@ -83,6 +84,12 @@ static const WCHAR combine_resultW[] = {'z','i','p',':','t','e','s','t',0};
 
 static const WCHAR winetestW[] = {'w','i','n','e','t','e','s','t',0};
 
+static const WCHAR parse_urlW[] = {'w','i','n','e','t','e','s','t',':','t','e','s','t',0};
+static const WCHAR parse_resultW[] = {'z','i','p',':','t','e','s','t',0};
+
+static PARSEACTION parse_action;
+static DWORD parse_flags;
+
 typedef struct _uri_create_flag_test {
     DWORD   flags;
     HRESULT expected;
@@ -9300,8 +9307,17 @@ static HRESULT WINAPI InternetProtocolInfo_ParseUrl(IInternetProtocolInfo *iface
         PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult,
         DWORD *pcchResult, DWORD dwReserved)
 {
-    ok(0, "unexpected call %d\n", ParseAction);
-    return E_NOTIMPL;
+    CHECK_EXPECT(ParseUrl);
+    ok(!lstrcmpW(pwzUrl, parse_urlW), "Error: Expected %s, but got %s instead.\n",
+        wine_dbgstr_w(parse_urlW), wine_dbgstr_w(pwzUrl));
+    ok(ParseAction == parse_action, "Error: Expected %d, but got %d.\n", parse_action, ParseAction);
+    ok(dwParseFlags == parse_flags, "Error: Expected 0x%08x, but got 0x%08x.\n", parse_flags, dwParseFlags);
+    ok(cchResult == 200, "Error: Got %d.\n", cchResult);
+
+    memcpy(pwzResult, parse_resultW, sizeof(parse_resultW));
+    *pcchResult = lstrlenW(parse_resultW);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI InternetProtocolInfo_CombineUrl(IInternetProtocolInfo *iface,
@@ -9725,6 +9741,36 @@ static void test_CoInternetParseIUri(void) {
     }
 }
 
+static void test_CoInternetParseIUri_Pluggable(void) {
+    HRESULT hr;
+    IUri *uri = NULL;
+
+    hr = pCreateUri(parse_urlW, 0, 0, &uri);
+    ok(SUCCEEDED(hr), "Error: Expected CreateUri to succeed, but got 0x%08x.\n", hr);
+    if(SUCCEEDED(hr)) {
+        WCHAR result[200];
+        DWORD result_len;
+
+        SET_EXPECT(ParseUrl);
+
+        parse_action = PARSE_CANONICALIZE;
+        parse_flags = URL_UNESCAPE|URL_ESCAPE_UNSAFE;
+
+        hr = pCoInternetParseIUri(uri, parse_action, parse_flags, result, 200, &result_len, 0);
+        ok(hr == S_OK, "Error: CoInternetParseIUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK);
+
+        CHECK_CALLED(ParseUrl);
+
+        if(SUCCEEDED(hr)) {
+            ok(result_len == lstrlenW(parse_resultW), "Error: Expected %d, but got %d.\n",
+                lstrlenW(parse_resultW), result_len);
+            ok(!lstrcmpW(result, parse_resultW), "Error: Expected %s, but got %s.\n",
+                wine_dbgstr_w(parse_resultW), wine_dbgstr_w(result));
+        }
+    }
+    if(uri) IUri_Release(uri);
+}
+
 START_TEST(uri) {
     HMODULE hurlmon;
 
@@ -9831,5 +9877,8 @@ START_TEST(uri) {
     trace("test CoInternetCombineUrlEx Pluggable...\n");
     test_CoInternetCombineUrlEx_Pluggable();
 
+    trace("test CoInternetParseIUri pluggable...\n");
+    test_CoInternetParseIUri_Pluggable();
+
     unregister_protocols();
 }
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index 1cccfe3..681327f 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -6203,6 +6203,7 @@ static HRESULT parse_canonicalize(const Uri *uri, DWORD flags, LPWSTR output,
                                 !(flags & URL_ESCAPE_SPACES_ONLY) &&
                                 !(flags & URL_ESCAPE_PERCENT);
 
+
     /* Check if the dot segments need to be removed from the
      * path component.
      */
@@ -6612,6 +6613,7 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d
 {
     HRESULT hr;
     Uri *uri;
+    IInternetProtocolInfo *info;
 
     TRACE("(%p %d %x %p %d %p %x)\n", pIUri, ParseAction, dwFlags, pwzResult,
         cchResult, pcchResult, (DWORD)dwReserved);
@@ -6624,44 +6626,35 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d
         return E_INVALIDARG;
     }
 
+    if(!(uri = get_uri_obj(pIUri))) {
+        *pcchResult = 0;
+        FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n",
+            pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved);
+        return E_NOTIMPL;
+    }
+
+    info = get_protocol_info(uri->canon_uri);
+    if(info) {
+        hr = IInternetProtocolInfo_ParseUrl(info, uri->canon_uri, ParseAction, dwFlags,
+                                            pwzResult, cchResult, pcchResult, 0);
+        IInternetProtocolInfo_Release(info);
+        if(SUCCEEDED(hr)) return hr;
+    }
+
     switch(ParseAction) {
     case PARSE_CANONICALIZE:
-        if(!(uri = get_uri_obj(pIUri))) {
-            *pcchResult = 0;
-            FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n",
-                pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved);
-            return E_NOTIMPL;
-        }
         hr = parse_canonicalize(uri, dwFlags, pwzResult, cchResult, pcchResult);
         break;
     case PARSE_FRIENDLY:
         hr = parse_friendly(pIUri, pwzResult, cchResult, pcchResult);
         break;
     case PARSE_ROOTDOCUMENT:
-        if(!(uri = get_uri_obj(pIUri))) {
-            *pcchResult = 0;
-            FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n",
-                pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved);
-            return E_NOTIMPL;
-        }
         hr = parse_rootdocument(uri, pwzResult, cchResult, pcchResult);
         break;
     case PARSE_DOCUMENT:
-        if(!(uri = get_uri_obj(pIUri))) {
-            *pcchResult = 0;
-            FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n",
-                pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved);
-            return E_NOTIMPL;
-        }
         hr = parse_document(uri, pwzResult, cchResult, pcchResult);
         break;
     case PARSE_PATH_FROM_URL:
-        if(!(uri = get_uri_obj(pIUri))) {
-            *pcchResult = 0;
-            FIXME("(%p %d %x %p %d %p %x) Unknown IUri's not supported for this action.\n",
-                pIUri, ParseAction, dwFlags, pwzResult, cchResult, pcchResult, (DWORD)dwReserved);
-            return E_NOTIMPL;
-        }
         hr = parse_path_from_url(uri, pwzResult, cchResult, pcchResult);
         break;
     case PARSE_URL_FROM_PATH:




More information about the wine-cvs mailing list