mfplat: Signal synchronous resolver methods on handler failure.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2020-04-27 10:44:40 +03:00 committed by Alexandre Julliard
parent a1fca92720
commit 66bfd5f40c
2 changed files with 26 additions and 27 deletions

View File

@ -5883,6 +5883,7 @@ static HRESULT resolver_handler_end_create(struct source_resolver *resolver, enu
IRtwqAsyncResult *result)
{
IRtwqAsyncResult *inner_result = (IRtwqAsyncResult *)IRtwqAsyncResult_GetStateNoAddRef(result);
RTWQASYNCRESULT *data = (RTWQASYNCRESULT *)inner_result;
struct resolver_queued_result *queued_result;
union
{
@ -5891,7 +5892,8 @@ static HRESULT resolver_handler_end_create(struct source_resolver *resolver, enu
IMFSchemeHandler *scheme_handler;
} handler;
queued_result = heap_alloc_zero(sizeof(*queued_result));
if (!(queued_result = heap_alloc_zero(sizeof(*queued_result))))
return E_OUTOFMEMORY;
IRtwqAsyncResult_GetObject(inner_result, &handler.handler);
@ -5911,37 +5913,30 @@ static HRESULT resolver_handler_end_create(struct source_resolver *resolver, enu
IUnknown_Release(handler.handler);
if (SUCCEEDED(queued_result->hr))
if (data->hEvent)
{
RTWQASYNCRESULT *data = (RTWQASYNCRESULT *)inner_result;
queued_result->inner_result = inner_result;
IRtwqAsyncResult_AddRef(queued_result->inner_result);
}
if (data->hEvent)
/* Push resolved object type and created object, so we don't have to guess on End*() call. */
EnterCriticalSection(&resolver->cs);
list_add_tail(&resolver->pending, &queued_result->entry);
LeaveCriticalSection(&resolver->cs);
if (data->hEvent)
SetEvent(data->hEvent);
else
{
IUnknown *caller_state = IRtwqAsyncResult_GetStateNoAddRef(inner_result);
IRtwqAsyncResult *caller_result;
if (SUCCEEDED(RtwqCreateAsyncResult(queued_result->object, data->pCallback, caller_state, &caller_result)))
{
queued_result->inner_result = inner_result;
IRtwqAsyncResult_AddRef(queued_result->inner_result);
}
/* Push resolved object type and created object, so we don't have to guess on End*() call. */
EnterCriticalSection(&resolver->cs);
list_add_tail(&resolver->pending, &queued_result->entry);
LeaveCriticalSection(&resolver->cs);
if (data->hEvent)
SetEvent(data->hEvent);
else
{
IUnknown *caller_state = IRtwqAsyncResult_GetStateNoAddRef(inner_result);
IRtwqAsyncResult *caller_result;
if (SUCCEEDED(RtwqCreateAsyncResult(queued_result->object, data->pCallback, caller_state, &caller_result)))
{
RtwqInvokeCallback(caller_result);
IRtwqAsyncResult_Release(caller_result);
}
RtwqInvokeCallback(caller_result);
IRtwqAsyncResult_Release(caller_result);
}
}
else
heap_free(queued_result);
return S_OK;
}

View File

@ -605,6 +605,10 @@ skip_source_tests:
/* Create from URL. */
callback.event = CreateEventA(NULL, FALSE, FALSE, NULL);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"nonexisting.mp4", MF_RESOLUTION_BYTESTREAM, NULL, &obj_type,
(IUnknown **)&stream);
ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#x.\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, filename, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type,
(IUnknown **)&stream);
ok(hr == S_OK, "Failed to resolve url, hr %#x.\n", hr);