InternetCrackUrlW

Dominik Strasser Dominik.Strasser at t-online.de
Sun Dec 29 13:40:23 CST 2002


This patch implements InternetCrackUrlW by changing the ASCII 
implemtation and thunking the ASCII implementation down to the ...W 
implementation. I hope this is the right way to go in this case as most 
functions in wininet do it the other way around. But this seemed rather 
tedious in this case as a multibyte string would have to be parsed which 
would involve a lot of calls to get the actual length of each multibyte 
char.
Additionally this patch contains a FIXME for the not implemented HTTP 
proxy protocol (to illustrate this, try to run IE6 setup behind a firewall).

This patch needs 
http://www.winehq.com/hypermail/wine-patches/2002/12/0388.html
to be applied before.


Regards

Dominik
-------------- next part --------------
Index: dlls/wininet/internet.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/internet.c,v
retrieving revision 1.48
diff -u -3 -p -r1.48 internet.c
--- dlls/wininet/internet.c	12 Dec 2002 23:34:02 -0000	1.48
+++ dlls/wininet/internet.c	29 Dec 2002 19:34:41 -0000
@@ -54,6 +54,7 @@
 #include "shlwapi.h"
 
 #include "wine/exception.h"
+#include "wine/unicode.h"
 #include "excpt.h"
 
 #include "internet.h"
@@ -82,7 +83,7 @@ typedef struct
     CHAR   response[MAX_REPLY_LEN];
 } WITHREADERROR, *LPWITHREADERROR;
 
-INTERNET_SCHEME GetInternetScheme(LPCSTR lpszScheme, INT nMaxCmp);
+INTERNET_SCHEME GetInternetScheme(LPCWSTR lpszScheme, INT nMaxCmp);
 BOOL WINAPI INTERNET_FindNextFileA(HINTERNET hFind, LPVOID lpvFindData);
 VOID INTERNET_ExecuteWork();
 
@@ -640,29 +641,32 @@ BOOL WINAPI InternetCloseHandle(HINTERNE
 /***********************************************************************
  *           SetUrlComponentValue (Internal)
  *
- * Helper function for InternetCrackUrlA
+ * Helper function for InternetCrackUrlW
  *
  * RETURNS
  *    TRUE on success
  *    FALSE on failure
  *
  */
-BOOL SetUrlComponentValue(LPSTR* lppszComponent, LPDWORD dwComponentLen, 
-    LPCSTR lpszStart, INT len)
+BOOL SetUrlComponentValue(LPWSTR* lppszComponent, LPDWORD dwComponentLen, 
+    LPCWSTR lpszStart, INT len)
 {
-    TRACE("%s (%d)\n", lpszStart, len);
+    TRACE("%s (%d)\n", debugstr_w(lpszStart), len);
 
     if (*dwComponentLen != 0)
     {
 	if (*lppszComponent == NULL)
 	{
-            *lppszComponent = (LPSTR)lpszStart;
+	    /* !! FIXME: memory leak */
+	    *lppszComponent = (WCHAR*)malloc((len + 1) * sizeof(WCHAR));
+	    memcpy(*lppszComponent, lpszStart, len * sizeof(WCHAR));
+		(*lppszComponent)[len] = 0;
 	    *dwComponentLen = len;
 	}
 	else
 	{
             INT ncpylen = min((*dwComponentLen)-1, len);
-            strncpy(*lppszComponent, lpszStart, ncpylen);
+            strncpyW(*lppszComponent, lpszStart, ncpylen);
             (*lppszComponent)[ncpylen] = '\0';
 	    *dwComponentLen = ncpylen;
 	}
@@ -673,7 +677,7 @@ BOOL SetUrlComponentValue(LPSTR* lppszCo
 
 
 /***********************************************************************
- *           InternetCrackUrlA (WININET.@)
+ *           InternetCrackUrlW (WININET.@)
  *
  * Break up URL into its components
  *
@@ -684,25 +688,26 @@ BOOL SetUrlComponentValue(LPSTR* lppszCo
  *    FALSE on failure
  *
  */
-BOOL WINAPI InternetCrackUrlA(LPCSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
-    LPURL_COMPONENTSA lpUrlComponents)
+BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
+    LPURL_COMPONENTSW lpUrlComponents)
 {
   /*
    * RFC 1808
    * <protocol>:[//<net_loc>][/path][;<params>][?<query>][#<fragment>]
    *
    */
-    LPSTR lpszParam    = NULL;
+    LPWSTR lpszParam    = NULL;
     BOOL  bIsAbsolute = FALSE;
-    LPSTR lpszap = (char*)lpszUrl;
-    LPSTR lpszcp = NULL;
+    LPWSTR lpszap = (WCHAR*)lpszUrl;
+    LPWSTR lpszcp = NULL;
+    static WCHAR sstr[] = { ';', '?' , 0 };
 
     TRACE("\n");
 
     /* Determine if the URI is absolute. */
     while (*lpszap != '\0')
     {
-        if (isalnum(*lpszap))
+        if (isalnumW(*lpszap))
         {
             lpszap++;
             continue;
@@ -714,26 +719,26 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lps
         }
 	else
 	{
-	    lpszcp = (LPSTR)lpszUrl; /* Relative url */
+	    lpszcp = (LPWSTR)lpszUrl; /* Relative url */
         }
 
         break;
     }
 
     /* Parse <params> */
-    lpszParam = strpbrk(lpszap, ";?");
+    lpszParam = strpbrkW(lpszap, sstr);
     if (lpszParam != NULL)
     {
         if (!SetUrlComponentValue(&lpUrlComponents->lpszExtraInfo,
-	     &lpUrlComponents->dwExtraInfoLength, lpszParam+1, strlen(lpszParam+1)))
+	     &lpUrlComponents->dwExtraInfoLength, lpszParam+1, strlenW(lpszParam+1)))
         {
 	    return FALSE;
         }
-        }
+    }
 
     if (bIsAbsolute) /* Parse <protocol>:[//<net_loc>] */
         {
-	LPSTR lpszNetLoc;
+	LPWSTR lpszNetLoc;
 
         /* Get scheme first. */
         lpUrlComponents->nScheme = GetInternetScheme(lpszUrl, lpszcp - lpszUrl);
@@ -756,7 +761,7 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lps
             }
         }
 
