[PATCH 3/3] mfplat: Signal synchronous resolver methods on handler failure.
Nikolay Sivov
nsivov at codeweavers.com
Mon Apr 27 02:44:40 CDT 2020
From: "Rémi Bernon" <rbernon at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
Supersedes 184179.
dlls/mfplat/main.c | 45 +++++++++++++++++---------------------
dlls/mfplat/tests/mfplat.c | 4 ++++
2 files changed, 24 insertions(+), 25 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 923905399b..0a5958acb2 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -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)
- {
- 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);
- /* 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 (data->hEvent)
- SetEvent(data->hEvent);
- else
+ if (SUCCEEDED(RtwqCreateAsyncResult(queued_result->object, data->pCallback, caller_state, &caller_result)))
{
- 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;
}
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index e623b4c0ed..4bc0813624 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -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);
--
2.26.2
More information about the wine-devel
mailing list