[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