WININET: InternetCrackUrlW

Alberto Massari alby at exln.com
Mon Dec 30 08:48:29 CST 2002


Note: this patch requires the patch "Unicode: Moved strpbrkW" to be already applied.

Changelog:
- implemented InternetCrackUrlW and re-implemented InternetCrackUrlA by using the Unicode version. 
- InternetCrackUrlW now parses URL having the "about" and "res" schemes.

Alberto

Index: internet.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/internet.c,v
retrieving revision 1.48
diff -u -r1.48 internet.c
--- internet.c	12 Dec 2002 23:34:02 -0000	1.48
+++ internet.c	30 Dec 2002 10:59:16 -0000
@@ -58,6 +58,8 @@
 
 #include "internet.h"
 
+#include "wine/unicode.h"
+
 WINE_DEFAULT_DEBUG_CHANNEL(wininet);
 
 #define MAX_IDLE_WORKER 1000*60*1
@@ -82,7 +84,6 @@
     CHAR   response[MAX_REPLY_LEN];
 } WITHREADERROR, *LPWITHREADERROR;
 
-INTERNET_SCHEME GetInternetScheme(LPCSTR lpszScheme, INT nMaxCmp);
 BOOL WINAPI INTERNET_FindNextFileA(HINTERNET hFind, LPVOID lpvFindData);
 VOID INTERNET_ExecuteWork();
 
@@ -638,37 +639,33 @@
 
 
 /***********************************************************************
- *           SetUrlComponentValue (Internal)
+ *           ConvertUrlComponentValue (Internal)
  *
  * Helper function for InternetCrackUrlA
  *
- * RETURNS
- *    TRUE on success
- *    FALSE on failure
- *
  */
-BOOL SetUrlComponentValue(LPSTR* lppszComponent, LPDWORD dwComponentLen, 
-    LPCSTR lpszStart, INT len)
+void ConvertUrlComponentValue(LPSTR* lppszComponent, LPDWORD dwComponentLen,
+                              LPWSTR lpwszComponent, DWORD dwwComponentLen,
+                              LPCSTR lpszStart,
+                              LPCWSTR lpwszStart)
 {
-    TRACE("%s (%d)\n", lpszStart, len);
-
     if (*dwComponentLen != 0)
     {
-	if (*lppszComponent == NULL)
-	{
-            *lppszComponent = (LPSTR)lpszStart;
-	    *dwComponentLen = len;
-	}
-	else
-	{
-            INT ncpylen = min((*dwComponentLen)-1, len);
-            strncpy(*lppszComponent, lpszStart, ncpylen);
-            (*lppszComponent)[ncpylen] = '\0';
-	    *dwComponentLen = ncpylen;
-	}
+        int nASCIILength=WideCharToMultiByte(CP_ACP,0,lpwszComponent,dwwComponentLen,NULL,0,NULL,NULL);
+        if (*lppszComponent == NULL)
+        {
+            int nASCIIOffset=WideCharToMultiByte(CP_ACP,0,lpwszStart,lpwszComponent-lpwszStart,NULL,0,NULL,NULL);
+            *lppszComponent = (LPSTR)lpszStart+nASCIIOffset;
+            *dwComponentLen = nASCIILength;
+        }
+        else
+        {
+            INT ncpylen = min((*dwComponentLen)-1, nASCIILength);
+            WideCharToMultiByte(CP_ACP,0,lpwszComponent,dwwComponentLen,*lppszComponent,ncpylen+1,NULL,NULL);
+            (*lppszComponent)[ncpylen]=0;
+            *dwComponentLen = ncpylen;
+        }
     }
-
-    return TRUE;
 }
 
 
