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 7c8d7c55232..c4baca200b7 100644 --- a/dlls/wintypes/main.c +++ b/dlls/wintypes/main.c @@ -407,6 +407,7 @@ struct property_value IReference_boolean boolean_iface; IReference_FLOAT float_iface; IReference_DOUBLE double_iface; + IReference_DateTime datetime_iface; IReference_GUID guid_iface; IReference_HSTRING hstring_iface; } irefs; @@ -525,6 +526,12 @@ static HRESULT STDMETHODCALLTYPE property_value_QueryInterface(IPropertyValue *i *out = &impl->irefs.double_iface; return S_OK; } + else if (IsEqualIID(riid, &IID_IReference_DateTime) && impl->type == PropertyType_DateTime) + { + IReference_DateTime_AddRef(&impl->irefs.datetime_iface); + *out = &impl->irefs.datetime_iface; + return S_OK; + } else if (IsEqualIID(riid, &IID_IReference_GUID) && impl->type == PropertyType_Guid) { IReference_GUID_AddRef(&impl->irefs.guid_iface); @@ -1178,6 +1185,31 @@ static const struct IReference_DOUBLEVtbl iref_double_vtbl = iref_double_get_Value, };
+DEFINE_IINSPECTABLE_(iref_datetime, IReference_DateTime, struct property_value, + impl_from_IReference_DateTime, irefs.datetime_iface, &impl->IPropertyValue_iface); + +static HRESULT STDMETHODCALLTYPE iref_datetime_get_Value(IReference_DateTime *iface, DateTime *value) +{ + struct property_value *impl = impl_from_IReference_DateTime(iface); + + TRACE("iface %p, value %p.\n", iface, value); + + return property_value_GetDateTime(&impl->IPropertyValue_iface, value); +} + +static const struct IReference_DateTimeVtbl iref_datetime_vtbl = +{ + iref_datetime_QueryInterface, + iref_datetime_AddRef, + iref_datetime_Release, + /* IInspectable methods */ + iref_datetime_GetIids, + iref_datetime_GetRuntimeClassName, + iref_datetime_GetTrustLevel, + /* IReference<DateTime> methods */ + iref_datetime_get_Value, +}; + DEFINE_IINSPECTABLE_(iref_guid, IReference_GUID, struct property_value, impl_from_IReference_GUID, irefs.guid_iface, &impl->IPropertyValue_iface);
@@ -1319,7 +1351,7 @@ static HRESULT STDMETHODCALLTYPE property_value_statics_CreateDateTime(IProperty DateTime value, IInspectable **property_value) { TRACE("iface %p, value %I64d, property_value %p.\n", iface, value.UniversalTime, property_value); - return create_primitive_property_value(PropertyType_DateTime); + create_primitive_property_value_iref(PropertyType_DateTime, irefs.datetime_iface.lpVtbl, iref_datetime_vtbl); }
static HRESULT STDMETHODCALLTYPE property_value_statics_CreateTimeSpan(IPropertyValueStatics *iface, diff --git a/dlls/wintypes/tests/wintypes.c b/dlls/wintypes/tests/wintypes.c index 9f8358a1157..e09354e80f6 100644 --- a/dlls/wintypes/tests/wintypes.c +++ b/dlls/wintypes/tests/wintypes.c @@ -746,6 +746,7 @@ static void test_IPropertyValueStatics(void) IReference_HSTRING *iref_hstring; IReference_FLOAT *iref_float; IReference_DOUBLE *iref_double; + IReference_DateTime *iref_datetime; IReference_GUID *iref_guid; IPropertyValue *value = NULL; enum PropertyType type; @@ -759,6 +760,7 @@ static void test_IPropertyValueStatics(void) UINT64 ret_uint64; FLOAT ret_float; DOUBLE ret_double; + struct DateTime ret_datetime; GUID ret_guid; boolean ret; HRESULT hr; @@ -1021,6 +1023,7 @@ static void test_IPropertyValueStatics(void) TEST_PROPERTY_VALUE_IREFERENCE(String, IReference_HSTRING, str, iref_hstring, ret_str) 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(Guid, IReference_GUID, IID_IPropertyValue, iref_guid, ret_guid)
#undef TEST_PROPERTY_VALUE_IREFERENCE