[SHLWAPI] Sync with Wine Staging 1.7.37. CORE-9246

svn path=/trunk/; revision=67398
This commit is contained in:
Amine Khaldi 2015-04-25 10:59:08 +00:00
parent 65a3bbb546
commit feb215f7d1
6 changed files with 70 additions and 48 deletions

View file

@ -661,7 +661,7 @@ BOOL WINAPI SetupDiBuildClassInfoList(
* SetupDiBuildClassInfoListExA (SETUPAPI.@) * SetupDiBuildClassInfoListExA (SETUPAPI.@)
* *
* Returns a list of setup class GUIDs that identify the classes * Returns a list of setup class GUIDs that identify the classes
* that are installed on a local or remote macine. * that are installed on a local or remote machine.
* *
* PARAMS * PARAMS
* Flags [I] control exclusion of classes from the list. * Flags [I] control exclusion of classes from the list.
@ -708,7 +708,7 @@ BOOL WINAPI SetupDiBuildClassInfoListExA(
* SetupDiBuildClassInfoListExW (SETUPAPI.@) * SetupDiBuildClassInfoListExW (SETUPAPI.@)
* *
* Returns a list of setup class GUIDs that identify the classes * Returns a list of setup class GUIDs that identify the classes
* that are installed on a local or remote macine. * that are installed on a local or remote machine.
* *
* PARAMS * PARAMS
* Flags [I] control exclusion of classes from the list. * Flags [I] control exclusion of classes from the list.
@ -1258,7 +1258,7 @@ SetupDiCreateDeviceInfoListExA(const GUID *ClassGuid,
* Create an empty DeviceInfoSet list. * Create an empty DeviceInfoSet list.
* *
* PARAMS * PARAMS
* ClassGuid [I] if not NULL only devices with GUID ClcassGuid are associated * ClassGuid [I] if not NULL only devices with GUID ClassGuid are associated
* with this list. * with this list.
* hwndParent [I] hwnd needed for interface related actions. * hwndParent [I] hwnd needed for interface related actions.
* MachineName [I] name of machine to create emtpy DeviceInfoSet list, if NULL * MachineName [I] name of machine to create emtpy DeviceInfoSet list, if NULL

View file

@ -431,7 +431,7 @@ exit:
* Success: S_OK. langbuf is set to the language string found. * Success: S_OK. langbuf is set to the language string found.
* Failure: E_FAIL, If any arguments are invalid, error occurred, or Explorer * Failure: E_FAIL, If any arguments are invalid, error occurred, or Explorer
* does not contain the setting. * does not contain the setting.
* HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), If the buffer is not big enough * E_NOT_SUFFICIENT_BUFFER, If the buffer is not big enough
*/ */
HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen) HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen)
{ {
@ -484,7 +484,7 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen)
} }
*buflen = 0; *buflen = 0;
return __HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); return E_NOT_SUFFICIENT_BUFFER;
} }
/************************************************************************* /*************************************************************************
@ -5032,11 +5032,8 @@ INT WINAPI SHFormatDateTimeW(const FILETIME UNALIGNED *fileTime, DWORD *flags,
{ {
if ((fmt_flags & FDTF_LONGDATE) && (ret < size + 2)) if ((fmt_flags & FDTF_LONGDATE) && (ret < size + 2))
{ {
if (ret < size + 2) lstrcatW(&buf[ret-1], sep1);
{ ret += 2;
lstrcatW(&buf[ret-1], sep1);
ret += 2;
}
} }
else else
{ {

View file

@ -3280,6 +3280,9 @@ HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath,
if (!pszUrl || !pszPath || !pcchPath || !*pcchPath) if (!pszUrl || !pszPath || !pcchPath || !*pcchPath)
return E_INVALIDARG; return E_INVALIDARG;
if (lstrlenW(pszUrl) < 5)
return E_INVALIDARG;
if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5, if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5,
file_colon, 5) != CSTR_EQUAL) file_colon, 5) != CSTR_EQUAL)
return E_INVALIDARG; return E_INVALIDARG;
@ -3321,9 +3324,8 @@ HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath,
src -= 1; src -= 1;
break; break;
case 2: case 2:
if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, src, 9, if (lstrlenW(src) >= 10 && CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE,
localhost, 9) == CSTR_EQUAL && src, 9, localhost, 9) == CSTR_EQUAL && (src[9] == '/' || src[9] == '\\'))
(src[9] == '/' || src[9] == '\\'))
{ {
/* 'file://localhost/' + escaped DOS path */ /* 'file://localhost/' + escaped DOS path */
src += 10; src += 10;
@ -3835,13 +3837,13 @@ BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR lpszPath)
WCHAR szSearch[MAX_PATH]; WCHAR szSearch[MAX_PATH];
DWORD dwLen; DWORD dwLen;
HANDLE hfind; HANDLE hfind;
BOOL retVal = FALSE; BOOL retVal = TRUE;
WIN32_FIND_DATAW find_data; WIN32_FIND_DATAW find_data;
TRACE("(%s)\n",debugstr_w(lpszPath)); TRACE("(%s)\n",debugstr_w(lpszPath));
if (!lpszPath || !PathIsDirectoryW(lpszPath)) if (!lpszPath || !PathIsDirectoryW(lpszPath))
return FALSE; return FALSE;
lstrcpynW(szSearch, lpszPath, MAX_PATH); lstrcpynW(szSearch, lpszPath, MAX_PATH);
PathAddBackslashW(szSearch); PathAddBackslashW(szSearch);
@ -3851,14 +3853,23 @@ BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR lpszPath)
strcpyW(szSearch + dwLen, szAllFiles); strcpyW(szSearch + dwLen, szAllFiles);
hfind = FindFirstFileW(szSearch, &find_data); hfind = FindFirstFileW(szSearch, &find_data);
if (hfind != INVALID_HANDLE_VALUE) if (hfind == INVALID_HANDLE_VALUE)
{ return FALSE;
if (find_data.cFileName[0] == '.' && find_data.cFileName[1] == '.')
/* The only directory entry should be the parent */
retVal = !FindNextFileW(hfind, &find_data);
FindClose(hfind);
}
do
{
if (find_data.cFileName[0] == '.')
{
if (find_data.cFileName[1] == '\0') continue;
if (find_data.cFileName[1] == '.' && find_data.cFileName[2] == '\0') continue;
}
retVal = FALSE;
break;
}
while (FindNextFileW(hfind, &find_data));
FindClose(hfind);
return retVal; return retVal;
} }

