Robert Shearman : wininet: Parse the scheme the string in InternetCreateFileW.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 9 16:06:10 CST 2006


Module: wine
Branch: refs/heads/master
Commit: e58a448c4a11c1d5058c81e1c786f10f4a80cf42
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=e58a448c4a11c1d5058c81e1c786f10f4a80cf42

Author: Robert Shearman <rob at codeweavers.com>
Date:   Thu Mar  9 15:16:41 2006 +0000

wininet: Parse the scheme the string in InternetCreateFileW.

Parse the scheme the string in InternetCreateFileW and rewrite
url_uses_default_port using schemes instead of strings.

---

 dlls/wininet/internet.c   |   59 +++++++++++++++++++++++++++------------------
 dlls/wininet/tests/http.c |    2 --
 2 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 3255384..4a2f001 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -3685,28 +3685,19 @@ BOOL WINAPI InternetCombineUrlW(LPCWSTR 
 #define URL_GET_COMP_LENGTHA(url, component) ((url)->dw##component##Length ? \
     (url)->dw##component##Length : strlen((url)->lpsz##component))
 
-static BOOL url_uses_default_port(LPURL_COMPONENTSW lpUrlComponents)
+static BOOL url_uses_default_port(INTERNET_SCHEME nScheme, INTERNET_PORT nPort)
 {
-    static const WCHAR httpW[] = {'h','t','t','p',0};
-    static const WCHAR httpsW[] = {'h','t','t','p','s',0};
-    static const WCHAR ftpW[] = {'f','t','p',0};
-    static const WCHAR gopherW[] = {'g','o','p','h','e','r',0};
-    DWORD len;
-
-    if (!lpUrlComponents->lpszScheme) return FALSE;
-
-    len = URL_GET_COMP_LENGTH(lpUrlComponents, Scheme);
-    if (!strncmpW(lpUrlComponents->lpszScheme, httpW, len) &&
-        (lpUrlComponents->nPort == INTERNET_DEFAULT_HTTP_PORT))
+    if ((nScheme == INTERNET_SCHEME_HTTP) &&
+        (nPort == INTERNET_DEFAULT_HTTP_PORT))
         return TRUE;
-    if (!strncmpW(lpUrlComponents->lpszScheme, httpsW, len) &&
-        (lpUrlComponents->nPort == INTERNET_DEFAULT_HTTPS_PORT))
+    if ((nScheme == INTERNET_SCHEME_HTTPS) &&
+        (nPort == INTERNET_DEFAULT_HTTPS_PORT))
         return TRUE;
-    if (!strncmpW(lpUrlComponents->lpszScheme, ftpW, len) &&
-        (lpUrlComponents->nPort == INTERNET_DEFAULT_FTP_PORT))
+    if ((nScheme == INTERNET_SCHEME_FTP) &&
+        (nPort == INTERNET_DEFAULT_FTP_PORT))
         return TRUE;
-    if (!strncmpW(lpUrlComponents->lpszScheme, gopherW, len) &&
-        (lpUrlComponents->nPort == INTERNET_DEFAULT_GOPHER_PORT))
+    if ((nScheme == INTERNET_SCHEME_GOPHER) &&
+        (nPort == INTERNET_DEFAULT_GOPHER_PORT))
         return TRUE;
 
     return FALSE;
@@ -3729,14 +3720,25 @@ static LPCWSTR INTERNET_GetSchemeString(
 static BOOL calc_url_length(LPURL_COMPONENTSW lpUrlComponents,
                             LPDWORD lpdwUrlLength)
 {
+    INTERNET_SCHEME nScheme;
+
     *lpdwUrlLength = 0;
 
     if (lpUrlComponents->lpszScheme)
-        *lpdwUrlLength += URL_GET_COMP_LENGTH(lpUrlComponents, Scheme);
+    {
+        DWORD dwLen = URL_GET_COMP_LENGTH(lpUrlComponents, Scheme);
+        *lpdwUrlLength += dwLen;
+        nScheme = GetInternetSchemeW(lpUrlComponents->lpszScheme, dwLen);
+    }
     else
     {
-        LPCWSTR scheme = INTERNET_GetSchemeString(lpUrlComponents->nScheme);
-        TRACE("got scheme %s\n", debugstr_w(scheme));
+        LPCWSTR scheme;
+
+        nScheme = lpUrlComponents->nScheme;
+
+        if (nScheme == INTERNET_SCHEME_DEFAULT)
+            nScheme = INTERNET_SCHEME_HTTP;
+        scheme = INTERNET_GetSchemeString(nScheme);
         *lpdwUrlLength += strlenW(scheme);
     }
 
@@ -3765,7 +3767,7 @@ static BOOL calc_url_length(LPURL_COMPON
     if (lpUrlComponents->lpszHostName)
         *lpdwUrlLength += URL_GET_COMP_LENGTH(lpUrlComponents, HostName);
 
-    if (!url_uses_default_port(lpUrlComponents))
+    if (!url_uses_default_port(nScheme, lpUrlComponents->nPort))
     {
         char szPort[MAX_WORD_DIGITS];
 
@@ -3905,6 +3907,7 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COM
                                LPWSTR lpszUrl, LPDWORD lpdwUrlLength)
 {
     DWORD dwLen;
+    INTERNET_SCHEME nScheme;
 
     static const WCHAR colonSlashW[] = {':','/','/'};
     static const WCHAR percentD[] = {'%','d',0};
@@ -3940,10 +3943,18 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COM
         dwLen = URL_GET_COMP_LENGTH(lpUrlComponents, Scheme);
         memcpy(lpszUrl, lpUrlComponents->lpszScheme, dwLen * sizeof(WCHAR));
         lpszUrl += dwLen;
+
+        nScheme = GetInternetSchemeW(lpUrlComponents->lpszScheme, dwLen);
     }
     else
     {
-        LPCWSTR scheme = INTERNET_GetSchemeString(lpUrlComponents->nScheme);
+        LPCWSTR scheme;
+        nScheme = lpUrlComponents->nScheme;
+
+        if (nScheme == INTERNET_SCHEME_DEFAULT)
+            nScheme = INTERNET_SCHEME_HTTP;
+
+        scheme = INTERNET_GetSchemeString(nScheme);
         dwLen = strlenW(scheme);
         memcpy(lpszUrl, scheme, dwLen * sizeof(WCHAR));
         lpszUrl += dwLen;
@@ -3979,7 +3990,7 @@ BOOL WINAPI InternetCreateUrlW(LPURL_COM
         lpszUrl += dwLen;
     }
 
-    if (!url_uses_default_port(lpUrlComponents))
+    if (!url_uses_default_port(nScheme, lpUrlComponents->nPort))
     {
         WCHAR szPort[MAX_WORD_DIGITS];
 
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 92f4c60..72ab72c 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -917,13 +917,11 @@ static void InternetCreateUrlA_test(void
 	SetLastError(0xdeadbeef);
 	urlComp.lpszScheme = NULL;
 	ret = InternetCreateUrlA(&urlComp, 0, szUrl, &len);
-	todo_wine {
 	ok(ret, "Expected success\n");
 	ok(GetLastError() == 0xdeadbeef,
 		"Expected 0xdeadbeef, got %ld\n", GetLastError());
 	ok(len == 50, "Expected len 50, got %ld\n", len);
 	ok(!strcmp(szUrl, CREATE_URL1), "Expected %s, got %s\n", CREATE_URL1, szUrl);
-	}
 
 	/* alloced szUrl, invalid nScheme
 	 * any nScheme out of range seems ignored




More information about the wine-cvs mailing list