mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-16 10:46:02 +00:00
mfplat: Get rid of variant coercion calls.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
780378b203
commit
ced0a1de7e
|
@ -37,6 +37,7 @@
|
||||||
#include "mfplat_private.h"
|
#include "mfplat_private.h"
|
||||||
#include "mfreadwrite.h"
|
#include "mfreadwrite.h"
|
||||||
#include "propvarutil.h"
|
#include "propvarutil.h"
|
||||||
|
#include "strsafe.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
|
WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
|
||||||
|
|
||||||
|
@ -857,7 +858,8 @@ static HRESULT WINAPI mfattributes_GetUINT32(IMFAttributes *iface, REFGUID key,
|
||||||
attrval.vt = VT_UI4;
|
attrval.vt = VT_UI4;
|
||||||
hr = attributes_get_item(attributes, key, &attrval);
|
hr = attributes_get_item(attributes, key, &attrval);
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
hr = PropVariantToUInt32(&attrval, value);
|
*value = attrval.u.ulVal;
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -873,7 +875,8 @@ static HRESULT WINAPI mfattributes_GetUINT64(IMFAttributes *iface, REFGUID key,
|
||||||
attrval.vt = VT_UI8;
|
attrval.vt = VT_UI8;
|
||||||
hr = attributes_get_item(attributes, key, &attrval);
|
hr = attributes_get_item(attributes, key, &attrval);
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
hr = PropVariantToUInt64(&attrval, value);
|
*value = attrval.u.uhVal.QuadPart;
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -889,7 +892,8 @@ static HRESULT WINAPI mfattributes_GetDouble(IMFAttributes *iface, REFGUID key,
|
||||||
attrval.vt = VT_R8;
|
attrval.vt = VT_R8;
|
||||||
hr = attributes_get_item(attributes, key, &attrval);
|
hr = attributes_get_item(attributes, key, &attrval);
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
hr = PropVariantToDouble(&attrval, value);
|
*value = attrval.u.dblVal;
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -905,7 +909,7 @@ static HRESULT WINAPI mfattributes_GetGUID(IMFAttributes *iface, REFGUID key, GU
|
||||||
attrval.vt = VT_CLSID;
|
attrval.vt = VT_CLSID;
|
||||||
hr = attributes_get_item(attributes, key, &attrval);
|
hr = attributes_get_item(attributes, key, &attrval);
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
hr = PropVariantToGUID(&attrval, value);
|
*value = *attrval.u.puuid;
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -913,17 +917,25 @@ static HRESULT WINAPI mfattributes_GetGUID(IMFAttributes *iface, REFGUID key, GU
|
||||||
static HRESULT WINAPI mfattributes_GetStringLength(IMFAttributes *iface, REFGUID key, UINT32 *length)
|
static HRESULT WINAPI mfattributes_GetStringLength(IMFAttributes *iface, REFGUID key, UINT32 *length)
|
||||||
{
|
{
|
||||||
struct attributes *attributes = impl_from_IMFAttributes(iface);
|
struct attributes *attributes = impl_from_IMFAttributes(iface);
|
||||||
PROPVARIANT attrval;
|
struct attribute *attribute;
|
||||||
HRESULT hr;
|
HRESULT hr = S_OK;
|
||||||
|
|
||||||
TRACE("%p, %s, %p.\n", iface, debugstr_attr(key), length);
|
TRACE("%p, %s, %p.\n", iface, debugstr_attr(key), length);
|
||||||
|
|
||||||
PropVariantInit(&attrval);
|
EnterCriticalSection(&attributes->cs);
|
||||||
attrval.vt = VT_LPWSTR;
|
|
||||||
hr = attributes_get_item(attributes, key, &attrval);
|
attribute = attributes_find_item(attributes, key, NULL);
|
||||||
if (SUCCEEDED(hr) && length)
|
if (attribute)
|
||||||
*length = lstrlenW(attrval.u.pwszVal);
|
{
|
||||||
PropVariantClear(&attrval);
|
if (attribute->value.vt == MF_ATTRIBUTE_STRING)
|
||||||
|
*length = strlenW(attribute->value.u.pwszVal);
|
||||||
|
else
|
||||||
|
hr = MF_E_INVALIDTYPE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hr = MF_E_ATTRIBUTENOTFOUND;
|
||||||
|
|
||||||
|
LeaveCriticalSection(&attributes->cs);
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -932,19 +944,35 @@ static HRESULT WINAPI mfattributes_GetString(IMFAttributes *iface, REFGUID key,
|
||||||
UINT32 size, UINT32 *length)
|
UINT32 size, UINT32 *length)
|
||||||
{
|
{
|
||||||
struct attributes *attributes = impl_from_IMFAttributes(iface);
|
struct attributes *attributes = impl_from_IMFAttributes(iface);
|
||||||
PROPVARIANT attrval;
|
struct attribute *attribute;
|
||||||
HRESULT hr;
|
HRESULT hr = S_OK;
|
||||||
|
|
||||||
TRACE("%p, %s, %p, %d, %p.\n", iface, debugstr_attr(key), value, size, length);
|
TRACE("%p, %s, %p, %d, %p.\n", iface, debugstr_attr(key), value, size, length);
|
||||||
|
|
||||||
PropVariantInit(&attrval);
|
EnterCriticalSection(&attributes->cs);
|
||||||
attrval.vt = VT_LPWSTR;
|
|
||||||
hr = attributes_get_item(attributes, key, &attrval);
|
attribute = attributes_find_item(attributes, key, NULL);
|
||||||
if (SUCCEEDED(hr))
|
if (attribute)
|
||||||
hr = PropVariantToString(&attrval, value, size);
|
{
|
||||||
if (SUCCEEDED(hr) && length)
|
if (attribute->value.vt == MF_ATTRIBUTE_STRING)
|
||||||
*length = lstrlenW(value);
|
{
|
||||||
PropVariantClear(&attrval);
|
int len = strlenW(attribute->value.u.pwszVal);
|
||||||
|
|
||||||
|
if (length)
|
||||||
|
*length = len;
|
||||||
|
|
||||||
|
if (size <= len)
|
||||||
|
return STRSAFE_E_INSUFFICIENT_BUFFER;
|
||||||
|
|
||||||
|
memcpy(value, attribute->value.u.pwszVal, (len + 1) * sizeof(WCHAR));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hr = MF_E_INVALIDTYPE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hr = MF_E_ATTRIBUTENOTFOUND;
|
||||||
|
|
||||||
|
LeaveCriticalSection(&attributes->cs);
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -708,9 +708,11 @@ static void test_attributes(void)
|
||||||
ok(!lstrcmpW(bufferW, stringW), "Unexpected string %s.\n", wine_dbgstr_w(bufferW));
|
ok(!lstrcmpW(bufferW, stringW), "Unexpected string %s.\n", wine_dbgstr_w(bufferW));
|
||||||
memset(bufferW, 0, sizeof(bufferW));
|
memset(bufferW, 0, sizeof(bufferW));
|
||||||
|
|
||||||
hr = IMFAttributes_GetString(attributes, &DUMMY_GUID1, bufferW, 1, NULL);
|
string_length = 0;
|
||||||
|
hr = IMFAttributes_GetString(attributes, &DUMMY_GUID1, bufferW, 1, &string_length);
|
||||||
ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr);
|
ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr);
|
||||||
ok(!bufferW[0], "Unexpected string %s.\n", wine_dbgstr_w(bufferW));
|
ok(!bufferW[0], "Unexpected string %s.\n", wine_dbgstr_w(bufferW));
|
||||||
|
ok(string_length, "Unexpected length.\n");
|
||||||
|
|
||||||
string_length = 0xdeadbeef;
|
string_length = 0xdeadbeef;
|
||||||
hr = IMFAttributes_GetStringLength(attributes, &GUID_NULL, &string_length);
|
hr = IMFAttributes_GetStringLength(attributes, &GUID_NULL, &string_length);
|
||||||
|
|
Loading…
Reference in a new issue