View file

@ -343,7 +343,7 @@ int WINAPI StrCmpIW(LPCWSTR lpszStr, LPCWSTR lpszComp)
* PARAMS * PARAMS
* lpszStr [I] First string to compare * lpszStr [I] First string to compare
* lpszComp [I] Second string to compare * lpszComp [I] Second string to compare
* iLen [I] Maximum number of chars to compare. * iLen [I] Number of chars to compare
* *
* RETURNS * RETURNS
* An integer less than, equal to or greater than 0, indicating that * An integer less than, equal to or greater than 0, indicating that
@ -374,7 +374,7 @@ INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen)
* PARAMS * PARAMS
* lpszStr [I] First string to compare * lpszStr [I] First string to compare
* lpszComp [I] Second string to compare * lpszComp [I] Second string to compare
* iLen [I] Maximum number of chars to compare. * iLen [I] Number of chars to compare
* *
* RETURNS * RETURNS
* An integer less than, equal to or greater than 0, indicating that * An integer less than, equal to or greater than 0, indicating that
@ -541,13 +541,15 @@ static LPSTR SHLWAPI_StrStrHelperA(LPCSTR lpszStr, LPCSTR lpszSearch,
INT (WINAPI *pStrCmpFn)(LPCSTR,LPCSTR,INT)) INT (WINAPI *pStrCmpFn)(LPCSTR,LPCSTR,INT))
{ {
size_t iLen; size_t iLen;
LPCSTR end;
if (!lpszStr || !lpszSearch || !*lpszSearch) if (!lpszStr || !lpszSearch || !*lpszSearch)
return NULL; return NULL;
iLen = strlen(lpszSearch); iLen = strlen(lpszSearch);
end = lpszStr + strlen(lpszStr);
while (*lpszStr) while (lpszStr + iLen <= end)
{ {
if (!pStrCmpFn(lpszStr, lpszSearch, iLen)) if (!pStrCmpFn(lpszStr, lpszSearch, iLen))
return (LPSTR)lpszStr; return (LPSTR)lpszStr;
@ -603,6 +605,7 @@ LPWSTR WINAPI StrStrW(LPCWSTR lpszStr, LPCWSTR lpszSearch)
*/ */
LPSTR WINAPI StrRStrIA(LPCSTR lpszStr, LPCSTR lpszEnd, LPCSTR lpszSearch) LPSTR WINAPI StrRStrIA(LPCSTR lpszStr, LPCSTR lpszEnd, LPCSTR lpszSearch)
{ {
LPSTR lpszRet = NULL;
WORD ch1, ch2; WORD ch1, ch2;
INT iLen; INT iLen;
@ -611,28 +614,28 @@ LPSTR WINAPI StrRStrIA(LPCSTR lpszStr, LPCSTR lpszEnd, LPCSTR lpszSearch)
if (!lpszStr || !lpszSearch || !*lpszSearch) if (!lpszStr || !lpszSearch || !*lpszSearch)
return NULL; return NULL;
if (!lpszEnd)
lpszEnd = lpszStr + lstrlenA(lpszStr);
if (lpszEnd == lpszStr)
return NULL;
if (IsDBCSLeadByte(*lpszSearch)) if (IsDBCSLeadByte(*lpszSearch))
ch1 = *lpszSearch << 8 | (UCHAR)lpszSearch[1]; ch1 = *lpszSearch << 8 | (UCHAR)lpszSearch[1];
else else
ch1 = *lpszSearch; ch1 = *lpszSearch;
iLen = lstrlenA(lpszSearch); iLen = lstrlenA(lpszSearch);
do if (!lpszEnd)
lpszEnd = lpszStr + lstrlenA(lpszStr);
else /* reproduce the broken behaviour on Windows */
lpszEnd += min(iLen - 1, lstrlenA(lpszEnd));
while (lpszStr + iLen <= lpszEnd && *lpszStr)
{ {
lpszEnd = CharPrevA(lpszStr, lpszEnd); ch2 = IsDBCSLeadByte(*lpszStr)? *lpszStr << 8 | (UCHAR)lpszStr[1] : *lpszStr;
ch2 = IsDBCSLeadByte(*lpszEnd)? *lpszEnd << 8 | (UCHAR)lpszEnd[1] : *lpszEnd;
if (!ChrCmpIA(ch1, ch2)) if (!ChrCmpIA(ch1, ch2))
{ {
if (!StrCmpNIA(lpszEnd, lpszSearch, iLen)) if (!StrCmpNIA(lpszStr, lpszSearch, iLen))
return (LPSTR)lpszEnd; lpszRet = (LPSTR)lpszStr;
} }
} while (lpszEnd > lpszStr); lpszStr = CharNextA(lpszStr);
return NULL; }
return lpszRet;
} }
/************************************************************************* /*************************************************************************
@ -642,6 +645,7 @@ LPSTR WINAPI StrRStrIA(LPCSTR lpszStr, LPCSTR lpszEnd, LPCSTR lpszSearch)
*/ */
LPWSTR WINAPI StrRStrIW(LPCWSTR lpszStr, LPCWSTR lpszEnd, LPCWSTR lpszSearch) LPWSTR WINAPI StrRStrIW(LPCWSTR lpszStr, LPCWSTR lpszEnd, LPCWSTR lpszSearch)
{ {
LPWSTR lpszRet = NULL;
INT iLen; INT iLen;
TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch));
@ -649,18 +653,23 @@ LPWSTR WINAPI StrRStrIW(LPCWSTR lpszStr, LPCWSTR lpszEnd, LPCWSTR lpszSearch)
if (!lpszStr || !lpszSearch || !*lpszSearch) if (!lpszStr || !lpszSearch || !*lpszSearch)
return NULL; return NULL;
if (!lpszEnd)
lpszEnd = lpszStr + strlenW(lpszStr);
iLen = strlenW(lpszSearch); iLen = strlenW(lpszSearch);
while (lpszEnd > lpszStr) if (!lpszEnd)
lpszEnd = lpszStr + strlenW(lpszStr);
else /* reproduce the broken behaviour on Windows */
lpszEnd += min(iLen - 1, lstrlenW(lpszEnd));
while (lpszStr + iLen <= lpszEnd && *lpszStr)
{ {
lpszEnd--; if (!ChrCmpIW(*lpszSearch, *lpszStr))
if (!StrCmpNIW(lpszEnd, lpszSearch, iLen)) {
return (LPWSTR)lpszEnd; if (!StrCmpNIW(lpszStr, lpszSearch, iLen))
lpszRet = (LPWSTR)lpszStr;
}
lpszStr++;
} }
return NULL; return lpszRet;
} }
/************************************************************************* /*************************************************************************
@ -690,6 +699,7 @@ LPSTR WINAPI StrStrIA(LPCSTR lpszStr, LPCSTR lpszSearch)
LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch) LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch)
{ {
int iLen; int iLen;
LPCWSTR end;
TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch)); TRACE("(%s,%s)\n", debugstr_w(lpszStr), debugstr_w(lpszSearch));
@ -697,8 +707,9 @@ LPWSTR WINAPI StrStrIW(LPCWSTR lpszStr, LPCWSTR lpszSearch)
return NULL; return NULL;
iLen = strlenW(lpszSearch); iLen = strlenW(lpszSearch);
end = lpszStr + strlenW(lpszStr);
while (*lpszStr) while (lpszStr + iLen <= end)
{ {
if (!StrCmpNIW(lpszStr, lpszSearch, iLen)) if (!StrCmpNIW(lpszStr, lpszSearch, iLen))
return (LPWSTR)lpszStr; return (LPWSTR)lpszStr;

View file

@ -899,7 +899,10 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
work = preliminary + base.cchProtocol+1+base.cchSuffix - 1; work = preliminary + base.cchProtocol+1+base.cchSuffix - 1;
if (*work++ != '/') if (*work++ != '/')
*(work++) = '/'; *(work++) = '/';
strcpyW(work, relative.pszSuffix); if (relative.pszSuffix[0] == '.' && relative.pszSuffix[1] == 0)
*work = 0;
else
strcpyW(work, relative.pszSuffix);
break; break;
default: default:

View file

@ -180,7 +180,7 @@ reactos/dll/win32/shdoclc # Synced to Wine-1.7.27
reactos/dll/win32/shdocvw # Synced to WineStaging-1.7.37 reactos/dll/win32/shdocvw # Synced to WineStaging-1.7.37
reactos/dll/win32/shell32 # Forked at Wine-20071011 reactos/dll/win32/shell32 # Forked at Wine-20071011
reactos/dll/win32/shfolder # Synced to Wine-1.7.27 reactos/dll/win32/shfolder # Synced to Wine-1.7.27
reactos/dll/win32/shlwapi # Synced to Wine-1.7.27 reactos/dll/win32/shlwapi # Synced to WineStaging-1.7.37
reactos/dll/win32/slbcsp # Synced to Wine-1.7.27 reactos/dll/win32/slbcsp # Synced to Wine-1.7.27
reactos/dll/win32/snmpapi # Synced to Wine-1.7.27 reactos/dll/win32/snmpapi # Synced to Wine-1.7.27
reactos/dll/win32/softpub # Synced to Wine-1.7.27 reactos/dll/win32/softpub # Synced to Wine-1.7.27