-        lpszNetLoc = strpbrk(lpszcp, "/");
+        lpszNetLoc = strchrW(lpszcp, '/');
 	if (lpszParam)
         {
 	    if (lpszNetLoc)
@@ -765,18 +770,18 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lps
                lpszNetLoc = lpszParam;
         }
         else if (!lpszNetLoc)
-            lpszNetLoc = lpszcp + strlen(lpszcp);
+            lpszNetLoc = lpszcp + strlenW(lpszcp);
 
         /* Parse net-loc */
         if (lpszNetLoc)
         {
-	    LPSTR lpszHost;
-	    LPSTR lpszPort;
+	    LPWSTR lpszHost;
+	    LPWSTR lpszPort;
 
                 /* [<user>[<:password>]@]<host>[:<port>] */
             /* First find the user and password if they exist */
 
-            lpszHost = strchr(lpszcp, '@');
+            lpszHost = strchrW(lpszcp, '@');
             if (lpszHost == NULL || lpszHost > lpszNetLoc)
                 {
                 /* username and password not specified. */
@@ -787,8 +792,8 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lps
                 }
             else /* Parse out username and password */
                 {
-		LPSTR lpszUser = lpszcp;
-		LPSTR lpszPasswd = lpszHost;
+		LPWSTR lpszUser = lpszcp;
+		LPWSTR lpszPasswd = lpszHost;
 
 		while (lpszcp < lpszHost)
                         {
@@ -828,7 +833,7 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lps
                &lpUrlComponents->dwHostNameLength, lpszHost, lpszPort - lpszHost);
 
 	    if (lpszPort != lpszNetLoc)
-                lpUrlComponents->nPort = atoi(++lpszPort);
+                lpUrlComponents->nPort = atoiW(++lpszPort);
             else
                 lpUrlComponents->nPort = 0;
             }
@@ -853,11 +858,11 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lps
             /* Leave the parameter list in lpszUrlPath.  Strip off any trailing
              * newlines if necessary.
              */
-            LPSTR lpsznewline = strchr (lpszcp, '\n');
+            LPWSTR lpsznewline = strchrW (lpszcp, '\n');
             if (lpsznewline != NULL)
                 len = lpsznewline - lpszcp;
             else
-                len = strlen(lpszcp);
+                len = strlenW(lpszcp);
         }
 
         if (!SetUrlComponentValue(&lpUrlComponents->lpszUrlPath,
@@ -869,21 +874,60 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lps
         lpUrlComponents->dwUrlPathLength = 0;
     }
 
-    TRACE("%s: host(%s) path(%s) extra(%s)\n", lpszUrl, lpUrlComponents->lpszHostName,
-          lpUrlComponents->lpszUrlPath, lpUrlComponents->lpszExtraInfo);
+    TRACE("%s: host(%s) path(%s) extra(%s)\n", debugstr_w(lpszUrl), debugstr_w(lpUrlComponents->lpszHostName),
+          debugstr_w(lpUrlComponents->lpszUrlPath), debugstr_w(lpUrlComponents->lpszExtraInfo));
 
     return TRUE;
 }
 
 
 /***********************************************************************
- *           InternetCrackUrlW   (WININET.@)
+ *           InternetCrackUrlA   (WININET.@)
  */
-BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
-                              LPURL_COMPONENTSW lpUrlComponents)
+BOOL WINAPI InternetCrackUrlA(LPCSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
+                              LPURL_COMPONENTSA lpUrlComponents)
 {
-    FIXME("stub\n");
-    return FALSE;
+  /*
+   * RFC 1808
+   * <protocol>:[//<net_loc>][/path][;<params>][?<query>][#<fragment>]
+   *
+   */
+	INT lenUrl = strlen(lpszUrl)+1;
+	WCHAR* szUrl = (WCHAR*)malloc(lenUrl*sizeof(WCHAR));
+	URL_COMPONENTSW urlComponents;
+	BOOL ret;
+
+	TRACE("%s %08lx %08lx\n", lpszUrl, dwUrlLength, dwFlags);
+
+
+	MultiByteToWideChar(CP_ACP, 0, lpszUrl, -1, szUrl, -1);
+
+	ret = InternetCrackUrlW(szUrl, dwUrlLength, dwFlags, &urlComponents);
+
+	if(ret)
+	{
+		lpUrlComponents->dwStructSize = urlComponents.dwStructSize;
+		WideCharToMultiByte(CP_ACP, -1, urlComponents.lpszScheme, -1, lpUrlComponents->lpszScheme, urlComponents.dwSchemeLength, NULL, NULL);
+		lpUrlComponents->dwSchemeLength = urlComponents.dwSchemeLength;
+		lpUrlComponents->nScheme = urlComponents.nScheme;
+		WideCharToMultiByte(CP_ACP, -1, urlComponents.lpszHostName, -1, lpUrlComponents->lpszHostName,
+			urlComponents.dwHostNameLength, NULL, NULL);
+		lpUrlComponents->dwHostNameLength = urlComponents.dwHostNameLength;
+		lpUrlComponents->nPort = urlComponents.nPort;
+		WideCharToMultiByte(CP_ACP, -1, urlComponents.lpszUserName, -1, lpUrlComponents->lpszUserName,
+			urlComponents.dwUserNameLength, NULL, NULL);
+		lpUrlComponents->dwUserNameLength = urlComponents.dwUserNameLength;
+		WideCharToMultiByte(CP_ACP, -1, urlComponents.lpszPassword, -1, lpUrlComponents->lpszPassword,
+			urlComponents.dwPasswordLength, NULL, NULL);
+		lpUrlComponents->dwPasswordLength = urlComponents.dwPasswordLength;
+		WideCharToMultiByte(CP_ACP, -1, urlComponents.lpszUrlPath, -1, lpUrlComponents->lpszUrlPath,
+			urlComponents.dwUrlPathLength, NULL, NULL);
+		lpUrlComponents->dwUrlPathLength = urlComponents.dwUrlPathLength;
+		WideCharToMultiByte(CP_ACP, -1, urlComponents.lpszExtraInfo, -1, lpUrlComponents->lpszExtraInfo,
+			urlComponents.dwExtraInfoLength, NULL, NULL);
+		lpUrlComponents->dwExtraInfoLength = urlComponents.dwExtraInfoLength;
+	}
+	return ret;
 }
 
 /***********************************************************************
@@ -1417,28 +1461,35 @@ BOOL WINAPI InternetSetCookieW(LPCSTR lp
  *    INTERNET_SCHEME_UNKNOWN on failure
  *
  */
