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 */