[SHLWAPI][SHLWAPI_APITEST][SDK] PathFileExistsDefExtAndAttributesW (#6879)

Implementing missing features...
JIRA issue: CORE-19278
- Implement PathFileExistsDefExtAndAttributesW function.
- Add its prototype to <shlwapi_undoc.h>.
- Modify shlwapi.spec.
- Add PathFileExistsDefExtAndAttributesW testcase.
This commit is contained in:
Katayama Hirofumi MZ 2024-05-15 07:42:43 +09:00 committed by GitHub
parent 96acfcb3dc
commit ac0bcf4a90
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 112 additions and 2 deletions

View file

@ -508,7 +508,7 @@
508 stdcall -noname SHPropertyBag_WriteDWORD(ptr wstr long) 508 stdcall -noname SHPropertyBag_WriteDWORD(ptr wstr long)
509 stdcall -noname IUnknown_OnFocusChangeIS(ptr ptr long) 509 stdcall -noname IUnknown_OnFocusChangeIS(ptr ptr long)
510 stdcall -noname SHLockSharedEx(ptr long long) 510 stdcall -noname SHLockSharedEx(ptr long long)
511 stdcall -stub -noname PathFileExistsDefExtAndAttributesW(wstr long ptr) 511 stdcall -noname PathFileExistsDefExtAndAttributesW(wstr long ptr)
512 stub -ordinal IStream_ReadPidl 512 stub -ordinal IStream_ReadPidl
513 stub -ordinal IStream_WritePidl 513 stub -ordinal IStream_WritePidl
514 stdcall -noname IUnknown_ProfferService(ptr ptr ptr ptr) 514 stdcall -noname IUnknown_ProfferService(ptr ptr ptr ptr)

View file

@ -77,3 +77,41 @@ IContextMenu_Invoke(
return ret; return ret;
} }
/*************************************************************************
* PathFileExistsDefExtAndAttributesW [SHLWAPI.511]
*
* @param pszPath The path string.
* @param dwWhich The WHICH_... flags.
* @param pdwFileAttributes A pointer to the file attributes. Optional.
* @return TRUE if successful.
*/
BOOL WINAPI
PathFileExistsDefExtAndAttributesW(
_Inout_ LPWSTR pszPath,
_In_ DWORD dwWhich,
_Out_opt_ LPDWORD pdwFileAttributes)
{
TRACE("(%s, 0x%lX, %p)\n", debugstr_w(pszPath), dwWhich, pdwFileAttributes);
if (pdwFileAttributes)
*pdwFileAttributes = INVALID_FILE_ATTRIBUTES;
if (!pszPath)
return FALSE;
if (!dwWhich || (*PathFindExtensionW(pszPath) && (dwWhich & WHICH_OPTIONAL)))
return PathFileExistsAndAttributesW(pszPath, pdwFileAttributes);
if (!PathFileExistsDefExtW(pszPath, dwWhich))
{
if (pdwFileAttributes)
*pdwFileAttributes = INVALID_FILE_ATTRIBUTES;
return FALSE;
}
if (pdwFileAttributes)
*pdwFileAttributes = GetFileAttributesW(pszPath);
return TRUE;
}

View file

