shell32: Implement PathResolve.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48082
Signed-off-by: Gijs Vermeulen <gijsvrm@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
(cherry picked from commit a5a2749cfe)
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
oldstable
Gijs Vermeulen 2019-12-11 11:16:17 +01:00 committed by Michael Stefaniuc
parent bc846f4b8d
commit 2d6f581595
2 changed files with 61 additions and 11 deletions

View File

@ -684,27 +684,78 @@ BOOL WINAPI PathQualifyAW(LPCVOID pszPath)
return PathQualifyA(pszPath); return PathQualifyA(pszPath);
} }
static BOOL PathResolveA(LPSTR path, LPCSTR *paths, DWORD flags) BOOL WINAPI PathFindOnPathExA(LPSTR,LPCSTR *,DWORD);
BOOL WINAPI PathFindOnPathExW(LPWSTR,LPCWSTR *,DWORD);
BOOL WINAPI PathFileExistsDefExtA(LPSTR,DWORD);
BOOL WINAPI PathFileExistsDefExtW(LPWSTR,DWORD);
static BOOL PathResolveA(char *path, const char **dirs, DWORD flags)
{ {
FIXME("(%s,%p,0x%08x),stub!\n", debugstr_a(path), paths, flags); BOOL is_file_spec = PathIsFileSpecA(path);
return FALSE; DWORD dwWhich = flags & PRF_DONTFINDLNK ? 0xf : 0xff;
TRACE("(%s,%p,0x%08x)\n", debugstr_a(path), dirs, flags);
if (flags & PRF_VERIFYEXISTS && !PathFileExistsA(path))
{
if (PathFindOnPathExA(path, dirs, dwWhich))
return TRUE;
if (PathFileExistsDefExtA(path, dwWhich))
return TRUE;
if (!is_file_spec) GetFullPathNameA(path, MAX_PATH, path, NULL);
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
if (is_file_spec)
{
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
GetFullPathNameA(path, MAX_PATH, path, NULL);
return TRUE;
} }
static BOOL PathResolveW(LPWSTR path, LPCWSTR *paths, DWORD flags) static BOOL PathResolveW(WCHAR *path, const WCHAR **dirs, DWORD flags)
{ {
FIXME("(%s,%p,0x%08x),stub!\n", debugstr_w(path), paths, flags); BOOL is_file_spec = PathIsFileSpecW(path);
return FALSE; DWORD dwWhich = flags & PRF_DONTFINDLNK ? 0xf : 0xff;
TRACE("(%s,%p,0x%08x)\n", debugstr_w(path), dirs, flags);
if (flags & PRF_VERIFYEXISTS && !PathFileExistsW(path))
{
if (PathFindOnPathExW(path, dirs, dwWhich))
return TRUE;
if (PathFileExistsDefExtW(path, dwWhich))
return TRUE;
if (!is_file_spec) GetFullPathNameW(path, MAX_PATH, path, NULL);
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
if (is_file_spec)
{
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
GetFullPathNameW(path, MAX_PATH, path, NULL);
return TRUE;
} }
/************************************************************************* /*************************************************************************
* PathResolve [SHELL32.51] * PathResolve [SHELL32.51]
*/ */
BOOL WINAPI PathResolveAW(LPVOID path, LPCVOID *paths, DWORD flags) BOOL WINAPI PathResolveAW(void *path, const void **paths, DWORD flags)
{ {
if (SHELL_OsIsUnicode()) if (SHELL_OsIsUnicode())
return PathResolveW(path, (LPCWSTR*)paths, flags); return PathResolveW(path, (const WCHAR **)paths, flags);
else else
return PathResolveA(path, (LPCSTR*)paths, flags); return PathResolveA(path, (const char **)paths, flags);
} }
/************************************************************************* /*************************************************************************

View File

@ -1717,10 +1717,9 @@ BOOL WINAPI WriteCabinetState(CABINETSTATE *);
/* PathResolve flags */ /* PathResolve flags */
#define PRF_VERIFYEXISTS 0x01 #define PRF_VERIFYEXISTS 0x01
#define PRF_EXECUTABLE 0x02
#define PRF_TRYPROGRAMEXTENSIONS 0x03 #define PRF_TRYPROGRAMEXTENSIONS 0x03
#define PRF_FIRSTDIRDEF 0x04 #define PRF_FIRSTDIRDEF 0x04
#define PRF_DONTFINDLINK 0x08 #define PRF_DONTFINDLNK 0x08
#define PRF_REQUIREABSOLUTE 0x10 #define PRF_REQUIREABSOLUTE 0x10
VOID WINAPI PathGetShortPath(LPWSTR pszPath); VOID WINAPI PathGetShortPath(LPWSTR pszPath);