[PATCH v2 3/3] sapi: Improve stub for ISpObjectToken::SetId.

Myah Caron qsniyg at protonmail.com
Wed Sep 16 01:23:40 CDT 2020


Signed-off-by: Myah Caron <qsniyg at protonmail.com>
---
v2: no change.

.token_key will be used when implementing CreateInstance (for querying CLSID). It's
still used in order to check if the registry key exists though (otherwise it would
fail more tests).

If this is not acceptable (as it is semi-unused), the alternative (I believe) would
be to have it be a local variable and introduce a temporary .initialized member instead.
Keeping it felt like the cleanest option to me, but please advise if this is not correct.

I set function as a semi-stub because it completely ignores the category, which appears
to be an important part of the function, even if it is passed as NULL (which
auto-detects the category).


 dlls/sapi/tests/token.c | 16 ++++++++--------
 dlls/sapi/token.c       | 29 +++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/dlls/sapi/tests/token.c b/dlls/sapi/tests/token.c
index 887539778a9..1ca49398ad1 100644
--- a/dlls/sapi/tests/token.c
+++ b/dlls/sapi/tests/token.c
@@ -202,23 +202,23 @@ static void test_object_token(void)
     ok( cat == (LPVOID)0xdeadbeef, "got %p\n", cat );

     hr = ISpObjectToken_SetId( token, NULL, NULL, FALSE );
-    todo_wine ok( hr == E_POINTER, "got %08x\n", hr );
+    ok( hr == E_POINTER, "got %08x\n", hr );
     hr = ISpObjectToken_SetId( token, L"bogus", NULL, FALSE );
-    todo_wine ok( hr == E_POINTER, "got %08x\n", hr );
+    ok( hr == E_POINTER, "got %08x\n", hr );

     hr = ISpObjectToken_SetId( token, NULL, L"bogus", FALSE );
-    todo_wine ok( hr == SPERR_NOT_FOUND, "got %08x\n", hr );
+    ok( hr == SPERR_NOT_FOUND, "got %08x\n", hr );
     hr = ISpObjectToken_SetId( token, NULL, L"HKEY_LOCAL_MACHINE\\SOFTWARE\\winetest bogus", FALSE );
-    todo_wine ok( hr == SPERR_NOT_FOUND, "got %08x\n", hr );
+    ok( hr == SPERR_NOT_FOUND, "got %08x\n", hr );

     /* SetId succeeds even if the key is invalid, but exists */
     hr = ISpObjectToken_SetId( token, NULL, L"HKEY_LOCAL_MACHINE\\SOFTWARE", FALSE );
-    todo_wine ok( hr == S_OK, "got %08x\n", hr );
+    ok( hr == S_OK, "got %08x\n", hr );

     hr = ISpObjectToken_SetId( token, NULL, NULL, FALSE );
-    todo_wine ok( hr == SPERR_ALREADY_INITIALIZED, "got %08x\n", hr );
+    ok( hr == SPERR_ALREADY_INITIALIZED, "got %08x\n", hr );
     hr = ISpObjectToken_SetId( token, NULL, L"bogus", FALSE );
-    todo_wine ok( hr == SPERR_ALREADY_INITIALIZED, "got %08x\n", hr );
+    ok( hr == SPERR_ALREADY_INITIALIZED, "got %08x\n", hr );

     hr = ISpObjectToken_GetId( token, NULL );
     todo_wine ok( hr == E_POINTER, "got %08x\n", hr );
@@ -265,7 +265,7 @@ static void test_object_token(void)

     /* NULL appears to auto-detect the category */
     hr = ISpObjectToken_SetId( token, NULL, token_id, FALSE );
-    todo_wine ok( hr == S_OK, "got %08x\n", hr );
+    ok( hr == S_OK, "got %08x\n", hr );

     tempW = NULL;
     hr = ISpObjectToken_GetId( token, &tempW );
diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c
index f7a00d73f02..b4a318b4ade 100644
--- a/dlls/sapi/token.c
+++ b/dlls/sapi/token.c
@@ -781,6 +781,8 @@ struct object_token
 {
     ISpObjectToken ISpObjectToken_iface;
     LONG ref;
+
+    HKEY token_key;
 };

 static struct object_token *impl_from_ISpObjectToken( ISpObjectToken *iface )
@@ -827,6 +829,7 @@ static ULONG WINAPI token_Release( ISpObjectToken *iface )

     if (!ref)
     {
+        if (This->token_key) RegCloseKey( This->token_key );
         heap_free( This );
     }

@@ -923,8 +926,28 @@ static HRESULT WINAPI token_SetId( ISpObjectToken *iface,
                                    LPCWSTR category_id, LPCWSTR token_id,
                                    BOOL create )
 {
-    FIXME( "stub\n" );
-    return E_NOTIMPL;
+    struct object_token *This = impl_from_ISpObjectToken( iface );
+    BOOL res;
+    HRESULT hr;
+    HKEY root, key;
+    const WCHAR *subkey;
+
+    FIXME( "(%p)->(%s %s %d): semi-stub\n", This, debugstr_w( category_id ),
+           debugstr_w(token_id), create );
+
+    if (This->token_key) return SPERR_ALREADY_INITIALIZED;
+
+    if (!token_id) return E_POINTER;
+
+    hr = parse_cat_id( token_id, &root, &subkey );
+    if (hr != S_OK) return SPERR_NOT_FOUND;
+
+    res = RegOpenKeyExW( root, subkey, 0, KEY_ALL_ACCESS, &key );
+    if (res) return SPERR_NOT_FOUND;
+
+    This->token_key = key;
+
+    return S_OK;
 }

 static HRESULT WINAPI token_GetId( ISpObjectToken *iface,
@@ -1047,6 +1070,8 @@ HRESULT token_create( IUnknown *outer, REFIID iid, void **obj )
     This->ISpObjectToken_iface.lpVtbl = &token_vtbl;
     This->ref = 1;

+    This->token_key = NULL;
+
     hr = ISpObjectToken_QueryInterface( &This->ISpObjectToken_iface, iid, obj );

     ISpObjectToken_Release( &This->ISpObjectToken_iface );
--
2.28.0





More information about the wine-devel mailing list