-INTERNET_SCHEME GetInternetScheme(LPCSTR lpszScheme, INT nMaxCmp)
+INTERNET_SCHEME GetInternetScheme(LPCWSTR lpszScheme, INT nMaxCmp)
 {
-    TRACE("\n");
-    if(lpszScheme==NULL)
-        return INTERNET_SCHEME_UNKNOWN;
-
-    if (!strncasecmp("ftp", lpszScheme, nMaxCmp))
-        return INTERNET_SCHEME_FTP;
-    else if (!strncasecmp("gopher", lpszScheme, nMaxCmp))
-        return INTERNET_SCHEME_GOPHER;
-    else if (!strncasecmp("http", lpszScheme, nMaxCmp))
-        return INTERNET_SCHEME_HTTP;
-    else if (!strncasecmp("https", lpszScheme, nMaxCmp))
-        return INTERNET_SCHEME_HTTPS;
-    else if (!strncasecmp("file", lpszScheme, nMaxCmp))
-        return INTERNET_SCHEME_FILE;
-    else if (!strncasecmp("news", lpszScheme, nMaxCmp))
-        return INTERNET_SCHEME_NEWS;
-    else if (!strncasecmp("mailto", lpszScheme, nMaxCmp))
-        return INTERNET_SCHEME_MAILTO;
-    else
-        return INTERNET_SCHEME_UNKNOWN;
+	static const WCHAR ftpW[] = {'f','t','p'};
+	static const WCHAR gopherW[] = {'g','o','p','h','e','r'};
+	static const WCHAR httpW[] = {'h','t','t','p'};
+	static const WCHAR httpsW[] = {'h','t','t','p','s'};
+	static const WCHAR fileW[] = {'f','i','l','e'};
+	static const WCHAR newsW[] = {'n','e','w','s'};
+	static const WCHAR mailtoW[] = {'m','a','i','l','t','o'};
+	TRACE("\n");
+	if(lpszScheme==NULL)
+		return INTERNET_SCHEME_UNKNOWN;
+
+	if (!strncasecmpW(ftpW, lpszScheme, nMaxCmp))
+		return INTERNET_SCHEME_FTP;
+	else if (!strncasecmpW(gopherW, lpszScheme, nMaxCmp))
+		return INTERNET_SCHEME_GOPHER;
+	else if (!strncasecmpW(httpW, lpszScheme, nMaxCmp))
+		return INTERNET_SCHEME_HTTP;
+	else if (!strncasecmpW(httpsW, lpszScheme, nMaxCmp))
+		return INTERNET_SCHEME_HTTPS;
+	else if (!strncasecmpW(fileW, lpszScheme, nMaxCmp))
+		return INTERNET_SCHEME_FILE;
+	else if (!strncasecmpW(newsW, lpszScheme, nMaxCmp))
+		return INTERNET_SCHEME_NEWS;
+	else if (!strncasecmpW(mailtoW, lpszScheme, nMaxCmp))
+		return INTERNET_SCHEME_MAILTO;
+	else
+		return INTERNET_SCHEME_UNKNOWN;
 }
 
 /***********************************************************************
Index: dlls/wininet/http.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/http.c,v
retrieving revision 1.32
diff -u -3 -p -r1.32 http.c
--- dlls/wininet/http.c	6 Dec 2002 23:20:31 -0000	1.32
+++ dlls/wininet/http.c	29 Dec 2002 19:34:42 -0000
@@ -1098,6 +1098,11 @@ HINTERNET HTTP_Connect(HINTERNET hIntern
 
     hIC = (LPWININETAPPINFOA) hInternet;
     hIC->hdr.dwContext = dwContext;
+    
+    if(hIC->lpszProxy != NULL)
+    {
+    	FIXME("Proxy settings are ignored.\n");
+    }
 
     lpwhs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WININETHTTPSESSIONA));
     if (NULL == lpwhs)


More information about the wine-patches mailing list