[SHLWAPI][SHLWAPI_APITEST][SDK] PathFileExistsDefExtAndAttributesW (#6879)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Tue, 14 May 2024 22:42:43 +0000 (07:42 +0900)
committerGitHub <noreply@github.com>
Tue, 14 May 2024 22:42:43 +0000 (07:42 +0900)
Implementing missing features...
JIRA issue: CORE-19278
- Implement PathFileExistsDefExtAndAttributesW function.
- Add its prototype to <shlwapi_undoc.h>.
- Modify shlwapi.spec.
- Add PathFileExistsDefExtAndAttributesW testcase.

dll/win32/shlwapi/shlwapi.spec
dll/win32/shlwapi/utils.cpp
modules/rostests/apitests/shlwapi/CMakeLists.txt
modules/rostests/apitests/shlwapi/PathFileExistsDefExtAndAttributesW.c [new file with mode: 0644]
modules/rostests/apitests/shlwapi/testlist.c
sdk/include/reactos/shlwapi_undoc.h

index 53e67a7..821a2ed 100644 (file)
 508 stdcall -noname SHPropertyBag_WriteDWORD(ptr wstr long)
 509 stdcall -noname IUnknown_OnFocusChangeIS(ptr ptr 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
 513 stub -ordinal IStream_WritePidl
 514 stdcall -noname IUnknown_ProfferService(ptr ptr ptr ptr)
index a27bcd9..673d6d7 100644 (file)
@@ -77,3 +77,41 @@ IContextMenu_Invoke(
 
     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;
+}
index 7a9a57e..95271b0 100644 (file)
@@ -6,6 +6,7 @@ include_directories($<TARGET_FILE_DIR:shlwapi_resource_dll>)
 
 list(APPEND SOURCE
     AssocQueryString.c
+    PathFileExistsDefExtAndAttributesW.c
     PathFindOnPath.c
     PathIsUNC.c
     PathIsUNCServer.c
diff --git a/modules/rostests/apitests/shlwapi/PathFileExistsDefExtAndAttributesW.c b/modules/rostests/apitests/shlwapi/PathFileExistsDefExtAndAttributesW.c
new file mode 100644 (file)
index 0000000..a1a7494
--- /dev/null
@@ -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);
+}
index 9f94155..9bb74d7 100644 (file)
@@ -2,6 +2,7 @@
 #include <apitest.h>
 
 extern void func_AssocQueryString(void);
+extern void func_PathFileExistsDefExtAndAttributesW(void);
 extern void func_PathFindOnPath(void);
 extern void func_isuncpath(void);
 extern void func_isuncpathserver(void);
@@ -19,6 +20,7 @@ extern void func_StrFormatByteSizeW(void);
 const struct test winetest_testlist[] =
 {
     { "AssocQueryString", func_AssocQueryString },
+    { "PathFileExistsDefExtAndAttributesW", func_PathFileExistsDefExtAndAttributesW },
     { "PathFindOnPath", func_PathFindOnPath },
     { "PathIsUNC", func_isuncpath },
     { "PathIsUNCServer", func_isuncpathserver },
index fd1ac3f..cd2cc18 100644 (file)
@@ -283,7 +283,8 @@ ShellMessageBoxWrapW(
   _In_ UINT fuStyle,
   ...);
 
-/* dwWhich flags for PathFileExistsDefExtW and PathFindOnPathExW */
+/* dwWhich flags for PathFileExistsDefExtW, PathFindOnPathExW,
+ * and PathFileExistsDefExtAndAttributesW */
 #define WHICH_PIF       (1 << 0)
 #define WHICH_COM       (1 << 1)
 #define WHICH_EXE       (1 << 2)
@@ -309,6 +310,13 @@ ShellMessageBoxWrapW(
 #define PATH_CHAR_CLASS_ANY         0xffffffff
 
 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);
 VOID WINAPI FixSlashesAndColonW(LPWSTR);
 BOOL WINAPI PathIsValidCharA(char c, DWORD dwClass);