https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4bccb6e6c93df7566c7266e56cfbb66eece86191

commit 4bccb6e6c93df7566c7266e56cfbb66eece86191
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Sat Dec 2 23:07:28 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Sat Dec 2 23:07:28 2023 +0900

    [SHELL32][SDK][SHELL32_APITEST] Add PathIsTemporaryA/W (#6067)
    
    - Implement PathIsTemporaryA and
      PathIsTemporaryW functions.
    - Add them to <undocshell.h>.
    - Add PathIsTemporary testcase.
    CORE-19278
---
 dll/win32/shell32/wine/shellord.c                  | 45 +++++++++++++++++
 modules/rostests/apitests/shell32/CMakeLists.txt   |  1 +
 .../rostests/apitests/shell32/PathIsTemporary.cpp  | 57 ++++++++++++++++++++++
 modules/rostests/apitests/shell32/testlist.c       |  2 +
 sdk/include/reactos/undocshell.h                   |  3 ++
 5 files changed, 108 insertions(+)

diff --git a/dll/win32/shell32/wine/shellord.c 
b/dll/win32/shell32/wine/shellord.c
index 51cbd9e8218..f000f9030e7 100644
--- a/dll/win32/shell32/wine/shellord.c
+++ b/dll/win32/shell32/wine/shellord.c
@@ -47,6 +47,7 @@ WINE_DECLARE_DEBUG_CHANNEL(pidl);
 
 #ifdef __REACTOS__
 #include <comctl32_undoc.h>
+#include <shlwapi_undoc.h>
 #else
 /* FIXME: !!! move CREATEMRULIST and flags to header file !!! */
 /*        !!! it is in both here and comctl32undoc.c      !!! */
@@ -1918,19 +1919,63 @@ BOOL WINAPI GUIDFromStringW(LPCWSTR str, LPGUID guid)
 /*************************************************************************
  *      PathIsTemporaryA    [SHELL32.713]
  */
+#ifdef __REACTOS__
+/** @see https://undoc.airesoft.co.uk/shell32.dll/PathIsTemporaryA.php */
+BOOL WINAPI PathIsTemporaryA(_In_ LPCSTR Str)
+#else
 BOOL WINAPI PathIsTemporaryA(LPSTR Str)
+#endif
 {
+#ifdef __REACTOS__
+    WCHAR szWide[MAX_PATH];
+
+    TRACE("(%s)\n", debugstr_a(Str));
+
+    SHAnsiToUnicode(Str, szWide, _countof(szWide));
+    return PathIsTemporaryW(szWide);
+#else
     FIXME("(%s)stub\n", debugstr_a(Str));
     return FALSE;
+#endif
 }
 
 /*************************************************************************
  *      PathIsTemporaryW    [SHELL32.714]
  */
+#ifdef __REACTOS__
+/** @see https://undoc.airesoft.co.uk/shell32.dll/PathIsTemporaryW.php */
+BOOL WINAPI PathIsTemporaryW(_In_ LPCWSTR Str)
+#else
 BOOL WINAPI PathIsTemporaryW(LPWSTR Str)
+#endif
 {
+#ifdef __REACTOS__
+    WCHAR szLongPath[MAX_PATH], szTempPath[MAX_PATH];
+    DWORD attrs;
+    LPCWSTR pszTarget = Str;
+
+    TRACE("(%s)\n", debugstr_w(Str));
+
+    attrs = GetFileAttributesW(Str);
+    if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_TEMPORARY))
+        return TRUE;
+
+    if (!GetTempPathW(_countof(szTempPath), szTempPath) ||
+        !GetLongPathNameW(szTempPath, szTempPath, _countof(szTempPath)))
+    {
+        return FALSE;
+    }
+
+    if (GetLongPathNameW(Str, szLongPath, _countof(szLongPath)))
+        pszTarget = szLongPath;
+
+    return (PathIsEqualOrSubFolder(szTempPath, pszTarget) ||
+            PathIsEqualOrSubFolder(UlongToPtr(CSIDL_INTERNET_CACHE), 
pszTarget) ||
+            PathIsEqualOrSubFolder(UlongToPtr(CSIDL_CDBURN_AREA), pszTarget));
+#else
     FIXME("(%s)stub\n", debugstr_w(Str));
     return FALSE;
+#endif
 }
 
 typedef struct _PSXA
