[PATCH 3/3] shlwapi: Forward some of URL functions to kernelbase.
Nikolay Sivov
nsivov at codeweavers.com
Mon May 27 08:28:44 CDT 2019
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/shlwapi/shlwapi.spec | 38 +-
dlls/shlwapi/url.c | 906 --------------------------------------
2 files changed, 19 insertions(+), 925 deletions(-)
diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec
index 3bc0da8fb0..10970dc60e 100644
--- a/dlls/shlwapi/shlwapi.spec
+++ b/dlls/shlwapi/shlwapi.spec
@@ -459,7 +459,7 @@
459 stdcall -noname SHExpandEnvironmentStringsA(str ptr long) kernel32.ExpandEnvironmentStringsA
460 stdcall -noname SHExpandEnvironmentStringsW(wstr ptr long) kernel32.ExpandEnvironmentStringsW
461 stdcall -noname SHGetAppCompatFlags(long)
-462 stdcall -ordinal UrlFixupW(wstr wstr long)
+462 stdcall -ordinal UrlFixupW(wstr wstr long) kernelbase.UrlFixupW
463 stdcall -noname SHExpandEnvironmentStringsForUserA(ptr str ptr long) userenv.ExpandEnvironmentStringsForUserA
464 stdcall -noname SHExpandEnvironmentStringsForUserW(ptr wstr ptr long) userenv.ExpandEnvironmentStringsForUserW
465 stub -noname PathUnExpandEnvStringsForUserA
@@ -563,11 +563,11 @@
@ stdcall DelayLoadFailureHook(str str) kernel32.DelayLoadFailureHook
@ stdcall -private DllGetVersion(ptr)
@ stdcall GetMenuPosFromID(ptr long)
-@ stdcall HashData (ptr long ptr long)
+@ stdcall HashData(ptr long ptr long) kernelbase.HashData
@ stdcall IntlStrEqWorkerA(long str str long) kernelbase.StrIsIntlEqualA
@ stdcall IntlStrEqWorkerW(long wstr wstr long) kernelbase.StrIsIntlEqualW
@ stdcall IsCharSpaceA(long)
-@ stdcall IsInternetESCEnabled()
+@ stdcall IsInternetESCEnabled() kernelbase.IsInternetESCEnabled
@ stdcall PathAddBackslashA (str)
@ stdcall PathAddBackslashW (wstr)
@ stdcall PathAddExtensionA (str str)
@@ -823,24 +823,24 @@
@ stdcall UrlCanonicalizeW(wstr ptr ptr long)
@ stdcall UrlCombineA(str str ptr ptr long)
@ stdcall UrlCombineW(wstr wstr ptr ptr long)
-@ stdcall UrlCompareA(str str long)
-@ stdcall UrlCompareW(wstr wstr long)
-@ stdcall UrlCreateFromPathA(str ptr ptr long)
-@ stdcall UrlCreateFromPathW(wstr ptr ptr long)
+@ stdcall UrlCompareA(str str long) kernelbase.UrlCompareA
+@ stdcall UrlCompareW(wstr wstr long) kernelbase.UrlCompareW
+@ stdcall UrlCreateFromPathA(str ptr ptr long) kernelbase.UrlCreateFromPathA
+@ stdcall UrlCreateFromPathW(wstr ptr ptr long) kernelbase.UrlCreateFromPathW
@ stdcall UrlEscapeA(str ptr ptr long)
@ stdcall UrlEscapeW(wstr ptr ptr long)
-@ stdcall UrlGetLocationA(str)
-@ stdcall UrlGetLocationW(wstr)
-@ stdcall UrlGetPartA(str ptr ptr long long)
-@ stdcall UrlGetPartW(wstr ptr ptr long long)
-@ stdcall UrlHashA(str ptr long)
-@ stdcall UrlHashW(wstr ptr long)
-@ stdcall UrlIsA(str long)
-@ stdcall UrlIsNoHistoryA(str)
-@ stdcall UrlIsNoHistoryW(wstr)
-@ stdcall UrlIsOpaqueA(str)
-@ stdcall UrlIsOpaqueW(wstr)
-@ stdcall UrlIsW(wstr long)
+@ stdcall UrlGetLocationA(str) kernelbase.UrlGetLocationA
+@ stdcall UrlGetLocationW(wstr) kernelbase.UrlGetLocationW
+@ stdcall UrlGetPartA(str ptr ptr long long) kernelbase.UrlGetPartA
+@ stdcall UrlGetPartW(wstr ptr ptr long long) kernelbase.UrlGetPartW
+@ stdcall UrlHashA(str ptr long) kernelbase.UrlHashA
+@ stdcall UrlHashW(wstr ptr long) kernelbase.UrlHashW
+@ stdcall UrlIsA(str long) kernelbase.UrlIsA
+@ stdcall UrlIsNoHistoryA(str) kernelbase.UrlIsNoHistoryA
+@ stdcall UrlIsNoHistoryW(wstr) kernelbase.UrlIsNoHistoryW
+@ stdcall UrlIsOpaqueA(str) kernelbase.UrlIsOpaqueA
+@ stdcall UrlIsOpaqueW(wstr) kernelbase.UrlIsOpaqueW
+@ stdcall UrlIsW(wstr long) kernelbase.UrlIsW
@ stdcall UrlUnescapeA(str ptr ptr long)
@ stdcall UrlUnescapeW(wstr ptr ptr long)
@ stdcall _SHGetInstanceExplorer(ptr)
diff --git a/dlls/shlwapi/url.c b/dlls/shlwapi/url.c
index 72cc4616a0..8a93052afa 100644
--- a/dlls/shlwapi/url.c
+++ b/dlls/shlwapi/url.c
@@ -84,54 +84,8 @@ static const struct {
{URL_SCHEME_RES, {'r','e','s',0}},
};
-typedef struct {
- LPCWSTR pScheme; /* [out] start of scheme */
- DWORD szScheme; /* [out] size of scheme (until colon) */
- LPCWSTR pUserName; /* [out] start of Username */
- DWORD szUserName; /* [out] size of Username (until ":" or "@") */
- LPCWSTR pPassword; /* [out] start of Password */
- DWORD szPassword; /* [out] size of Password (until "@") */
- LPCWSTR pHostName; /* [out] start of Hostname */
- DWORD szHostName; /* [out] size of Hostname (until ":" or "/") */
- LPCWSTR pPort; /* [out] start of Port */
- DWORD szPort; /* [out] size of Port (until "/" or eos) */
- LPCWSTR pQuery; /* [out] start of Query */
- DWORD szQuery; /* [out] size of Query (until eos) */
-} WINE_PARSE_URL;
-
-typedef enum {
- SCHEME,
- HOST,
- PORT,
- USERPASS,
-} WINE_URL_SCAN_TYPE;
-
static const CHAR hexDigits[] = "0123456789ABCDEF";
-static const WCHAR fileW[] = {'f','i','l','e','\0'};
-
-static const unsigned char HashDataLookup[256] = {
- 0x01, 0x0E, 0x6E, 0x19, 0x61, 0xAE, 0x84, 0x77, 0x8A, 0xAA, 0x7D, 0x76, 0x1B,
- 0xE9, 0x8C, 0x33, 0x57, 0xC5, 0xB1, 0x6B, 0xEA, 0xA9, 0x38, 0x44, 0x1E, 0x07,
- 0xAD, 0x49, 0xBC, 0x28, 0x24, 0x41, 0x31, 0xD5, 0x68, 0xBE, 0x39, 0xD3, 0x94,
- 0xDF, 0x30, 0x73, 0x0F, 0x02, 0x43, 0xBA, 0xD2, 0x1C, 0x0C, 0xB5, 0x67, 0x46,
- 0x16, 0x3A, 0x4B, 0x4E, 0xB7, 0xA7, 0xEE, 0x9D, 0x7C, 0x93, 0xAC, 0x90, 0xB0,
- 0xA1, 0x8D, 0x56, 0x3C, 0x42, 0x80, 0x53, 0x9C, 0xF1, 0x4F, 0x2E, 0xA8, 0xC6,
- 0x29, 0xFE, 0xB2, 0x55, 0xFD, 0xED, 0xFA, 0x9A, 0x85, 0x58, 0x23, 0xCE, 0x5F,
- 0x74, 0xFC, 0xC0, 0x36, 0xDD, 0x66, 0xDA, 0xFF, 0xF0, 0x52, 0x6A, 0x9E, 0xC9,
- 0x3D, 0x03, 0x59, 0x09, 0x2A, 0x9B, 0x9F, 0x5D, 0xA6, 0x50, 0x32, 0x22, 0xAF,
- 0xC3, 0x64, 0x63, 0x1A, 0x96, 0x10, 0x91, 0x04, 0x21, 0x08, 0xBD, 0x79, 0x40,
- 0x4D, 0x48, 0xD0, 0xF5, 0x82, 0x7A, 0x8F, 0x37, 0x69, 0x86, 0x1D, 0xA4, 0xB9,
- 0xC2, 0xC1, 0xEF, 0x65, 0xF2, 0x05, 0xAB, 0x7E, 0x0B, 0x4A, 0x3B, 0x89, 0xE4,
- 0x6C, 0xBF, 0xE8, 0x8B, 0x06, 0x18, 0x51, 0x14, 0x7F, 0x11, 0x5B, 0x5C, 0xFB,
- 0x97, 0xE1, 0xCF, 0x15, 0x62, 0x71, 0x70, 0x54, 0xE2, 0x12, 0xD6, 0xC7, 0xBB,
- 0x0D, 0x20, 0x5E, 0xDC, 0xE0, 0xD4, 0xF7, 0xCC, 0xC4, 0x2B, 0xF9, 0xEC, 0x2D,
- 0xF4, 0x6F, 0xB6, 0x99, 0x88, 0x81, 0x5A, 0xD9, 0xCA, 0x13, 0xA5, 0xE7, 0x47,
- 0xE6, 0x8E, 0x60, 0xE3, 0x3E, 0xB3, 0xF6, 0x72, 0xA2, 0x35, 0xA0, 0xD7, 0xCD,
- 0xB4, 0x2F, 0x6D, 0x2C, 0x26, 0x1F, 0x95, 0x87, 0x00, 0xD8, 0x34, 0x3F, 0x17,
- 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)
{
unsigned int i;
@@ -1412,222 +1366,6 @@ HRESULT WINAPI UrlUnescapeW(
return ret;
}
-/*************************************************************************
- * UrlGetLocationA [SHLWAPI.@]
- *
- * Get the location from a Url.
- *
- * PARAMS
- * pszUrl [I] Url to get the location from
- *
- * RETURNS
- * A pointer to the start of the location in pszUrl, or NULL if there is
- * no location.
- *
- * NOTES
- * - MSDN erroneously states that "The location is the segment of the Url
- * starting with a '?' or '#' character". Neither V4 nor V5 of shlwapi.dll
- * stop at '?' and always return a NULL in this case.
- * - MSDN also erroneously states that "If a file URL has a query string,
- * the returned string is the query string". In all tested cases, if the
- * Url starts with "fi" then a NULL is returned. V5 gives the following results:
- *| Result Url
- *| ------ ---
- *| NULL file://aa/b/cd#hohoh
- *| #hohoh http://aa/b/cd#hohoh
- *| NULL fi://aa/b/cd#hohoh
- *| #hohoh ff://aa/b/cd#hohoh
- */
-LPCSTR WINAPI UrlGetLocationA(
- LPCSTR pszUrl)
-{
- PARSEDURLA base;
- DWORD res1;
-
- base.cbSize = sizeof(base);
- res1 = ParseURLA(pszUrl, &base);
- if (res1) return NULL; /* invalid scheme */
-
- /* if scheme is file: then never return pointer */
- if (strncmp(base.pszProtocol, "file", min(4,base.cchProtocol)) == 0) return NULL;
-
- /* Look for '#' and return its addr */
- return strchr(base.pszSuffix, '#');
-}
-
-/*************************************************************************
- * UrlGetLocationW [SHLWAPI.@]
- *
- * See UrlGetLocationA.
- */
-LPCWSTR WINAPI UrlGetLocationW(
- LPCWSTR pszUrl)
-{
- PARSEDURLW base;
- DWORD res1;
-
- base.cbSize = sizeof(base);
- res1 = ParseURLW(pszUrl, &base);
- if (res1) return NULL; /* invalid scheme */
-
- /* if scheme is file: then never return pointer */
- if (strncmpW(base.pszProtocol, fileW, min(4,base.cchProtocol)) == 0) return NULL;
-
- /* Look for '#' and return its addr */
- return strchrW(base.pszSuffix, '#');
-}
-
-/*************************************************************************
- * UrlCompareA [SHLWAPI.@]
- *
- * Compare two Urls.
- *
- * PARAMS
- * pszUrl1 [I] First Url to compare
- * pszUrl2 [I] Url to compare to pszUrl1
- * fIgnoreSlash [I] TRUE = compare only up to a final slash
- *
- * RETURNS
- * less than zero, zero, or greater than zero indicating pszUrl2 is greater
- * than, equal to, or less than pszUrl1 respectively.
- */
-INT WINAPI UrlCompareA(
- LPCSTR pszUrl1,
- LPCSTR pszUrl2,
- BOOL fIgnoreSlash)
-{
- INT ret, len, len1, len2;
-
- if (!fIgnoreSlash)
- return strcmp(pszUrl1, pszUrl2);
- len1 = strlen(pszUrl1);
- if (pszUrl1[len1-1] == '/') len1--;
- len2 = strlen(pszUrl2);
- if (pszUrl2[len2-1] == '/') len2--;
- if (len1 == len2)
- return strncmp(pszUrl1, pszUrl2, len1);
- len = min(len1, len2);
- ret = strncmp(pszUrl1, pszUrl2, len);
- if (ret) return ret;
- if (len1 > len2) return 1;
- return -1;
-}
-
-/*************************************************************************
- * UrlCompareW [SHLWAPI.@]
- *
- * See UrlCompareA.
- */
-INT WINAPI UrlCompareW(
- LPCWSTR pszUrl1,
- LPCWSTR pszUrl2,
- BOOL fIgnoreSlash)
-{
- INT ret;
- size_t len, len1, len2;
-
- if (!fIgnoreSlash)
- return strcmpW(pszUrl1, pszUrl2);
- len1 = strlenW(pszUrl1);
- if (pszUrl1[len1-1] == '/') len1--;
- len2 = strlenW(pszUrl2);
- if (pszUrl2[len2-1] == '/') len2--;
- if (len1 == len2)
- return strncmpW(pszUrl1, pszUrl2, len1);
- len = min(len1, len2);
- ret = strncmpW(pszUrl1, pszUrl2, len);
- if (ret) return ret;
- if (len1 > len2) return 1;
- return -1;
-}
-
-/*************************************************************************
- * HashData [SHLWAPI.@]
- *
- * Hash an input block into a variable sized digest.
- *
- * PARAMS
- * lpSrc [I] Input block
- * nSrcLen [I] Length of lpSrc
- * lpDest [I] Output for hash digest
- * nDestLen [I] Length of lpDest
- *
- * RETURNS
- * Success: TRUE. lpDest is filled with the computed hash value.
- * Failure: FALSE, if any argument is invalid.
- */
-HRESULT WINAPI HashData(const unsigned char *lpSrc, DWORD nSrcLen,
- unsigned char *lpDest, DWORD nDestLen)
-{
- INT srcCount = nSrcLen - 1, destCount = nDestLen - 1;
-
- if (!lpSrc || !lpDest)
- return E_INVALIDARG;
-
- while (destCount >= 0)
- {
- lpDest[destCount] = (destCount & 0xff);
- destCount--;
- }
-
- while (srcCount >= 0)
- {
- destCount = nDestLen - 1;
- while (destCount >= 0)
- {
- lpDest[destCount] = HashDataLookup[lpSrc[srcCount] ^ lpDest[destCount]];
- destCount--;
- }
- srcCount--;
- }
- return S_OK;
-}
-
-/*************************************************************************
- * UrlHashA [SHLWAPI.@]
- *
- * Produce a Hash from a Url.
- *
- * PARAMS
- * pszUrl [I] Url to hash
- * lpDest [O] Destinationh for hash
- * nDestLen [I] Length of lpDest
- *
- * RETURNS
- * Success: S_OK. lpDest is filled with the computed hash value.
- * Failure: E_INVALIDARG, if any argument is invalid.
- */
-HRESULT WINAPI UrlHashA(LPCSTR pszUrl, unsigned char *lpDest, DWORD nDestLen)
-{
- if (IsBadStringPtrA(pszUrl, -1) || IsBadWritePtr(lpDest, nDestLen))
- return E_INVALIDARG;
-
- HashData((const BYTE*)pszUrl, (int)strlen(pszUrl), lpDest, nDestLen);
- return S_OK;
-}
-
-/*************************************************************************
- * UrlHashW [SHLWAPI.@]
- *
- * See UrlHashA.
- */
-HRESULT WINAPI UrlHashW(LPCWSTR pszUrl, unsigned char *lpDest, DWORD nDestLen)
-{
- char szUrl[MAX_PATH];
-
- TRACE("(%s,%p,%d)\n",debugstr_w(pszUrl), lpDest, nDestLen);
-
- if (IsBadStringPtrW(pszUrl, -1) || IsBadWritePtr(lpDest, nDestLen))
- return E_INVALIDARG;
-
- /* Win32 hashes the data as an ASCII string, presumably so that both A+W
- * return the same digests for the same URL.
- */
- WideCharToMultiByte(CP_ACP, 0, pszUrl, -1, szUrl, MAX_PATH, NULL, NULL);
- HashData((const BYTE*)szUrl, (int)strlen(szUrl), lpDest, nDestLen);
- return S_OK;
-}
-
/*************************************************************************
* UrlApplySchemeA [SHLWAPI.@]
*
@@ -1848,539 +1586,6 @@ HRESULT WINAPI UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DW
return S_FALSE;
}
-/*************************************************************************
- * UrlIsA [SHLWAPI.@]
- *
- * Determine if a Url is of a certain class.
- *
- * PARAMS
- * pszUrl [I] Url to check
- * Urlis [I] URLIS_ constant from "shlwapi.h"
- *
- * RETURNS
- * TRUE if pszUrl belongs to the class type in Urlis.
- * FALSE Otherwise.
- */
-BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis)
-{
- PARSEDURLA base;
- DWORD res1;
- LPCSTR last;
-
- TRACE("(%s %d)\n", debugstr_a(pszUrl), Urlis);
-
- if(!pszUrl)
- return FALSE;
-
- switch (Urlis) {
-
- case URLIS_OPAQUE:
- base.cbSize = sizeof(base);
- res1 = ParseURLA(pszUrl, &base);
- if (res1) return FALSE; /* invalid scheme */
- switch (base.nScheme)
- {
- case URL_SCHEME_MAILTO:
- case URL_SCHEME_SHELL:
- case URL_SCHEME_JAVASCRIPT:
- case URL_SCHEME_VBSCRIPT:
- case URL_SCHEME_ABOUT:
- return TRUE;
- }
- return FALSE;
-
- case URLIS_FILEURL:
- return (CompareStringA(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5,
- "file:", 5) == CSTR_EQUAL);
-
- case URLIS_DIRECTORY:
- last = pszUrl + strlen(pszUrl) - 1;
- return (last >= pszUrl && (*last == '/' || *last == '\\' ));
-
- case URLIS_URL:
- return PathIsURLA(pszUrl);
-
- case URLIS_NOHISTORY:
- case URLIS_APPLIABLE:
- case URLIS_HASQUERY:
- default:
- FIXME("(%s %d): stub\n", debugstr_a(pszUrl), Urlis);
- }
- return FALSE;
-}
-
-/*************************************************************************
- * UrlIsW [SHLWAPI.@]
- *
- * See UrlIsA.
- */
-BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis)
-{
- static const WCHAR file_colon[] = { 'f','i','l','e',':',0 };
- PARSEDURLW base;
- DWORD res1;
- LPCWSTR last;
-
- TRACE("(%s %d)\n", debugstr_w(pszUrl), Urlis);
-
- if(!pszUrl)
- return FALSE;
-
- switch (Urlis) {
-
- case URLIS_OPAQUE:
- base.cbSize = sizeof(base);
- res1 = ParseURLW(pszUrl, &base);
- if (res1) return FALSE; /* invalid scheme */
- switch (base.nScheme)
- {
- case URL_SCHEME_MAILTO:
- case URL_SCHEME_SHELL:
- case URL_SCHEME_JAVASCRIPT:
- case URL_SCHEME_VBSCRIPT:
- case URL_SCHEME_ABOUT:
- return TRUE;
- }
- return FALSE;
-
- case URLIS_FILEURL:
- return (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5,
- file_colon, 5) == CSTR_EQUAL);
-
- case URLIS_DIRECTORY:
- last = pszUrl + strlenW(pszUrl) - 1;
- return (last >= pszUrl && (*last == '/' || *last == '\\'));
-
- case URLIS_URL:
- return PathIsURLW(pszUrl);
-
- case URLIS_NOHISTORY:
- case URLIS_APPLIABLE:
- case URLIS_HASQUERY:
- default:
- FIXME("(%s %d): stub\n", debugstr_w(pszUrl), Urlis);
- }
- return FALSE;
-}
-
-/*************************************************************************
- * UrlIsNoHistoryA [SHLWAPI.@]
- *
- * Determine if a Url should not be stored in the users history list.
- *
- * PARAMS
- * pszUrl [I] Url to check
- *
- * RETURNS
- * TRUE, if pszUrl should be excluded from the history list,
- * FALSE otherwise.
- */
-BOOL WINAPI UrlIsNoHistoryA(LPCSTR pszUrl)
-{
- return UrlIsA(pszUrl, URLIS_NOHISTORY);
-}
-
-/*************************************************************************
- * UrlIsNoHistoryW [SHLWAPI.@]
- *
- * See UrlIsNoHistoryA.
- */
-BOOL WINAPI UrlIsNoHistoryW(LPCWSTR pszUrl)
-{
- return UrlIsW(pszUrl, URLIS_NOHISTORY);
-}
-
-/*************************************************************************
- * UrlIsOpaqueA [SHLWAPI.@]
- *
- * Determine if a Url is opaque.
- *
- * PARAMS
- * pszUrl [I] Url to check
- *
- * RETURNS
- * TRUE if pszUrl is opaque,
- * FALSE Otherwise.
- *
- * NOTES
- * An opaque Url is one that does not start with "<protocol>://".
- */
-BOOL WINAPI UrlIsOpaqueA(LPCSTR pszUrl)
-{
- return UrlIsA(pszUrl, URLIS_OPAQUE);
-}
-
-/*************************************************************************
- * UrlIsOpaqueW [SHLWAPI.@]
- *
- * See UrlIsOpaqueA.
- */
-BOOL WINAPI UrlIsOpaqueW(LPCWSTR pszUrl)
-{
- return UrlIsW(pszUrl, URLIS_OPAQUE);
-}
-
-/*************************************************************************
- * Scans for characters of type "type" and when not matching found,
- * returns pointer to it and length in size.
- *
- * Characters tested based on RFC 1738
- */
-static LPCWSTR URL_ScanID(LPCWSTR start, LPDWORD size, WINE_URL_SCAN_TYPE type)
-{
- static DWORD alwayszero = 0;
- BOOL cont = TRUE;
-
- *size = 0;
-
- switch(type){
-
- case SCHEME:
- while (cont) {
- if ( (islowerW(*start) && isalphaW(*start)) ||
- isdigitW(*start) ||
- (*start == '+') ||
- (*start == '-') ||
- (*start == '.')) {
- start++;
- (*size)++;
- }
- else
- cont = FALSE;
- }
-
- if(*start != ':')
- *size = 0;
-
- break;
-
- case USERPASS:
- while (cont) {
- if ( isalphaW(*start) ||
- isdigitW(*start) ||
- /* user/password only characters */
- (*start == ';') ||
- (*start == '?') ||
- (*start == '&') ||
- (*start == '=') ||
- /* *extra* characters */
- (*start == '!') ||
- (*start == '*') ||
- (*start == '\'') ||
- (*start == '(') ||
- (*start == ')') ||
- (*start == ',') ||
- /* *safe* characters */
- (*start == '$') ||
- (*start == '_') ||
- (*start == '+') ||
- (*start == '-') ||
- (*start == '.') ||
- (*start == ' ')) {
- start++;
- (*size)++;
- } else if (*start == '%') {
- if (isxdigitW(*(start+1)) &&
- isxdigitW(*(start+2))) {
- start += 3;
- *size += 3;
- } else
- cont = FALSE;
- } else
- cont = FALSE;
- }
- break;
-
- case PORT:
- while (cont) {
- if (isdigitW(*start)) {
- start++;
- (*size)++;
- }
- else
- cont = FALSE;
- }
- break;
-
- case HOST:
- while (cont) {
- if (isalnumW(*start) ||
- (*start == '-') ||
- (*start == '.') ||
- (*start == ' ') ||
- (*start == '*') ) {
- start++;
- (*size)++;
- }
- else
- cont = FALSE;
- }
- break;
- default:
- FIXME("unknown type %d\n", type);
- return (LPWSTR)&alwayszero;
- }
- /* TRACE("scanned %d characters next char %p<%c>\n",
- *size, start, *start); */
- return start;
-}
-
-/*************************************************************************
- * Attempt to parse URL into pieces.
- */
-static LONG URL_ParseUrl(LPCWSTR pszUrl, WINE_PARSE_URL *pl)
-{
- LPCWSTR work;
-
- memset(pl, 0, sizeof(WINE_PARSE_URL));
- pl->pScheme = pszUrl;
- work = URL_ScanID(pl->pScheme, &pl->szScheme, SCHEME);
- if (!*work || (*work != ':')) goto ErrorExit;
- work++;
- if ((*work != '/') || (*(work+1) != '/')) goto SuccessExit;
- pl->pUserName = work + 2;
- work = URL_ScanID(pl->pUserName, &pl->szUserName, USERPASS);
- if (*work == ':' ) {
- /* parse password */
- work++;
- pl->pPassword = work;
- work = URL_ScanID(pl->pPassword, &pl->szPassword, USERPASS);
- if (*work != '@') {
- /* what we just parsed must be the hostname and port
- * so reset pointers and clear then let it parse */
- pl->szUserName = pl->szPassword = 0;
- work = pl->pUserName - 1;
- pl->pUserName = pl->pPassword = 0;
- }
- } else if (*work == '@') {
- /* no password */
- pl->szPassword = 0;
- pl->pPassword = 0;
- } else if (!*work || (*work == '/') || (*work == '.')) {
- /* what was parsed was hostname, so reset pointers and let it parse */
- pl->szUserName = pl->szPassword = 0;
- work = pl->pUserName - 1;
- pl->pUserName = pl->pPassword = 0;
- } else goto ErrorExit;
-
- /* now start parsing hostname or hostnumber */
- work++;
- pl->pHostName = work;
- work = URL_ScanID(pl->pHostName, &pl->szHostName, HOST);
- if (*work == ':') {
- /* parse port */
- work++;
- pl->pPort = work;
- work = URL_ScanID(pl->pPort, &pl->szPort, PORT);
- }
- if (*work == '/') {
- /* see if query string */
- pl->pQuery = strchrW(work, '?');
- if (pl->pQuery) pl->szQuery = strlenW(pl->pQuery);
- }
- SuccessExit:
- TRACE("parse successful: scheme=%p(%d), user=%p(%d), pass=%p(%d), host=%p(%d), port=%p(%d), query=%p(%d)\n",
- pl->pScheme, pl->szScheme,
- pl->pUserName, pl->szUserName,
- pl->pPassword, pl->szPassword,
- pl->pHostName, pl->szHostName,
- pl->pPort, pl->szPort,
- pl->pQuery, pl->szQuery);
- return S_OK;
- ErrorExit:
- FIXME("failed to parse %s\n", debugstr_w(pszUrl));
- return E_INVALIDARG;
-}
-
-/*************************************************************************
- * UrlGetPartA [SHLWAPI.@]
- *
- * Retrieve part of a Url.
- *
- * PARAMS
- * pszIn [I] Url to parse
- * pszOut [O] Destination for part of pszIn requested
- * pcchOut [I] Size of pszOut
- * [O] length of pszOut string EXCLUDING '\0' if S_OK, otherwise
- * needed size of pszOut INCLUDING '\0'.
- * dwPart [I] URL_PART_ enum from "shlwapi.h"
- * dwFlags [I] URL_ flags from "shlwapi.h"
- *
- * RETURNS
- * Success: S_OK. pszOut contains the part requested, pcchOut contains its length.
- * Failure: An HRESULT error code describing the error.
- */
-HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut,
- DWORD dwPart, DWORD dwFlags)
-{
- LPWSTR in, out;
- DWORD ret, len, len2;
-
- if(!pszIn || !pszOut || !pcchOut || *pcchOut <= 0)
- return E_INVALIDARG;
-
- in = HeapAlloc(GetProcessHeap(), 0,
- (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR));
- out = in + INTERNET_MAX_URL_LENGTH;
-
- MultiByteToWideChar(CP_ACP, 0, pszIn, -1, in, INTERNET_MAX_URL_LENGTH);
-
- len = INTERNET_MAX_URL_LENGTH;
- ret = UrlGetPartW(in, out, &len, dwPart, dwFlags);
-
- if (FAILED(ret)) {
- HeapFree(GetProcessHeap(), 0, in);
- return ret;
- }
-
- len2 = WideCharToMultiByte(CP_ACP, 0, out, len, NULL, 0, NULL, NULL);
- if (len2 > *pcchOut) {
- *pcchOut = len2+1;
- HeapFree(GetProcessHeap(), 0, in);
- return E_POINTER;
- }
- len2 = WideCharToMultiByte(CP_ACP, 0, out, len+1, pszOut, *pcchOut, NULL, NULL);
- *pcchOut = len2-1;
- HeapFree(GetProcessHeap(), 0, in);
- return ret;
-}
-
-/*************************************************************************
- * UrlGetPartW [SHLWAPI.@]
- *
- * See UrlGetPartA.
- */
-HRESULT WINAPI UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut,
- DWORD dwPart, DWORD dwFlags)
-{
- WINE_PARSE_URL pl;
- HRESULT ret;
- DWORD scheme, size, schsize;
- LPCWSTR addr, schaddr;
-
- TRACE("(%s %p %p(%d) %08x %08x)\n",
- debugstr_w(pszIn), pszOut, pcchOut, *pcchOut, dwPart, dwFlags);
-
- if(!pszIn || !pszOut || !pcchOut || *pcchOut <= 0)
- return E_INVALIDARG;
-
- *pszOut = '\0';
-
- addr = strchrW(pszIn, ':');
- if(!addr)
- scheme = URL_SCHEME_UNKNOWN;
- else
- scheme = get_scheme_code(pszIn, addr-pszIn);
-
- ret = URL_ParseUrl(pszIn, &pl);
-
- switch (dwPart) {
- case URL_PART_SCHEME:
- if (!pl.szScheme) {
- *pcchOut = 0;
- return S_FALSE;
- }
- addr = pl.pScheme;
- size = pl.szScheme;
- break;
-
- case URL_PART_HOSTNAME:
- switch(scheme) {
- case URL_SCHEME_FTP:
- case URL_SCHEME_HTTP:
- case URL_SCHEME_GOPHER:
- case URL_SCHEME_TELNET:
- case URL_SCHEME_FILE:
- case URL_SCHEME_HTTPS:
- break;
- default:
- *pcchOut = 0;
- return E_FAIL;
- }
-
- if(scheme==URL_SCHEME_FILE && (!pl.szHostName ||
- (pl.szHostName==1 && *(pl.pHostName+1)==':'))) {
- *pcchOut = 0;
- return S_FALSE;
- }
-
- if (!pl.szHostName) {
- *pcchOut = 0;
- return S_FALSE;
- }
- addr = pl.pHostName;
- size = pl.szHostName;
- break;
-
- case URL_PART_USERNAME:
- if (!pl.szUserName) {
- *pcchOut = 0;
- return S_FALSE;
- }
- addr = pl.pUserName;
- size = pl.szUserName;
- break;
-
- case URL_PART_PASSWORD:
- if (!pl.szPassword) {
- *pcchOut = 0;
- return S_FALSE;
- }
- addr = pl.pPassword;
- size = pl.szPassword;
- break;
-
- case URL_PART_PORT:
- if (!pl.szPort) {
- *pcchOut = 0;
- return S_FALSE;
- }
- addr = pl.pPort;
- size = pl.szPort;
- break;
-
- case URL_PART_QUERY:
- if (!pl.szQuery) {
- *pcchOut = 0;
- return S_FALSE;
- }
- addr = pl.pQuery;
- size = pl.szQuery;
- break;
-
- default:
- *pcchOut = 0;
- return E_INVALIDARG;
- }
-
- if (dwFlags == URL_PARTFLAG_KEEPSCHEME) {
- if(!pl.pScheme || !pl.szScheme) {
- *pcchOut = 0;
- return E_FAIL;
- }
- schaddr = pl.pScheme;
- schsize = pl.szScheme;
- if (*pcchOut < schsize + size + 2) {
- *pcchOut = schsize + size + 2;
- return E_POINTER;
- }
- memcpy(pszOut, schaddr, schsize*sizeof(WCHAR));
- pszOut[schsize] = ':';
- memcpy(pszOut+schsize+1, addr, size*sizeof(WCHAR));
- pszOut[schsize+1+size] = 0;
- *pcchOut = schsize + 1 + size;
- }
- else {
- if (*pcchOut < size + 1) {*pcchOut = size+1; return E_POINTER;}
- memcpy(pszOut, addr, size*sizeof(WCHAR));
- pszOut[size] = 0;
- *pcchOut = size;
- }
- TRACE("len=%d %s\n", *pcchOut, debugstr_w(pszOut));
-
- return ret;
-}
-
/*************************************************************************
* PathIsURLA [SHLWAPI.@]
*
@@ -2428,76 +1633,6 @@ BOOL WINAPI PathIsURLW(LPCWSTR lpstrPath)
return hres == S_OK && (base.nScheme != URL_SCHEME_INVALID);
}
-/*************************************************************************
- * UrlCreateFromPathA [SHLWAPI.@]
- *
- * See UrlCreateFromPathW
- */
-HRESULT WINAPI UrlCreateFromPathA(LPCSTR pszPath, LPSTR pszUrl, LPDWORD pcchUrl, DWORD dwReserved)
-{
- WCHAR bufW[INTERNET_MAX_URL_LENGTH];
- WCHAR *urlW = bufW;
- UNICODE_STRING pathW;
- HRESULT ret;
- DWORD lenW = ARRAY_SIZE(bufW), lenA;
-
- if(!RtlCreateUnicodeStringFromAsciiz(&pathW, pszPath))
- return E_INVALIDARG;
- if((ret = UrlCreateFromPathW(pathW.Buffer, urlW, &lenW, dwReserved)) == E_POINTER) {
- urlW = HeapAlloc(GetProcessHeap(), 0, lenW * sizeof(WCHAR));
- ret = UrlCreateFromPathW(pathW.Buffer, urlW, &lenW, dwReserved);
- }
- if(ret == S_OK || ret == S_FALSE) {
- RtlUnicodeToMultiByteSize(&lenA, urlW, lenW * sizeof(WCHAR));
- if(*pcchUrl > lenA) {
- RtlUnicodeToMultiByteN(pszUrl, *pcchUrl - 1, &lenA, urlW, lenW * sizeof(WCHAR));
- pszUrl[lenA] = 0;
- *pcchUrl = lenA;
- } else {
- *pcchUrl = lenA + 1;
- ret = E_POINTER;
- }
- }
- if(urlW != bufW) HeapFree(GetProcessHeap(), 0, urlW);
- RtlFreeUnicodeString(&pathW);
- return ret;
-}
-
-/*************************************************************************
- * UrlCreateFromPathW [SHLWAPI.@]
- *
- * Create a Url from a file path.
- *
- * PARAMS
- * pszPath [I] Path to convert
- * pszUrl [O] Destination for the converted Url
- * pcchUrl [I/O] Length of pszUrl
- * dwReserved [I] Reserved, must be 0
- *
- * RETURNS
- * Success: S_OK pszUrl contains the converted path, S_FALSE if the path is already a Url
- * Failure: An HRESULT error code.
- */
-HRESULT WINAPI UrlCreateFromPathW(LPCWSTR pszPath, LPWSTR pszUrl, LPDWORD pcchUrl, DWORD dwReserved)
-{
- HRESULT ret;
-
- TRACE("(%s, %p, %p, 0x%08x)\n", debugstr_w(pszPath), pszUrl, pcchUrl, dwReserved);
-
- /* Validate arguments */
- if (dwReserved != 0)
- return E_INVALIDARG;
- if (!pszUrl || !pcchUrl)
- return E_INVALIDARG;
-
- ret = URL_CreateFromPath(pszPath, pszUrl, pcchUrl);
-
- if (S_FALSE == ret)
- strcpyW(pszUrl, pszPath);
-
- return ret;
-}
-
/*************************************************************************
* SHAutoComplete [SHLWAPI.@]
*
@@ -2615,44 +1750,3 @@ HRESULT WINAPI MLBuildResURLW(LPCWSTR lpszLibName, HMODULE hMod, DWORD dwFlags,
}
return hRet;
}
-
-/***********************************************************************
- * UrlFixupW [SHLWAPI.462]
- *
- * Checks the scheme part of a URL and attempts to correct misspellings.
- *
- * PARAMS
- * lpszUrl [I] Pointer to the URL to be corrected
- * lpszTranslatedUrl [O] Pointer to a buffer to store corrected URL
- * dwMaxChars [I] Maximum size of corrected URL
- *
- * RETURNS
- * success: S_OK if URL corrected or already correct
- * failure: S_FALSE if unable to correct / COM error code if other error
- *
- */
-HRESULT WINAPI UrlFixupW(LPCWSTR url, LPWSTR translatedUrl, DWORD maxChars)
-{
- DWORD srcLen;
-
- FIXME("(%s,%p,%d) STUB\n", debugstr_w(url), translatedUrl, maxChars);
-
- if (!url)
- return E_FAIL;
-
- srcLen = lstrlenW(url) + 1;
-
- /* For now just copy the URL directly */
- lstrcpynW(translatedUrl, url, (maxChars < srcLen) ? maxChars : srcLen);
-
- return S_OK;
-}
-
-/*************************************************************************
- * IsInternetESCEnabled [SHLWAPI.@]
- */
-BOOL WINAPI IsInternetESCEnabled(void)
-{
- FIXME(": stub\n");
- return FALSE;
-}
--
2.20.1
More information about the wine-devel
mailing list