Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/setupapi/fakedll.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/dlls/setupapi/fakedll.c b/dlls/setupapi/fakedll.c index cf219916400..3196708a7f7 100644 --- a/dlls/setupapi/fakedll.c +++ b/dlls/setupapi/fakedll.c @@ -881,13 +881,18 @@ static int install_fake_dll( WCHAR *dest, WCHAR *file, const WCHAR *ext, BOOL ex WCHAR *destname = dest + lstrlenW(dest); WCHAR *name = wcsrchr( file, '\' ) + 1; WCHAR *end = name + lstrlenW(name); + SIZE_T len = end - name;
if (ext) lstrcpyW( end, ext ); - if (!(ret = read_file( file, &data, &size, expect_builtin ))) return 0; + if (!(ret = read_file( file, &data, &size, expect_builtin ))) + { + *end = 0; + return 0; + }
- if (end > name + 2 && !wcsncmp( end - 2, L"16", 2 )) end -= 2; /* remove "16" suffix */ - memcpy( destname, name, (end - name) * sizeof(WCHAR) ); - destname[end - name] = 0; + if (end > name + 2 && !wcsncmp( end - 2, L"16", 2 )) len -= 2; /* remove "16" suffix */ + memcpy( destname, name, len * sizeof(WCHAR) ); + destname[len] = 0; if (!add_handled_dll( destname )) ret = -1;
if (ret != -1) @@ -906,6 +911,7 @@ static int install_fake_dll( WCHAR *dest, WCHAR *file, const WCHAR *ext, BOOL ex } } *destname = 0; /* restore it for next file */ + *end = 0; return ret; }
@@ -965,9 +971,14 @@ static void install_lib_dir( WCHAR *dest, WCHAR *file, const WCHAR *default_ext, { lstrcatW( name, L"\" ); lstrcatW( name, data.name ); - if (!wcschr( data.name, '.' )) lstrcatW( name, default_ext ); - if (!install_fake_dll( dest, file, NULL, expect_builtin, &delay_copy )) - install_fake_dll( dest, file, L".fake", FALSE, &delay_copy ); + if (wcschr( data.name, '.' )) /* module possibly already has an extension */ + { + if (install_fake_dll( dest, file, NULL, expect_builtin, &delay_copy )) continue; + if (install_fake_dll( dest, file, L".fake", FALSE, &delay_copy )) continue; + } + lstrcatW( name, default_ext ); + if (install_fake_dll( dest, file, NULL, expect_builtin, &delay_copy )) continue; + if (install_fake_dll( dest, file, L".fake", FALSE, &delay_copy )) continue; } else install_fake_dll( dest, file, NULL, expect_builtin, &delay_copy ); }
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- configure.ac | 1 + dlls/windows.media.speech/Makefile.in | 9 + dlls/windows.media.speech/classes.idl | 19 +++ dlls/windows.media.speech/main.c | 159 ++++++++++++++++++ .../windows.media.speech.spec | 3 + 5 files changed, 191 insertions(+) create mode 100644 dlls/windows.media.speech/Makefile.in create mode 100644 dlls/windows.media.speech/classes.idl create mode 100644 dlls/windows.media.speech/main.c create mode 100644 dlls/windows.media.speech/windows.media.speech.spec
diff --git a/configure.ac b/configure.ac index 1ca832102d8..9d8488113a4 100644 --- a/configure.ac +++ b/configure.ac @@ -3801,6 +3801,7 @@ WINE_CONFIG_MAKEFILE(dlls/win32s16.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/win87em.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/winaspi.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/windebug.dll16,enable_win16) +WINE_CONFIG_MAKEFILE(dlls/windows.media.speech) WINE_CONFIG_MAKEFILE(dlls/windowscodecs) WINE_CONFIG_MAKEFILE(dlls/windowscodecs/tests) WINE_CONFIG_MAKEFILE(dlls/windowscodecsext) diff --git a/dlls/windows.media.speech/Makefile.in b/dlls/windows.media.speech/Makefile.in new file mode 100644 index 00000000000..2c55daa04be --- /dev/null +++ b/dlls/windows.media.speech/Makefile.in @@ -0,0 +1,9 @@ +MODULE = windows.media.speech.dll +IMPORTS = combase uuid + +EXTRADLLFLAGS = -mno-cygwin + +C_SRCS = \ + main.c + +IDL_SRCS = classes.idl diff --git a/dlls/windows.media.speech/classes.idl b/dlls/windows.media.speech/classes.idl new file mode 100644 index 00000000000..6c141bf4768 --- /dev/null +++ b/dlls/windows.media.speech/classes.idl @@ -0,0 +1,19 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma makedep register + +#include "windows.media.speechsynthesis.idl" diff --git a/dlls/windows.media.speech/main.c b/dlls/windows.media.speech/main.c new file mode 100644 index 00000000000..a6b4fb2ff0a --- /dev/null +++ b/dlls/windows.media.speech/main.c @@ -0,0 +1,159 @@ +/* WinRT Windows.Media.Speech implementation + * + * Copyright 2021 Rémi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#define COBJMACROS +#include "windef.h" +#include "winbase.h" +#include "winstring.h" +#include "wine/debug.h" +#include "objbase.h" + +#include "initguid.h" +#include "activation.h" + +#include "windows.foundation.h" +#include "windows.media.speechsynthesis.h" + +WINE_DEFAULT_DEBUG_CHANNEL(speech); + +static const char *debugstr_hstring(HSTRING hstr) +{ + const WCHAR *str; + UINT32 len; + if (hstr && !((ULONG_PTR)hstr >> 16)) return "(invalid)"; + str = WindowsGetStringRawBuffer(hstr, &len); + return wine_dbgstr_wn(str, len); +} + +struct windows_media_speech +{ + IActivationFactory IActivationFactory_iface; + LONG ref; +}; + +static inline struct windows_media_speech *impl_from_IActivationFactory(IActivationFactory *iface) +{ + return CONTAINING_RECORD(iface, struct windows_media_speech, IActivationFactory_iface); +} + +static HRESULT STDMETHODCALLTYPE windows_media_speech_QueryInterface( + IActivationFactory *iface, REFIID iid, void **out) +{ + 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_IActivationFactory)) + { + IUnknown_AddRef(iface); + *out = iface; + return S_OK; + } + + FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG STDMETHODCALLTYPE windows_media_speech_AddRef( + IActivationFactory *iface) +{ + struct windows_media_speech *impl = impl_from_IActivationFactory(iface); + ULONG ref = InterlockedIncrement(&impl->ref); + TRACE("iface %p, ref %u.\n", iface, ref); + return ref; +} + +static ULONG STDMETHODCALLTYPE windows_media_speech_Release( + IActivationFactory *iface) +{ + struct windows_media_speech *impl = impl_from_IActivationFactory(iface); + ULONG ref = InterlockedDecrement(&impl->ref); + TRACE("iface %p, ref %u.\n", iface, ref); + return ref; +} + +static HRESULT STDMETHODCALLTYPE windows_media_speech_GetIids( + IActivationFactory *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 windows_media_speech_GetRuntimeClassName( + IActivationFactory *iface, HSTRING *class_name) +{ + FIXME("iface %p, class_name %p stub!\n", iface, class_name); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE windows_media_speech_GetTrustLevel( + IActivationFactory *iface, TrustLevel *trust_level) +{ + FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE windows_media_speech_ActivateInstance( + IActivationFactory *iface, IInspectable **instance) +{ + FIXME("iface %p, instance %p stub!\n", iface, instance); + return E_NOTIMPL; +} + +static const struct IActivationFactoryVtbl activation_factory_vtbl = +{ + windows_media_speech_QueryInterface, + windows_media_speech_AddRef, + windows_media_speech_Release, + /* IInspectable methods */ + windows_media_speech_GetIids, + windows_media_speech_GetRuntimeClassName, + windows_media_speech_GetTrustLevel, + /* IActivationFactory methods */ + windows_media_speech_ActivateInstance, +}; + +static struct windows_media_speech windows_media_speech = +{ + {&activation_factory_vtbl}, + 1 +}; + +HRESULT WINAPI DllCanUnloadNow(void) +{ + return S_FALSE; +} + +HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **out) +{ + FIXME("clsid %s, riid %s, out %p stub!\n", debugstr_guid(clsid), debugstr_guid(riid), out); + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT WINAPI DllGetActivationFactory(HSTRING classid, IActivationFactory **factory) +{ + TRACE("classid %s, factory %p.\n", debugstr_hstring(classid), factory); + *factory = &windows_media_speech.IActivationFactory_iface; + IUnknown_AddRef(*factory); + return S_OK; +} diff --git a/dlls/windows.media.speech/windows.media.speech.spec b/dlls/windows.media.speech/windows.media.speech.spec new file mode 100644 index 00000000000..721493229c2 --- /dev/null +++ b/dlls/windows.media.speech/windows.media.speech.spec @@ -0,0 +1,3 @@ +1 stdcall -private DllCanUnloadNow() +2 stdcall -private DllGetActivationFactory(ptr ptr) +3 stdcall -private DllGetClassObject(ptr ptr ptr)
Signed-off-by: Jacek Caban jacek@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- configure.ac | 1 + dlls/windows.media.speech/tests/Makefile.in | 5 + dlls/windows.media.speech/tests/statics.c | 176 ++++++++++++++++++++ 3 files changed, 182 insertions(+) create mode 100644 dlls/windows.media.speech/tests/Makefile.in create mode 100644 dlls/windows.media.speech/tests/statics.c
diff --git a/configure.ac b/configure.ac index 9d8488113a4..8c092fb020c 100644 --- a/configure.ac +++ b/configure.ac @@ -3802,6 +3802,7 @@ WINE_CONFIG_MAKEFILE(dlls/win87em.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/winaspi.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/windebug.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/windows.media.speech) +WINE_CONFIG_MAKEFILE(dlls/windows.media.speech/tests) WINE_CONFIG_MAKEFILE(dlls/windowscodecs) WINE_CONFIG_MAKEFILE(dlls/windowscodecs/tests) WINE_CONFIG_MAKEFILE(dlls/windowscodecsext) diff --git a/dlls/windows.media.speech/tests/Makefile.in b/dlls/windows.media.speech/tests/Makefile.in new file mode 100644 index 00000000000..fad32174647 --- /dev/null +++ b/dlls/windows.media.speech/tests/Makefile.in @@ -0,0 +1,5 @@ +TESTDLL = windows.media.speech.dll +IMPORTS = uuid + +C_SRCS = \ + statics.c diff --git a/dlls/windows.media.speech/tests/statics.c b/dlls/windows.media.speech/tests/statics.c new file mode 100644 index 00000000000..02bb267dc06 --- /dev/null +++ b/dlls/windows.media.speech/tests/statics.c @@ -0,0 +1,176 @@ +/* + * Copyright 2021 Rémi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ +#define COBJMACROS +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winstring.h" + +#include "initguid.h" +#include "roapi.h" + +#define WIDL_using_Windows_Foundation +#define WIDL_using_Windows_Foundation_Collections +#include "windows.foundation.h" +#define WIDL_using_Windows_Media_SpeechSynthesis +#include "windows.media.speechsynthesis.h" + +#include "wine/test.h" + +static HRESULT (WINAPI *pRoActivateInstance)(HSTRING, IInspectable **); +static HRESULT (WINAPI *pRoGetActivationFactory)(HSTRING, REFIID, void **); +static HRESULT (WINAPI *pRoInitialize)(RO_INIT_TYPE); +static void (WINAPI *pRoUninitialize)(void); +static HRESULT (WINAPI *pWindowsCreateString)(LPCWSTR, UINT32, HSTRING *); +static HRESULT (WINAPI *pWindowsDeleteString)(HSTRING); + +static void test_SpeechSynthesizer(void) +{ + static const WCHAR *speech_synthesizer_name = L"Windows.Media.SpeechSynthesis.SpeechSynthesizer"; + + IVectorView_VoiceInformation *voices = NULL; + IInstalledVoicesStatic *voices_static = NULL; + IActivationFactory *factory = NULL; + IInspectable *inspectable = NULL, *tmp_inspectable = NULL; + IAgileObject *agile_object = NULL, *tmp_agile_object = NULL; + HSTRING str; + HRESULT hr; + ULONG rc, size; + + hr = pRoInitialize(RO_INIT_MULTITHREADED); + ok(SUCCEEDED(hr), "RoInitialize failed, hr %#x\n", hr); + + hr = pWindowsCreateString(speech_synthesizer_name, wcslen(speech_synthesizer_name), &str); + ok(SUCCEEDED(hr), "WindowsCreateString failed, hr %#x\n", hr); + + hr = pRoGetActivationFactory(str, &IID_IActivationFactory, (void **)&factory); + ok(SUCCEEDED(hr), "RoGetActivationFactory failed, hr %#x\n", hr); + + rc = IActivationFactory_AddRef(factory); + ok(rc == 3, "IActivationFactory_AddRef returned %d\n", rc); + rc = IActivationFactory_Release(factory); + ok(rc == 2, "IActivationFactory_Release returned %d\n", rc); + + hr = IActivationFactory_QueryInterface(factory, &IID_IInspectable, (void **)&inspectable); + ok(SUCCEEDED(hr), "IActivationFactory_QueryInterface IID_IInspectable failed, hr %#x\n", hr); + + hr = IActivationFactory_QueryInterface(factory, &IID_IAgileObject, (void **)&agile_object); + ok(SUCCEEDED(hr), "IActivationFactory_QueryInterface IID_IAgileObject failed, hr %#x\n", hr); + + hr = IActivationFactory_QueryInterface(factory, &IID_IInstalledVoicesStatic, (void **)&voices_static); + todo_wine ok(SUCCEEDED(hr), "IActivationFactory_QueryInterface IID_IInstalledVoicesStatic failed, hr %#x\n", hr); + if (FAILED(hr)) goto done; + + hr = IInstalledVoicesStatic_QueryInterface(voices_static, &IID_IInspectable, (void **)&tmp_inspectable); + ok(SUCCEEDED(hr), "IInstalledVoicesStatic_QueryInterface IID_IInspectable failed, hr %#x\n", hr); + ok(tmp_inspectable == inspectable, "IInstalledVoicesStatic_QueryInterface IID_IInspectable returned %p, expected %p\n", tmp_inspectable, inspectable); + IInspectable_Release(tmp_inspectable); + + hr = IInstalledVoicesStatic_QueryInterface(voices_static, &IID_IAgileObject, (void **)&tmp_agile_object); + ok(SUCCEEDED(hr), "IInstalledVoicesStatic_QueryInterface IID_IAgileObject failed, hr %#x\n", hr); + ok(tmp_agile_object == agile_object, "IInstalledVoicesStatic_QueryInterface IID_IAgileObject returned %p, expected %p\n", tmp_agile_object, agile_object); + IAgileObject_Release(tmp_agile_object); + + hr = IInstalledVoicesStatic_get_AllVoices(voices_static, &voices); + ok(SUCCEEDED(hr), "IInstalledVoicesStatic_get_AllVoices failed, hr %#x\n", hr); + + hr = IVectorView_VoiceInformation_QueryInterface(voices, &IID_IInspectable, (void **)&tmp_inspectable); + ok(SUCCEEDED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); + ok(tmp_inspectable != inspectable, "IVectorView_VoiceInformation_QueryInterface voices returned %p, expected %p\n", tmp_inspectable, inspectable); + IInspectable_Release(tmp_inspectable); + + hr = IVectorView_VoiceInformation_QueryInterface(voices, &IID_IAgileObject, (void **)&tmp_agile_object); + ok(FAILED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); + + size = 0xdeadbeef; + hr = IVectorView_VoiceInformation_get_Size(voices, &size); + ok(SUCCEEDED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); + ok(size != 0 && size != 0xdeadbeef, "IVectorView_VoiceInformation_get_Size returned %u\n", size); + + rc = IVectorView_VoiceInformation_Release(voices); + ok(rc == 0, "IVectorView_VoiceInformation_Release returned unexpected refcount %d\n", rc); + + rc = IInstalledVoicesStatic_Release(voices_static); + ok(rc == 4, "IInstalledVoicesStatic_Release returned unexpected refcount %d\n", rc); + +done: + rc = IAgileObject_Release(agile_object); + ok(rc == 3, "IAgileObject_Release returned unexpected refcount %d\n", rc); + rc = IInspectable_Release(inspectable); + ok(rc == 2, "IInspectable_Release returned unexpected refcount %d\n", rc); + rc = IActivationFactory_Release(factory); + ok(rc == 1, "IActivationFactory_Release returned unexpected refcount %d\n", rc); + + pWindowsDeleteString(str); + + pRoUninitialize(); +} + +static void test_VoiceInformation(void) +{ + static const WCHAR *voice_information_name = L"Windows.Media.SpeechSynthesis.VoiceInformation"; + + IActivationFactory *factory = NULL; + HSTRING str; + HRESULT hr; + + hr = pRoInitialize(RO_INIT_MULTITHREADED); + ok(SUCCEEDED(hr), "RoInitialize failed, hr %#x\n", hr); + + hr = pWindowsCreateString(voice_information_name, wcslen(voice_information_name), &str); + ok(SUCCEEDED(hr), "WindowsCreateString failed, hr %#x\n", hr); + + hr = pRoGetActivationFactory(str, &IID_IActivationFactory, (void **)&factory); + todo_wine ok(hr == REGDB_E_CLASSNOTREG, "RoGetActivationFactory returned unexpected hr %#x\n", hr); + if (SUCCEEDED(hr)) IActivationFactory_Release(factory); + + pWindowsDeleteString(str); + + pRoUninitialize(); +} + +START_TEST(statics) +{ + HMODULE combase; + + if (!(combase = LoadLibraryW(L"combase.dll"))) + { + win_skip("Failed to load combase.dll, skipping tests\n"); + return; + } + +#define LOAD_FUNCPTR(x) \ + if (!(p##x = (void*)GetProcAddress(combase, #x))) \ + { \ + win_skip("Failed to find %s in combase.dll, skipping tests.\n", #x); \ + return; \ + } + + LOAD_FUNCPTR(RoActivateInstance); + LOAD_FUNCPTR(RoGetActivationFactory); + LOAD_FUNCPTR(RoInitialize); + LOAD_FUNCPTR(RoUninitialize); + LOAD_FUNCPTR(WindowsCreateString); + LOAD_FUNCPTR(WindowsDeleteString); +#undef LOAD_FUNCPTR + + test_SpeechSynthesizer(); + test_VoiceInformation(); +}
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=86934
Your paranoid android.
=== debiant2 (32 bit French report) ===
Report validation errors: The report seems to have been truncated
On 3/12/21 12:58 PM, Marvin wrote:
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=86934
Your paranoid android.
=== debiant2 (32 bit French report) ===
Report validation errors: The report seems to have been truncated
So it looks like that Marvin still fails to pick the new DLL when it runs from the ML, but it worked fine when I submitted the patch manually, as in:
https://testbot.winehq.org/JobDetails.pl?Key=86929
Cheers,
On Fri, 12 Mar 2021, Rémi Bernon wrote: [...]
=== debiant2 (32 bit French report) ===
Report validation errors: The report seems to have been truncated
So it looks like that Marvin still fails to pick the new DLL when it runs from the ML, but it worked fine when I submitted the patch manually, as in:
For manual jobs one can pass custom arguments to the test executable. But WineTest.exe does not support passing arbitrary arguments to a specific test executable.
So when the WineTest.pl script (which is responsible for doing the build and running the tests on Wine VMs) receives extra arguments is always runs the test using TestLauncher which does not have the bug that WineTest.exe has.
But when receiving a patch through the mailing list there is no custom argument. Furthermore there may be more than one test to run. So in that case, rather than running TestLauncher.exe multiple times, the WineTest.pl script invokes WineTest.exe with arguments specifying which tests to run.
So after simplifying the commands a bit, for job 86929 we had: WineTest.pl --testpatch win32:wow32:wow64 patch.diff windows.media.speech statics "windows.media.speech statics" are the extra args which, in this case, could be handled by passing "windows.media.speech:statics" to WineTest.exe. But 'statics' could have been anything really.
-> wine TestLauncher64.exe -t 120 windows.media.speech_test.exe statics
And for job 86934: WineTest.pl --testpatch win32 patch.diff No extra argument.
-> wine winetest.exe -c -o win32.report -t do.not.submit setupapi windows.media.speech
That and I still have not sent the required WineTest.exe patch. But it's next in line now.
Signed-off-by: Jacek Caban jacek@codeweavers.com
On 3/12/21 5:31 AM, Rémi Bernon wrote:
+START_TEST(statics) +{
- HMODULE combase;
- if (!(combase = LoadLibraryW(L"combase.dll")))
- {
win_skip("Failed to load combase.dll, skipping tests\n");
return;
- }
+#define LOAD_FUNCPTR(x) \
- if (!(p##x = (void*)GetProcAddress(combase, #x))) \
- { \
win_skip("Failed to find %s in combase.dll, skipping tests.\n", #x); \
return; \
- }
- LOAD_FUNCPTR(RoActivateInstance);
- LOAD_FUNCPTR(RoGetActivationFactory);
- LOAD_FUNCPTR(RoInitialize);
- LOAD_FUNCPTR(RoUninitialize);
- LOAD_FUNCPTR(WindowsCreateString);
- LOAD_FUNCPTR(WindowsDeleteString);
+#undef LOAD_FUNCPTR
- test_SpeechSynthesizer();
- test_VoiceInformation();
+}
Is there a point in loading combase dynamically?
On 3/15/21 8:41 PM, Zebediah Figura (she/her) wrote:
On 3/12/21 5:31 AM, Rémi Bernon wrote:
+START_TEST(statics) +{
- HMODULE combase;
- if (!(combase = LoadLibraryW(L"combase.dll")))
- {
win_skip("Failed to load combase.dll, skipping tests\n");
return;
- }
+#define LOAD_FUNCPTR(x) \
- if (!(p##x = (void*)GetProcAddress(combase, #x))) \
- { \
win_skip("Failed to find %s in combase.dll, skipping tests.\n", #x); \
return; \
- }
- LOAD_FUNCPTR(RoActivateInstance);
- LOAD_FUNCPTR(RoGetActivationFactory);
- LOAD_FUNCPTR(RoInitialize);
- LOAD_FUNCPTR(RoUninitialize);
- LOAD_FUNCPTR(WindowsCreateString);
- LOAD_FUNCPTR(WindowsDeleteString);
+#undef LOAD_FUNCPTR
- test_SpeechSynthesizer();
- test_VoiceInformation();
+}
Is there a point in loading combase dynamically?
No idea, this is what the combase tests are doing.
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/windows.media.speech/main.c | 89 +++++++++++++++++++++++ dlls/windows.media.speech/tests/statics.c | 8 +- 2 files changed, 93 insertions(+), 4 deletions(-)
diff --git a/dlls/windows.media.speech/main.c b/dlls/windows.media.speech/main.c index a6b4fb2ff0a..0d1da641394 100644 --- a/dlls/windows.media.speech/main.c +++ b/dlls/windows.media.speech/main.c @@ -29,7 +29,10 @@ #include "initguid.h" #include "activation.h"
+#define WIDL_using_Windows_Foundation +#define WIDL_using_Windows_Foundation_Collections #include "windows.foundation.h" +#define WIDL_using_Windows_Media_SpeechSynthesis #include "windows.media.speechsynthesis.h"
WINE_DEFAULT_DEBUG_CHANNEL(speech); @@ -46,6 +49,7 @@ static const char *debugstr_hstring(HSTRING hstr) struct windows_media_speech { IActivationFactory IActivationFactory_iface; + IInstalledVoicesStatic IInstalledVoicesStatic_iface; LONG ref; };
@@ -54,9 +58,16 @@ static inline struct windows_media_speech *impl_from_IActivationFactory(IActivat return CONTAINING_RECORD(iface, struct windows_media_speech, IActivationFactory_iface); }
+static inline struct windows_media_speech *impl_from_IInstalledVoicesStatic(IInstalledVoicesStatic *iface) +{ + return CONTAINING_RECORD(iface, struct windows_media_speech, IInstalledVoicesStatic_iface); +} + static HRESULT STDMETHODCALLTYPE windows_media_speech_QueryInterface( IActivationFactory *iface, REFIID iid, void **out) { + struct windows_media_speech *impl = impl_from_IActivationFactory(iface); + TRACE("iface %p, iid %s, out %p stub!\n", iface, debugstr_guid(iid), out);
if (IsEqualGUID(iid, &IID_IUnknown) || @@ -69,6 +80,13 @@ static HRESULT STDMETHODCALLTYPE windows_media_speech_QueryInterface( return S_OK; }
+ if (IsEqualGUID(iid, &IID_IInstalledVoicesStatic)) + { + IUnknown_AddRef(iface); + *out = &impl->IInstalledVoicesStatic_iface; + return S_OK; + } + FIXME("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); *out = NULL; return E_NOINTERFACE; @@ -133,9 +151,80 @@ static const struct IActivationFactoryVtbl activation_factory_vtbl = windows_media_speech_ActivateInstance, };
+static HRESULT STDMETHODCALLTYPE installed_voices_static_QueryInterface( + IInstalledVoicesStatic *iface, REFIID iid, void **out) +{ + struct windows_media_speech *impl = impl_from_IInstalledVoicesStatic(iface); + return windows_media_speech_QueryInterface(&impl->IActivationFactory_iface, iid, out); +} + +static ULONG STDMETHODCALLTYPE installed_voices_static_AddRef( + IInstalledVoicesStatic *iface) +{ + struct windows_media_speech *impl = impl_from_IInstalledVoicesStatic(iface); + return windows_media_speech_AddRef(&impl->IActivationFactory_iface); +} + +static ULONG STDMETHODCALLTYPE installed_voices_static_Release( + IInstalledVoicesStatic *iface) +{ + struct windows_media_speech *impl = impl_from_IInstalledVoicesStatic(iface); + return windows_media_speech_Release(&impl->IActivationFactory_iface); +} + +static HRESULT STDMETHODCALLTYPE installed_voices_static_GetIids( + IInstalledVoicesStatic *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 installed_voices_static_GetRuntimeClassName( + IInstalledVoicesStatic *iface, HSTRING *class_name) +{ + FIXME("iface %p, class_name %p stub!\n", iface, class_name); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE installed_voices_static_GetTrustLevel( + IInstalledVoicesStatic *iface, TrustLevel *trust_level) +{ + FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE installed_voices_static_get_AllVoices( + IInstalledVoicesStatic *iface, IVectorView_VoiceInformation **value) +{ + FIXME("iface %p, value %p stub!\n", iface, value); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE installed_voices_static_get_DefaultVoice( + IInstalledVoicesStatic *iface, IVoiceInformation **value) +{ + FIXME("iface %p, value %p stub!\n", iface, value); + return E_NOTIMPL; +} + +static const struct IInstalledVoicesStaticVtbl installed_voices_static_vtbl = +{ + installed_voices_static_QueryInterface, + installed_voices_static_AddRef, + installed_voices_static_Release, + /* IInspectable methods */ + installed_voices_static_GetIids, + installed_voices_static_GetRuntimeClassName, + installed_voices_static_GetTrustLevel, + /* IInstalledVoicesStatic methods */ + installed_voices_static_get_AllVoices, + installed_voices_static_get_DefaultVoice, +}; + static struct windows_media_speech windows_media_speech = { {&activation_factory_vtbl}, + {&installed_voices_static_vtbl}, 1 };
diff --git a/dlls/windows.media.speech/tests/statics.c b/dlls/windows.media.speech/tests/statics.c index 02bb267dc06..470b6d769c6 100644 --- a/dlls/windows.media.speech/tests/statics.c +++ b/dlls/windows.media.speech/tests/statics.c @@ -75,8 +75,7 @@ static void test_SpeechSynthesizer(void) ok(SUCCEEDED(hr), "IActivationFactory_QueryInterface IID_IAgileObject failed, hr %#x\n", hr);
hr = IActivationFactory_QueryInterface(factory, &IID_IInstalledVoicesStatic, (void **)&voices_static); - todo_wine ok(SUCCEEDED(hr), "IActivationFactory_QueryInterface IID_IInstalledVoicesStatic failed, hr %#x\n", hr); - if (FAILED(hr)) goto done; + ok(SUCCEEDED(hr), "IActivationFactory_QueryInterface IID_IInstalledVoicesStatic failed, hr %#x\n", hr);
hr = IInstalledVoicesStatic_QueryInterface(voices_static, &IID_IInspectable, (void **)&tmp_inspectable); ok(SUCCEEDED(hr), "IInstalledVoicesStatic_QueryInterface IID_IInspectable failed, hr %#x\n", hr); @@ -89,7 +88,8 @@ static void test_SpeechSynthesizer(void) IAgileObject_Release(tmp_agile_object);
hr = IInstalledVoicesStatic_get_AllVoices(voices_static, &voices); - ok(SUCCEEDED(hr), "IInstalledVoicesStatic_get_AllVoices failed, hr %#x\n", hr); + todo_wine ok(SUCCEEDED(hr), "IInstalledVoicesStatic_get_AllVoices failed, hr %#x\n", hr); + if (FAILED(hr)) goto done;
hr = IVectorView_VoiceInformation_QueryInterface(voices, &IID_IInspectable, (void **)&tmp_inspectable); ok(SUCCEEDED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); @@ -107,10 +107,10 @@ static void test_SpeechSynthesizer(void) rc = IVectorView_VoiceInformation_Release(voices); ok(rc == 0, "IVectorView_VoiceInformation_Release returned unexpected refcount %d\n", rc);
+done: rc = IInstalledVoicesStatic_Release(voices_static); ok(rc == 4, "IInstalledVoicesStatic_Release returned unexpected refcount %d\n", rc);
-done: rc = IAgileObject_Release(agile_object); ok(rc == 3, "IAgileObject_Release returned unexpected refcount %d\n", rc); rc = IInspectable_Release(inspectable);
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=86935
Your paranoid android.
=== debiant2 (32 bit French report) ===
Report validation errors: The report seems to have been truncated
Signed-off-by: Jacek Caban jacek@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/windows.media.speech/main.c | 125 +++++++++++++++++++++- dlls/windows.media.speech/tests/statics.c | 8 +- 2 files changed, 126 insertions(+), 7 deletions(-)
diff --git a/dlls/windows.media.speech/main.c b/dlls/windows.media.speech/main.c index 0d1da641394..28b1c45c4fd 100644 --- a/dlls/windows.media.speech/main.c +++ b/dlls/windows.media.speech/main.c @@ -46,6 +46,125 @@ static const char *debugstr_hstring(HSTRING hstr) return wine_dbgstr_wn(str, len); }
+struct voice_information_vector +{ + IVectorView_VoiceInformation IVectorView_VoiceInformation_iface; + LONG ref; +}; + +static inline struct voice_information_vector *impl_from_IVectorView_VoiceInformation(IVectorView_VoiceInformation *iface) +{ + return CONTAINING_RECORD(iface, struct voice_information_vector, IVectorView_VoiceInformation_iface); +} + +static HRESULT STDMETHODCALLTYPE vector_view_voice_information_QueryInterface( + IVectorView_VoiceInformation *iface, REFIID iid, void **out) +{ + 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_IVectorView_VoiceInformation)) + { + IUnknown_AddRef(iface); + *out = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG STDMETHODCALLTYPE vector_view_voice_information_AddRef( + IVectorView_VoiceInformation *iface) +{ + struct voice_information_vector *impl = impl_from_IVectorView_VoiceInformation(iface); + ULONG ref = InterlockedIncrement(&impl->ref); + TRACE("iface %p, ref %u.\n", iface, ref); + return ref; +} + +static ULONG STDMETHODCALLTYPE vector_view_voice_information_Release( + IVectorView_VoiceInformation *iface) +{ + struct voice_information_vector *impl = impl_from_IVectorView_VoiceInformation(iface); + ULONG ref = InterlockedDecrement(&impl->ref); + TRACE("iface %p, ref %u.\n", iface, ref); + return ref; +} + +static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetIids( + IVectorView_VoiceInformation *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 vector_view_voice_information_GetRuntimeClassName( + IVectorView_VoiceInformation *iface, HSTRING *class_name) +{ + FIXME("iface %p, class_name %p stub!\n", iface, class_name); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetTrustLevel( + IVectorView_VoiceInformation *iface, TrustLevel *trust_level) +{ + FIXME("iface %p, trust_level %p stub!\n", iface, trust_level); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetAt( + IVectorView_VoiceInformation *iface, ULONG index, IVoiceInformation **value) +{ + FIXME("iface %p, index %#x, value %p stub!\n", iface, index, value); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE vector_view_voice_information_get_Size( + IVectorView_VoiceInformation *iface, ULONG *value) +{ + FIXME("iface %p, value %p stub!\n", iface, value); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE vector_view_voice_information_IndexOf( + IVectorView_VoiceInformation *iface, IVoiceInformation *element, ULONG *index, BOOLEAN *value) +{ + FIXME("iface %p, element %p, index %p, value %p stub!\n", iface, element, index, value); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetMany( + IVectorView_VoiceInformation *iface, ULONG start_index, IVoiceInformation **items, UINT *value) +{ + FIXME("iface %p, start_index %#x, items %p, value %p stub!\n", iface, start_index, items, value); + return E_NOTIMPL; +} + +static const struct IVectorView_VoiceInformationVtbl vector_view_voice_information_vtbl = +{ + vector_view_voice_information_QueryInterface, + vector_view_voice_information_AddRef, + vector_view_voice_information_Release, + /* IInspectable methods */ + vector_view_voice_information_GetIids, + vector_view_voice_information_GetRuntimeClassName, + vector_view_voice_information_GetTrustLevel, + /* IVectorView<VoiceInformation> methods */ + vector_view_voice_information_GetAt, + vector_view_voice_information_get_Size, + vector_view_voice_information_IndexOf, + vector_view_voice_information_GetMany, +}; + +static struct voice_information_vector all_voices = +{ + {&vector_view_voice_information_vtbl}, + 0 +}; + struct windows_media_speech { IActivationFactory IActivationFactory_iface; @@ -196,8 +315,10 @@ static HRESULT STDMETHODCALLTYPE installed_voices_static_GetTrustLevel( static HRESULT STDMETHODCALLTYPE installed_voices_static_get_AllVoices( IInstalledVoicesStatic *iface, IVectorView_VoiceInformation **value) { - FIXME("iface %p, value %p stub!\n", iface, value); - return E_NOTIMPL; + TRACE("iface %p, value %p.\n", iface, value); + *value = &all_voices.IVectorView_VoiceInformation_iface; + IVectorView_VoiceInformation_AddRef(*value); + return S_OK; }
static HRESULT STDMETHODCALLTYPE installed_voices_static_get_DefaultVoice( diff --git a/dlls/windows.media.speech/tests/statics.c b/dlls/windows.media.speech/tests/statics.c index 470b6d769c6..30994b3ac1d 100644 --- a/dlls/windows.media.speech/tests/statics.c +++ b/dlls/windows.media.speech/tests/statics.c @@ -88,8 +88,7 @@ static void test_SpeechSynthesizer(void) IAgileObject_Release(tmp_agile_object);
hr = IInstalledVoicesStatic_get_AllVoices(voices_static, &voices); - todo_wine ok(SUCCEEDED(hr), "IInstalledVoicesStatic_get_AllVoices failed, hr %#x\n", hr); - if (FAILED(hr)) goto done; + ok(SUCCEEDED(hr), "IInstalledVoicesStatic_get_AllVoices failed, hr %#x\n", hr);
hr = IVectorView_VoiceInformation_QueryInterface(voices, &IID_IInspectable, (void **)&tmp_inspectable); ok(SUCCEEDED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); @@ -101,13 +100,12 @@ static void test_SpeechSynthesizer(void)
size = 0xdeadbeef; hr = IVectorView_VoiceInformation_get_Size(voices, &size); - ok(SUCCEEDED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); - ok(size != 0 && size != 0xdeadbeef, "IVectorView_VoiceInformation_get_Size returned %u\n", size); + todo_wine ok(SUCCEEDED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); + todo_wine ok(size != 0 && size != 0xdeadbeef, "IVectorView_VoiceInformation_get_Size returned %u\n", size);
rc = IVectorView_VoiceInformation_Release(voices); ok(rc == 0, "IVectorView_VoiceInformation_Release returned unexpected refcount %d\n", rc);
-done: rc = IInstalledVoicesStatic_Release(voices_static); ok(rc == 4, "IInstalledVoicesStatic_Release returned unexpected refcount %d\n", rc);
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=86936
Your paranoid android.
=== debiant2 (32 bit French report) ===
Report validation errors: The report seems to have been truncated
Signed-off-by: Jacek Caban jacek@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/windows.media.speech/main.c | 11 +++++++---- dlls/windows.media.speech/tests/statics.c | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/dlls/windows.media.speech/main.c b/dlls/windows.media.speech/main.c index 28b1c45c4fd..92215fe717d 100644 --- a/dlls/windows.media.speech/main.c +++ b/dlls/windows.media.speech/main.c @@ -119,28 +119,31 @@ static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetAt( IVectorView_VoiceInformation *iface, ULONG index, IVoiceInformation **value) { FIXME("iface %p, index %#x, value %p stub!\n", iface, index, value); - return E_NOTIMPL; + return S_OK; }
static HRESULT STDMETHODCALLTYPE vector_view_voice_information_get_Size( IVectorView_VoiceInformation *iface, ULONG *value) { FIXME("iface %p, value %p stub!\n", iface, value); - return E_NOTIMPL; + *value = 0; + return S_OK; }
static HRESULT STDMETHODCALLTYPE vector_view_voice_information_IndexOf( IVectorView_VoiceInformation *iface, IVoiceInformation *element, ULONG *index, BOOLEAN *value) { FIXME("iface %p, element %p, index %p, value %p stub!\n", iface, element, index, value); - return E_NOTIMPL; + *value = FALSE; + return S_OK; }
static HRESULT STDMETHODCALLTYPE vector_view_voice_information_GetMany( IVectorView_VoiceInformation *iface, ULONG start_index, IVoiceInformation **items, UINT *value) { FIXME("iface %p, start_index %#x, items %p, value %p stub!\n", iface, start_index, items, value); - return E_NOTIMPL; + *value = 0; + return S_OK; }
static const struct IVectorView_VoiceInformationVtbl vector_view_voice_information_vtbl = diff --git a/dlls/windows.media.speech/tests/statics.c b/dlls/windows.media.speech/tests/statics.c index 30994b3ac1d..8454729f9c3 100644 --- a/dlls/windows.media.speech/tests/statics.c +++ b/dlls/windows.media.speech/tests/statics.c @@ -100,7 +100,7 @@ static void test_SpeechSynthesizer(void)
size = 0xdeadbeef; hr = IVectorView_VoiceInformation_get_Size(voices, &size); - todo_wine ok(SUCCEEDED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); + ok(SUCCEEDED(hr), "IVectorView_VoiceInformation_QueryInterface voices failed, hr %#x\n", hr); todo_wine ok(size != 0 && size != 0xdeadbeef, "IVectorView_VoiceInformation_get_Size returned %u\n", size);
rc = IVectorView_VoiceInformation_Release(voices);
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=86937
Your paranoid android.
=== debiant2 (32 bit French report) ===
Report validation errors: The report seems to have been truncated
Signed-off-by: Jacek Caban jacek@codeweavers.com
Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/windows.media.speech/tests/statics.c | 3 +-- tools/widl/register.c | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/windows.media.speech/tests/statics.c b/dlls/windows.media.speech/tests/statics.c index 8454729f9c3..9faa49dfc5d 100644 --- a/dlls/windows.media.speech/tests/statics.c +++ b/dlls/windows.media.speech/tests/statics.c @@ -136,8 +136,7 @@ static void test_VoiceInformation(void) ok(SUCCEEDED(hr), "WindowsCreateString failed, hr %#x\n", hr);
hr = pRoGetActivationFactory(str, &IID_IActivationFactory, (void **)&factory); - todo_wine ok(hr == REGDB_E_CLASSNOTREG, "RoGetActivationFactory returned unexpected hr %#x\n", hr); - if (SUCCEEDED(hr)) IActivationFactory_Release(factory); + ok(hr == REGDB_E_CLASSNOTREG, "RoGetActivationFactory returned unexpected hr %#x\n", hr);
pWindowsDeleteString(str);
diff --git a/tools/widl/register.c b/tools/widl/register.c index 76bfc3c715c..39c207f11dd 100644 --- a/tools/widl/register.c +++ b/tools/widl/register.c @@ -194,6 +194,11 @@ static void write_runtimeclasses_registry( const statement_list_t *stmts ) { if (stmt->type != STMT_TYPE) continue; if (type_get_type((type = stmt->u.type)) != TYPE_RUNTIMECLASS) continue; + if (!get_attrp(type->attrs, ATTR_ACTIVATABLE)) + { + put_str( indent, "Delete %s\n", format_namespace( type->namespace, "", ".", type->name, NULL ) ); + continue; + } put_str( indent, "ForceRemove %s\n", format_namespace( type->namespace, "", ".", type->name, NULL ) ); put_str( indent++, "{\n" ); put_str( indent, "val 'DllPath' = s '%%MODULE%%'\n" );
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=86938
Your paranoid android.
=== debiant2 (32 bit French report) ===
Report validation errors: The report seems to have been truncated
On 12.03.2021 12:31, Rémi Bernon wrote:
if (!get_attrp(type->attrs, ATTR_ACTIVATABLE))
{
put_str( indent, "Delete %s\n", format_namespace( type->namespace, "", ".", type->name, NULL ) );
Is there a reason to actively delete existing keys? It seems to me that just skipping registration would be better.
Thanks,
Jacek
On 3/15/21 7:35 PM, Jacek Caban wrote:
On 12.03.2021 12:31, Rémi Bernon wrote:
+ if (!get_attrp(type->attrs, ATTR_ACTIVATABLE)) + { + put_str( indent, "Delete %s\n", format_namespace( type->namespace, "", ".", type->name, NULL ) );
Is there a reason to actively delete existing keys? It seems to me that just skipping registration would be better.
Thanks,
Jacek
Well we've possibly created some now because widl wasn't doing the right thing, so I thought we should forcefully delete them. There's no reason otherwise.
On 3/15/21 7:45 PM, Rémi Bernon wrote:
On 3/15/21 7:35 PM, Jacek Caban wrote:
On 12.03.2021 12:31, Rémi Bernon wrote:
+ if (!get_attrp(type->attrs, ATTR_ACTIVATABLE)) + { + put_str( indent, "Delete %s\n", format_namespace( type->namespace, "", ".", type->name, NULL ) );
Is there a reason to actively delete existing keys? It seems to me that just skipping registration would be better.
Thanks,
Jacek
Well we've possibly created some now because widl wasn't doing the right thing, so I thought we should forcefully delete them. There's no reason otherwise.
Well apparently it's not entirely correct anyway, as classes without the activatable attribute but with static attribute should be registered as well.
I'll send another version (without the delete).