Jacek Caban : shlwapi: Unicodified scheme detecting code.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Feb 12 09:23:46 CST 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Feb 10 16:29:31 2007 +0100

shlwapi: Unicodified scheme detecting code.

---

 dlls/shlwapi/url.c |   98 ++++++++++++++++++++++-----------------------------
 1 files changed, 42 insertions(+), 56 deletions(-)

diff --git a/dlls/shlwapi/url.c b/dlls/shlwapi/url.c
index e89113f..6c88e91 100644
--- a/dlls/shlwapi/url.c
+++ b/dlls/shlwapi/url.c
@@ -44,31 +44,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
 /* The following schemes were identified in the native version of
  * SHLWAPI.DLL version 5.50
  */
-typedef struct {
+static const struct {
     URL_SCHEME  scheme_number;
-    LPCSTR scheme_name;
-} SHL_2_inet_scheme;
-
-static const SHL_2_inet_scheme shlwapi_schemes[] = {
-  {URL_SCHEME_FTP,        "ftp"},
-  {URL_SCHEME_HTTP,       "http"},
-  {URL_SCHEME_GOPHER,     "gopher"},
-  {URL_SCHEME_MAILTO,     "mailto"},
-  {URL_SCHEME_NEWS,       "news"},
-  {URL_SCHEME_NNTP,       "nntp"},
-  {URL_SCHEME_TELNET,     "telnet"},
-  {URL_SCHEME_WAIS,       "wais"},
-  {URL_SCHEME_FILE,       "file"},
-  {URL_SCHEME_MK,         "mk"},
-  {URL_SCHEME_HTTPS,      "https"},
-  {URL_SCHEME_SHELL,      "shell"},
-  {URL_SCHEME_SNEWS,      "snews"},
-  {URL_SCHEME_LOCAL,      "local"},
-  {URL_SCHEME_JAVASCRIPT, "javascript"},
-  {URL_SCHEME_VBSCRIPT,   "vbscript"},
-  {URL_SCHEME_ABOUT,      "about"},
-  {URL_SCHEME_RES,        "res"},
-  {0, 0}
+    WCHAR scheme_name[12];
+} shlwapi_schemes[] = {
+  {URL_SCHEME_FTP,        {'f','t','p',0}},
+  {URL_SCHEME_HTTP,       {'h','t','t','p',0}},
+  {URL_SCHEME_GOPHER,     {'g','o','p','h','e','r',0}},
+  {URL_SCHEME_MAILTO,     {'m','a','i','l','t','o',0}},
+  {URL_SCHEME_NEWS,       {'n','e','w','s',0}},
+  {URL_SCHEME_NNTP,       {'n','n','t','p',0}},
+  {URL_SCHEME_TELNET,     {'t','e','l','n','e','t',0}},
+  {URL_SCHEME_WAIS,       {'w','a','i','s',0}},
+  {URL_SCHEME_FILE,       {'f','i','l','e',0}},
+  {URL_SCHEME_MK,         {'m','k',0}},
+  {URL_SCHEME_HTTPS,      {'h','t','t','p','s',0}},
+  {URL_SCHEME_SHELL,      {'s','h','e','l','l',0}},
+  {URL_SCHEME_SNEWS,      {'s','n','e','w','s',0}},
+  {URL_SCHEME_LOCAL,      {'l','o','c','a','l',0}},
+  {URL_SCHEME_JAVASCRIPT, {'j','a','v','a','s','c','r','i','p','t',0}},
+  {URL_SCHEME_VBSCRIPT,   {'v','b','s','c','r','i','p','t',0}},
+  {URL_SCHEME_ABOUT,      {'a','b','o','u','t',0}},
+  {URL_SCHEME_RES,        {'r','e','s',0}},
 };
 
 typedef struct {
@@ -119,6 +116,19 @@ static const unsigned char HashDataLooku
  0x25, 0x45, 0x27, 0x75, 0x92, 0xB8, 0xA3, 0xC8, 0xDE, 0xEB, 0xF8, 0xF3, 0xDB,
  0x0A, 0x98, 0x83, 0x7B, 0xE5, 0xCB, 0x4C, 0x78, 0xD1 };
 
+static DWORD get_scheme_code(LPCWSTR scheme, DWORD scheme_len)
+{
+    int i;
+
+    for(i=0; i < sizeof(shlwapi_schemes)/sizeof(shlwapi_schemes[0]); i++) {
+        if(scheme_len == strlenW(shlwapi_schemes[i].scheme_name)
+           && !memcmp(scheme, shlwapi_schemes[i].scheme_name, scheme_len*sizeof(WCHAR)))
+            return shlwapi_schemes[i].scheme_number;
+    }
+
+    return URL_SCHEME_UNKNOWN;
+}
+
 static BOOL URL_JustLocation(LPCWSTR str)
 {
     while(*str && (*str == L'/')) str++;
@@ -147,8 +157,8 @@ static BOOL URL_JustLocation(LPCWSTR str
  */
 HRESULT WINAPI ParseURLA(LPCSTR x, PARSEDURLA *y)
 {
-    DWORD cnt;
-    const SHL_2_inet_scheme *inet_pro;
+    WCHAR scheme[INTERNET_MAX_SCHEME_LENGTH];
+    DWORD cnt, len;
 
     y->nScheme = URL_SCHEME_INVALID;
     if (y->cbSize != sizeof(*y)) return E_INVALIDARG;
@@ -180,17 +190,10 @@ HRESULT WINAPI ParseURLA(LPCSTR x, PARSE
     /* found scheme, set length of remainder */
     y->cchSuffix = lstrlenA(y->pszSuffix);
 
-    /* see if known scheme and return indicator number */
-    y->nScheme = URL_SCHEME_UNKNOWN;
-    inet_pro = shlwapi_schemes;
-    while (inet_pro->scheme_name) {
-	if (!strncasecmp(inet_pro->scheme_name, y->pszProtocol,
-		    min(y->cchProtocol, lstrlenA(inet_pro->scheme_name)))) {
-	    y->nScheme = inet_pro->scheme_number;
-	    break;
-	}
-	inet_pro++;
-    }
+    len = MultiByteToWideChar(CP_ACP, 0, y->pszProtocol, y->cchProtocol,
+                              scheme, sizeof(scheme));
+    y->nScheme = get_scheme_code(scheme, len);
+
     return S_OK;
 }
 
@@ -202,9 +205,6 @@ HRESULT WINAPI ParseURLA(LPCSTR x, PARSE
 HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y)
 {
     DWORD cnt;
-    const SHL_2_inet_scheme *inet_pro;
-    LPSTR cmpstr;
-    INT len;
 
     y->nScheme = URL_SCHEME_INVALID;
     if (y->cbSize != sizeof(*y)) return E_INVALIDARG;
@@ -235,22 +235,8 @@ HRESULT WINAPI ParseURLW(LPCWSTR x, PARS
 
     /* found scheme, set length of remainder */
     y->cchSuffix = lstrlenW(y->pszSuffix);
+    y->nScheme = get_scheme_code(y->pszProtocol, y->cchProtocol);
 
-    /* see if known scheme and return indicator number */
-    len = WideCharToMultiByte(0, 0, y->pszProtocol, y->cchProtocol, 0, 0, 0, 0);
-    cmpstr = HeapAlloc(GetProcessHeap(), 0, len);
-    WideCharToMultiByte(0, 0, y->pszProtocol, y->cchProtocol, cmpstr, len, 0, 0);
-    y->nScheme = URL_SCHEME_UNKNOWN;
-    inet_pro = shlwapi_schemes;
-    while (inet_pro->scheme_name) {
-	if (!strncasecmp(inet_pro->scheme_name, cmpstr,
-		    min(len, lstrlenA(inet_pro->scheme_name)))) {
-	    y->nScheme = inet_pro->scheme_number;
-	    break;
-	}
-	inet_pro++;
-    }
-    HeapFree(GetProcessHeap(), 0, cmpstr);
     return S_OK;
 }
 
@@ -643,7 +629,6 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBa
 	process_case = 1;
     }
     else do {
-
 	/* get size of location field (if it exists) */
 	work = (LPWSTR)base.pszSuffix;
 	sizeloc = 0;
@@ -665,6 +650,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBa
 	    len = (DWORD)(work - base.pszSuffix + 1);
 	    base.cchSuffix = len;
 	}
+
 	/*
 	 * At this point:
 	 *    .pszSuffix   points to location (starting with '//')




More information about the wine-cvs mailing list