Module: wine Branch: master Commit: 557e4d308bd60c8608882e4f8b090c032408838b URL: http://source.winehq.org/git/wine.git/?a=commit;h=557e4d308bd60c8608882e4f8b...
Author: Jacek Caban jacek@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 '//')