Commit 743d77b2 authored by Bernhard Kölbl's avatar Bernhard Kölbl Committed by Alexandre Julliard

windows.media.speech: Store speech commands in listconstraint.

And make them obtainable with ISpeechRecognitionListConstraint_get_Commands. Signed-off-by: 's avatarBernhard Kölbl <besentv@gmail.com> Signed-off-by: 's avatarRémi Bernon <rbernon@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent a709f242
...@@ -120,8 +120,19 @@ static HRESULT WINAPI list_constraint_GetTrustLevel( ISpeechRecognitionListConst ...@@ -120,8 +120,19 @@ static HRESULT WINAPI list_constraint_GetTrustLevel( ISpeechRecognitionListConst
static HRESULT WINAPI list_constraint_get_Commands( ISpeechRecognitionListConstraint *iface, IVector_HSTRING **value ) static HRESULT WINAPI list_constraint_get_Commands( ISpeechRecognitionListConstraint *iface, IVector_HSTRING **value )
{ {
FIXME("iface %p, value %p stub!\n", iface, value); struct list_constraint *impl = impl_from_ISpeechRecognitionListConstraint(iface);
return E_NOTIMPL; IIterable_HSTRING *iterable;
HRESULT hr;
TRACE("iface %p, value %p.\n", iface, value);
hr = IVector_HSTRING_QueryInterface(impl->commands, &IID_IIterable_HSTRING, (void **)&iterable);
if (FAILED(hr)) return hr;
hr = vector_hstring_create_copy(iterable, value);
IIterable_HSTRING_Release(iterable);
return hr;
} }
static const struct ISpeechRecognitionListConstraintVtbl speech_recognition_list_constraint_vtbl = static const struct ISpeechRecognitionListConstraintVtbl speech_recognition_list_constraint_vtbl =
...@@ -135,7 +146,7 @@ static const struct ISpeechRecognitionListConstraintVtbl speech_recognition_list ...@@ -135,7 +146,7 @@ static const struct ISpeechRecognitionListConstraintVtbl speech_recognition_list
list_constraint_GetRuntimeClassName, list_constraint_GetRuntimeClassName,
list_constraint_GetTrustLevel, list_constraint_GetTrustLevel,
/* ISpeechRecognitionListConstraint methods */ /* ISpeechRecognitionListConstraint methods */
list_constraint_get_Commands list_constraint_get_Commands,
}; };
/* /*
...@@ -209,7 +220,7 @@ static const struct ISpeechRecognitionConstraintVtbl speech_recognition_constrai ...@@ -209,7 +220,7 @@ static const struct ISpeechRecognitionConstraintVtbl speech_recognition_constrai
constraint_put_Tag, constraint_put_Tag,
constraint_get_Type, constraint_get_Type,
constraint_get_Probability, constraint_get_Probability,
constraint_put_Probability constraint_put_Probability,
}; };
/* /*
...@@ -338,6 +349,7 @@ static HRESULT WINAPI constraint_factory_CreateWithTag( ISpeechRecognitionListCo ...@@ -338,6 +349,7 @@ static HRESULT WINAPI constraint_factory_CreateWithTag( ISpeechRecognitionListCo
ISpeechRecognitionListConstraint** listconstraint ) ISpeechRecognitionListConstraint** listconstraint )
{ {
struct list_constraint *impl; struct list_constraint *impl;
HRESULT hr;
TRACE("iface %p, commands %p, tag %p, listconstraint %p.\n", iface, commands, tag, listconstraint); TRACE("iface %p, commands %p, tag %p, listconstraint %p.\n", iface, commands, tag, listconstraint);
...@@ -347,11 +359,7 @@ static HRESULT WINAPI constraint_factory_CreateWithTag( ISpeechRecognitionListCo ...@@ -347,11 +359,7 @@ static HRESULT WINAPI constraint_factory_CreateWithTag( ISpeechRecognitionListCo
return E_POINTER; return E_POINTER;
if (!(impl = calloc(1, sizeof(*impl)))) return E_OUTOFMEMORY; if (!(impl = calloc(1, sizeof(*impl)))) return E_OUTOFMEMORY;
if (FAILED(vector_hstring_create(&impl->commands))) if (FAILED(hr = vector_hstring_create_copy(commands, &impl->commands))) goto error;
{
free(impl);
return E_OUTOFMEMORY;
}
impl->ISpeechRecognitionListConstraint_iface.lpVtbl = &speech_recognition_list_constraint_vtbl; impl->ISpeechRecognitionListConstraint_iface.lpVtbl = &speech_recognition_list_constraint_vtbl;
impl->ISpeechRecognitionConstraint_iface.lpVtbl = &speech_recognition_constraint_vtbl; impl->ISpeechRecognitionConstraint_iface.lpVtbl = &speech_recognition_constraint_vtbl;
...@@ -361,6 +369,11 @@ static HRESULT WINAPI constraint_factory_CreateWithTag( ISpeechRecognitionListCo ...@@ -361,6 +369,11 @@ static HRESULT WINAPI constraint_factory_CreateWithTag( ISpeechRecognitionListCo
*listconstraint = &impl->ISpeechRecognitionListConstraint_iface; *listconstraint = &impl->ISpeechRecognitionListConstraint_iface;
return S_OK; return S_OK;
error:
if (impl->commands) IVector_HSTRING_Release(impl->commands);
if (impl) free(impl);
return hr;
} }
static const struct ISpeechRecognitionListConstraintFactoryVtbl speech_recognition_list_constraint_factory_vtbl = static const struct ISpeechRecognitionListConstraintFactoryVtbl speech_recognition_list_constraint_factory_vtbl =
......
...@@ -67,6 +67,7 @@ HRESULT typed_event_handlers_notify( struct list *list, IInspectable *sender, II ...@@ -67,6 +67,7 @@ HRESULT typed_event_handlers_notify( struct list *list, IInspectable *sender, II
HRESULT typed_event_handlers_clear( struct list* list ); HRESULT typed_event_handlers_clear( struct list* list );
HRESULT vector_hstring_create( IVector_HSTRING **out ); HRESULT vector_hstring_create( IVector_HSTRING **out );
HRESULT vector_hstring_create_copy( IIterable_HSTRING *iterable, IVector_HSTRING **out );
#define DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from, iface_mem, expr ) \ #define DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from, iface_mem, expr ) \
static inline impl_type *impl_from( iface_type *iface ) \ static inline impl_type *impl_from( iface_type *iface ) \
......
...@@ -106,6 +106,7 @@ static inline struct completed_event_handler *impl_from_IHandler_RecognitionComp ...@@ -106,6 +106,7 @@ static inline struct completed_event_handler *impl_from_IHandler_RecognitionComp
HRESULT WINAPI completed_event_handler_QueryInterface( IHandler_RecognitionCompleted *iface, REFIID iid, void **out ) HRESULT WINAPI completed_event_handler_QueryInterface( IHandler_RecognitionCompleted *iface, REFIID iid, void **out )
{ {
if (IsEqualGUID(iid, &IID_IUnknown) || if (IsEqualGUID(iid, &IID_IUnknown) ||
IsEqualGUID(iid, &IID_IAgileObject) ||
IsEqualGUID(iid, &IID_IHandler_RecognitionCompleted)) IsEqualGUID(iid, &IID_IHandler_RecognitionCompleted))
{ {
IUnknown_AddRef(iface); IUnknown_AddRef(iface);
...@@ -172,6 +173,7 @@ static inline struct recognition_result_handler *impl_from_IHandler_RecognitionR ...@@ -172,6 +173,7 @@ static inline struct recognition_result_handler *impl_from_IHandler_RecognitionR
HRESULT WINAPI recognition_result_handler_QueryInterface( IHandler_RecognitionResult *iface, REFIID iid, void **out ) HRESULT WINAPI recognition_result_handler_QueryInterface( IHandler_RecognitionResult *iface, REFIID iid, void **out )
{ {
if (IsEqualGUID(iid, &IID_IUnknown) || if (IsEqualGUID(iid, &IID_IUnknown) ||
IsEqualGUID(iid, &IID_IAgileObject) ||
IsEqualGUID(iid, &IID_IHandler_RecognitionResult)) IsEqualGUID(iid, &IID_IHandler_RecognitionResult))
{ {
IUnknown_AddRef(iface); IUnknown_AddRef(iface);
...@@ -417,9 +419,11 @@ static HRESULT WINAPI iterable_hstring_GetTrustLevel( IIterable_HSTRING *iface, ...@@ -417,9 +419,11 @@ static HRESULT WINAPI iterable_hstring_GetTrustLevel( IIterable_HSTRING *iface,
static HRESULT WINAPI iterable_hstring_First( IIterable_HSTRING *iface, IIterator_HSTRING **value ) static HRESULT WINAPI iterable_hstring_First( IIterable_HSTRING *iface, IIterator_HSTRING **value )
{ {
struct iterable_hstring *impl = impl_from_Iterable_HSTRING(iface); struct iterable_hstring *impl = impl_from_Iterable_HSTRING(iface);
struct iterator_hstring *impl_iter = impl_from_IIterator_HSTRING(impl->iterator);
trace("iface %p, value %p.\n", iface, value); trace("iface %p, value %p.\n", iface, value);
impl_iter->index = 0;
IIterator_HSTRING_AddRef((*value = impl->iterator)); IIterator_HSTRING_AddRef((*value = impl->iterator));
return S_OK; return S_OK;
} }
...@@ -956,33 +960,34 @@ static void test_SpeechRecognitionListConstraint(void) ...@@ -956,33 +960,34 @@ static void test_SpeechRecognitionListConstraint(void)
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = ISpeechRecognitionListConstraint_get_Commands(listconstraint, &hstring_vector); hr = ISpeechRecognitionListConstraint_get_Commands(listconstraint, &hstring_vector);
todo_wine ok(hr == S_OK, "ISpeechRecognitionListConstraint_Commands failed, hr %#lx.\n", hr); ok(hr == S_OK, "ISpeechRecognitionListConstraint_Commands failed, hr %#lx.\n", hr);
if (!SUCCEEDED(hr))
goto skip_tests;
hr = IVector_HSTRING_get_Size(hstring_vector, &vector_size); hr = IVector_HSTRING_get_Size(hstring_vector, &vector_size);
todo_wine ok(hr == S_OK, "IVector_HSTRING_get_Size failed, hr %#lx.\n", hr); ok(hr == S_OK, "IVector_HSTRING_get_Size failed, hr %#lx.\n", hr);
todo_wine ok(vector_size == ARRAY_SIZE(commands), "Got unexpected vector_size %u.\n", vector_size); ok(vector_size == ARRAY_SIZE(commands), "Got unexpected vector_size %u.\n", vector_size);
for (i = 0; i < vector_size; i++) for (i = 0; i < vector_size; i++)
{ {
HSTRING str; HSTRING str;
hr = IVector_HSTRING_GetAt(hstring_vector, i, &str); hr = IVector_HSTRING_GetAt(hstring_vector, i, &str);
todo_wine ok(hr == S_OK, "IVector_HSTRING_GetAt failed, hr %#lx.\n", hr); ok(hr == S_OK, "IVector_HSTRING_GetAt failed, hr %#lx.\n", hr);
hr = WindowsCompareStringOrdinal(commands[i], str, &str_cmp); hr = WindowsCompareStringOrdinal(commands[i], str, &str_cmp);
todo_wine ok(hr == S_OK, "WindowsCompareStringOrdinal failed, hr %#lx.\n", hr); ok(hr == S_OK, "WindowsCompareStringOrdinal failed, hr %#lx.\n", hr);
todo_wine ok(!str_cmp, "Strings not equal.\n"); ok(!str_cmp, "Strings not equal.\n");
WindowsDeleteString(str); WindowsDeleteString(str);
} }
ref = IVector_HSTRING_Release(hstring_vector); ref = IVector_HSTRING_Release(hstring_vector);
todo_wine ok(ref == 0, "Got unexpected ref %lu.\n", ref); ok(ref == 0, "Got unexpected ref %lu.\n", ref);
hr = ISpeechRecognitionConstraint_get_Tag(constraint, &tag_out); hr = ISpeechRecognitionConstraint_get_Tag(constraint, &tag_out);
todo_wine ok(hr == S_OK, "ISpeechRecognitionConstraint_get_Tag failed, hr %#lx.\n", hr); todo_wine ok(hr == S_OK, "ISpeechRecognitionConstraint_get_Tag failed, hr %#lx.\n", hr);
if (FAILED(hr))
goto skip_tests;
hr = WindowsCompareStringOrdinal(tag, tag_out, &str_cmp); hr = WindowsCompareStringOrdinal(tag, tag_out, &str_cmp);
todo_wine ok(hr == S_OK, "WindowsCompareStringOrdinal failed, hr %#lx.\n", hr); todo_wine ok(hr == S_OK, "WindowsCompareStringOrdinal failed, hr %#lx.\n", hr);
todo_wine ok(!str_cmp, "Strings not equal.\n"); todo_wine ok(!str_cmp, "Strings not equal.\n");
......
...@@ -727,3 +727,47 @@ HRESULT vector_hstring_create( IVector_HSTRING **out ) ...@@ -727,3 +727,47 @@ HRESULT vector_hstring_create( IVector_HSTRING **out )
TRACE("created %p\n", *out); TRACE("created %p\n", *out);
return S_OK; return S_OK;
} }
HRESULT vector_hstring_create_copy( IIterable_HSTRING *iterable, IVector_HSTRING **out )
{
struct vector_hstring *impl;
IIterator_HSTRING *iterator;
UINT32 capacity = 0;
BOOL available;
HRESULT hr;
TRACE("iterable %p, out %p.\n", iterable, out);
if (FAILED(hr = vector_hstring_create(out))) return hr;
if (FAILED(hr = IIterable_HSTRING_First(iterable, &iterator))) goto error;
for (IIterator_HSTRING_get_HasCurrent(iterator, &available); available; IIterator_HSTRING_MoveNext(iterator, &available))
capacity++;
IIterator_HSTRING_Release(iterator);
impl = impl_from_IVector_HSTRING(*out);
impl->size = 0;
impl->capacity = capacity;
if (!(impl->elements = realloc(impl->elements, impl->capacity * sizeof(*impl->elements)))) goto error;
if (FAILED(hr = IIterable_HSTRING_First(iterable, &iterator))) goto error;
for (IIterator_HSTRING_get_HasCurrent(iterator, &available); available; IIterator_HSTRING_MoveNext(iterator, &available))
{
HSTRING str;
if (FAILED(hr = IIterator_HSTRING_get_Current(iterator, &str))) goto error;
if (FAILED(hr = WindowsDuplicateString(str, &impl->elements[impl->size]))) goto error;
WindowsDeleteString(str);
impl->size++;
}
IIterator_HSTRING_Release(iterator);
TRACE("created %p\n", *out);
return S_OK;
error:
IVector_HSTRING_Release(*out);
return hr;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment