From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/wintypes/main.c | 34 +++++++++++++++++++++++++++++++++- dlls/wintypes/tests/wintypes.c | 3 +++ 2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/dlls/wintypes/main.c b/dlls/wintypes/main.c index 697e896f10e..cb0a9b6fab0 100644 --- a/dlls/wintypes/main.c +++ b/dlls/wintypes/main.c @@ -408,6 +408,7 @@ struct property_value IReference_FLOAT float_iface; IReference_DOUBLE double_iface; IReference_DateTime datetime_iface; + IReference_TimeSpan timespan_iface; IReference_GUID guid_iface; IReference_Point point_iface; IReference_Size size_iface; @@ -535,6 +536,12 @@ static HRESULT STDMETHODCALLTYPE property_value_QueryInterface(IPropertyValue *i *out = &impl->irefs.datetime_iface; return S_OK; } + else if (IsEqualIID(riid, &IID_IReference_TimeSpan) && impl->type == PropertyType_TimeSpan) + { + IReference_TimeSpan_AddRef(&impl->irefs.timespan_iface); + *out = &impl->irefs.timespan_iface; + return S_OK; + } else if (IsEqualIID(riid, &IID_IReference_GUID) && impl->type == PropertyType_Guid) { IReference_GUID_AddRef(&impl->irefs.guid_iface); @@ -1231,6 +1238,31 @@ static const struct IReference_DateTimeVtbl iref_datetime_vtbl = iref_datetime_get_Value, };
+DEFINE_IINSPECTABLE_(iref_timespan, IReference_TimeSpan, struct property_value, + impl_from_IReference_TimeSpan, irefs.timespan_iface, &impl->IPropertyValue_iface); + +static HRESULT STDMETHODCALLTYPE iref_timespan_get_Value(IReference_TimeSpan *iface, TimeSpan *value) +{ + struct property_value *impl = impl_from_IReference_TimeSpan(iface); + + TRACE("iface %p, value %p.\n", iface, value); + + return property_value_GetTimeSpan(&impl->IPropertyValue_iface, value); +} + +static const struct IReference_TimeSpanVtbl iref_timespan_vtbl = +{ + iref_timespan_QueryInterface, + iref_timespan_AddRef, + iref_timespan_Release, + /* IInspectable methods */ + iref_timespan_GetIids, + iref_timespan_GetRuntimeClassName, + iref_timespan_GetTrustLevel, + /* IReference<TimeSpan> methods */ + iref_timespan_get_Value, +}; + DEFINE_IINSPECTABLE_(iref_guid, IReference_GUID, struct property_value, impl_from_IReference_GUID, irefs.guid_iface, &impl->IPropertyValue_iface);
@@ -1454,7 +1486,7 @@ static HRESULT STDMETHODCALLTYPE property_value_statics_CreateTimeSpan(IProperty TimeSpan value, IInspectable **property_value) { TRACE("iface %p, value %I64d, property_value %p.\n", iface, value.Duration, property_value); - return create_primitive_property_value(PropertyType_TimeSpan); + create_primitive_property_value_iref(PropertyType_TimeSpan, irefs.timespan_iface.lpVtbl, iref_timespan_vtbl); }
static HRESULT STDMETHODCALLTYPE property_value_statics_CreatePoint(IPropertyValueStatics *iface, diff --git a/dlls/wintypes/tests/wintypes.c b/dlls/wintypes/tests/wintypes.c index d4a07e01331..1ab3f4b9af8 100644 --- a/dlls/wintypes/tests/wintypes.c +++ b/dlls/wintypes/tests/wintypes.c @@ -747,6 +747,7 @@ static void test_IPropertyValueStatics(void) IReference_FLOAT *iref_float; IReference_DOUBLE *iref_double; IReference_DateTime *iref_datetime; + IReference_TimeSpan *iref_timespan; IReference_GUID *iref_guid; IReference_Point *iref_point; IReference_Size *iref_size; @@ -764,6 +765,7 @@ static void test_IPropertyValueStatics(void) FLOAT ret_float; DOUBLE ret_double; struct DateTime ret_datetime; + struct TimeSpan ret_timespan; GUID ret_guid; struct Point ret_point; struct Size ret_size; @@ -1030,6 +1032,7 @@ static void test_IPropertyValueStatics(void) TEST_PROPERTY_VALUE_IREFERENCE(Single, IReference_FLOAT, float_value, iref_float, ret_float) TEST_PROPERTY_VALUE_IREFERENCE(Double, IReference_DOUBLE, double_value, iref_double, ret_double) TEST_PROPERTY_VALUE_IREFERENCE(DateTime, IReference_DateTime, datetime_value, iref_datetime, ret_datetime) + TEST_PROPERTY_VALUE_IREFERENCE(TimeSpan, IReference_TimeSpan, timespan_value, iref_timespan, ret_timespan) TEST_PROPERTY_VALUE_IREFERENCE(Guid, IReference_GUID, IID_IPropertyValue, iref_guid, ret_guid) TEST_PROPERTY_VALUE_IREFERENCE(Point, IReference_Point, point_value, iref_point, ret_point) TEST_PROPERTY_VALUE_IREFERENCE(Size, IReference_Size, size_value, iref_size, ret_size)