Module: wine Branch: master Commit: 77b7bd19c5a437dd5cf0cff11050ef9ba105eaa5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=77b7bd19c5a437dd5cf0cff110...
Author: Huw Davies huw@codeweavers.com Date: Thu Sep 28 08:40:49 2017 +0100
sapi: Implement SpObjectTokenEnum::SetAttribs().
Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/sapi/sapi_private.h | 17 +++++++++++++++++ dlls/sapi/token.c | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/dlls/sapi/sapi_private.h b/dlls/sapi/sapi_private.h index 7a5c14e..0f6ca4a 100644 --- a/dlls/sapi/sapi_private.h +++ b/dlls/sapi/sapi_private.h @@ -18,6 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include "wine/unicode.h" + HRESULT data_key_create( IUnknown *outer, REFIID iid, void **obj ) DECLSPEC_HIDDEN; HRESULT token_enum_create( IUnknown *outer, REFIID iid, void **obj ) DECLSPEC_HIDDEN;
@@ -30,3 +32,18 @@ static inline BOOL heap_free(void *mem) { return HeapFree(GetProcessHeap(), 0, mem); } + +static inline LPWSTR heap_strdupW(LPCWSTR str) +{ + LPWSTR ret = NULL; + DWORD size; + + if (str) + { + size = (strlenW( str ) + 1) * sizeof(WCHAR); + ret = heap_alloc( size ); + if (ret) memcpy( ret, str, size ); + } + + return ret; +} diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c index 03ce0a7..8ad13a8 100644 --- a/dlls/sapi/token.c +++ b/dlls/sapi/token.c @@ -231,6 +231,9 @@ struct token_enum { ISpObjectTokenEnumBuilder ISpObjectTokenEnumBuilder_iface; LONG ref; + + BOOL init; + WCHAR *req, *opt; };
struct token_enum *impl_from_ISpObjectTokenEnumBuilder( ISpObjectTokenEnumBuilder *iface ) @@ -276,7 +279,11 @@ static ULONG WINAPI token_enum_Release( ISpObjectTokenEnumBuilder *iface ) TRACE( "(%p) ref = %u\n", This, ref );
if (!ref) + { + heap_free( This->req ); + heap_free( This->opt ); heap_free( This ); + }
return ref; } @@ -326,8 +333,30 @@ static HRESULT WINAPI token_enum_GetCount( ISpObjectTokenEnumBuilder *iface, static HRESULT WINAPI token_enum_SetAttribs( ISpObjectTokenEnumBuilder *iface, LPCWSTR req, LPCWSTR opt) { - FIXME( "stub\n" ); - return E_NOTIMPL; + struct token_enum *This = impl_from_ISpObjectTokenEnumBuilder( iface ); + + TRACE( "(%p)->(%s %s)\n", This, debugstr_w( req ), debugstr_w( opt ) ); + + if (This->init) return SPERR_ALREADY_INITIALIZED; + + if (req) + { + This->req = heap_strdupW( req ); + if (!This->req) goto out_of_mem; + } + + if (opt) + { + This->opt = heap_strdupW( opt ); + if (!This->opt) goto out_of_mem; + } + + This->init = TRUE; + return S_OK; + +out_of_mem: + heap_free( This->req ); + return E_OUTOFMEMORY; }
static HRESULT WINAPI token_enum_AddTokens( ISpObjectTokenEnumBuilder *iface, @@ -385,6 +414,9 @@ HRESULT token_enum_create( IUnknown *outer, REFIID iid, void **obj ) if (!This) return E_OUTOFMEMORY; This->ISpObjectTokenEnumBuilder_iface.lpVtbl = &token_enum_vtbl; This->ref = 1; + This->req = NULL; + This->opt = NULL; + This->init = FALSE;
hr = ISpObjectTokenEnumBuilder_QueryInterface( &This->ISpObjectTokenEnumBuilder_iface, iid, obj );