2 * Speech API (SAPI) token implementation.
4 * Copyright (C) 2017 Huw Davies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "wine/debug.h"
33 #include "sapi_private.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(sapi
);
39 ISpRegDataKey ISpRegDataKey_iface
;
46 static struct data_key
*impl_from_ISpRegDataKey( ISpRegDataKey
*iface
)
48 return CONTAINING_RECORD( iface
, struct data_key
, ISpRegDataKey_iface
);
51 static HRESULT WINAPI
data_key_QueryInterface( ISpRegDataKey
*iface
, REFIID iid
, void **obj
)
53 struct data_key
*This
= impl_from_ISpRegDataKey( iface
);
55 TRACE( "(%p)->(%s %p)\n", This
, debugstr_guid( iid
), obj
);
57 if (IsEqualIID( iid
, &IID_IUnknown
) ||
58 IsEqualIID( iid
, &IID_ISpDataKey
) ||
59 IsEqualIID( iid
, &IID_ISpRegDataKey
))
61 ISpRegDataKey_AddRef( iface
);
66 FIXME( "interface %s not implemented\n", debugstr_guid( iid
) );
71 static ULONG WINAPI
data_key_AddRef( ISpRegDataKey
*iface
)
73 struct data_key
*This
= impl_from_ISpRegDataKey( iface
);
74 ULONG ref
= InterlockedIncrement( &This
->ref
);
76 TRACE( "(%p) ref = %lu\n", This
, ref
);
80 static ULONG WINAPI
data_key_Release( ISpRegDataKey
*iface
)
82 struct data_key
*This
= impl_from_ISpRegDataKey( iface
);
83 ULONG ref
= InterlockedDecrement(&This
->ref
);
85 TRACE( "(%p) ref = %lu\n", This
, ref
);
89 if (This
->key
) RegCloseKey( This
->key
);
96 static HRESULT WINAPI
data_key_SetData( ISpRegDataKey
*iface
, LPCWSTR name
,
97 ULONG size
, const BYTE
*data
)
103 static HRESULT WINAPI
data_key_GetData( ISpRegDataKey
*iface
, LPCWSTR name
,
104 ULONG
*size
, BYTE
*data
)
110 static HRESULT WINAPI
data_key_SetStringValue( ISpRegDataKey
*iface
,
111 LPCWSTR name
, LPCWSTR value
)
117 static HRESULT WINAPI
data_key_GetStringValue( ISpRegDataKey
*iface
,
118 LPCWSTR name
, LPWSTR
*value
)
120 struct data_key
*This
= impl_from_ISpRegDataKey( iface
);
124 TRACE( "%p, %s, %p\n", This
, debugstr_w(name
), value
);
130 ret
= RegGetValueW( This
->key
, NULL
, name
, RRF_RT_REG_SZ
, NULL
, NULL
, &size
);
131 if (ret
!= ERROR_SUCCESS
)
132 return SPERR_NOT_FOUND
;
134 content
= CoTaskMemAlloc(size
);
136 return E_OUTOFMEMORY
;
138 ret
= RegGetValueW( This
->key
, NULL
, name
, RRF_RT_REG_SZ
, NULL
, content
, &size
);
139 if (ret
!= ERROR_SUCCESS
)
141 CoTaskMemFree(content
);
142 return HRESULT_FROM_WIN32(ret
);
149 static HRESULT WINAPI
data_key_SetDWORD( ISpRegDataKey
*iface
,
150 LPCWSTR name
, DWORD value
)
156 static HRESULT WINAPI
data_key_GetDWORD( ISpRegDataKey
*iface
,
157 LPCWSTR name
, DWORD
*pdwValue
)
163 static HRESULT WINAPI
data_key_OpenKey( ISpRegDataKey
*iface
,
164 LPCWSTR name
, ISpDataKey
**sub_key
)
170 static HRESULT WINAPI
data_key_CreateKey( ISpRegDataKey
*iface
,
171 LPCWSTR name
, ISpDataKey
**sub_key
)
173 struct data_key
*This
= impl_from_ISpRegDataKey( iface
);
174 ISpRegDataKey
*spregkey
;
179 TRACE( "%p, %s, %p\n", This
, debugstr_w(name
), sub_key
);
181 res
= RegCreateKeyExW( This
->key
, name
, 0, NULL
, 0, KEY_ALL_ACCESS
, NULL
, &key
, NULL
);
182 if (res
!= ERROR_SUCCESS
)
183 return HRESULT_FROM_WIN32(res
);
185 hr
= data_key_create(NULL
, &IID_ISpRegDataKey
, (void**)&spregkey
);
188 hr
= ISpRegDataKey_SetKey(spregkey
, key
, FALSE
);
190 hr
= ISpRegDataKey_QueryInterface(spregkey
, &IID_ISpDataKey
, (void**)sub_key
);
191 ISpRegDataKey_Release(spregkey
);
197 static HRESULT WINAPI
data_key_DeleteKey( ISpRegDataKey
*iface
, LPCWSTR name
)
203 static HRESULT WINAPI
data_key_DeleteValue( ISpRegDataKey
*iface
, LPCWSTR name
)
209 static HRESULT WINAPI
data_key_EnumKeys( ISpRegDataKey
*iface
,
210 ULONG index
, LPWSTR
*sub_key
)
216 static HRESULT WINAPI
data_key_EnumValues( ISpRegDataKey
*iface
,
217 ULONG index
, LPWSTR
*value
)
223 static HRESULT WINAPI
data_key_SetKey( ISpRegDataKey
*iface
,
224 HKEY key
, BOOL read_only
)
226 struct data_key
*This
= impl_from_ISpRegDataKey( iface
);
228 TRACE( "(%p)->(%p %d)\n", This
, key
, read_only
);
230 if (This
->key
) return SPERR_ALREADY_INITIALIZED
;
233 This
->read_only
= read_only
;
237 const struct ISpRegDataKeyVtbl data_key_vtbl
=
239 data_key_QueryInterface
,
244 data_key_SetStringValue
,
245 data_key_GetStringValue
,
251 data_key_DeleteValue
,
257 HRESULT
data_key_create( IUnknown
*outer
, REFIID iid
, void **obj
)
259 struct data_key
*This
= heap_alloc( sizeof(*This
) );
262 if (!This
) return E_OUTOFMEMORY
;
263 This
->ISpRegDataKey_iface
.lpVtbl
= &data_key_vtbl
;
266 This
->read_only
= FALSE
;
268 hr
= ISpRegDataKey_QueryInterface( &This
->ISpRegDataKey_iface
, iid
, obj
);
270 ISpRegDataKey_Release( &This
->ISpRegDataKey_iface
);
274 struct token_category
276 ISpObjectTokenCategory ISpObjectTokenCategory_iface
;
279 ISpRegDataKey
*data_key
;
282 static struct token_category
*impl_from_ISpObjectTokenCategory( ISpObjectTokenCategory
*iface
)
284 return CONTAINING_RECORD( iface
, struct token_category
, ISpObjectTokenCategory_iface
);
287 static HRESULT WINAPI
token_category_QueryInterface( ISpObjectTokenCategory
*iface
,
288 REFIID iid
, void **obj
)
290 struct token_category
*This
= impl_from_ISpObjectTokenCategory( iface
);
292 TRACE( "(%p)->(%s %p)\n", This
, debugstr_guid( iid
), obj
);
294 if (IsEqualIID( iid
, &IID_IUnknown
) ||
295 IsEqualIID( iid
, &IID_ISpDataKey
) ||
296 IsEqualIID( iid
, &IID_ISpObjectTokenCategory
))
298 ISpObjectTokenCategory_AddRef( iface
);
303 FIXME( "interface %s not implemented\n", debugstr_guid( iid
) );
305 return E_NOINTERFACE
;
308 static ULONG WINAPI
token_category_AddRef( ISpObjectTokenCategory
*iface
)
310 struct token_category
*This
= impl_from_ISpObjectTokenCategory( iface
);
311 ULONG ref
= InterlockedIncrement( &This
->ref
);
313 TRACE( "(%p) ref = %lu\n", This
, ref
);
317 static ULONG WINAPI
token_category_Release( ISpObjectTokenCategory
*iface
)
319 struct token_category
*This
= impl_from_ISpObjectTokenCategory( iface
);
320 ULONG ref
= InterlockedDecrement(&This
->ref
);
322 TRACE( "(%p) ref = %lu\n", This
, ref
);
326 if (This
->data_key
) ISpRegDataKey_Release( This
->data_key
);
332 static HRESULT WINAPI
token_category_SetData( ISpObjectTokenCategory
*iface
,
333 LPCWSTR name
, ULONG size
,
340 static HRESULT WINAPI
token_category_GetData( ISpObjectTokenCategory
*iface
,
341 LPCWSTR name
, ULONG
*size
,
348 static HRESULT WINAPI
token_category_SetStringValue( ISpObjectTokenCategory
*iface
,
349 LPCWSTR name
, LPCWSTR value
)
355 static HRESULT WINAPI
token_category_GetStringValue( ISpObjectTokenCategory
*iface
,
356 LPCWSTR name
, LPWSTR
*value
)
362 static HRESULT WINAPI
token_category_SetDWORD( ISpObjectTokenCategory
*iface
,
363 LPCWSTR name
, DWORD value
)
369 static HRESULT WINAPI
token_category_GetDWORD( ISpObjectTokenCategory
*iface
,
370 LPCWSTR name
, DWORD
*pdwValue
)
376 static HRESULT WINAPI
token_category_OpenKey( ISpObjectTokenCategory
*iface
,
377 LPCWSTR name
, ISpDataKey
**sub_key
)
383 static HRESULT WINAPI
token_category_CreateKey( ISpObjectTokenCategory
*iface
,
384 LPCWSTR name
, ISpDataKey
**sub_key
)
390 static HRESULT WINAPI
token_category_DeleteKey( ISpObjectTokenCategory
*iface
,
397 static HRESULT WINAPI
token_category_DeleteValue( ISpObjectTokenCategory
*iface
,
404 static HRESULT WINAPI
token_category_EnumKeys( ISpObjectTokenCategory
*iface
,
405 ULONG index
, LPWSTR
*sub_key
)
411 static HRESULT WINAPI
token_category_EnumValues( ISpObjectTokenCategory
*iface
,
412 ULONG index
, LPWSTR
*value
)
418 static HRESULT
parse_cat_id( const WCHAR
*str
, HKEY
*root
, const WCHAR
**sub_key
)
427 #define X(s) s, ARRAY_SIZE(s) - 1
428 { X(L
"HKEY_LOCAL_MACHINE\\"), HKEY_LOCAL_MACHINE
},
429 { X(L
"HKEY_CURRENT_USER\\"), HKEY_CURRENT_USER
},
434 int len
= lstrlenW( str
);
436 for (ptr
= table
; ptr
->name
; ptr
++)
438 if (len
>= ptr
->len
&& !wcsncmp( str
, ptr
->name
, ptr
->len
))
441 *sub_key
= str
+ ptr
->len
;
448 static HRESULT WINAPI
token_category_SetId( ISpObjectTokenCategory
*iface
,
449 LPCWSTR id
, BOOL create
)
451 struct token_category
*This
= impl_from_ISpObjectTokenCategory( iface
);
457 TRACE( "(%p)->(%s %d)\n", This
, debugstr_w( id
), create
);
459 if (This
->data_key
) return SPERR_ALREADY_INITIALIZED
;
461 hr
= parse_cat_id( id
, &root
, &subkey
);
462 if (hr
!= S_OK
) return SPERR_INVALID_REGISTRY_KEY
;
465 res
= RegCreateKeyExW( root
, subkey
, 0, NULL
, 0, KEY_ALL_ACCESS
, NULL
, &key
, NULL
);
467 res
= RegOpenKeyExW( root
, subkey
, 0, KEY_ALL_ACCESS
, &key
);
468 if (res
) return SPERR_INVALID_REGISTRY_KEY
;
470 hr
= CoCreateInstance( &CLSID_SpDataKey
, NULL
, CLSCTX_ALL
,
471 &IID_ISpRegDataKey
, (void **)&This
->data_key
);
472 if (FAILED(hr
)) goto fail
;
474 hr
= ISpRegDataKey_SetKey( This
->data_key
, key
, FALSE
);
475 if (FAILED(hr
)) goto fail
;
484 static HRESULT WINAPI
token_category_GetId( ISpObjectTokenCategory
*iface
,
491 static HRESULT WINAPI
token_category_GetDataKey( ISpObjectTokenCategory
*iface
,
492 SPDATAKEYLOCATION location
,
493 ISpDataKey
**data_key
)
499 static HRESULT WINAPI
token_category_EnumTokens( ISpObjectTokenCategory
*iface
,
500 LPCWSTR req
, LPCWSTR opt
,
501 IEnumSpObjectTokens
**enum_tokens
)
503 struct token_category
*This
= impl_from_ISpObjectTokenCategory( iface
);
504 ISpObjectTokenEnumBuilder
*builder
;
507 FIXME( "(%p)->(%s %s %p): semi-stub\n", This
, debugstr_w( req
), debugstr_w( opt
), enum_tokens
);
509 if (!This
->data_key
) return SPERR_UNINITIALIZED
;
511 hr
= CoCreateInstance( &CLSID_SpObjectTokenEnum
, NULL
, CLSCTX_ALL
,
512 &IID_ISpObjectTokenEnumBuilder
, (void **)&builder
);
513 if (FAILED(hr
)) return hr
;
515 hr
= ISpObjectTokenEnumBuilder_SetAttribs( builder
, req
, opt
);
516 if (FAILED(hr
)) goto fail
;
518 /* FIXME: Build the enumerator */
520 hr
= ISpObjectTokenEnumBuilder_QueryInterface( builder
, &IID_IEnumSpObjectTokens
,
521 (void **)enum_tokens
);
524 ISpObjectTokenEnumBuilder_Release( builder
);
528 static HRESULT WINAPI
token_category_SetDefaultTokenId( ISpObjectTokenCategory
*iface
,
535 static HRESULT WINAPI
token_category_GetDefaultTokenId( ISpObjectTokenCategory
*iface
,
538 struct token_category
*This
= impl_from_ISpObjectTokenCategory( iface
);
539 struct data_key
*this_data_key
;
542 DWORD regvalue_size
= sizeof( regvalue
);
544 FIXME( "(%p)->(%p): semi-stub\n", iface
, id
);
547 return SPERR_UNINITIALIZED
;
552 /* todo: check HKCU's DefaultTokenId before */
554 this_data_key
= impl_from_ISpRegDataKey( This
->data_key
);
556 res
= RegGetValueW( this_data_key
->key
, NULL
, L
"DefaultDefaultTokenId", RRF_RT_REG_SZ
,
557 NULL
, ®value
, ®value_size
);
558 if (res
== ERROR_FILE_NOT_FOUND
) {
559 return SPERR_NOT_FOUND
;
560 } else if (res
!= ERROR_SUCCESS
) {
561 /* probably not the correct return value */
562 FIXME( "returning %08lx\n", res
);
566 *id
= CoTaskMemAlloc( regvalue_size
);
567 wcscpy( *id
, regvalue
);
572 const struct ISpObjectTokenCategoryVtbl token_category_vtbl
=
574 token_category_QueryInterface
,
575 token_category_AddRef
,
576 token_category_Release
,
577 token_category_SetData
,
578 token_category_GetData
,
579 token_category_SetStringValue
,
580 token_category_GetStringValue
,
581 token_category_SetDWORD
,
582 token_category_GetDWORD
,
583 token_category_OpenKey
,
584 token_category_CreateKey
,
585 token_category_DeleteKey
,
586 token_category_DeleteValue
,
587 token_category_EnumKeys
,
588 token_category_EnumValues
,
589 token_category_SetId
,
590 token_category_GetId
,
591 token_category_GetDataKey
,
592 token_category_EnumTokens
,
593 token_category_SetDefaultTokenId
,
594 token_category_GetDefaultTokenId
,
597 HRESULT
token_category_create( IUnknown
*outer
, REFIID iid
, void **obj
)
599 struct token_category
*This
= heap_alloc( sizeof(*This
) );
602 if (!This
) return E_OUTOFMEMORY
;
603 This
->ISpObjectTokenCategory_iface
.lpVtbl
= &token_category_vtbl
;
605 This
->data_key
= NULL
;
607 hr
= ISpObjectTokenCategory_QueryInterface( &This
->ISpObjectTokenCategory_iface
, iid
, obj
);
609 ISpObjectTokenCategory_Release( &This
->ISpObjectTokenCategory_iface
);
615 ISpObjectTokenEnumBuilder ISpObjectTokenEnumBuilder_iface
;
623 static struct token_enum
*impl_from_ISpObjectTokenEnumBuilder( ISpObjectTokenEnumBuilder
*iface
)
625 return CONTAINING_RECORD( iface
, struct token_enum
, ISpObjectTokenEnumBuilder_iface
);
628 static HRESULT WINAPI
token_enum_QueryInterface( ISpObjectTokenEnumBuilder
*iface
,
629 REFIID iid
, void **obj
)
631 struct token_enum
*This
= impl_from_ISpObjectTokenEnumBuilder( iface
);
633 TRACE( "(%p)->(%s %p)\n", This
, debugstr_guid( iid
), obj
);
635 if (IsEqualIID( iid
, &IID_IUnknown
) ||
636 IsEqualIID( iid
, &IID_IEnumSpObjectTokens
) ||
637 IsEqualIID( iid
, &IID_ISpObjectTokenEnumBuilder
))
639 ISpObjectTokenEnumBuilder_AddRef( iface
);
644 FIXME( "interface %s not implemented\n", debugstr_guid( iid
) );
646 return E_NOINTERFACE
;
649 static ULONG WINAPI
token_enum_AddRef( ISpObjectTokenEnumBuilder
*iface
)
651 struct token_enum
*This
= impl_from_ISpObjectTokenEnumBuilder( iface
);
652 ULONG ref
= InterlockedIncrement( &This
->ref
);
654 TRACE( "(%p) ref = %lu\n", This
, ref
);
658 static ULONG WINAPI
token_enum_Release( ISpObjectTokenEnumBuilder
*iface
)
660 struct token_enum
*This
= impl_from_ISpObjectTokenEnumBuilder( iface
);
661 ULONG ref
= InterlockedDecrement(&This
->ref
);
663 TRACE( "(%p) ref = %lu\n", This
, ref
);
667 heap_free( This
->req
);
668 heap_free( This
->opt
);
675 static HRESULT WINAPI
token_enum_Next( ISpObjectTokenEnumBuilder
*iface
,
676 ULONG num
, ISpObjectToken
**tokens
,
679 struct token_enum
*This
= impl_from_ISpObjectTokenEnumBuilder( iface
);
681 TRACE( "(%p)->(%lu %p %p)\n", This
, num
, tokens
, fetched
);
683 if (!This
->init
) return SPERR_UNINITIALIZED
;
685 FIXME( "semi-stub: Returning an empty enumerator\n" );
687 if (fetched
) *fetched
= 0;
691 static HRESULT WINAPI
token_enum_Skip( ISpObjectTokenEnumBuilder
*iface
,
698 static HRESULT WINAPI
token_enum_Reset( ISpObjectTokenEnumBuilder
*iface
)
704 static HRESULT WINAPI
token_enum_Clone( ISpObjectTokenEnumBuilder
*iface
,
705 IEnumSpObjectTokens
**clone
)
711 static HRESULT WINAPI
token_enum_Item( ISpObjectTokenEnumBuilder
*iface
,
712 ULONG index
, ISpObjectToken
**token
)
718 static HRESULT WINAPI
token_enum_GetCount( ISpObjectTokenEnumBuilder
*iface
,
721 struct token_enum
*This
= impl_from_ISpObjectTokenEnumBuilder( iface
);
723 TRACE( "(%p)->(%p)\n", This
, count
);
725 if (!This
->init
) return SPERR_UNINITIALIZED
;
727 *count
= This
->count
;
731 static HRESULT WINAPI
token_enum_SetAttribs( ISpObjectTokenEnumBuilder
*iface
,
732 LPCWSTR req
, LPCWSTR opt
)
734 struct token_enum
*This
= impl_from_ISpObjectTokenEnumBuilder( iface
);
736 TRACE( "(%p)->(%s %s)\n", This
, debugstr_w( req
), debugstr_w( opt
) );
738 if (This
->init
) return SPERR_ALREADY_INITIALIZED
;
742 This
->req
= heap_strdupW( req
);
743 if (!This
->req
) goto out_of_mem
;
748 This
->opt
= heap_strdupW( opt
);
749 if (!This
->opt
) goto out_of_mem
;
756 heap_free( This
->req
);
757 return E_OUTOFMEMORY
;
760 static HRESULT WINAPI
token_enum_AddTokens( ISpObjectTokenEnumBuilder
*iface
,
761 ULONG num
, ISpObjectToken
**tokens
)
767 static HRESULT WINAPI
token_enum_AddTokensFromDataKey( ISpObjectTokenEnumBuilder
*iface
,
768 ISpDataKey
*data_key
,
769 LPCWSTR sub_key
, LPCWSTR cat_id
)
775 static HRESULT WINAPI
token_enum_AddTokensFromTokenEnum( ISpObjectTokenEnumBuilder
*iface
,
776 IEnumSpObjectTokens
*token_enum
)
782 static HRESULT WINAPI
token_enum_Sort( ISpObjectTokenEnumBuilder
*iface
,
789 const struct ISpObjectTokenEnumBuilderVtbl token_enum_vtbl
=
791 token_enum_QueryInterface
,
800 token_enum_SetAttribs
,
801 token_enum_AddTokens
,
802 token_enum_AddTokensFromDataKey
,
803 token_enum_AddTokensFromTokenEnum
,
807 HRESULT
token_enum_create( IUnknown
*outer
, REFIID iid
, void **obj
)
809 struct token_enum
*This
= heap_alloc( sizeof(*This
) );
812 if (!This
) return E_OUTOFMEMORY
;
813 This
->ISpObjectTokenEnumBuilder_iface
.lpVtbl
= &token_enum_vtbl
;
820 hr
= ISpObjectTokenEnumBuilder_QueryInterface( &This
->ISpObjectTokenEnumBuilder_iface
, iid
, obj
);
822 ISpObjectTokenEnumBuilder_Release( &This
->ISpObjectTokenEnumBuilder_iface
);
828 ISpObjectToken ISpObjectToken_iface
;
835 static struct object_token
*impl_from_ISpObjectToken( ISpObjectToken
*iface
)
837 return CONTAINING_RECORD( iface
, struct object_token
, ISpObjectToken_iface
);
840 static HRESULT WINAPI
token_QueryInterface( ISpObjectToken
*iface
,
841 REFIID iid
, void **obj
)
843 struct object_token
*This
= impl_from_ISpObjectToken( iface
);
845 TRACE( "(%p)->(%s %p)\n", This
, debugstr_guid( iid
), obj
);
847 if (IsEqualIID( iid
, &IID_IUnknown
) ||
848 IsEqualIID( iid
, &IID_ISpDataKey
) ||
849 IsEqualIID( iid
, &IID_ISpObjectToken
))
851 ISpObjectToken_AddRef( iface
);
856 FIXME( "interface %s not implemented\n", debugstr_guid( iid
) );
858 return E_NOINTERFACE
;
861 static ULONG WINAPI
token_AddRef( ISpObjectToken
*iface
)
863 struct object_token
*This
= impl_from_ISpObjectToken( iface
);
864 ULONG ref
= InterlockedIncrement( &This
->ref
);
866 TRACE( "(%p) ref = %lu\n", This
, ref
);
870 static ULONG WINAPI
token_Release( ISpObjectToken
*iface
)
872 struct object_token
*This
= impl_from_ISpObjectToken( iface
);
873 ULONG ref
= InterlockedDecrement(&This
->ref
);
875 TRACE( "(%p) ref = %lu\n", This
, ref
);
879 if (This
->token_key
) RegCloseKey( This
->token_key
);
880 free(This
->token_id
);
887 static HRESULT WINAPI
token_SetData( ISpObjectToken
*iface
,
888 LPCWSTR name
, ULONG size
,
895 static HRESULT WINAPI
token_GetData( ISpObjectToken
*iface
,
896 LPCWSTR name
, ULONG
*size
,
903 static HRESULT WINAPI
token_SetStringValue( ISpObjectToken
*iface
,
904 LPCWSTR name
, LPCWSTR value
)
910 static HRESULT WINAPI
token_GetStringValue( ISpObjectToken
*iface
,
911 LPCWSTR name
, LPWSTR
*value
)
917 static HRESULT WINAPI
token_SetDWORD( ISpObjectToken
*iface
,
918 LPCWSTR name
, DWORD value
)
924 static HRESULT WINAPI
token_GetDWORD( ISpObjectToken
*iface
,
925 LPCWSTR name
, DWORD
*pdwValue
)
931 static HRESULT WINAPI
token_OpenKey( ISpObjectToken
*iface
,
932 LPCWSTR name
, ISpDataKey
**sub_key
)
934 struct object_token
*This
= impl_from_ISpObjectToken( iface
);
935 ISpRegDataKey
*spregkey
;
940 TRACE( "%p, %s, %p\n", This
, debugstr_w(name
), sub_key
);
942 ret
= RegOpenKeyExW (This
->token_key
, name
, 0, KEY_ALL_ACCESS
, &key
);
943 if (ret
!= ERROR_SUCCESS
)
944 return SPERR_NOT_FOUND
;
946 hr
= data_key_create(NULL
, &IID_ISpRegDataKey
, (void**)&spregkey
);
953 hr
= ISpRegDataKey_SetKey(spregkey
, key
, FALSE
);
957 ISpRegDataKey_Release(spregkey
);
961 hr
= ISpRegDataKey_QueryInterface(spregkey
, &IID_ISpDataKey
, (void**)sub_key
);
962 ISpRegDataKey_Release(spregkey
);
967 static HRESULT WINAPI
token_CreateKey( ISpObjectToken
*iface
,
968 LPCWSTR name
, ISpDataKey
**sub_key
)
974 static HRESULT WINAPI
token_DeleteKey( ISpObjectToken
*iface
,
981 static HRESULT WINAPI
token_DeleteValue( ISpObjectToken
*iface
,
988 static HRESULT WINAPI
token_EnumKeys( ISpObjectToken
*iface
,
989 ULONG index
, LPWSTR
*sub_key
)
995 static HRESULT WINAPI
token_EnumValues( ISpObjectToken
*iface
,
996 ULONG index
, LPWSTR
*value
)
1002 static HRESULT WINAPI
token_SetId( ISpObjectToken
*iface
,
1003 LPCWSTR category_id
, LPCWSTR token_id
,
1006 struct object_token
*This
= impl_from_ISpObjectToken( iface
);
1010 const WCHAR
*subkey
;
1012 FIXME( "(%p)->(%s %s %d): semi-stub\n", This
, debugstr_w( category_id
),
1013 debugstr_w(token_id
), create
);
1015 if (This
->token_key
) return SPERR_ALREADY_INITIALIZED
;
1017 if (!token_id
) return E_POINTER
;
1019 hr
= parse_cat_id( token_id
, &root
, &subkey
);
1020 if (hr
!= S_OK
) return SPERR_NOT_FOUND
;
1023 res
= RegCreateKeyExW( root
, subkey
, 0, NULL
, 0, KEY_ALL_ACCESS
, NULL
, &key
, NULL
);
1025 res
= RegOpenKeyExW( root
, subkey
, 0, KEY_ALL_ACCESS
, &key
);
1026 if (res
) return SPERR_NOT_FOUND
;
1028 This
->token_key
= key
;
1029 This
->token_id
= wcsdup(token_id
);
1034 static HRESULT WINAPI
token_GetId( ISpObjectToken
*iface
,
1037 struct object_token
*This
= impl_from_ISpObjectToken( iface
);
1039 TRACE( "%p, %p\n", This
, token_id
);
1041 if (!This
->token_key
)
1042 return SPERR_UNINITIALIZED
;
1047 if (!This
->token_id
)
1049 FIXME("Loading default category not supported.\n");
1053 *token_id
= CoTaskMemAlloc( (wcslen(This
->token_id
) + 1) * sizeof(WCHAR
));
1055 return E_OUTOFMEMORY
;
1057 wcscpy(*token_id
, This
->token_id
);
1061 static HRESULT WINAPI
token_GetCategory( ISpObjectToken
*iface
,
1062 ISpObjectTokenCategory
**category
)
1068 static HRESULT WINAPI
token_CreateInstance( ISpObjectToken
*iface
,
1070 DWORD class_context
,
1078 static HRESULT WINAPI
token_GetStorageFileName( ISpObjectToken
*iface
,
1089 static HRESULT WINAPI
token_RemoveStorageFileName( ISpObjectToken
*iface
,
1098 static HRESULT WINAPI
token_Remove( ISpObjectToken
*iface
,
1105 static HRESULT WINAPI
token_IsUISupported( ISpObjectToken
*iface
,
1108 ULONG extra_data_size
,
1116 static HRESULT WINAPI
token_DisplayUI( ISpObjectToken
*iface
,
1121 ULONG extra_data_size
,
1128 static HRESULT WINAPI
token_MatchesAttributes( ISpObjectToken
*iface
,
1136 const struct ISpObjectTokenVtbl token_vtbl
=
1138 token_QueryInterface
,
1143 token_SetStringValue
,
1144 token_GetStringValue
,
1156 token_CreateInstance
,
1157 token_GetStorageFileName
,
1158 token_RemoveStorageFileName
,
1160 token_IsUISupported
,
1162 token_MatchesAttributes
1165 HRESULT
token_create( IUnknown
*outer
, REFIID iid
, void **obj
)
1167 struct object_token
*This
= heap_alloc( sizeof(*This
) );
1170 if (!This
) return E_OUTOFMEMORY
;
1171 This
->ISpObjectToken_iface
.lpVtbl
= &token_vtbl
;
1174 This
->token_key
= NULL
;
1175 This
->token_id
= NULL
;
1177 hr
= ISpObjectToken_QueryInterface( &This
->ISpObjectToken_iface
, iid
, obj
);
1179 ISpObjectToken_Release( &This
->ISpObjectToken_iface
);