summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin/qplugin.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2012-02-06 23:36:17 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-15 17:27:37 +0100
commit7184456f9a26a9c07a689c15b415ddf82eb000b7 (patch)
tree076d42ad3fd6f08a1cbef21ee6811a3fa951850b /src/corelib/plugin/qplugin.h
parent556dd0228aca07dfe8443fd99e9f2ead4e13ab22 (diff)
Implement new plugin mechanism
moc can now embed meta information about the plugin inside the plugin itself. This information can be queried by Qt without having to load the plugin. Source compatibility with the old plugin loading mechanism is still there, but will be removed before Qt 5.0. Change-Id: I03e4196ddfed07d0fe94acca40d5de8a6ce7f920 Reviewed-by: João Abecasis <joao.abecasis@nokia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/plugin/qplugin.h')
-rw-r--r--src/corelib/plugin/qplugin.h84
1 files changed, 56 insertions, 28 deletions
diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h
index 6cc0ceb5c2..90ab8369c9 100644
--- a/src/corelib/plugin/qplugin.h
+++ b/src/corelib/plugin/qplugin.h
@@ -59,15 +59,33 @@ QT_BEGIN_NAMESPACE
#endif
typedef QObject *(*QtPluginInstanceFunction)();
+typedef const char *(*QtPluginMetaDataFunction)();
+
+struct QStaticPlugin
+{
+ QtPluginInstanceFunction instance;
+ QtPluginMetaDataFunction metaData;
+};
+
+void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
+
+#if defined (Q_OF_ELF) && defined (Q_CC_GNU)
+# define QT_PLUGIN_VERIFICATION_SECTION \
+ __attribute__ ((section (".qtplugin"))) __attribute__((used))
+# define QT_PLUGIN_METADATA_SECTION \
+ __attribute__ ((section (".qtmetadata"))) __attribute__((used))
+#else
+# define QT_PLUGIN_VERIFICATION_SECTION
+# define QT_PLUGIN_METADATA_SECTION
+#endif
-void Q_CORE_EXPORT qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunction function);
#define Q_IMPORT_PLUGIN(PLUGIN) \
- extern QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance_##PLUGIN(); \
+ extern const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGIN(); \
class Static##PLUGIN##PluginInstance{ \
public: \
Static##PLUGIN##PluginInstance() { \
- qRegisterStaticPluginInstanceFunction(qt_plugin_instance_##PLUGIN); \
+ qRegisterStaticPluginFunction(qt_static_plugin_##PLUGIN()); \
} \
}; \
static Static##PLUGIN##PluginInstance static##PLUGIN##Instance;
@@ -80,21 +98,43 @@ void Q_CORE_EXPORT qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunctio
return _instance; \
}
-# define Q_EXPORT_PLUGIN(PLUGIN) \
- Q_EXPORT_PLUGIN2(PLUGIN, PLUGIN)
+#if defined(QT_STATICPLUGIN)
-# define Q_EXPORT_STATIC_PLUGIN(PLUGIN) \
- Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGIN)
+# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS) \
+ static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
+ Q_PLUGIN_INSTANCE(PLUGINCLASS) \
+ static const char *qt_plugin_query_metadata() { return (const char *)qt_pluginMetaData; } \
+ const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGINCLASS() { \
+ QT_PREPEND_NAMESPACE(QStaticPlugin) plugin = { qt_plugin_instance, qt_plugin_query_metadata }; \
+ return plugin; \
+ }
-#if defined(QT_STATICPLUGIN)
+#else
-# define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS) \
- QT_PREPEND_NAMESPACE(QObject) \
- *qt_plugin_instance_##PLUGIN() \
+# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS) \
+ Q_EXTERN_C Q_DECL_EXPORT \
+ const char *qt_plugin_query_metadata() \
+ { return (const char *)qt_pluginMetaData; } \
+ Q_EXTERN_C Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
Q_PLUGIN_INSTANCE(PLUGINCLASS)
-# define Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGINCLASS) \
- Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS)
+#endif
+
+
+#define Q_EXPORT_PLUGIN(PLUGIN) \
+ Q_EXPORT_PLUGIN2(PLUGIN, PLUGIN)
+#define Q_EXPORT_STATIC_PLUGIN(PLUGIN)
+#define Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGINCLASS)
+
+#if defined(QT_STATICPLUGIN)
+
+# define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS) \
+ static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
+ Q_PLUGIN_INSTANCE(PLUGINCLASS) \
+ const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGIN() { \
+ QT_PREPEND_NAMESPACE(QStaticPlugin) plugin = { qt_plugin_instance, 0 }; \
+ return plugin; \
+ }
#else
// NOTE: if you change pattern, you MUST change the pattern in
@@ -118,25 +158,13 @@ void Q_CORE_EXPORT qRegisterStaticPluginInstanceFunction(QtPluginInstanceFunctio
"version="QT_VERSION_STR"\n" \
"debug="QPLUGIN_DEBUG_STR;
-# if defined (Q_OF_ELF) && defined (Q_CC_GNU)
-# define Q_PLUGIN_VERIFICATION_SECTION \
- __attribute__ ((section (".qtplugin"))) __attribute__((used))
-# else
-# define Q_PLUGIN_VERIFICATION_SECTION
-# endif
-
-# if defined (Q_OS_WIN32) && defined(Q_CC_BOR)
-# define Q_STANDARD_CALL __stdcall
-# else
-# define Q_STANDARD_CALL
-# endif
# define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS) \
- Q_PLUGIN_VERIFICATION_SECTION Q_PLUGIN_VERIFICATION_DATA \
+ QT_PLUGIN_VERIFICATION_SECTION Q_PLUGIN_VERIFICATION_DATA \
Q_EXTERN_C Q_DECL_EXPORT \
- const char * Q_STANDARD_CALL qt_plugin_query_verification_data() \
+ const char * qt_plugin_query_verification_data() \
{ return qt_plugin_verification_data; } \
- Q_EXTERN_C Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) * Q_STANDARD_CALL qt_plugin_instance() \
+ Q_EXTERN_C Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) * qt_plugin_instance() \
Q_PLUGIN_INSTANCE(PLUGINCLASS)
# define Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGINCLASS)