summaryrefslogtreecommitdiffstats
path: root/src/corelib/global/qnativeinterface_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/global/qnativeinterface_p.h')
-rw-r--r--src/corelib/global/qnativeinterface_p.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/corelib/global/qnativeinterface_p.h b/src/corelib/global/qnativeinterface_p.h
new file mode 100644
index 0000000000..aa7705e153
--- /dev/null
+++ b/src/corelib/global/qnativeinterface_p.h
@@ -0,0 +1,63 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef QNATIVEINTERFACE_P_H
+#define QNATIVEINTERFACE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/private/qglobal_p.h>
+#include <QtCore/qloggingcategory.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate {
+Q_DECLARE_EXPORTED_LOGGING_CATEGORY(lcNativeInterface, Q_CORE_EXPORT)
+}
+
+// Provides a definition for the interface destructor
+#define QT_DEFINE_NATIVE_INTERFACE_2(Namespace, InterfaceClass) \
+ QT_PREPEND_NAMESPACE(Namespace)::InterfaceClass::~InterfaceClass() = default
+
+#define QT_DEFINE_NATIVE_INTERFACE(...) \
+ QT_OVERLOADED_MACRO(QT_DEFINE_NATIVE_INTERFACE, QNativeInterface, __VA_ARGS__)
+#define QT_DEFINE_PRIVATE_NATIVE_INTERFACE(...) \
+ QT_OVERLOADED_MACRO(QT_DEFINE_NATIVE_INTERFACE, QNativeInterface::Private, __VA_ARGS__)
+
+#define QT_NATIVE_INTERFACE_RETURN_IF(NativeInterface, baseType) \
+ { \
+ using QtPrivate::lcNativeInterface; \
+ using QNativeInterface::Private::TypeInfo; \
+ qCDebug(lcNativeInterface, "Comparing requested interface name %s with available %s", \
+ name, TypeInfo<NativeInterface>::name()); \
+ if (qstrcmp(name, TypeInfo<NativeInterface>::name()) == 0) { \
+ qCDebug(lcNativeInterface, \
+ "Match for interface %s. Comparing revisions (requested %d / available %d)", \
+ name, revision, TypeInfo<NativeInterface>::revision()); \
+ if (revision == TypeInfo<NativeInterface>::revision()) { \
+ qCDebug(lcNativeInterface) << "Full match. Returning dynamic cast of" << baseType; \
+ return dynamic_cast<NativeInterface *>(baseType); \
+ } else { \
+ qCWarning(lcNativeInterface, \
+ "Native interface revision mismatch (requested %d / available %d) for " \
+ "interface %s", \
+ revision, TypeInfo<NativeInterface>::revision(), name); \
+ return nullptr; \
+ } \
+ } else { \
+ qCDebug(lcNativeInterface, "No match for requested interface name %s", name); \
+ } \
+ }
+
+QT_END_NAMESPACE
+
+#endif // QNATIVEINTERFACE_P_H