Returning the user default country.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com ---
v2: Use GetUserDefaultGeoName.
dlls/windows.globalization/main.c | 12 ++++++++++-- dlls/windows.globalization/tests/globalization.c | 15 +++++---------- 2 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/dlls/windows.globalization/main.c b/dlls/windows.globalization/main.c index 17bb49a1c4e..84813152047 100644 --- a/dlls/windows.globalization/main.c +++ b/dlls/windows.globalization/main.c @@ -225,8 +225,16 @@ static HRESULT STDMETHODCALLTYPE globalization_preferences_get_Languages( static HRESULT STDMETHODCALLTYPE globalization_preferences_get_HomeGeographicRegion( IGlobalizationPreferencesStatics *iface, HSTRING* out) { - FIXME("iface %p, out %p stub!\n", iface, out); - return E_NOTIMPL; + WCHAR country[16]; + + TRACE("iface %p, out %p.\n", iface, out); + + if (!GetUserDefaultGeoName(country, 16)) + return E_FAIL; + + TRACE("returning country %s\n", debugstr_w(country)); + + return WindowsCreateString(country, wcslen(country), out); }
static HRESULT STDMETHODCALLTYPE globalization_preferences_get_WeekStartsOn( diff --git a/dlls/windows.globalization/tests/globalization.c b/dlls/windows.globalization/tests/globalization.c index 1918322b7a2..00d9cee5b0d 100644 --- a/dlls/windows.globalization/tests/globalization.c +++ b/dlls/windows.globalization/tests/globalization.c @@ -55,14 +55,11 @@ static void test_GlobalizationPreferences(void) BOOLEAN found; HRESULT hr; UINT32 len; - WCHAR *buf, locale[LOCALE_NAME_MAX_LENGTH], *country, *tmp; + WCHAR *buf, locale[LOCALE_NAME_MAX_LENGTH], country[16]; UINT32 i, size;
GetUserDefaultLocaleName(locale, LOCALE_NAME_MAX_LENGTH); - if ((tmp = wcsrchr(locale, '_'))) *tmp = 0; - if (!(tmp = wcschr(locale, '-')) || (wcslen(tmp) > 3 && !(tmp = wcschr(tmp + 1, '-')))) country = wcsdup(L"US"); - else country = wcsdup(tmp + 1); - GetUserDefaultLocaleName(locale, LOCALE_NAME_MAX_LENGTH); + GetUserDefaultGeoName(country, 16);
hr = pRoInitialize(RO_INIT_MULTITHREADED); ok(hr == S_OK, "RoInitialize failed, hr %#x\n", hr); @@ -77,7 +74,6 @@ static void test_GlobalizationPreferences(void) win_skip("%s runtimeclass not registered, skipping tests.\n", wine_dbgstr_w(class_name)); pWindowsDeleteString(str); pRoUninitialize(); - free(country); return; }
@@ -101,8 +97,7 @@ static void test_GlobalizationPreferences(void) IAgileObject_Release(tmp_agile_object);
hr = IGlobalizationPreferencesStatics_get_HomeGeographicRegion(preferences_statics, &tmp_str); - todo_wine ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_HomeGeographicRegion failed, hr %#x\n", hr); - if (FAILED(hr)) goto done; + ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_HomeGeographicRegion failed, hr %#x\n", hr);
buf = pWindowsGetStringRawBuffer(tmp_str, &len); ok(buf != NULL && len > 0, "WindowsGetStringRawBuffer returned buf %p, len %u\n", buf, len); @@ -113,7 +108,8 @@ static void test_GlobalizationPreferences(void) pWindowsDeleteString(tmp_str);
hr = IGlobalizationPreferencesStatics_get_Languages(preferences_statics, &languages); - ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_Languages failed, hr %#x\n", hr); + todo_wine ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_Languages failed, hr %#x\n", hr); + if (FAILED(hr)) goto done;
hr = IVectorView_HSTRING_QueryInterface(languages, &IID_IInspectable, (void **)&tmp_inspectable); ok(hr == S_OK, "IVectorView_HSTRING_QueryInterface failed, hr %#x\n", hr); @@ -164,7 +160,6 @@ done: pWindowsDeleteString(str);
pRoUninitialize(); - free(country); }
START_TEST(globalization)
Returning user default language in a 1-element HSTRING vector.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/windows.globalization/main.c | 190 +++++++++++++++++- .../tests/globalization.c | 33 ++- 2 files changed, 218 insertions(+), 5 deletions(-)
diff --git a/dlls/windows.globalization/main.c b/dlls/windows.globalization/main.c index 84813152047..42e77fbf84a 100644 --- a/dlls/windows.globalization/main.c +++ b/dlls/windows.globalization/main.c @@ -48,6 +48,182 @@ static const char *debugstr_hstring(HSTRING hstr) return wine_dbgstr_wn(str, len); }
+struct hstring_vector +{ + IVectorView_HSTRING IVectorView_HSTRING_iface; + LONG ref; + + ULONG count; + HSTRING values[1]; +}; + +static inline struct hstring_vector *impl_from_IVectorView_HSTRING(IVectorView_HSTRING *iface) +{ + return CONTAINING_RECORD(iface, struct hstring_vector, IVectorView_HSTRING_iface); +} + +static HRESULT STDMETHODCALLTYPE hstring_vector_QueryInterface(IVectorView_HSTRING *iface, + REFIID iid, void **out) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + TRACE("iface %p, iid %s, out %p stub!\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown) || + IsEqualGUID(iid, &IID_IInspectable) || + IsEqualGUID(iid, &IID_IAgileObject) || + IsEqualGUID(iid, &IID_IVectorView_HSTRING)) + { + IUnknown_AddRef(iface); + *out = &impl->IVectorView_HSTRING_iface; + return S_OK; + } + + FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG STDMETHODCALLTYPE hstring_vector_AddRef(IVectorView_HSTRING *iface) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + ULONG ref = InterlockedIncrement(&impl->ref); + TRACE("iface %p, ref %u.\n", iface, ref); + return ref; +} + +static ULONG STDMETHODCALLTYPE hstring_vector_Release(IVectorView_HSTRING *iface) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + ULONG ref = InterlockedDecrement(&impl->ref); + TRACE("iface %p, ref %u.\n", iface, ref); + if (ref == 0) + { + while (impl->count--) WindowsDeleteString(impl->values[impl->count]); + free(impl); + } + return ref; +} + +static HRESULT STDMETHODCALLTYPE hstring_vector_GetIids(IVectorView_HSTRING *iface, + ULONG *iid_count, IID **iids) +{ + FIXME("iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE hstring_vector_GetRuntimeClassName(IVectorView_HSTRING *iface, + HSTRING *class_name) +{ + FIXME("iface %p, class_name %p stub!\n", iface, class_name); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE hstring_vector_GetTrustLevel(IVectorView_HSTRING *iface, + TrustLevel *trust_level) +{ + FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE hstring_vector_GetAt(IVectorView_HSTRING *iface, + ULONG index, HSTRING *value) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + + TRACE("iface %p, index %#x, value %p.\n", iface, index, value); + + *value = NULL; + if (index >= impl->count) return E_BOUNDS; + return WindowsDuplicateString(impl->values[index], value); +} + +static HRESULT STDMETHODCALLTYPE hstring_vector_get_Size(IVectorView_HSTRING *iface, + ULONG *value) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + + TRACE("iface %p, value %p.\n", iface, value); + + *value = impl->count; + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE hstring_vector_IndexOf(IVectorView_HSTRING *iface, + HSTRING element, ULONG *index, BOOLEAN *found) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + INT32 i, order; + + TRACE("iface %p, element %p, index %p, found %p.\n", iface, element, index, found); + + for (i = 0; i < impl->count; ++i) + if (SUCCEEDED(WindowsCompareStringOrdinal(impl->values[i], element, &order)) && order == 0) + break; + + if (i < impl->count) + { + *found = TRUE; + *index = i; + } + else + { + *found = FALSE; + *index = 0; + } + + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE hstring_vector_GetMany(IVectorView_HSTRING *iface, + ULONG start_index, ULONG items_size, HSTRING *items, UINT *count) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + HRESULT hr; + ULONG i; + + TRACE("iface %p, start_index %#x, items %p, count %p.\n", iface, start_index, items, count); + + memset(items, 0, items_size * sizeof(HSTRING *)); + + for (i = start_index; i < impl->count && i < start_index + items_size; ++i) + if (FAILED(hr = WindowsDuplicateString(impl->values[i], items + i - start_index))) + return hr; + + *count = i - start_index; + return S_OK; +} + +static const struct IVectorView_HSTRINGVtbl hstring_vector_vtbl = +{ + hstring_vector_QueryInterface, + hstring_vector_AddRef, + hstring_vector_Release, + /* IInspectable methods */ + hstring_vector_GetIids, + hstring_vector_GetRuntimeClassName, + hstring_vector_GetTrustLevel, + /* IVectorView<HSTRING> methods */ + hstring_vector_GetAt, + hstring_vector_get_Size, + hstring_vector_IndexOf, + hstring_vector_GetMany, +}; + +static HRESULT hstring_vector_create(HSTRING *values, SIZE_T count, IVectorView_HSTRING **out) +{ + struct hstring_vector *impl; + + if (!(impl = malloc(offsetof(struct hstring_vector, values[count])))) return E_OUTOFMEMORY; + impl->ref = 1; + + impl->IVectorView_HSTRING_iface.lpVtbl = &hstring_vector_vtbl; + impl->count = count; + memcpy(impl->values, values, count * sizeof(HSTRING)); + + *out = &impl->IVectorView_HSTRING_iface; + return S_OK; +} + struct windows_globalization { IActivationFactory IActivationFactory_iface; @@ -218,8 +394,18 @@ static HRESULT STDMETHODCALLTYPE globalization_preferences_get_Currencies( static HRESULT STDMETHODCALLTYPE globalization_preferences_get_Languages( IGlobalizationPreferencesStatics *iface, IVectorView_HSTRING **out) { - FIXME("iface %p, out %p stub!\n", iface, out); - return E_NOTIMPL; + HSTRING hstring; + WCHAR locale[LOCALE_NAME_MAX_LENGTH]; + + TRACE("iface %p, out %p.\n", iface, out); + + if (!GetUserDefaultLocaleName(locale, LOCALE_NAME_MAX_LENGTH)) + return E_FAIL; + + TRACE("returning language %s\n", debugstr_w(locale)); + + WindowsCreateString(locale, wcslen(locale), &hstring); + return hstring_vector_create(&hstring, 1, out); }
static HRESULT STDMETHODCALLTYPE globalization_preferences_get_HomeGeographicRegion( diff --git a/dlls/windows.globalization/tests/globalization.c b/dlls/windows.globalization/tests/globalization.c index 00d9cee5b0d..a2b47e53be5 100644 --- a/dlls/windows.globalization/tests/globalization.c +++ b/dlls/windows.globalization/tests/globalization.c @@ -108,8 +108,7 @@ static void test_GlobalizationPreferences(void) pWindowsDeleteString(tmp_str);
hr = IGlobalizationPreferencesStatics_get_Languages(preferences_statics, &languages); - todo_wine ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_Languages failed, hr %#x\n", hr); - if (FAILED(hr)) goto done; + ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_Languages failed, hr %#x\n", hr);
hr = IVectorView_HSTRING_QueryInterface(languages, &IID_IInspectable, (void **)&tmp_inspectable); ok(hr == S_OK, "IVectorView_HSTRING_QueryInterface failed, hr %#x\n", hr); @@ -143,14 +142,42 @@ static void test_GlobalizationPreferences(void)
pWindowsDeleteString(tmp_str);
+ hr = pWindowsCreateString(L"deadbeef", 8, &tmp_str); + ok(hr == S_OK, "WindowsCreateString failed, hr %#x\n", hr); + + i = 0xdeadbeef; + found = TRUE; + hr = IVectorView_HSTRING_IndexOf(languages, tmp_str, &i, &found); + ok(hr == S_OK, "IVectorView_HSTRING_IndexOf failed, hr %#x\n", hr); + ok(i == 0 && found == FALSE, "IVectorView_HSTRING_IndexOf returned size %d, found %d\n", size, found); + + pWindowsDeleteString(tmp_str); + tmp_str = (HSTRING)0xdeadbeef; hr = IVectorView_HSTRING_GetAt(languages, size, &tmp_str); ok(hr == E_BOUNDS, "IVectorView_HSTRING_GetAt failed, hr %#x\n", hr); ok(tmp_str == NULL, "IVectorView_HSTRING_GetAt returned %p\n", tmp_str);
+ tmp_str = (HSTRING)0xdeadbeef; + hr = IVectorView_HSTRING_GetMany(languages, size, 1, &tmp_str, &i); + ok(hr == S_OK, "IVectorView_HSTRING_GetAt failed, hr %#x\n", hr); + ok(i == 0 && tmp_str == NULL, "IVectorView_HSTRING_GetMany returned count %u, str %p\n", i, tmp_str); + + hr = IVectorView_HSTRING_GetMany(languages, 0, 1, &tmp_str, &i); + ok(hr == S_OK, "IVectorView_HSTRING_GetAt failed, hr %#x\n", hr); + ok(i == 1, "IVectorView_HSTRING_GetMany returned count %u, expected 1\n", i); + + buf = pWindowsGetStringRawBuffer(tmp_str, &len); + ok(buf != NULL && len > 0, "WindowsGetStringRawBuffer returned buf %p, len %u\n", buf, len); + + ok(wcslen(locale) == len && !memcmp(buf, locale, len), + "IGlobalizationPreferencesStatics_get_Languages 0 returned len %u, str %s, expected %s\n", + len, wine_dbgstr_w(buf), wine_dbgstr_w(locale)); + + pWindowsDeleteString(tmp_str); + IVectorView_HSTRING_Release(languages);
-done: IGlobalizationPreferencesStatics_Release(preferences_statics);
IAgileObject_Release(agile_object);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87683
Your paranoid android.
=== debiant2 (build log) ===
Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the 0 report
Hi Rémi,
It looks mostly good, but error handling nuances could be improved.
On 3/25/21 9:17 AM, Rémi Bernon wrote:
+static HRESULT STDMETHODCALLTYPE hstring_vector_GetMany(IVectorView_HSTRING *iface,
ULONG start_index, ULONG items_size, HSTRING *items, UINT *count)
+{
- struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface);
- HRESULT hr;
- ULONG i;
- TRACE("iface %p, start_index %#x, items %p, count %p.\n", iface, start_index, items, count);
- memset(items, 0, items_size * sizeof(HSTRING *));
- for (i = start_index; i < impl->count && i < start_index + items_size; ++i)
if (FAILED(hr = WindowsDuplicateString(impl->values[i], items + i - start_index)))
return hr;
This leaks previously allocated strings in error case.
- WindowsCreateString(locale, wcslen(locale), &hstring);
This may fail.
Thanks, Jacek
On 3/25/21 10:46 PM, Jacek Caban wrote:
Hi Rémi,
It looks mostly good, but error handling nuances could be improved.
On 3/25/21 9:17 AM, Rémi Bernon wrote:
+static HRESULT STDMETHODCALLTYPE hstring_vector_GetMany(IVectorView_HSTRING *iface, + ULONG start_index, ULONG items_size, HSTRING *items, UINT *count) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + HRESULT hr; + ULONG i;
+ TRACE("iface %p, start_index %#x, items %p, count %p.\n", iface, start_index, items, count);
+ memset(items, 0, items_size * sizeof(HSTRING *));
+ for (i = start_index; i < impl->count && i < start_index + items_size; ++i) + if (FAILED(hr = WindowsDuplicateString(impl->values[i], items
- i - start_index)))
+ return hr;
This leaks previously allocated strings in error case.
Sure, then in this particular case the largest vector has one element, so it's not actually leaking anything. Also, the elements have not been created with WindowsCreateStringReference, so WindowsDuplicateString will only increments the string refcount count and is never going to fail.
+ WindowsCreateString(locale, wcslen(locale), &hstring);
This may fail.
Here the only possible error is an allocation error. I honestly expect that things are going to be pretty bad very soon if we fail to allocate a few bytes. But yes, the status should be returned.
Still, I'll resend for the sake of correctness.
Cheers,
On 3/26/21 10:05 AM, Rémi Bernon wrote:
On 3/25/21 10:46 PM, Jacek Caban wrote:
Hi Rémi,
It looks mostly good, but error handling nuances could be improved.
On 3/25/21 9:17 AM, Rémi Bernon wrote:
+static HRESULT STDMETHODCALLTYPE hstring_vector_GetMany(IVectorView_HSTRING *iface, + ULONG start_index, ULONG items_size, HSTRING *items, UINT *count) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + HRESULT hr; + ULONG i;
+ TRACE("iface %p, start_index %#x, items %p, count %p.\n", iface, start_index, items, count);
+ memset(items, 0, items_size * sizeof(HSTRING *));
+ for (i = start_index; i < impl->count && i < start_index + items_size; ++i) + if (FAILED(hr = WindowsDuplicateString(impl->values[i], items + i - start_index))) + return hr;
This leaks previously allocated strings in error case.
Sure, then in this particular case the largest vector has one element, so it's not actually leaking anything.
Sure, but if you want to assume that, then you don't need the loop at all. If you're making things generic, let's make it right (and from the looks of it, it's likely to be useful when implementation of the DLL is more complete).
Also, the elements have not been created with WindowsCreateStringReference, so WindowsDuplicateString will only increments the string refcount count and is never going to fail.
Okay, but if you can assume that, then the error check is not needed at all.
+ WindowsCreateString(locale, wcslen(locale), &hstring);
This may fail.
Here the only possible error is an allocation error. I honestly expect that things are going to be pretty bad very soon if we fail to allocate a few bytes. But yes, the status should be returned.
Yes, it's largely about consistency: you check for similar errors in other places.
Jacek
On 3/26/21 10:27 AM, Jacek Caban wrote:
On 3/26/21 10:05 AM, Rémi Bernon wrote:
On 3/25/21 10:46 PM, Jacek Caban wrote:
Hi Rémi,
It looks mostly good, but error handling nuances could be improved.
On 3/25/21 9:17 AM, Rémi Bernon wrote:
+static HRESULT STDMETHODCALLTYPE hstring_vector_GetMany(IVectorView_HSTRING *iface, + ULONG start_index, ULONG items_size, HSTRING *items, UINT *count) +{ + struct hstring_vector *impl = impl_from_IVectorView_HSTRING(iface); + HRESULT hr; + ULONG i;
+ TRACE("iface %p, start_index %#x, items %p, count %p.\n", iface, start_index, items, count);
+ memset(items, 0, items_size * sizeof(HSTRING *));
+ for (i = start_index; i < impl->count && i < start_index + items_size; ++i) + if (FAILED(hr = WindowsDuplicateString(impl->values[i], items + i - start_index))) + return hr;
This leaks previously allocated strings in error case.
Sure, then in this particular case the largest vector has one element, so it's not actually leaking anything.
Sure, but if you want to assume that, then you don't need the loop at all. If you're making things generic, let's make it right (and from the looks of it, it's likely to be useful when implementation of the DLL is more complete).
Also, the elements have not been created with WindowsCreateStringReference, so WindowsDuplicateString will only increments the string refcount count and is never going to fail.
Okay, but if you can assume that, then the error check is not needed at all.
+ WindowsCreateString(locale, wcslen(locale), &hstring);
This may fail.
Here the only possible error is an allocation error. I honestly expect that things are going to be pretty bad very soon if we fail to allocate a few bytes. But yes, the status should be returned.
Yes, it's largely about consistency: you check for similar errors in other places.
Jacek
Yes, no worries I'm all for correctness. It was just for the pleasure or the argument and because I really want to be done with these stubs :)
Thanks for the thorough reviews!
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/windows.globalization/main.c | 6 ++-- .../tests/globalization.c | 36 ++++++++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/dlls/windows.globalization/main.c b/dlls/windows.globalization/main.c index 42e77fbf84a..d065f6d48f1 100644 --- a/dlls/windows.globalization/main.c +++ b/dlls/windows.globalization/main.c @@ -374,21 +374,21 @@ static HRESULT STDMETHODCALLTYPE globalization_preferences_get_Calendars( IGlobalizationPreferencesStatics *iface, IVectorView_HSTRING **out) { FIXME("iface %p, out %p stub!\n", iface, out); - return E_NOTIMPL; + return hstring_vector_create(NULL, 0, out); }
static HRESULT STDMETHODCALLTYPE globalization_preferences_get_Clocks( IGlobalizationPreferencesStatics *iface, IVectorView_HSTRING **out) { FIXME("iface %p, out %p stub!\n", iface, out); - return E_NOTIMPL; + return hstring_vector_create(NULL, 0, out); }
static HRESULT STDMETHODCALLTYPE globalization_preferences_get_Currencies( IGlobalizationPreferencesStatics *iface, IVectorView_HSTRING **out) { FIXME("iface %p, out %p stub!\n", iface, out); - return E_NOTIMPL; + return hstring_vector_create(NULL, 0, out); }
static HRESULT STDMETHODCALLTYPE globalization_preferences_get_Languages( diff --git a/dlls/windows.globalization/tests/globalization.c b/dlls/windows.globalization/tests/globalization.c index a2b47e53be5..b824cfdf8ae 100644 --- a/dlls/windows.globalization/tests/globalization.c +++ b/dlls/windows.globalization/tests/globalization.c @@ -47,7 +47,7 @@ static void test_GlobalizationPreferences(void) static const WCHAR *class_name = L"Windows.System.UserProfile.GlobalizationPreferences";
IGlobalizationPreferencesStatics *preferences_statics = NULL; - IVectorView_HSTRING *languages = NULL; + IVectorView_HSTRING *languages = NULL, *calendars, *clocks, *currencies; IActivationFactory *factory = NULL; IInspectable *inspectable = NULL, *tmp_inspectable = NULL; IAgileObject *agile_object = NULL, *tmp_agile_object = NULL; @@ -178,6 +178,40 @@ static void test_GlobalizationPreferences(void)
IVectorView_HSTRING_Release(languages);
+ + hr = IGlobalizationPreferencesStatics_get_Calendars(preferences_statics, &calendars); + ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_Calendars failed, hr %#x\n", hr); + + size = 0xdeadbeef; + hr = IVectorView_HSTRING_get_Size(calendars, &size); + ok(hr == S_OK, "IVectorView_HSTRING_get_Size failed, hr %#x\n", hr); + todo_wine ok(size != 0 && size != 0xdeadbeef, "IVectorView_HSTRING_get_Size returned %u\n", size); + + IVectorView_HSTRING_Release(calendars); + + + hr = IGlobalizationPreferencesStatics_get_Clocks(preferences_statics, &clocks); + ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_Clocks failed, hr %#x\n", hr); + + size = 0xdeadbeef; + hr = IVectorView_HSTRING_get_Size(clocks, &size); + ok(hr == S_OK, "IVectorView_HSTRING_get_Size failed, hr %#x\n", hr); + todo_wine ok(size != 0 && size != 0xdeadbeef, "IVectorView_HSTRING_get_Size returned %u\n", size); + + IVectorView_HSTRING_Release(clocks); + + + hr = IGlobalizationPreferencesStatics_get_Currencies(preferences_statics, ¤cies); + ok(hr == S_OK, "IGlobalizationPreferencesStatics_get_Currencies failed, hr %#x\n", hr); + + size = 0xdeadbeef; + hr = IVectorView_HSTRING_get_Size(currencies, &size); + ok(hr == S_OK, "IVectorView_HSTRING_get_Size failed, hr %#x\n", hr); + todo_wine ok(size != 0 && size != 0xdeadbeef, "IVectorView_HSTRING_get_Size returned %u\n", size); + + IVectorView_HSTRING_Release(currencies); + + IGlobalizationPreferencesStatics_Release(preferences_statics);
IAgileObject_Release(agile_object);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87684
Your paranoid android.
=== debiant2 (build log) ===
Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the 0 report
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87682
Your paranoid android.
=== debiant2 (build log) ===
Task: WineTest did not produce the win32 report
=== debiant2 (build log) ===
Task: Could not create the wow32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the 0 report