@@ -687,22 +684,172 @@
 BOOL WINAPI InternetCrackUrlA(LPCSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
     LPURL_COMPONENTSA lpUrlComponents)
 {
+  DWORD nLength;
+  URL_COMPONENTSW UCW;
+  WCHAR* lpwszUrl;
+  if(dwUrlLength==0)
+      dwUrlLength=strlen(lpszUrl);
+  lpwszUrl=HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(dwUrlLength+1));
+  memset(lpwszUrl,0,sizeof(WCHAR)*(dwUrlLength+1));
+  nLength=MultiByteToWideChar(CP_ACP,0,lpszUrl,dwUrlLength,lpwszUrl,dwUrlLength+1);
+  memset(&UCW,0,sizeof(UCW));
+  if(lpUrlComponents->dwHostNameLength!=0)
+      UCW.dwHostNameLength=1;
+  if(lpUrlComponents->dwUserNameLength!=0)
+      UCW.dwUserNameLength=1;
+  if(lpUrlComponents->dwPasswordLength!=0)
+      UCW.dwPasswordLength=1;
+  if(lpUrlComponents->dwUrlPathLength!=0)
+      UCW.dwUrlPathLength=1;
+  if(lpUrlComponents->dwSchemeLength!=0)
+      UCW.dwSchemeLength=1;
+  if(lpUrlComponents->dwExtraInfoLength!=0)
+      UCW.dwExtraInfoLength=1;
+  if(!InternetCrackUrlW(lpwszUrl,nLength,dwFlags,&UCW))
+  {
+      HeapFree(GetProcessHeap(), 0, lpwszUrl);
+      return FALSE;
+  }
+  ConvertUrlComponentValue(&lpUrlComponents->lpszHostName, &lpUrlComponents->dwHostNameLength,
+                           UCW.lpszHostName, UCW.dwHostNameLength,
+                           lpszUrl, lpwszUrl);
+  ConvertUrlComponentValue(&lpUrlComponents->lpszUserName, &lpUrlComponents->dwUserNameLength,
+                           UCW.lpszUserName, UCW.dwUserNameLength,
+                           lpszUrl, lpwszUrl);
+  ConvertUrlComponentValue(&lpUrlComponents->lpszPassword, &lpUrlComponents->dwPasswordLength,
+                           UCW.lpszPassword, UCW.dwPasswordLength,
+                           lpszUrl, lpwszUrl);
+  ConvertUrlComponentValue(&lpUrlComponents->lpszUrlPath, &lpUrlComponents->dwUrlPathLength,
+                           UCW.lpszUrlPath, UCW.dwUrlPathLength,
+                           lpszUrl, lpwszUrl);
+  ConvertUrlComponentValue(&lpUrlComponents->lpszScheme, &lpUrlComponents->dwSchemeLength,
+                           UCW.lpszScheme, UCW.dwSchemeLength,
+                           lpszUrl, lpwszUrl);
+  ConvertUrlComponentValue(&lpUrlComponents->lpszExtraInfo, &lpUrlComponents->dwExtraInfoLength,
+                           UCW.lpszExtraInfo, UCW.dwExtraInfoLength,
+                           lpszUrl, lpwszUrl);
+  lpUrlComponents->nScheme=UCW.nScheme;
+  lpUrlComponents->nPort=UCW.nPort;
+  HeapFree(GetProcessHeap(), 0, lpwszUrl);
+  
+  TRACE("%s: scheme(%s) host(%s) path(%s) extra(%s)\n", lpszUrl,
+          debugstr_an(lpUrlComponents->lpszScheme,lpUrlComponents->dwSchemeLength),
+          debugstr_an(lpUrlComponents->lpszHostName,lpUrlComponents->dwHostNameLength),
+          debugstr_an(lpUrlComponents->lpszUrlPath,lpUrlComponents->dwUrlPathLength),
+          debugstr_an(lpUrlComponents->lpszExtraInfo,lpUrlComponents->dwExtraInfoLength));
+
+  return TRUE;
+}
+
+/***********************************************************************
+ *           GetInternetSchemeW (internal)
+ *
+ * Get scheme of url
+ *
+ * RETURNS
+ *    scheme on success
+ *    INTERNET_SCHEME_UNKNOWN on failure
+ *
+ */
+INTERNET_SCHEME GetInternetSchemeW(LPCWSTR lpszScheme, INT nMaxCmp)
+{
+    INTERNET_SCHEME iScheme=INTERNET_SCHEME_UNKNOWN;
+    WCHAR lpszFtp[]={'f','t','p',0};
+    WCHAR lpszGopher[]={'g','o','p','h','e','r',0};
+    WCHAR lpszHttp[]={'h','t','t','p',0};
+    WCHAR lpszHttps[]={'h','t','t','p','s',0};
+    WCHAR lpszFile[]={'f','i','l','e',0};
+    WCHAR lpszNews[]={'n','e','w','s',0};
+    WCHAR lpszMailto[]={'m','a','i','l','t','o',0};
+    WCHAR lpszRes[]={'r','e','s',0};
+    WCHAR* tempBuffer=NULL;
+    TRACE("\n");
+    if(lpszScheme==NULL)
+        return INTERNET_SCHEME_UNKNOWN;
+
+    tempBuffer=malloc(nMaxCmp+1);
+    strncpyW(tempBuffer,lpszScheme,nMaxCmp);
+    tempBuffer[nMaxCmp]=0;
+    strlwrW(tempBuffer);
+    if (nMaxCmp==strlenW(lpszFtp) && !strncmpW(lpszFtp, tempBuffer, nMaxCmp))
+        iScheme=INTERNET_SCHEME_FTP;
+    else if (nMaxCmp==strlenW(lpszGopher) && !strncmpW(lpszGopher, tempBuffer, nMaxCmp))
+        iScheme=INTERNET_SCHEME_GOPHER;
+    else if (nMaxCmp==strlenW(lpszHttp) && !strncmpW(lpszHttp, tempBuffer, nMaxCmp))
+        iScheme=INTERNET_SCHEME_HTTP;
+    else if (nMaxCmp==strlenW(lpszHttps) && !strncmpW(lpszHttps, tempBuffer, nMaxCmp))
+        iScheme=INTERNET_SCHEME_HTTPS;
+    else if (nMaxCmp==strlenW(lpszFile) && !strncmpW(lpszFile, tempBuffer, nMaxCmp))
+        iScheme=INTERNET_SCHEME_FILE;
+    else if (nMaxCmp==strlenW(lpszNews) && !strncmpW(lpszNews, tempBuffer, nMaxCmp))
+        iScheme=INTERNET_SCHEME_NEWS;
+    else if (nMaxCmp==strlenW(lpszMailto) && !strncmpW(lpszMailto, tempBuffer, nMaxCmp))
+        iScheme=INTERNET_SCHEME_MAILTO;
+    else if (nMaxCmp==strlenW(lpszRes) && !strncmpW(lpszRes, tempBuffer, nMaxCmp))
+        iScheme=INTERNET_SCHEME_RES;
+    free(tempBuffer);
+    return iScheme;
+}
+
+/***********************************************************************
+ *           SetUrlComponentValueW (Internal)
+ *
+ * Helper function for InternetCrackUrlW
+ *
+ * RETURNS
+ *    TRUE on success
+ *    FALSE on failure
+ *
+ */
+BOOL SetUrlComponentValueW(LPWSTR* lppszComponent, LPDWORD dwComponentLen, LPCWSTR lpszStart, INT len)
+{
+    TRACE("%s (%d)\n", debugstr_wn(lpszStart,len), len);
+
+    if (*dwComponentLen != 0)
+    {
+        if (*lppszComponent == NULL)
+        {
+            *lppszComponent = (LPWSTR)lpszStart;
+            *dwComponentLen = len;
+        }
+        else
+        {
+            INT ncpylen = min((*dwComponentLen)-1, len);
+            strncpyW(*lppszComponent, lpszStart, ncpylen);
+            (*lppszComponent)[ncpylen] = '\0';
+            *dwComponentLen = ncpylen;
+        }
+    }
+
+    return TRUE;
+}
+
+/***********************************************************************
+ *           InternetCrackUrlW   (WININET.@)
+ */
+BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
+                              LPURL_COMPONENTSW lpUC)
+{
   /*
    * 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;
+    WCHAR lpszSeparators[3]={';','?',0};
+    WCHAR lpszSlash[2]={'/',0};
+    if(dwUrlLength==0)
+        dwUrlLength=strlenW(lpszUrl);
 
     TRACE("\n");
 
     /* Determine if the URI is absolute. */
     while (*lpszap != '\0')
     {
-        if (isalnum(*lpszap))
+        if (isalnumW(*lpszap))
         {
             lpszap++;
             continue;
@@ -712,127 +859,158 @@
             bIsAbsolute = TRUE;
             lpszcp = lpszap;
         }
-	else
-	{
-	    lpszcp = (LPSTR)lpszUrl; /* Relative url */
+        else
+        {
+            lpszcp = (LPWSTR)lpszUrl; /* Relative url */
         }
 
         break;
     }
 
     /* Parse <params> */
-    lpszParam = strpbrk(lpszap, ";?");
+    lpszParam = strpbrkW(lpszap, lpszSeparators);
     if (lpszParam != NULL)
     {
-        if (!SetUrlComponentValue(&lpUrlComponents->lpszExtraInfo,
-	     &lpUrlComponents->dwExtraInfoLength, lpszParam+1, strlen(lpszParam+1)))
+        if (!SetUrlComponentValueW(&lpUC->lpszExtraInfo, &lpUC->dwExtraInfoLength,
+                                   lpszParam, dwUrlLength-(lpszParam-lpszUrl)))
         {
-	    return FALSE;
-        }
+            return FALSE;
         }
+    }
 
     if (bIsAbsolute) /* Parse <protocol>:[//<net_loc>] */
-        {
-	LPSTR lpszNetLoc;
+    {
+        LPWSTR lpszNetLoc;
+        WCHAR wszAbout[]={'a','b','o','u','t',':',0};
 
         /* Get scheme first. */
-        lpUrlComponents->nScheme = GetInternetScheme(lpszUrl, lpszcp - lpszUrl);
-        if (!SetUrlComponentValue(&lpUrlComponents->lpszScheme,
-		    &lpUrlComponents->dwSchemeLength, lpszUrl, lpszcp - lpszUrl))
-	    return FALSE;
+        lpUC->nScheme = GetInternetSchemeW(lpszUrl, lpszcp - lpszUrl);
+        if (!SetUrlComponentValueW(&lpUC->lpszScheme, &lpUC->dwSchemeLength,
+                                   lpszUrl, lpszcp - lpszUrl))
+            return FALSE;
 
         /* Eat ':' in protocol. */
         lpszcp++;
 
-        /* Skip over slashes. */
-        if (*lpszcp == '/')
+        /* if the scheme is "about", there is no host */
+        if(strncmpW(wszAbout,lpszUrl, lpszcp - lpszUrl)==0)
+        {
+            SetUrlComponentValueW(&lpUC->lpszUserName, &lpUC->dwUserNameLength, NULL, 0);
+            SetUrlComponentValueW(&lpUC->lpszPassword, &lpUC->dwPasswordLength, NULL, 0);
+            SetUrlComponentValueW(&lpUC->lpszHostName, &lpUC->dwHostNameLength, NULL, 0);
+            lpUC->nPort = 0;
+        }
+        else
         {
-            lpszcp++;
+            /* Skip over slashes. */
             if (*lpszcp == '/')
             {
                 lpszcp++;
                 if (*lpszcp == '/')
+                {
                     lpszcp++;
+                    if (*lpszcp == '/')
+                        lpszcp++;
+                }
             }
-        }
 
-        lpszNetLoc = strpbrk(lpszcp, "/");
-	if (lpszParam)
-        {
-	    if (lpszNetLoc)
-               lpszNetLoc = min(lpszNetLoc, lpszParam);
-        else
-               lpszNetLoc = lpszParam;
-        }
-        else if (!lpszNetLoc)
-            lpszNetLoc = lpszcp + strlen(lpszcp);
+            lpszNetLoc = strpbrkW(lpszcp, lpszSlash);
+            if (lpszParam)
+            {
+                if (lpszNetLoc)
+                    lpszNetLoc = min(lpszNetLoc, lpszParam);
+                else
+                    lpszNetLoc = lpszParam;
+            }
+            else if (!lpszNetLoc)
+                lpszNetLoc = lpszcp + dwUrlLength-(lpszcp-lpszUrl);
 
-        /* Parse net-loc */
-        if (lpszNetLoc)
-        {
-	    LPSTR lpszHost;
-	    LPSTR lpszPort;
+            /* Parse net-loc */
+            if (lpszNetLoc)
+            {
+                LPWSTR lpszHost;
+                LPWSTR lpszPort;
 
                 /* [<user>[<:password>]@]<host>[:<port>] */
-            /* First find the user and password if they exist */
+                /* First find the user and password if they exist */
 
-            lpszHost = strchr(lpszcp, '@');
-            if (lpszHost == NULL || lpszHost > lpszNetLoc)
+                lpszHost = strchrW(lpszcp, '@');
+                if (lpszHost == NULL || lpszHost > lpszNetLoc)
                 {
-                /* username and password not specified. */
-		SetUrlComponentValue(&lpUrlComponents->lpszUserName,
-			&lpUrlComponents->dwUserNameLength, NULL, 0);
-		SetUrlComponentValue(&lpUrlComponents->lpszPassword,
-			&lpUrlComponents->dwPasswordLength, NULL, 0);
+                    /* username and password not specified. */
+                    SetUrlComponentValueW(&lpUC->lpszUserName, &lpUC->dwUserNameLength, NULL, 0);
+                    SetUrlComponentValueW(&lpUC->lpszPassword, &lpUC->dwPasswordLength, NULL, 0);
                 }
-            else /* Parse out username and password */
+                else /* Parse out username and password */
                 {
-		LPSTR lpszUser = lpszcp;
-		LPSTR lpszPasswd = lpszHost;
+                    LPWSTR lpszUser = lpszcp;
+                    LPWSTR lpszPasswd = lpszHost;
 
-		while (lpszcp < lpszHost)
-                        {
-		   if (*lpszcp == ':')
-		       lpszPasswd = lpszcp;
+                    while (lpszcp < lpszHost)
+                    {
+                        if (*lpszcp == ':')
+                            lpszPasswd = lpszcp;
 
-		   lpszcp++;
+                        lpszcp++;
                     }
 
-		SetUrlComponentValue(&lpUrlComponents->lpszUserName,
-			&lpUrlComponents->dwUserNameLength, lpszUser, lpszPasswd - lpszUser);
+                    SetUrlComponentValueW(&lpUC->lpszUserName, &lpUC->dwUserNameLength,
+                                          lpszUser, lpszPasswd - lpszUser);
 
-                if (lpszPasswd != lpszHost)
-                    lpszPasswd++;
-		SetUrlComponentValue(&lpUrlComponents->lpszPassword,
-			&lpUrlComponents->dwPasswordLength,
-			lpszPasswd == lpszHost ? NULL : lpszPasswd,
-			lpszHost - lpszPasswd);
+                    if (lpszPasswd != lpszHost)
+                        lpszPasswd++;
+                    SetUrlComponentValueW(&lpUC->lpszPassword, &lpUC->dwPasswordLength,
+                                          lpszPasswd == lpszHost ? NULL : lpszPasswd,
+                                          lpszHost - lpszPasswd);
 
-		lpszcp++; /* Advance to beginning of host */
+                    lpszcp++; /* Advance to beginning of host */
                 }
 
-            /* Parse <host><:port> */
+                /* Parse <host><:port> */
 
-	    lpszHost = lpszcp;
-	    lpszPort = lpszNetLoc;
+                lpszHost = lpszcp;
+                lpszPort = lpszNetLoc;
 
-	    while (lpszcp < lpszNetLoc)
-		    {
-		if (*lpszcp == ':')
-                    lpszPort = lpszcp;
-
-		lpszcp++;
+                /* special case for res:// URLs: there is no port here, so the host is the
+                   entire string up to the first '/' */
+                if(lpUC->nScheme==INTERNET_SCHEME_RES)
+                {
+                    SetUrlComponentValueW(&lpUC->lpszHostName, &lpUC->dwHostNameLength,
+                                          lpszHost, lpszPort - lpszHost);
+                    lpUC->nPort = 0;
+                    lpszcp=lpszNetLoc;
                 }
+                else
+                {
+                    while (lpszcp < lpszNetLoc)
+                    {
+                        if (*lpszcp == ':')
+                            lpszPort = lpszcp;
 
-            SetUrlComponentValue(&lpUrlComponents->lpszHostName,
-               &lpUrlComponents->dwHostNameLength, lpszHost, lpszPort - lpszHost);
+                        lpszcp++;
+                    }
 
-	    if (lpszPort != lpszNetLoc)
-                lpUrlComponents->nPort = atoi(++lpszPort);
-            else
-                lpUrlComponents->nPort = 0;
+                    /* If the scheme is "file" and the host is just one letter, it's not a host */
+                    if(lpUC->nScheme==INTERNET_SCHEME_FILE && (lpszPort-lpszHost)==1)
+                    {
+                        lpszcp=lpszHost;
+                        SetUrlComponentValueW(&lpUC->lpszHostName, &lpUC->dwHostNameLength,
+                                              NULL, 0);
+                        lpUC->nPort = 0;
+                    }
+                    else
+                    {
+                        SetUrlComponentValueW(&lpUC->lpszHostName, &lpUC->dwHostNameLength,
+                                              lpszHost, lpszPort - lpszHost);
+                        if (lpszPort != lpszNetLoc)
+                            lpUC->nPort = atoiW(++lpszPort);
+                        else
+                            lpUC->nPort = 0;
+                    }
+                }
             }
         }
+    }
 
     /* Here lpszcp points to:
      *
@@ -844,48 +1022,39 @@
         INT len;
 
         /* Only truncate the parameter list if it's already been saved
-         * in lpUrlComponents->lpszExtraInfo.
+         * in lpUC->lpszExtraInfo.
          */
-        if (lpszParam && lpUrlComponents->dwExtraInfoLength)
+        if (lpszParam && lpUC->dwExtraInfoLength)
             len = lpszParam - lpszcp;
         else
         {
             /* 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 = dwUrlLength-(lpszcp-lpszUrl);
         }
 
-        if (!SetUrlComponentValue(&lpUrlComponents->lpszUrlPath,
-         &lpUrlComponents->dwUrlPathLength, lpszcp, len))
-         return FALSE;
+        if (!SetUrlComponentValueW(&lpUC->lpszUrlPath, &lpUC->dwUrlPathLength,
+                                   lpszcp, len))
+            return FALSE;
     }
     else
     {
-        lpUrlComponents->dwUrlPathLength = 0;
+        lpUC->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_wn(lpszUrl,dwUrlLength),
+             debugstr_wn(lpUC->lpszHostName,lpUC->dwHostNameLength),
+             debugstr_wn(lpUC->lpszUrlPath,lpUC->dwUrlPathLength),
+             debugstr_wn(lpUC->lpszExtraInfo,lpUC->dwExtraInfoLength));
 
     return TRUE;
 }
 
-
-/***********************************************************************
- *           InternetCrackUrlW   (WININET.@)
- */
-BOOL WINAPI InternetCrackUrlW(LPCWSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
-                              LPURL_COMPONENTSW lpUrlComponents)
-{
-    FIXME("stub\n");
-    return FALSE;
-}
-
 /***********************************************************************
  *           InternetAttemptConnect (WININET.@)
  *
@@ -1408,40 +1609,6 @@
 
 
 /***********************************************************************
- *           GetInternetScheme (internal)
- *
- * Get scheme of url
- *
- * RETURNS
- *    scheme on success
- *    INTERNET_SCHEME_UNKNOWN on failure
- *
- */
-INTERNET_SCHEME GetInternetScheme(LPCSTR 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;
-}
-
-/***********************************************************************
  *	InternetCheckConnectionA (WININET.@)
  *
  * Pings a requested host to check internet connection





More information about the wine-patches mailing list