Use QComObject with QWindowsUiaMainProvider

This change adds QComObject as base to QWindowsUiaMainProvider in order
to reuse its implementation of IUnknown.

Change-Id: I48808262364992f90f18fc881594f151eeb29a3f
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
bb10
Pavel Dubsky 2024-04-11 18:54:45 +02:00
parent 6324075a2d
commit f9c9981524
2 changed files with 16 additions and 29 deletions

View File

@ -18,7 +18,6 @@
#include "qwindowsuiagriditemprovider.h"
#include "qwindowsuiawindowprovider.h"
#include "qwindowsuiaexpandcollapseprovider.h"
#include "qwindowscombase.h"
#include "qwindowscontext.h"
#include "qwindowsuiautils.h"
#include "qwindowsuiaprovidercache.h"
@ -62,9 +61,8 @@ QWindowsUiaMainProvider *QWindowsUiaMainProvider::providerForAccessible(QAccessi
return provider;
}
QWindowsUiaMainProvider::QWindowsUiaMainProvider(QAccessibleInterface *a, int initialRefCount)
: QWindowsUiaBaseProvider(QAccessible::uniqueId(a)),
m_ref(initialRefCount)
QWindowsUiaMainProvider::QWindowsUiaMainProvider(QAccessibleInterface *a)
: QWindowsUiaBaseProvider(QAccessible::uniqueId(a))
{
}
@ -208,33 +206,26 @@ void QWindowsUiaMainProvider::notifyTextChange(QAccessibleEvent *event)
HRESULT STDMETHODCALLTYPE QWindowsUiaMainProvider::QueryInterface(REFIID iid, LPVOID *iface)
{
if (!iface)
return E_INVALIDARG;
*iface = nullptr;
HRESULT result = QComObject::QueryInterface(iid, iface);
QAccessibleInterface *accessible = accessibleInterface();
if (SUCCEEDED(result) && iid == __uuidof(IRawElementProviderFragmentRoot)) {
QAccessibleInterface *accessible = accessibleInterface();
if (accessible && hwndForAccessible(accessible)) {
result = S_OK;
} else {
result = E_NOINTERFACE;
iface = nullptr;
}
}
const bool result = qWindowsComQueryUnknownInterfaceMulti<IRawElementProviderSimple>(this, iid, iface)
|| qWindowsComQueryInterface<IRawElementProviderSimple>(this, iid, iface)
|| qWindowsComQueryInterface<IRawElementProviderFragment>(this, iid, iface)
|| (accessible && hwndForAccessible(accessible) && qWindowsComQueryInterface<IRawElementProviderFragmentRoot>(this, iid, iface));
return result ? S_OK : E_NOINTERFACE;
}
ULONG QWindowsUiaMainProvider::AddRef()
{
return ++m_ref;
return result;
}
ULONG STDMETHODCALLTYPE QWindowsUiaMainProvider::Release()
{
QMutexLocker locker(&m_mutex);
if (!--m_ref) {
delete this;
return 0;
}
return m_ref;
return QComObject::Release();
}
HRESULT QWindowsUiaMainProvider::get_ProviderOptions(ProviderOptions *pRetVal)

View File

@ -20,15 +20,13 @@ QT_BEGIN_NAMESPACE
// The main UI Automation class.
class QWindowsUiaMainProvider :
public QWindowsUiaBaseProvider,
public IRawElementProviderSimple,
public IRawElementProviderFragment,
public IRawElementProviderFragmentRoot
public QComObject<IRawElementProviderSimple, IRawElementProviderFragment, IRawElementProviderFragmentRoot>
{
Q_OBJECT
Q_DISABLE_COPY_MOVE(QWindowsUiaMainProvider)
public:
static QWindowsUiaMainProvider *providerForAccessible(QAccessibleInterface *accessible);
explicit QWindowsUiaMainProvider(QAccessibleInterface *a, int initialRefCount = 1);
explicit QWindowsUiaMainProvider(QAccessibleInterface *a);
virtual ~QWindowsUiaMainProvider();
static void notifyFocusChange(QAccessibleEvent *event);
static void notifyStateChange(QAccessibleStateChangeEvent *event);
@ -39,7 +37,6 @@ public:
// IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id, LPVOID *iface) override;
ULONG STDMETHODCALLTYPE AddRef() override;
ULONG STDMETHODCALLTYPE Release() override;
// IRawElementProviderSimple methods
@ -63,7 +60,6 @@ public:
private:
QString automationIdForAccessible(const QAccessibleInterface *accessible);
static void fillVariantArrayForRelation(QAccessibleInterface *accessible, QAccessible::Relation relation, VARIANT *pRetVal);
ULONG m_ref;
static QMutex m_mutex;
};