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

commit aa52c3f5ebb588adbf710310dcb9dd5bfb3a3ba6
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Mon Jan 20 08:32:07 2025 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Mon Jan 20 08:32:07 2025 +0900

    [SHELL32][SHELL32_APITEST][SDK] Implement SHEnumerateUnreadMailAccountsW 
(#7619)
    
    Implementing missing features...
    JIRA issue: CORE-19278
    - Move function definition from stubs.cpp into utils.cpp.
    - Add prototype to <shellapi.h>.
---
 dll/win32/shell32/stubs.cpp                        | 15 ----------
 dll/win32/shell32/utils.cpp                        | 33 ++++++++++++++++++++++
 modules/rostests/apitests/shell32/CMakeLists.txt   |  1 +
 .../shell32/SHEnumerateUnreadMailAccountsW.cpp     | 33 ++++++++++++++++++++++
 modules/rostests/apitests/shell32/testlist.c       |  2 ++
 sdk/include/psdk/shellapi.h                        |  7 +++++
 6 files changed, 76 insertions(+), 15 deletions(-)

diff --git a/dll/win32/shell32/stubs.cpp b/dll/win32/shell32/stubs.cpp
index 70918f6f18a..8967dd49ab8 100644
--- a/dll/win32/shell32/stubs.cpp
+++ b/dll/win32/shell32/stubs.cpp
@@ -30,21 +30,6 @@ SHGetUnreadMailCountW(HKEY hKeyUser,
     return E_FAIL;
 }
 
-/*
- * Unimplemented
- */
-EXTERN_C HRESULT
-WINAPI
-SHEnumerateUnreadMailAccountsW(HKEY user,
-                               DWORD idx,
-                               LPWSTR mailaddress,
-                               INT mailaddresslen)
-{
-    FIXME("SHEnumerateUnreadMailAccountsW(%p %d %p %d) stub\n",
-        user, idx, mailaddress, mailaddresslen);
-    return E_NOTIMPL;
-}
-
 /*
  * Unimplemented
  */
diff --git a/dll/win32/shell32/utils.cpp b/dll/win32/shell32/utils.cpp
index 391acbd8461..1f4ff07a88e 100644
--- a/dll/win32/shell32/utils.cpp
+++ b/dll/win32/shell32/utils.cpp
@@ -901,6 +901,39 @@ SheRemoveQuotesW(LPWSTR psz)
     return psz;
 }
 