diff --git a/modules/rostests/apitests/shell32/CMakeLists.txt 
b/modules/rostests/apitests/shell32/CMakeLists.txt
index 82c1eeea279..0c62b2ed6a0 100644
--- a/modules/rostests/apitests/shell32/CMakeLists.txt
+++ b/modules/rostests/apitests/shell32/CMakeLists.txt
@@ -20,6 +20,7 @@ list(APPEND SOURCE
     IShellFolderViewCB.cpp
     OpenAs_RunDLL.cpp
     PathIsEqualOrSubFolder.cpp
+    PathIsTemporary.cpp
     PathResolve.cpp
     SHAppBarMessage.cpp
     SHChangeNotify.cpp
diff --git a/modules/rostests/apitests/shell32/PathIsTemporary.cpp 
b/modules/rostests/apitests/shell32/PathIsTemporary.cpp
new file mode 100644
index 00000000000..5600e7a1bfa
--- /dev/null
+++ b/modules/rostests/apitests/shell32/PathIsTemporary.cpp
@@ -0,0 +1,57 @@
+/*
+ * PROJECT:     ReactOS API Tests
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Tests for PathIsTemporaryA/W
+ * COPYRIGHT:   Copyright 2023 Katayama Hirofumi MZ 
<katayama.hirofumi...@gmail.com>
+ */
+
+#include "shelltest.h"
+#include <undocshell.h>
+
+static void Test_PathIsTemporaryA(void)
+{
+    CHAR szPath[MAX_PATH];
+    ok_int(PathIsTemporaryA("C:\\"), FALSE);
+    ok_int(PathIsTemporaryA("C:\\TestTestTest"), FALSE);
+
+    GetWindowsDirectoryA(szPath, _countof(szPath));
+    ok_int(PathIsTemporaryA(szPath), FALSE);
+
+    GetTempPathA(_countof(szPath), szPath);
+    ok_int(PathIsTemporaryA(szPath), TRUE);
+
+    PathAppendA(szPath, "TestTestTest");
+    ok_int(PathIsTemporaryA(szPath), FALSE);
+
+    CreateDirectoryA(szPath, NULL);
+    ok_int(PathIsTemporaryA(szPath), TRUE);
+
+    RemoveDirectoryA(szPath);
+}
+
+static void Test_PathIsTemporaryW(void)
+{
+    WCHAR szPath[MAX_PATH];
+    ok_int(PathIsTemporaryW(L"C:\\"), FALSE);
+    ok_int(PathIsTemporaryW(L"C:\\TestTestTest"), FALSE);
+
+    GetWindowsDirectoryW(szPath, _countof(szPath));
+    ok_int(PathIsTemporaryW(szPath), FALSE);
+
+    GetTempPathW(_countof(szPath), szPath);
+    ok_int(PathIsTemporaryW(szPath), TRUE);
+
+    PathAppendW(szPath, L"TestTestTest");
+    ok_int(PathIsTemporaryW(szPath), FALSE);
+
+    CreateDirectoryW(szPath, NULL);
+    ok_int(PathIsTemporaryW(szPath), TRUE);
+
+    RemoveDirectoryW(szPath);
+}
+
+START_TEST(PathIsTemporary)
+{
+    Test_PathIsTemporaryA();
+    Test_PathIsTemporaryW();
+}
diff --git a/modules/rostests/apitests/shell32/testlist.c 
b/modules/rostests/apitests/shell32/testlist.c
index 1a4952cfc17..265f58a5e83 100644
--- a/modules/rostests/apitests/shell32/testlist.c
+++ b/modules/rostests/apitests/shell32/testlist.c
@@ -22,6 +22,7 @@ extern void func_IShellFolderViewCB(void);
 extern void func_menu(void);
 extern void func_OpenAs_RunDLL(void);
 extern void func_PathIsEqualOrSubFolder(void);
+extern void func_PathIsTemporary(void);
 extern void func_PathResolve(void);
 extern void func_SHAppBarMessage(void);
 extern void func_SHChangeNotify(void);
@@ -59,6 +60,7 @@ const struct test winetest_testlist[] =
     { "menu", func_menu },
     { "OpenAs_RunDLL", func_OpenAs_RunDLL },
     { "PathIsEqualOrSubFolder", func_PathIsEqualOrSubFolder },
+    { "PathIsTemporary", func_PathIsTemporary },
     { "PathResolve", func_PathResolve },
     { "SHAppBarMessage", func_SHAppBarMessage },
     { "SHChangeNotify", func_SHChangeNotify },
diff --git a/sdk/include/reactos/undocshell.h b/sdk/include/reactos/undocshell.h
index b768552f708..5d0689827f9 100644
--- a/sdk/include/reactos/undocshell.h
+++ b/sdk/include/reactos/undocshell.h
@@ -500,6 +500,9 @@ BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID 
*sOtherDirs);
 
 BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszFile1OrCSIDL, _In_ LPCWSTR 
pszFile2);
 
+BOOL WINAPI PathIsTemporaryA(_In_ LPCSTR Str);
+BOOL WINAPI PathIsTemporaryW(_In_ LPCWSTR Str);
+
 /****************************************************************************
  * Shell File Operations error codes - SHFileOperationA/W
  */

Reply via email to