Myah Caron : sapi: Improve GetDefaultTokenId stub.

Alexandre Julliard julliard at winehq.org
Tue Sep 15 15:40:13 CDT 2020


Module: wine
Branch: master
Commit: 2e11e2f33f5cf95230e157d913fe337762081724
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2e11e2f33f5cf95230e157d913fe337762081724

Author: Myah Caron <qsniyg at protonmail.com>
Date:   Fri Sep 11 19:42:50 2020 +0000

sapi: Improve GetDefaultTokenId stub.

Signed-off-by: Myah Caron <qsniyg at protonmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/sapi/tests/token.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/sapi/token.c       | 34 ++++++++++++++++++++++++++--
 2 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/dlls/sapi/tests/token.c b/dlls/sapi/tests/token.c
index 9f6689b83f..58d69920fd 100644
--- a/dlls/sapi/tests/token.c
+++ b/dlls/sapi/tests/token.c
@@ -116,11 +116,70 @@ static void test_token_enum(void)
     ISpObjectTokenEnumBuilder_Release( token_enum );
 }
 
+static void test_default_token_id(void)
+{
+    ISpObjectTokenCategory *cat;
+    HRESULT hr;
+    LPWSTR token_id = NULL;
+    LONG res;
+    WCHAR regvalue[512];
+    DWORD regvalue_size;
+
+    hr = CoCreateInstance( &CLSID_SpObjectTokenCategory, NULL, CLSCTX_INPROC_SERVER,
+                           &IID_ISpObjectTokenCategory, (void **)&cat );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    token_id = (LPWSTR)0xdeadbeef;
+    hr = ISpObjectTokenCategory_GetDefaultTokenId( cat, &token_id );
+    ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
+    ok( token_id == (LPWSTR)0xdeadbeef, "got %p\n", token_id );
+
+    hr = ISpObjectTokenCategory_GetDefaultTokenId( cat, NULL );
+    ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
+
+    hr = ISpObjectTokenCategory_SetId( cat, SPCAT_AUDIOOUT, FALSE );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = ISpObjectTokenCategory_GetDefaultTokenId( cat, NULL );
+    ok( hr == E_POINTER, "got %08x\n", hr );
+
+    token_id = (LPWSTR)0xdeadbeef;
+    hr = ISpObjectTokenCategory_GetDefaultTokenId( cat, &token_id );
+
+    /* AudioOutput under windows server returns this error */
+    if (hr == SPERR_NOT_FOUND) {
+        /* also happens if TokenEnums/Tokens is empty or doesn't exist */
+        skip( "AudioOutput category not found for GetDefaultTokenId\n" );
+        return;
+    }
+
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( token_id != (LPWSTR)0xdeadbeef && token_id != NULL, "got %p\n", token_id );
+
+    regvalue_size = sizeof( regvalue );
+    res = RegGetValueW( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Speech\\AudioOutput",
+                        L"DefaultDefaultTokenId", RRF_RT_REG_SZ, NULL,
+                        (LPVOID)&regvalue, &regvalue_size);
+    if (res == ERROR_FILE_NOT_FOUND) {
+        skip( "DefaultDefaultTokenId not found for AudioOutput category (%s)\n",
+              wine_dbgstr_w(token_id) );
+    } else {
+        ok( res == ERROR_SUCCESS, "got %08x\n", res );
+        ok( !wcscmp(regvalue, token_id),
+            "GetDefaultTokenId (%s) should be equal to the DefaultDefaultTokenId key (%s)\n",
+            wine_dbgstr_w(token_id), wine_dbgstr_w(regvalue) );
+    }
+
+    CoTaskMemFree( token_id );
+    ISpObjectTokenCategory_Release( cat );
+}
+
 START_TEST(token)
 {
     CoInitialize( NULL );
     test_data_key();
     test_token_category();
     test_token_enum();
+    test_default_token_id();
     CoUninitialize();
 }
diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c
index d2b70c95cf..21cd958282 100644
--- a/dlls/sapi/token.c
+++ b/dlls/sapi/token.c
@@ -489,8 +489,38 @@ static HRESULT WINAPI token_category_SetDefaultTokenId( ISpObjectTokenCategory *
 static HRESULT WINAPI token_category_GetDefaultTokenId( ISpObjectTokenCategory *iface,
                                                         LPWSTR *id )
 {
-    FIXME( "stub\n" );
-    return E_NOTIMPL;
+    struct token_category *This = impl_from_ISpObjectTokenCategory( iface );
+    struct data_key *this_data_key;
+    LONG res;
+    WCHAR regvalue[512];
+    DWORD regvalue_size = sizeof( regvalue );
+
+    FIXME( "(%p)->(%p): semi-stub\n", iface, id );
+
+    if (!This->data_key)
+        return SPERR_UNINITIALIZED;
+
+    if (!id)
+        return E_POINTER;
+
+    /* todo: check HKCU's DefaultTokenId before */
+
+    this_data_key = impl_from_ISpRegDataKey( This->data_key );
+
+    res = RegGetValueW( this_data_key->key, NULL, L"DefaultDefaultTokenId", RRF_RT_REG_SZ,
+                        NULL, &regvalue, &regvalue_size);
+    if (res == ERROR_FILE_NOT_FOUND) {
+        return SPERR_NOT_FOUND;
+    } else if (res != ERROR_SUCCESS) {
+        /* probably not the correct return value */
+        FIXME( "returning %08x\n", res );
+        return res;
+    }
+
+    *id = CoTaskMemAlloc( regvalue_size );
+    wcscpy( *id, regvalue );
+
+    return S_OK;
 }
 
 const struct ISpObjectTokenCategoryVtbl token_category_vtbl =




More information about the wine-cvs mailing list