+/*************************************************************************
+ *  SHEnumerateUnreadMailAccountsW [SHELL32.287]
+ *
+ * @see 
https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shenumerateunreadmailaccountsw
+ */
+EXTERN_C
+HRESULT WINAPI
+SHEnumerateUnreadMailAccountsW(
+    _In_opt_ HKEY hKeyUser,
+    _In_ DWORD dwIndex,
+    _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
+    _In_ INT cchMailAddress)
+{
+    if (!hKeyUser)
+        hKeyUser = HKEY_CURRENT_USER;
+
+    HKEY hKey;
+    LSTATUS error = RegOpenKeyExW(hKeyUser,
+                                  
L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
+                                  0, KEY_ENUMERATE_SUB_KEYS, &hKey);
+    if (error)
+        return HRESULT_FROM_WIN32(error);
+
+    FILETIME FileTime;
+    error = RegEnumKeyExW(hKey, dwIndex, pszMailAddress, 
(PDWORD)&cchMailAddress, NULL, NULL,
+                          NULL, &FileTime);
+    if (error)
+        *pszMailAddress = UNICODE_NULL;
+
+    RegCloseKey(hKey);
+    return error ? HRESULT_FROM_WIN32(error) : S_OK;
+}
+
 /*************************************************************************
  *  SHFindComputer [SHELL32.91]
  *
diff --git a/modules/rostests/apitests/shell32/CMakeLists.txt 
b/modules/rostests/apitests/shell32/CMakeLists.txt
index 7a7b523a68d..aff71a65c90 100644
--- a/modules/rostests/apitests/shell32/CMakeLists.txt
+++ b/modules/rostests/apitests/shell32/CMakeLists.txt
@@ -34,6 +34,7 @@ list(APPEND SOURCE
     SHParseDisplayName.cpp
     SHRestricted.cpp
     SHShouldShowWizards.cpp
+    SHEnumerateUnreadMailAccountsW.cpp
     She.cpp
     ShellExec_RunDLL.cpp
     ShellExecCmdLine.cpp
diff --git 
a/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp 
b/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp
new file mode 100644
index 00000000000..5abc2df9a44
--- /dev/null
+++ b/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp
@@ -0,0 +1,33 @@
+/*
+ * PROJECT:     ReactOS API tests
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE:     Test for SHEnumerateUnreadMailAccountsW
+ * COPYRIGHT:   Copyright 2025 Katayama Hirofumi MZ 
(katayama.hirofumi...@gmail.com)
+ */
+
+#include "shelltest.h"
+
+START_TEST(SHEnumerateUnreadMailAccountsW)
+{
+    HRESULT hr;
+    WCHAR szMailAddress[MAX_PATH];
+    HKEY hKey;
+    LSTATUS error;
+    DWORD dwDisposition;
+
+    error = RegCreateKeyExW(HKEY_CURRENT_USER,
+                            
L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\example.com",
+                            0, NULL, 0, KEY_WRITE, NULL, &hKey, 
&dwDisposition);
+    ok_long(error, ERROR_SUCCESS);
+
+    szMailAddress[0] = UNICODE_NULL;
+    hr = SHEnumerateUnreadMailAccountsW(NULL, 0, szMailAddress, 
_countof(szMailAddress));
+    ok_hex(hr, S_OK);
+    ok(szMailAddress[0] != UNICODE_NULL, "szMailAddress was empty\n");
+
+    if (dwDisposition == REG_CREATED_NEW_KEY)
+    {
+        RegDeleteKeyW(HKEY_CURRENT_USER,
+                      
L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\example.com");
+    }
+}
diff --git a/modules/rostests/apitests/shell32/testlist.c 
b/modules/rostests/apitests/shell32/testlist.c
index d98d529c6fb..daa699a8e32 100644
--- a/modules/rostests/apitests/shell32/testlist.c
+++ b/modules/rostests/apitests/shell32/testlist.c
@@ -34,6 +34,7 @@ extern void func_SHChangeNotify(void);
 extern void func_SHCreateDataObject(void);
 extern void func_SHCreateFileDataObject(void);
 extern void func_SHCreateFileExtractIconW(void);
+extern void func_SHEnumerateUnreadMailAccountsW(void);
 extern void func_She(void);
 extern void func_ShellExec_RunDLL(void);
 extern void func_ShellExecCmdLine(void);
@@ -84,6 +85,7 @@ const struct test winetest_testlist[] =
     { "SHCreateDataObject", func_SHCreateDataObject },
     { "SHCreateFileDataObject", func_SHCreateFileDataObject },
     { "SHCreateFileExtractIconW", func_SHCreateFileExtractIconW },
+    { "SHEnumerateUnreadMailAccountsW", func_SHEnumerateUnreadMailAccountsW },
     { "She", func_She },
     { "ShellExec_RunDLL", func_ShellExec_RunDLL },
     { "ShellExecCmdLine", func_ShellExecCmdLine },
diff --git a/sdk/include/psdk/shellapi.h b/sdk/include/psdk/shellapi.h
index eeda59cfcfb..b707d6d41df 100644
--- a/sdk/include/psdk/shellapi.h
+++ b/sdk/include/psdk/shellapi.h
@@ -652,6 +652,13 @@ SHTestTokenMembership(
     _In_ ULONG ulRID);
 #endif
 
+HRESULT WINAPI
+SHEnumerateUnreadMailAccountsW(
+    _In_opt_ HKEY hKeyUser,
+    _In_ DWORD dwIndex,
+    _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
+    _In_ INT cchMailAddress);
+
 #ifdef UNICODE
 #define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAW_V1_SIZE
 #define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAW_V2_SIZE

Reply via email to