From d1e31dceb931ff2a40e606f7aa9acf46d79ca074 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes 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