@ -6,6 +6,7 @@ include_directories($<TARGET_FILE_DIR:shlwapi_resource_dll>)
list(APPEND SOURCE list(APPEND SOURCE
AssocQueryString.c AssocQueryString.c
PathFileExistsDefExtAndAttributesW.c
PathFindOnPath.c PathFindOnPath.c
PathIsUNC.c PathIsUNC.c
PathIsUNCServer.c PathIsUNCServer.c

View file

@ -0,0 +1,61 @@
/*
* PROJECT: ReactOS api tests
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Tests for PathFileExistsDefExtAndAttributesW
* COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#include <apitest.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <shlwapi_undoc.h>
START_TEST(PathFileExistsDefExtAndAttributesW)
{
WCHAR szPath[MAX_PATH];
DWORD attrs;
BOOL ret;
/* NULL check */
ret = PathFileExistsDefExtAndAttributesW(NULL, 0, NULL);
ok_int(ret, FALSE);
/* Not existent file */
lstrcpynW(szPath, L"Not Existent File.txt", _countof(szPath));
ret = PathFileExistsDefExtAndAttributesW(szPath, 0, NULL);
ok_int(ret, FALSE);
/* "Windows" directory */
GetWindowsDirectoryW(szPath, _countof(szPath));
ret = PathFileExistsDefExtAndAttributesW(szPath, 0, NULL);
ok_int(ret, TRUE);
/* "Windows" directory with attributes check */
attrs = 0;
ret = PathFileExistsDefExtAndAttributesW(szPath, 0, &attrs);
ok_int(ret, TRUE);
ok(attrs != 0 && attrs != INVALID_FILE_ATTRIBUTES, "attrs was 0x%lX\n", attrs);
/* Find notepad.exe */
SearchPathW(NULL, L"notepad.exe", NULL, _countof(szPath), szPath, NULL);
ret = PathFileExistsW(szPath);
ok_int(ret, TRUE);
/* Remove .exe */
PathRemoveExtensionW(szPath);
ret = PathFileExistsW(szPath);
ok_int(ret, FALSE);
/* Add .exe */
ret = PathFileExistsDefExtAndAttributesW(szPath, WHICH_EXE, NULL);
ok_int(ret, TRUE);
ret = PathFileExistsW(szPath);
ok_int(ret, TRUE);
/* notepad.cmd doesn't exist */
PathRemoveExtensionW(szPath);
ret = PathFileExistsDefExtAndAttributesW(szPath, WHICH_CMD, NULL);
ok_int(ret, FALSE);
ret = PathFileExistsW(szPath);
ok_int(ret, FALSE);
}

View file

@ -2,6 +2,7 @@
#include <apitest.h> #include <apitest.h>
extern void func_AssocQueryString(void); extern void func_AssocQueryString(void);
extern void func_PathFileExistsDefExtAndAttributesW(void);
extern void func_PathFindOnPath(void); extern void func_PathFindOnPath(void);
extern void func_isuncpath(void); extern void func_isuncpath(void);
extern void func_isuncpathserver(void); extern void func_isuncpathserver(void);
@ -19,6 +20,7 @@ extern void func_StrFormatByteSizeW(void);
const struct test winetest_testlist[] = const struct test winetest_testlist[] =
{ {
{ "AssocQueryString", func_AssocQueryString }, { "AssocQueryString", func_AssocQueryString },
{ "PathFileExistsDefExtAndAttributesW", func_PathFileExistsDefExtAndAttributesW },
{ "PathFindOnPath", func_PathFindOnPath }, { "PathFindOnPath", func_PathFindOnPath },
{ "PathIsUNC", func_isuncpath }, { "PathIsUNC", func_isuncpath },
{ "PathIsUNCServer", func_isuncpathserver }, { "PathIsUNCServer", func_isuncpathserver },

View file

@ -283,7 +283,8 @@ ShellMessageBoxWrapW(
_In_ UINT fuStyle, _In_ UINT fuStyle,
...); ...);
/* dwWhich flags for PathFileExistsDefExtW and PathFindOnPathExW */ /* dwWhich flags for PathFileExistsDefExtW, PathFindOnPathExW,
* and PathFileExistsDefExtAndAttributesW */
#define WHICH_PIF (1 << 0) #define WHICH_PIF (1 << 0)
#define WHICH_COM (1 << 1) #define WHICH_COM (1 << 1)
#define WHICH_EXE (1 << 2) #define WHICH_EXE (1 << 2)
@ -309,6 +310,13 @@ ShellMessageBoxWrapW(
#define PATH_CHAR_CLASS_ANY 0xffffffff #define PATH_CHAR_CLASS_ANY 0xffffffff
BOOL WINAPI PathFileExistsDefExtW(LPWSTR lpszPath, DWORD dwWhich); BOOL WINAPI PathFileExistsDefExtW(LPWSTR lpszPath, DWORD dwWhich);
BOOL WINAPI
PathFileExistsDefExtAndAttributesW(
_Inout_ LPWSTR pszPath,
_In_ DWORD dwWhich,
_Out_opt_ LPDWORD pdwFileAttributes);
BOOL WINAPI PathFindOnPathExW(LPWSTR lpszFile, LPCWSTR *lppszOtherDirs, DWORD dwWhich); BOOL WINAPI PathFindOnPathExW(LPWSTR lpszFile, LPCWSTR *lppszOtherDirs, DWORD dwWhich);
VOID WINAPI FixSlashesAndColonW(LPWSTR); VOID WINAPI FixSlashesAndColonW(LPWSTR);
BOOL WINAPI PathIsValidCharA(char c, DWORD dwClass); BOOL WINAPI PathIsValidCharA(char c, DWORD dwClass);