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>
This commit is contained in:
parent
b26f9d1996
commit
a5a2749cfe
|
@ -684,27 +684,78 @@ BOOL WINAPI PathQualifyAW(LPCVOID 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);
|
||||
return FALSE;
|
||||
BOOL is_file_spec = PathIsFileSpecA(path);
|
||||
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);
|
||||
return FALSE;
|
||||
BOOL is_file_spec = PathIsFileSpecW(path);
|
||||
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]
|
||||
*/
|
||||
BOOL WINAPI PathResolveAW(LPVOID path, LPCVOID *paths, DWORD flags)
|
||||
BOOL WINAPI PathResolveAW(void *path, const void **paths, DWORD flags)
|
||||
{
|
||||
if (SHELL_OsIsUnicode())
|
||||
return PathResolveW(path, (LPCWSTR*)paths, flags);
|
||||
return PathResolveW(path, (const WCHAR **)paths, flags);
|
||||
else
|
||||
return PathResolveA(path, (LPCSTR*)paths, flags);
|
||||
return PathResolveA(path, (const char **)paths, flags);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
|
|
@ -1752,10 +1752,9 @@ BOOL WINAPI WriteCabinetState(CABINETSTATE *);
|
|||
|
||||
/* PathResolve flags */
|
||||
#define PRF_VERIFYEXISTS 0x01
|
||||
#define PRF_EXECUTABLE 0x02
|
||||
#define PRF_TRYPROGRAMEXTENSIONS 0x03
|
||||
#define PRF_FIRSTDIRDEF 0x04
|
||||
#define PRF_DONTFINDLINK 0x08
|
||||
#define PRF_DONTFINDLNK 0x08
|
||||
#define PRF_REQUIREABSOLUTE 0x10
|
||||
|
||||
VOID WINAPI PathGetShortPath(LPWSTR pszPath);
|
||||
|
|
Loading…
Reference in New Issue