Skip to content

Commit 6f2a0c4

Browse files
shaunrenjulliard
authored andcommitted
sapi: Implement IEnumVARIANT::Next for ISpeechObjectTokens.
1 parent 261d7c3 commit 6f2a0c4

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

dlls/sapi/tests/token.c

+28
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ static void test_token_enum(void)
256256
ISpObjectToken *out_tokens[5];
257257
WCHAR token_id[MAX_PATH];
258258
ULONG count;
259+
VARIANT vars[3];
259260
int i;
260261

261262
hr = CoCreateInstance( &CLSID_SpObjectTokenEnum, NULL, CLSCTX_INPROC_SERVER,
@@ -372,6 +373,33 @@ static void test_token_enum(void)
372373
hr = IUnknown_QueryInterface( unk, &IID_IEnumVARIANT, (void **)&enumvar );
373374
ok( hr == S_OK, "got %08lx\n", hr );
374375
IUnknown_Release( unk );
376+
377+
V_VT( &vars[0] ) = VT_ILLEGAL;
378+
V_DISPATCH( &vars[0] ) = (IDispatch *)0xdeadbeef;
379+
hr = IEnumVARIANT_Next( enumvar, 1, vars, NULL );
380+
ok( hr == S_OK, "got %08lx\n", hr );
381+
ok( V_VT( &vars[0] ) == VT_DISPATCH, "got %#x\n", V_VT( &vars[0] ) );
382+
ok( V_DISPATCH( &vars[0] ) != (IDispatch *)0xdeadbeef && V_DISPATCH( &vars[0] ) != NULL,
383+
"got %p\n", V_DISPATCH( &vars[0] ) );
384+
VariantClear( &vars[0] );
385+
386+
for ( i = 0; i < 3; i++ ) {
387+
V_VT( &vars[i] ) = VT_ILLEGAL;
388+
V_DISPATCH( &vars[i] ) = (IDispatch *)0xdeadbeef;
389+
}
390+
count = 0xdeadbeef;
391+
392+
hr = IEnumVARIANT_Next( enumvar, 3, vars, &count );
393+
ok( hr == S_FALSE, "got %08lx\n", hr );
394+
ok( count == 2, "got %lu\n", count );
395+
for ( i = 0; i < 2; i++ ) {
396+
ok( V_VT( &vars[i] ) == VT_DISPATCH, "got %#x\n", V_VT( &vars[i] ) );
397+
ok( V_DISPATCH( &vars[i] ) != (IDispatch *)0xdeadbeef && V_DISPATCH( &vars[i] ) != NULL,
398+
"got %p\n", V_DISPATCH( &vars[i] ) );
399+
VariantClear( &vars[i] );
400+
}
401+
ok( V_VT( &vars[2] ) == VT_ILLEGAL, "got %#x\n", V_VT( &vars[2] ) );
402+
375403
IEnumVARIANT_Release( enumvar );
376404

377405
ISpeechObjectTokens_Release( speech_tokens );

dlls/sapi/token.c

+35-2
Original file line numberDiff line numberDiff line change
@@ -1206,8 +1206,41 @@ static ULONG WINAPI enum_var_Release( IEnumVARIANT *iface )
12061206
static HRESULT WINAPI enum_var_Next( IEnumVARIANT *iface, ULONG count,
12071207
VARIANT *vars, ULONG *fetched )
12081208
{
1209-
FIXME( "stub\n" );
1210-
return E_NOTIMPL;
1209+
struct enum_var *This = impl_from_IEnumVARIANT( iface );
1210+
ULONG i, total;
1211+
HRESULT hr;
1212+
1213+
TRACE( "(%p)->(%lu %p %p)\n", This, count, vars, fetched );
1214+
1215+
if (fetched) *fetched = 0;
1216+
1217+
if (FAILED(hr = ISpObjectTokenEnumBuilder_GetCount( This->token_enum, &total )))
1218+
return hr;
1219+
1220+
for ( i = 0; i < count && This->index < total; i++, This->index++ )
1221+
{
1222+
ISpObjectToken *token;
1223+
IDispatch *disp;
1224+
1225+
if (FAILED(hr = ISpObjectTokenEnumBuilder_Item( This->token_enum, This->index, &token )))
1226+
goto fail;
1227+
1228+
hr = ISpObjectToken_QueryInterface( token, &IID_IDispatch, (void **)&disp );
1229+
ISpObjectToken_Release( token );
1230+
if (FAILED(hr)) goto fail;
1231+
1232+
VariantInit( &vars[i] );
1233+
V_VT( &vars[i] ) = VT_DISPATCH;
1234+
V_DISPATCH( &vars[i] ) = disp;
1235+
}
1236+
1237+
if (fetched) *fetched = i;
1238+
return i == count ? S_OK : S_FALSE;
1239+
1240+
fail:
1241+
while (i--)
1242+
VariantClear( &vars[i] );
1243+
return hr;
12111244
}
12121245

12131246
static HRESULT WINAPI enum_var_Skip( IEnumVARIANT *iface, ULONG count )

0 commit comments

Comments
 (0)