Thomas Mullaly : urlmon: Implemented PARSE_DOCUMENT for CoInternetParseIUri .

Alexandre Julliard julliard at winehq.org
Mon Nov 29 13:38:36 CST 2010


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

Author: Thomas Mullaly <thomas.mullaly at gmail.com>
Date:   Sun Nov 28 16:21:00 2010 -0500

urlmon: Implemented PARSE_DOCUMENT for CoInternetParseIUri.

---

 dlls/urlmon/tests/uri.c |   10 +++++++++-
 dlls/urlmon/uri.c       |   42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletions(-)

diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c
index c03e516..706e8b5 100644
--- a/dlls/urlmon/tests/uri.c
+++ b/dlls/urlmon/tests/uri.c
@@ -5933,7 +5933,15 @@ static const uri_parse_test uri_parse_tests[] = {
     {"zip://google.com/",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE},
     {"file:///c:/testing/",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE},
     {"file://server/test",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE},
-    {"zip:test/test",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE}
+    {"zip:test/test",0,PARSE_ROOTDOCUMENT,0,"",S_OK,FALSE},
+
+    /* PARSE_DOCUMENT tests. */
+    {"http://[email protected]/test?query#frag",0,PARSE_DOCUMENT,0,"http://[email protected]/test?query",S_OK,FALSE},
+    {"http:testing#frag",0,PARSE_DOCUMENT,0,"",S_OK,FALSE},
+    {"file:///c:/test#frag",0,PARSE_DOCUMENT,0,"",S_OK,FALSE},
+    {"zip://google.com/#frag",0,PARSE_DOCUMENT,0,"",S_OK,FALSE},
+    {"zip:test#frag",0,PARSE_DOCUMENT,0,"",S_OK,FALSE},
+    {"testing#frag",Uri_CREATE_ALLOW_RELATIVE,PARSE_DOCUMENT,0,"",S_OK,FALSE}
 };
 
 static inline LPWSTR a2w(LPCSTR str) {
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index 475db7f..4247c71 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -6265,6 +6265,39 @@ static HRESULT parse_rootdocument(const Uri *uri, LPWSTR output, DWORD output_le
     return S_OK;
 }
 
+static HRESULT parse_document(const Uri *uri, LPWSTR output, DWORD output_len,
+                              DWORD *result_len)
+{
+    DWORD len = 0;
+
+    /* It has to be a known scheme type, but, it can't be a file
+     * scheme. It also has to hierarchical.
+     */
+    if(uri->scheme_type == URL_SCHEME_UNKNOWN ||
+       uri->scheme_type == URL_SCHEME_FILE ||
+       uri->authority_start == -1) {
+        *result_len = 0;
+        if(output_len < 1)
+            return STRSAFE_E_INSUFFICIENT_BUFFER;
+
+        output[0] = 0;
+        return S_OK;
+    }
+
+    if(uri->fragment_start > -1)
+        len = uri->fragment_start;
+    else
+        len = uri->canon_len;
+
+    *result_len = len;
+    if(len+1 > output_len)
+        return STRSAFE_E_INSUFFICIENT_BUFFER;
+
+    memcpy(output, uri->canon_uri, len*sizeof(WCHAR));
+    output[len] = 0;
+    return S_OK;
+}
+
 /***********************************************************************
  *           CoInternetParseIUri (urlmon.@)
  */
@@ -6308,6 +6341,15 @@ HRESULT WINAPI CoInternetParseIUri(IUri *pIUri, PARSEACTION ParseAction, DWORD d
         }
         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_SECURITY_URL:
     case PARSE_MIME:
     case PARSE_SERVER:




More information about the wine-cvs mailing list