Module: wine Branch: master Commit: e00bfc4c91b8649c1a11f465c1944d6e489ed3db URL: https://source.winehq.org/git/wine.git/?a=commit;h=e00bfc4c91b8649c1a11f465c...
Author: Jactry Zeng jzeng@codeweavers.com Date: Thu Mar 14 11:03:14 2019 +0300
mfplat: Add support for string attributes.
Signed-off-by: Jactry Zeng jzeng@codeweavers.com Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/mfplat/main.c | 63 ++++++++++++++++++++++++++++++++++------- dlls/mfplat/tests/mfplat.c | 44 ++++++++++++++++++++++++++-- dlls/mfreadwrite/tests/mfplat.c | 2 +- 3 files changed, 95 insertions(+), 14 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c index 6fb917e..d73076b 100644 --- a/dlls/mfplat/main.c +++ b/dlls/mfplat/main.c @@ -785,25 +785,61 @@ static HRESULT WINAPI mfattributes_GetGUID(IMFAttributes *iface, REFGUID key, GU
static HRESULT WINAPI mfattributes_GetStringLength(IMFAttributes *iface, REFGUID key, UINT32 *length) { - FIXME("%p, %s, %p.\n", iface, debugstr_attr(key), length); + struct attributes *attributes = impl_from_IMFAttributes(iface); + PROPVARIANT attrval; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %s, %p.\n", iface, debugstr_attr(key), length); + + PropVariantInit(&attrval); + attrval.vt = VT_LPWSTR; + hr = attributes_get_item(attributes, key, &attrval); + if (SUCCEEDED(hr) && length) + *length = lstrlenW(attrval.u.pwszVal); + PropVariantClear(&attrval); + + return hr; }
static HRESULT WINAPI mfattributes_GetString(IMFAttributes *iface, REFGUID key, WCHAR *value, - UINT32 size, UINT32 *length) + UINT32 size, UINT32 *length) { - FIXME("%p, %s, %p, %d, %p.\n", iface, debugstr_attr(key), value, size, length); + struct attributes *attributes = impl_from_IMFAttributes(iface); + PROPVARIANT attrval; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %s, %p, %d, %p.\n", iface, debugstr_attr(key), value, size, length); + + PropVariantInit(&attrval); + attrval.vt = VT_LPWSTR; + hr = attributes_get_item(attributes, key, &attrval); + if (SUCCEEDED(hr)) + hr = PropVariantToString(&attrval, value, size); + if (SUCCEEDED(hr) && length) + *length = lstrlenW(value); + PropVariantClear(&attrval); + + return hr; }
-static HRESULT WINAPI mfattributes_GetAllocatedString(IMFAttributes *iface, REFGUID key, - WCHAR **value, UINT32 *length) +static HRESULT WINAPI mfattributes_GetAllocatedString(IMFAttributes *iface, REFGUID key, WCHAR **value, UINT32 *length) { - FIXME("%p, %s, %p, %p.\n", iface, debugstr_attr(key), value, length); + struct attributes *attributes = impl_from_IMFAttributes(iface); + PROPVARIANT attrval; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %s, %p, %p.\n", iface, debugstr_attr(key), value, length); + + PropVariantInit(&attrval); + attrval.vt = VT_LPWSTR; + hr = attributes_get_item(attributes, key, &attrval); + if (SUCCEEDED(hr)) + { + *value = attrval.u.pwszVal; + *length = lstrlenW(*value); + } + + return hr; }
static HRESULT WINAPI mfattributes_GetBlobSize(IMFAttributes *iface, REFGUID key, UINT32 *size) @@ -968,9 +1004,14 @@ static HRESULT WINAPI mfattributes_SetGUID(IMFAttributes *iface, REFGUID key, RE
static HRESULT WINAPI mfattributes_SetString(IMFAttributes *iface, REFGUID key, const WCHAR *value) { - FIXME("%p, %s, %s.\n", iface, debugstr_attr(key), debugstr_w(value)); + struct attributes *attributes = impl_from_IMFAttributes(iface); + PROPVARIANT attrval;
- return E_NOTIMPL; + TRACE("%p, %s, %s.\n", iface, debugstr_attr(key), debugstr_w(value)); + + attrval.vt = VT_LPWSTR; + attrval.u.pwszVal = (WCHAR *)value; + return attributes_set_item(attributes, key, &attrval); }
static HRESULT WINAPI mfattributes_SetBlob(IMFAttributes *iface, REFGUID key, const UINT8 *buf, UINT32 size) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index e6a3f4b..3fda11d 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -44,6 +44,7 @@ DEFINE_GUID(DUMMY_GUID3, 0x12345678,0x1234,0x1234,0x23,0x23,0x23,0x23,0x23,0x23, #include "mferror.h" #include "mfreadwrite.h" #include "propvarutil.h" +#include "strsafe.h"
#include "wine/test.h"
@@ -285,7 +286,7 @@ static void test_source_resolver(void) (void **)&attributes); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFAttributes_SetString(attributes, &MF_BYTESTREAM_CONTENT_TYPE, file_type); - todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); + ok(hr == S_OK, "Failed to set string value, hr %#x.\n", hr); IMFAttributes_Release(attributes);
hr = IMFSourceResolver_CreateObjectFromByteStream( @@ -505,11 +506,14 @@ static void check_attr_count(IMFAttributes* obj, UINT32 expected, int line)
static void test_MFCreateAttributes(void) { + static const WCHAR stringW[] = {'W','i','n','e',0}; PROPVARIANT propvar, ret_propvar; + UINT32 value, string_length; IMFAttributes *attributes; double double_value; + WCHAR bufferW[256]; UINT64 value64; - UINT32 value; + WCHAR *string; HRESULT hr; GUID key;
@@ -649,6 +653,42 @@ static void test_MFCreateAttributes(void) ok(hr == S_OK, "Failed to get double value, hr %#x.\n", hr); ok(double_value == 22.0, "Unexpected value: %f, expected: 22.0.\n", double_value);
+ hr = IMFAttributes_SetString(attributes, &DUMMY_GUID1, stringW); + ok(hr == S_OK, "Failed to set string attribute, hr %#x.\n", hr); + CHECK_ATTR_COUNT(attributes, 3); + + hr = IMFAttributes_GetStringLength(attributes, &DUMMY_GUID1, &string_length); + ok(hr == S_OK, "Failed to get string length, hr %#x.\n", hr); + ok(string_length == lstrlenW(stringW), "Unexpected length %u.\n", string_length); + + string_length = 0xdeadbeef; + hr = IMFAttributes_GetAllocatedString(attributes, &DUMMY_GUID1, &string, &string_length); + ok(hr == S_OK, "Failed to get allocated string, hr %#x.\n", hr); + ok(!lstrcmpW(string, stringW), "Unexpected string %s.\n", wine_dbgstr_w(string)); + ok(string_length == lstrlenW(stringW), "Unexpected length %u.\n", string_length); + CoTaskMemFree(string); + + string_length = 0xdeadbeef; + hr = IMFAttributes_GetString(attributes, &DUMMY_GUID1, bufferW, ARRAY_SIZE(bufferW), &string_length); + ok(hr == S_OK, "Failed to get string value, hr %#x.\n", hr); + ok(!lstrcmpW(bufferW, stringW), "Unexpected string %s.\n", wine_dbgstr_w(bufferW)); + ok(string_length == lstrlenW(stringW), "Unexpected length %u.\n", string_length); + memset(bufferW, 0, sizeof(bufferW)); + + hr = IMFAttributes_GetString(attributes, &DUMMY_GUID1, bufferW, ARRAY_SIZE(bufferW), NULL); + ok(hr == S_OK, "Failed to get string value, hr %#x.\n", hr); + ok(!lstrcmpW(bufferW, stringW), "Unexpected string %s.\n", wine_dbgstr_w(bufferW)); + memset(bufferW, 0, sizeof(bufferW)); + + hr = IMFAttributes_GetString(attributes, &DUMMY_GUID1, bufferW, 1, NULL); + ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr); + ok(!bufferW[0], "Unexpected string %s.\n", wine_dbgstr_w(bufferW)); + + string_length = 0xdeadbeef; + hr = IMFAttributes_GetStringLength(attributes, &GUID_NULL, &string_length); + ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#x.\n", hr); + ok(string_length == 0xdeadbeef, "Unexpected length %u.\n", string_length); + IMFAttributes_Release(attributes); }
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index 1767433..609510d 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -64,7 +64,7 @@ static void test_MFCreateSourceReaderFromByteStream(void) ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IMFAttributes_SetString(attributes, &MF_READWRITE_MMCSS_CLASS_AUDIO, audio); - todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); + ok(hr == S_OK, "Failed to set string value, hr %#x.\n", hr);
hr = IMFAttributes_SetUINT32(attributes, &MF_READWRITE_MMCSS_PRIORITY_AUDIO, 0); ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);