Commit a5a2749c authored by Gijs Vermeulen's avatar Gijs Vermeulen Committed by Alexandre Julliard

shell32: Implement PathResolve.

parent b26f9d19
...@@ -684,27 +684,78 @@ BOOL WINAPI PathQualifyAW(LPCVOID pszPath) ...@@ -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);
} }
/************************************************************************* /*************************************************************************
......
...@@ -1752,10 +1752,9 @@ BOOL WINAPI WriteCabinetState(CABINETSTATE *); ...@@ -1752,10 +1752,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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment