**************************************************************/
HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::QueryInterface(REFIID id, LPVOID *iface)
{
- *iface = 0;
-
- QByteArray strIID = IIDToString(id);
- if (!strIID.isEmpty()) {
- QString ss; QDebug dbg(&ss); dbg << accessible;
- accessibleDebug("QWindowsIA2Accessible::QI() - IID:%s, iface:%s ", strIID.constData(), qPrintable(ss));
- }
- if (id == IID_IUnknown) {
- *iface = (IUnknown*)(IDispatch*)this;
- } else if (id == IID_IDispatch) {
- *iface = (IDispatch*)this;
- } else if (id == IID_IAccessible) {
- *iface = (IAccessible*)this;
- } else if (id == IID_IOleWindow) {
- *iface = (IOleWindow*)this;
- } else if (id == IID_IServiceProvider) {
- *iface = (IServiceProvider*)this;
- } else if (id == IID_IAccessible2) {
- *iface = (IAccessible2*)this;
- } else if (id == IID_IAccessibleAction) {
- if (accessible->actionInterface())
- *iface = (IAccessibleAction*)this;
- } else if (id == IID_IAccessibleComponent) {
- *iface = (IAccessibleComponent*)this;
- } else if (id == IID_IAccessibleEditableText) {
- //if (accessible->editableTextInterface()) {
- //*iface = (IAccessibleEditableText*)this;
- //}
- } else if (id == IID_IAccessibleHyperlink) {
- //*iface = (IAccessibleHyperlink*)this;
- } else if (id == IID_IAccessibleHypertext) {
- //*iface = (IAccessibleHypertext*)this;
- } else if (id == IID_IAccessibleImage) {
- //*iface = (IAccessibleImage*)this;
- } else if (id == IID_IAccessibleRelation) {
- *iface = (IAccessibleRelation*)this;
- } else if (id == IID_IAccessibleTable) {
- //*iface = (IAccessibleTable*)this; // not supported
- } else if (id == IID_IAccessibleTable2) {
- if (accessible->tableInterface())
- *iface = (IAccessibleTable2*)this;
- } else if (id == IID_IAccessibleTableCell) {
- if (accessible->tableCellInterface())
- *iface = (IAccessibleTableCell*)this;
- } else if (id == IID_IAccessibleText) {
- if (accessible->textInterface())
- *iface = (IAccessibleText*)this;
- } else if (id == IID_IAccessibleValue) {
- if (accessible->valueInterface())
- *iface = (IAccessibleValue*)this;
- }
- if (*iface) {
- AddRef();
- return S_OK;
+ HRESULT hr = QWindowsMsaaAccessible::QueryInterface(id, iface);
+ if (!SUCCEEDED(hr)) {
+ if (id == IID_IAccessible2) {
+ *iface = (IAccessible2*)this;
+ } else if (id == IID_IAccessibleAction) {
+ if (accessible->actionInterface())
+ *iface = (IAccessibleAction*)this;
+ } else if (id == IID_IAccessibleComponent) {
+ *iface = (IAccessibleComponent*)this;
+ } else if (id == IID_IAccessibleEditableText) {
+ //if (accessible->editableTextInterface()) {
+ //*iface = (IAccessibleEditableText*)this;
+ //}
+ } else if (id == IID_IAccessibleHyperlink) {
+ //*iface = (IAccessibleHyperlink*)this;
+ } else if (id == IID_IAccessibleHypertext) {
+ //*iface = (IAccessibleHypertext*)this;
+ } else if (id == IID_IAccessibleImage) {
+ //*iface = (IAccessibleImage*)this;
+ } else if (id == IID_IAccessibleRelation) {
+ *iface = (IAccessibleRelation*)this;
+ } else if (id == IID_IAccessibleTable) {
+ //*iface = (IAccessibleTable*)this; // not supported
+ } else if (id == IID_IAccessibleTable2) {
+ if (accessible->tableInterface())
+ *iface = (IAccessibleTable2*)this;
+ } else if (id == IID_IAccessibleTableCell) {
+ if (accessible->tableCellInterface())
+ *iface = (IAccessibleTableCell*)this;
+ } else if (id == IID_IAccessibleText) {
+ if (accessible->textInterface())
+ *iface = (IAccessibleText*)this;
+ } else if (id == IID_IAccessibleValue) {
+ if (accessible->valueInterface())
+ *iface = (IAccessibleValue*)this;
+ }
+ if (*iface) {
+ AddRef();
+ hr = S_OK;
+ } else {
+ hr = E_NOINTERFACE;
+ }
}
-
- return E_NOINTERFACE;
+ return hr;
}
ULONG STDMETHODCALLTYPE QWindowsIA2Accessible::AddRef()
{
- return ++ref;
+ return QWindowsMsaaAccessible::AddRef();
}
ULONG STDMETHODCALLTYPE QWindowsIA2Accessible::Release()
{
- if (!--ref) {
- delete this;
- return 0;
- }
- return ref;
+ return QWindowsMsaaAccessible::Release();
}
-
-
/**************************************************************\
* *
* IAccessible2 *
QByteArray QWindowsIA2Accessible::IIDToString(REFIID id)
{
+ QByteArray strGuid = QWindowsMsaaAccessible::IIDToString(id);
+ if (!strGuid.isEmpty())
+ return strGuid;
+
IF_EQUAL_RETURN_IIDSTRING(id, IID_IUnknown);
IF_EQUAL_RETURN_IIDSTRING(id, IID_IDispatch);
IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessible);
IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessibleValue);
// else...
- QByteArray strGuid;
#if 0 // Can be useful for debugging, but normally we'd like to reduce the noise a bit...
OLECHAR szGuid[39]={0};
::StringFromGUID2(id, szGuid, 39);
}
#endif
+/**************************************************************\
+ * *
+ * IUnknown *
+ * *
+ **************************************************************/
+HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::QueryInterface(REFIID id, LPVOID *iface)
+{
+ *iface = 0;
+
+ QByteArray strIID = IIDToString(id);
+ if (!strIID.isEmpty()) {
+ QString ss; QDebug dbg(&ss); dbg << accessible;
+ accessibleDebug("QWindowsIA2Accessible::QI() - IID:%s, iface:%s ", strIID.constData(), qPrintable(ss));
+ }
+ if (id == IID_IUnknown) {
+ *iface = (IUnknown*)(IDispatch*)this;
+ } else if (id == IID_IDispatch) {
+ *iface = (IDispatch*)this;
+ } else if (id == IID_IAccessible) {
+ *iface = (IAccessible*)this;
+ } else if (id == IID_IOleWindow) {
+ *iface = (IOleWindow*)this;
+ }
+
+ if (*iface) {
+ AddRef();
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+ULONG STDMETHODCALLTYPE QWindowsMsaaAccessible::AddRef()
+{
+ return ++ref;
+}
+
+ULONG STDMETHODCALLTYPE QWindowsMsaaAccessible::Release()
+{
+ if (!--ref) {
+ delete this;
+ return 0;
+ }
+ return ref;
+}
+
+
/*
IDispatch
*/
return S_OK;
}
+#define IF_EQUAL_RETURN_IIDSTRING(id, iid) if (id == iid) return QByteArray(#iid)
+QByteArray QWindowsMsaaAccessible::IIDToString(REFIID id)
+{
+ IF_EQUAL_RETURN_IIDSTRING(id, IID_IUnknown);
+ IF_EQUAL_RETURN_IIDSTRING(id, IID_IDispatch);
+ IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessible);
+ IF_EQUAL_RETURN_IIDSTRING(id, IID_IOleWindow);
+
+ return QByteArray();
+}
+
QT_END_NAMESPACE
#endif //QT_NO_ACCESSIBILITY
#include <QtCore/QtConfig>
#ifndef QT_NO_ACCESSIBILITY
+#include <QtCore/qglobal.h>
#include "../qtwindows_additional.h"
-#include <oleacc.h>
-#include "Accessible2.h"
#include <QtCore/qsharedpointer.h>
#include <QtGui/qaccessible.h>
+#ifndef Q_CC_MINGW
+# include <oleacc.h>
+# include "Accessible2.h" // IAccessible2 inherits from IAccessible
+#else
+ // MinGW
+# include <basetyps.h>
+# include <oleacc.h>
+#endif
QT_BEGIN_NAMESPACE
/**************************************************************\
* QWindowsAccessible *
**************************************************************/
-class QWindowsMsaaAccessible : public IAccessible2, public IOleWindow
+class QWindowsMsaaAccessible : public
+#ifdef Q_CC_MINGW
+ IAccessible
+#else
+ IAccessible2
+#endif
+ , public IOleWindow
{
public:
QWindowsMsaaAccessible(QAccessibleInterface *a)
delete accessible;
}
+ /* IUnknown */
+ HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, LPVOID *);
+ ULONG STDMETHODCALLTYPE AddRef();
+ ULONG STDMETHODCALLTYPE Release();
/* IDispatch */
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int *);
HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
protected:
+ virtual QByteArray IIDToString(REFIID id);
+
QAccessibleInterface *accessible;
QAIPointer childPointer(VARIANT varID)
{
return QAIPointer(accessible->child(varID.lVal - 1));
}
+
+private:
+ ULONG ref;
+
};
QT_END_NAMESPACE