From d1e31dceb931ff2a40e606f7aa9acf46d79ca074 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Wed, 22 Sep 2021 19:01:44 +1000
Subject: [PATCH] sapi: Implement ISpObjectToken GetId

---
 dlls/sapi/tests/token.c |  7 ++++---
 dlls/sapi/token.c       | 27 ++++++++++++++++++++++++---
 2 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/dlls/sapi/tests/token.c b/dlls/sapi/tests/token.c
index 47196d42dc7..042dfbaa84a 100644
--- a/dlls/sapi/tests/token.c
+++ b/dlls/sapi/tests/token.c
@@ -185,11 +185,11 @@ static void test_object_token(void)
     ok( hr == S_OK, "got %08x\n", hr );
 
     hr = ISpObjectToken_GetId( token, NULL );
-    todo_wine ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
+    ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
 
     tempW = (LPWSTR)0xdeadbeef;
     hr = ISpObjectToken_GetId( token, &tempW );
-    todo_wine ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
+    ok( hr == SPERR_UNINITIALIZED, "got %08x\n", hr );
     ok( tempW == (LPWSTR)0xdeadbeef, "got %s\n", wine_dbgstr_w(tempW) );
 
     hr = ISpObjectToken_GetCategory( token, NULL );
@@ -220,7 +220,7 @@ static void test_object_token(void)
     ok( hr == SPERR_ALREADY_INITIALIZED, "got %08x\n", hr );
 
     hr = ISpObjectToken_GetId( token, NULL );
-    todo_wine ok( hr == E_POINTER, "got %08x\n", hr );
+    ok( hr == E_POINTER, "got %08x\n", hr );
 
     hr = ISpObjectToken_GetCategory( token, NULL );
     todo_wine ok( hr == E_POINTER, "got %08x\n", hr );
@@ -297,6 +297,7 @@ static void test_object_token(void)
     ISpObjectToken_Release( token );
 }
 
+
 START_TEST(token)
 {
     CoInitialize( NULL );
diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c
index d16478d0064..93ce6549e65 100644
--- a/dlls/sapi/token.c
+++ b/dlls/sapi/token.c
@@ -70,6 +70,7 @@ struct object_token
     LONG ref;
 
     HKEY token_key;
+    WCHAR *token_id;
 };
 
 static struct object_token *impl_from_ISpObjectToken( ISpObjectToken *iface )
@@ -765,7 +766,6 @@ static HRESULT WINAPI token_enum_Item( ISpObjectTokenEnumBuilder *iface,
     ret = RegOpenKeyExW (This->key, subkey, 0, KEY_READ, &key);
     if (ret != ERROR_SUCCESS)
         return HRESULT_FROM_WIN32(ret);
-    heap_free(subkey);
 
     hr = token_create( NULL, &IID_ISpObjectToken, (void**)&subtoken );
     if (FAILED(hr))
@@ -773,6 +773,7 @@ static HRESULT WINAPI token_enum_Item( ISpObjectTokenEnumBuilder *iface,
 
     object = impl_from_ISpObjectToken( subtoken );
     object->token_key = key;
+    object->token_id = subkey;
 
     *token = subtoken;
 
@@ -927,6 +928,7 @@ static ULONG WINAPI token_Release( ISpObjectToken *iface )
     if (!ref)
     {
         if (This->token_key) RegCloseKey( This->token_key );
+        heap_free(This->token_id);
         heap_free( This );
     }
 
@@ -1053,8 +1055,27 @@ static HRESULT WINAPI token_SetId( ISpObjectToken *iface,
 static HRESULT WINAPI token_GetId( ISpObjectToken *iface,
                                    LPWSTR *token_id )
 {
-    FIXME( "stub\n" );
-    return E_NOTIMPL;
+    struct object_token *This = impl_from_ISpObjectToken( iface );
+
+    TRACE( "%p, %p\n", This, token_id);
+
+    if (!This->token_key)
+        return SPERR_UNINITIALIZED;
+
+    if (!token_id)
+        return E_POINTER;
+
+    if (!This->token_id)
+    {
+        FIXME("Loading default category not supported.\n");
+        return E_POINTER;
+    }
+    *token_id = CoTaskMemAlloc( (wcslen(This->token_id) + 1) * sizeof(WCHAR));
+    if (!*token_id)
+        return E_OUTOFMEMORY;
+
+    wcscpy(*token_id, This->token_id);
+    return S_OK;
 }
 
 static HRESULT WINAPI token_GetCategory( ISpObjectToken *iface,
-- 
2.33.0