@@ -599,6 +599,20 @@ static struct token_enum *impl_from_ISpeechObjectTokens( ISpeechObjectTokens *if
599
599
return CONTAINING_RECORD ( iface , struct token_enum , ISpeechObjectTokens_iface );
600
600
}
601
601
602
+ struct enum_var
603
+ {
604
+ IEnumVARIANT IEnumVARIANT_iface ;
605
+ LONG ref ;
606
+
607
+ ISpObjectTokenEnumBuilder * token_enum ;
608
+ ULONG index ;
609
+ };
610
+
611
+ static struct enum_var * impl_from_IEnumVARIANT ( IEnumVARIANT * iface )
612
+ {
613
+ return CONTAINING_RECORD ( iface , struct enum_var , IEnumVARIANT_iface );
614
+ }
615
+
602
616
static HRESULT WINAPI token_category_EnumTokens ( ISpObjectTokenCategory * iface ,
603
617
LPCWSTR req , LPCWSTR opt ,
604
618
IEnumSpObjectTokens * * enum_tokens )
@@ -1145,6 +1159,86 @@ const struct ISpObjectTokenEnumBuilderVtbl token_enum_vtbl =
1145
1159
token_enum_Sort
1146
1160
};
1147
1161
1162
+ static HRESULT WINAPI enum_var_QueryInterface ( IEnumVARIANT * iface ,
1163
+ REFIID iid , void * * obj )
1164
+ {
1165
+ struct enum_var * This = impl_from_IEnumVARIANT ( iface );
1166
+
1167
+ TRACE ( "(%p)->(%s %p)\n" , This , debugstr_guid ( iid ), obj );
1168
+
1169
+ if (IsEqualIID ( iid , & IID_IUnknown ) ||
1170
+ IsEqualIID ( iid , & IID_IEnumVARIANT ))
1171
+ {
1172
+ IEnumVARIANT_AddRef ( iface );
1173
+ * obj = iface ;
1174
+ return S_OK ;
1175
+ }
1176
+
1177
+ * obj = NULL ;
1178
+ FIXME ( "interface %s not implemented\n" , debugstr_guid ( iid ) );
1179
+ return E_NOINTERFACE ;
1180
+ }
1181
+
1182
+ static ULONG WINAPI enum_var_AddRef ( IEnumVARIANT * iface )
1183
+ {
1184
+ struct enum_var * This = impl_from_IEnumVARIANT ( iface );
1185
+ ULONG ref = InterlockedIncrement ( & This -> ref );
1186
+
1187
+ TRACE ( "(%p) ref = %lu\n" , This , ref );
1188
+ return ref ;
1189
+ }
1190
+
1191
+ static ULONG WINAPI enum_var_Release ( IEnumVARIANT * iface )
1192
+ {
1193
+ struct enum_var * This = impl_from_IEnumVARIANT ( iface );
1194
+ ULONG ref = InterlockedDecrement ( & This -> ref );
1195
+
1196
+ TRACE ( "(%p) ref = %lu\n" , This , ref );
1197
+
1198
+ if (!ref )
1199
+ {
1200
+ ISpObjectTokenEnumBuilder_Release ( This -> token_enum );
1201
+ free ( This );
1202
+ }
1203
+ return ref ;
1204
+ }
1205
+
1206
+ static HRESULT WINAPI enum_var_Next ( IEnumVARIANT * iface , ULONG count ,
1207
+ VARIANT * vars , ULONG * fetched )
1208
+ {
1209
+ FIXME ( "stub\n" );
1210
+ return E_NOTIMPL ;
1211
+ }
1212
+
1213
+ static HRESULT WINAPI enum_var_Skip ( IEnumVARIANT * iface , ULONG count )
1214
+ {
1215
+ FIXME ( "stub\n" );
1216
+ return E_NOTIMPL ;
1217
+ }
1218
+
1219
+ static HRESULT WINAPI enum_var_Reset ( IEnumVARIANT * iface )
1220
+ {
1221
+ FIXME ( "stub\n" );
1222
+ return E_NOTIMPL ;
1223
+ }
1224
+
1225
+ static HRESULT WINAPI enum_var_Clone ( IEnumVARIANT * iface , IEnumVARIANT * * new_enum )
1226
+ {
1227
+ FIXME ( "stub\n" );
1228
+ return E_NOTIMPL ;
1229
+ }
1230
+
1231
+ static const IEnumVARIANTVtbl enum_var_vtbl =
1232
+ {
1233
+ enum_var_QueryInterface ,
1234
+ enum_var_AddRef ,
1235
+ enum_var_Release ,
1236
+ enum_var_Next ,
1237
+ enum_var_Skip ,
1238
+ enum_var_Reset ,
1239
+ enum_var_Clone
1240
+ };
1241
+
1148
1242
static HRESULT WINAPI speech_tokens_QueryInterface ( ISpeechObjectTokens * iface ,
1149
1243
REFIID iid , void * * obj )
1150
1244
{
@@ -1233,8 +1327,27 @@ static HRESULT WINAPI speech_tokens_Item( ISpeechObjectTokens *iface,
1233
1327
static HRESULT WINAPI speech_tokens_get__NewEnum ( ISpeechObjectTokens * iface ,
1234
1328
IUnknown * * new_enum )
1235
1329
{
1236
- FIXME ( "stub\n" );
1237
- return E_NOTIMPL ;
1330
+ struct enum_var * enum_var ;
1331
+ HRESULT hr ;
1332
+
1333
+ TRACE ( "(%p)->(%p)\n" , iface , new_enum );
1334
+
1335
+ if (!new_enum ) return E_POINTER ;
1336
+ if (!(enum_var = malloc ( sizeof (* enum_var ) ))) return E_OUTOFMEMORY ;
1337
+
1338
+ enum_var -> IEnumVARIANT_iface .lpVtbl = & enum_var_vtbl ;
1339
+ enum_var -> ref = 1 ;
1340
+ enum_var -> index = 0 ;
1341
+ if (FAILED (hr = ISpeechObjectTokens_QueryInterface ( iface , & IID_ISpObjectTokenEnumBuilder ,
1342
+ (void * * )& enum_var -> token_enum )))
1343
+ {
1344
+ free ( enum_var );
1345
+ return hr ;
1346
+ }
1347
+
1348
+ * new_enum = (IUnknown * )& enum_var -> IEnumVARIANT_iface ;
1349
+
1350
+ return S_OK ;
1238
1351
}
1239
1352
1240
1353
static const ISpeechObjectTokensVtbl speech_tokens_vtbl =
0 commit comments