[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-core-devel
Subject: Using dynamic Qt plugins in KAuth
From: Dario Freddi <drf54321 () gmail ! com>
Date: 2010-02-11 18:02:16
Message-ID: 201002111902.21952.drf54321 () gmail ! com
[Download RAW message or body]
[Attachment #2 (multipart/mixed)]
Hello list,
After seeing that ldd'ing libkdecore gives out quite a lot of things due to
KAuth + polkit-1, I decided it could be a good thing to move backend handling
to a dynamic plugin architecture, so I did it (patch attached).
I think this approach is better, it does not change anything in API/ABI (the
only change in public headers is that now a function is exported), I tested it
and works quite well.
I was wondering if such a change is ok (I still did not commit it) and if it's
eligible for a backport to 4.4.
--
-------------------
Dario Freddi
KDE Developer
GPG Key Signature: 511A9A3B
["kauth_dynamic_plugins.patch" (text/x-patch)]
Index: auth/ConfigureChecks.cmake
===================================================================
--- auth/ConfigureChecks.cmake (revisione 1088743)
+++ auth/ConfigureChecks.cmake (copia locale)
@@ -101,7 +101,7 @@
auth/backends/mac/AuthServicesBackend.cpp
)
- set(KAUTH_BACKEND_LIBS ${SECURITY_LIBRARY})
+ set(KAUTH_BACKEND_LIBS ${SECURITY_LIBRARY} ${QT_QTCORE_LIBRARY})
elseif(KDE4_AUTH_BACKEND_NAME STREQUAL "POLKITQT")
set (KAUTH_COMPILING_POLKITQT_BACKEND TRUE)
@@ -113,7 +113,7 @@
auth/backends/policykit/PolicyKitBackend.cpp
)
- set(KAUTH_BACKEND_LIBS ${POLKITQT_CORE_LIBRARY})
+ set(KAUTH_BACKEND_LIBS ${POLKITQT_CORE_LIBRARY} ${QT_QTCORE_LIBRARY})
set(KDE4_AUTH_POLICY_FILES_INSTALL_DIR ${POLKITQT_POLICY_FILES_INSTALL_DIR} CACHE STRING
"Where policy files generated by KAuth will be installed" FORCE)
@@ -128,7 +128,7 @@
auth/backends/polkit-1/Polkit1Backend.cpp
)
- set(KAUTH_BACKEND_LIBS ${POLKITQT-1_CORE_LIBRARY})
+ set(KAUTH_BACKEND_LIBS ${POLKITQT-1_CORE_LIBRARY} ${QT_QTCORE_LIBRARY})
set(KDE4_AUTH_POLICY_FILES_INSTALL_DIR ${POLKITQT-1_POLICY_FILES_INSTALL_DIR} CACHE STRING
"Where policy files generated by KAuth will be installed" FORCE)
@@ -142,6 +142,8 @@
set(KAUTH_BACKEND_SRCS ${KAUTH_BACKEND_SRCS}
auth/backends/fake/FakeBackend.cpp
)
+
+ set(KAUTH_BACKEND_LIBS ${QT_QTCORE_LIBRARY})
endif()
# KAuth policy generator executable source probing
@@ -179,6 +181,8 @@
${kauth_dbus_adaptor_SRCS}
)
+set(KAUTH_HELPER_BACKEND_LIBS kdecore)
+
# Install some files as well
install( FILES auth/backends/dbus/org.kde.auth.conf
DESTINATION ${SYSCONF_INSTALL_DIR}/dbus-1/system.d )
@@ -187,4 +191,9 @@
auth/backends/dbus/dbus_service.stub
DESTINATION ${DATA_INSTALL_DIR}/kauth COMPONENT Devel)
+# Set the various directories
+set(KAUTH_HELPER_PLUGIN_DIR "${QT_PLUGINS_DIR}/kauth/helper")
+set(KAUTH_BACKEND_PLUGIN_DIR "${QT_PLUGINS_DIR}/kauth/backend")
+set(KAUTH_OTHER_PLUGIN_DIR "${QT_PLUGINS_DIR}/kauth/plugins")
+
## End
Index: auth/BackendsManager.cpp
===================================================================
--- auth/BackendsManager.cpp (revisione 1088743)
+++ auth/BackendsManager.cpp (copia locale)
@@ -21,30 +21,9 @@
#include "BackendsConfig.h"
-// Here comes all the logic for compiling the chosen backends
-#ifdef KAUTH_COMPILING_OSX_BACKEND
-#include "backends/mac/AuthServicesBackend.h"
-typedef KAuth::AuthServicesBackend KAuthAuthBackend;
-#endif
-#ifdef KAUTH_COMPILING_POLKITQT_BACKEND
-#include "backends/policykit/PolicyKitBackend.h"
-typedef KAuth::PolicyKitBackend KAuthAuthBackend;
-#endif
-#ifdef KAUTH_COMPILING_POLKITQT1_BACKEND
-#include "backends/polkit-1/Polkit1Backend.h"
-typedef KAuth::Polkit1Backend KAuthAuthBackend;
-#endif
-#ifdef KAUTH_COMPILING_FAKE_BACKEND
-#include "backends/fake/FakeBackend.h"
-typedef KAuth::FakeBackend KAuthAuthBackend;
-#endif
+#include <QPluginLoader>
+#include <QDir>
-// Helper backends
-#ifdef KAUTH_COMPILING_DBUS_HELPER_BACKEND
-#include "backends/dbus/DBusHelperProxy.h"
-typedef KAuth::DBusHelperProxy KAuthHelperBackend;
-#endif
-
namespace KAuth
{
@@ -55,12 +34,63 @@
{
}
+QList< QObject* > BackendsManager::retrieveInstancesIn(const QString& path)
+{
+ QDir pluginPath(path);
+
+ if (!pluginPath.exists()) {
+ return QList< QObject* >();
+ }
+
+ QFileInfoList entryList = pluginPath.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);
+
+ if (entryList.isEmpty()) {
+ return QList< QObject* >();
+ }
+
+ QList< QObject* > retlist;
+
+ foreach(const QFileInfo &fi, entryList) {
+ QString filePath = fi.filePath(); // file name with path
+ QString fileName = fi.fileName(); // just file name
+
+ if(!QLibrary::isLibrary(filePath)) {
+ continue;
+ }
+
+ QString errstr;
+ QPluginLoader loader(filePath);
+ QObject *instance = loader.instance();
+ if (instance) {
+ retlist.append(instance);
+ }
+ }
+
+ return retlist;
+}
+
void BackendsManager::init()
{
- // Beware: here comes all the logic for loading the correct backend
- auth = new KAuthAuthBackend;
- helper = new KAuthHelperBackend;
+ // Backend plugin
+ QList< QObject* > backends = retrieveInstancesIn(KAUTH_BACKEND_PLUGIN_DIR);
+ foreach (QObject *instance, backends) {
+ auth = qobject_cast< KAuth::AuthBackend* >(instance);
+ if (auth) {
+ break;
+ }
+ }
+
+ // Helper plugin
+ QList< QObject* > helpers = retrieveInstancesIn(KAUTH_HELPER_PLUGIN_DIR);
+
+ foreach (QObject *instance, helpers) {
+ helper = qobject_cast< KAuth::HelperProxy* >(instance);
+ if (helper) {
+ break;
+ }
+ }
+
Q_ASSERT_X(auth, __FUNCTION__, "No AuthBackend found.");
Q_ASSERT_X(helper, __FUNCTION__, "No HelperBackend found.");
}
Index: auth/BackendsManager.h
===================================================================
--- auth/BackendsManager.h (revisione 1088743)
+++ auth/BackendsManager.h (copia locale)
@@ -22,11 +22,12 @@
#include "AuthBackend.h"
#include "HelperProxy.h"
+#include <kdecore_export.h>
namespace KAuth
{
-class BackendsManager
+class KDECORE_EXPORT BackendsManager
{
static AuthBackend *auth;
static HelperProxy *helper;
@@ -38,6 +39,7 @@
private:
static void init();
+ static QList<QObject*> retrieveInstancesIn(const QString &path);
};
} // namespace Auth
Index: auth/BackendsConfig.h.cmake
===================================================================
--- auth/BackendsConfig.h.cmake (revisione 1088743)
+++ auth/BackendsConfig.h.cmake (copia locale)
@@ -3,4 +3,6 @@
#cmakedefine KAUTH_COMPILING_POLKITQT1_BACKEND 1
#cmakedefine KAUTH_COMPILING_FAKE_BACKEND 1
#cmakedefine KAUTH_COMPILING_DBUS_HELPER_BACKEND 1
-
+#define KAUTH_BACKEND_PLUGIN_DIR "${KAUTH_BACKEND_PLUGIN_DIR}"
+#define KAUTH_HELPER_PLUGIN_DIR "${KAUTH_HELPER_PLUGIN_DIR}"
+#define KAUTH_OTHER_PLUGIN_DIR "${KAUTH_OTHER_PLUGIN_DIR}"
Index: auth/backends/mac/AuthServicesBackend.cpp
===================================================================
--- auth/backends/mac/AuthServicesBackend.cpp (revisione 1088743)
+++ auth/backends/mac/AuthServicesBackend.cpp (copia locale)
@@ -20,6 +20,8 @@
#include "AuthServicesBackend.h"
#include <Security/Security.h>
+#include <QtCore/qplugin.h>
+
namespace KAuth
{
@@ -120,3 +122,5 @@
}
}; // namespace KAuth
+
+Q_EXPORT_PLUGIN2(kauth_backend, KAuth::AuthServicesBackend)
Index: auth/backends/polkit-1/Polkit1Backend.cpp
===================================================================
--- auth/backends/polkit-1/Polkit1Backend.cpp (revisione 1088743)
+++ auth/backends/polkit-1/Polkit1Backend.cpp (copia locale)
@@ -21,7 +21,7 @@
#include "Polkit1Backend.h"
-#include <QDebug>
+#include <QtCore/qplugin.h>
#include <syslog.h>
#include <PolkitQt1/Authority>
#include <PolkitQt1/Subject>
@@ -108,3 +108,5 @@
}
} // namespace Auth
+
+Q_EXPORT_PLUGIN2(kauth_backend, KAuth::Polkit1Backend)
Index: auth/backends/fake/FakeBackend.cpp
===================================================================
--- auth/backends/fake/FakeBackend.cpp (revisione 1088743)
+++ auth/backends/fake/FakeBackend.cpp (copia locale)
@@ -19,6 +19,8 @@
#include "FakeBackend.h"
+#include <QtCore/qplugin.h>
+
#include <syslog.h>
namespace KAuth
@@ -59,3 +61,5 @@
}
} // namespace Auth
+
+Q_EXPORT_PLUGIN2(kauth_backend, KAuth::FakeBackend)
Index: auth/backends/policykit/PolicyKitBackend.cpp
===================================================================
--- auth/backends/policykit/PolicyKitBackend.cpp (revisione 1088743)
+++ auth/backends/policykit/PolicyKitBackend.cpp (copia locale)
@@ -20,6 +20,7 @@
#include "PolicyKitBackend.h"
+#include <QtCore/qplugin.h>
#include <syslog.h>
#include <polkit-qt/context.h>
#include <polkit-qt/auth.h>
@@ -98,3 +99,5 @@
}
} // namespace Auth
+
+Q_EXPORT_PLUGIN2(kauth_backend, KAuth::PolicyKitBackend)
Index: auth/backends/dbus/DBusHelperProxy.cpp
===================================================================
--- auth/backends/dbus/DBusHelperProxy.cpp (revisione 1088743)
+++ auth/backends/dbus/DBusHelperProxy.cpp (copia locale)
@@ -20,6 +20,7 @@
#include "DBusHelperProxy.h"
+#include <QtCore/qplugin.h>
#include <QObject>
#include <QMap>
#include <QtDBus/QDBusMessage>
@@ -329,3 +330,5 @@
}
} // namespace Auth
+
+Q_EXPORT_PLUGIN2(kauth_helper_backend, KAuth::DBusHelperProxy)
Index: auth/kauthactionreply.h
===================================================================
--- auth/kauthactionreply.h (revisione 1088743)
+++ auth/kauthactionreply.h (copia locale)
@@ -592,10 +592,10 @@
bool operator!=(const ActionReply &reply) const;
/// Output streaming operator for QDataStream
- friend QDataStream &operator<<(QDataStream &, const ActionReply &);
+ friend KDECORE_EXPORT QDataStream &operator<<(QDataStream &, const ActionReply &);
/// Input streaming operator for QDataStream
- friend QDataStream &operator>>(QDataStream &, ActionReply &);
+ friend KDECORE_EXPORT QDataStream &operator>>(QDataStream &, ActionReply &);
};
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt (revisione 1088295)
+++ CMakeLists.txt (copia locale)
@@ -111,11 +111,6 @@
)
endif (UNIX)
-# Add KAuth backend sources
-set(kdecore_OPTIONAL_SRCS ${kdecore_OPTIONAL_SRCS} ${KAUTH_BACKEND_SRCS} ${KAUTH_HELPER_BACKEND_SRCS})
-# Add KAuth backend libraries
-set(kdecore_OPTIONAL_LIBS ${kdecore_OPTIONAL_LIBS} ${KAUTH_BACKEND_LIBS})
-
add_subdirectory( kconfig_compiler )
add_subdirectory( tests )
add_subdirectory( sonnet/tests )
@@ -346,6 +341,31 @@
########### next target ###############
+# KAuth backend plugin
+
+set(KAUTH_BACKEND_SRCS ${KAUTH_BACKEND_SRCS} auth/AuthBackend.cpp)
+kde4_add_library(kauth_backend_plugin SHARED ${KAUTH_BACKEND_SRCS})
+target_link_libraries(kauth_backend_plugin ${KAUTH_BACKEND_LIBS})
+install(TARGETS kauth_backend_plugin
+ LIBRARY DESTINATION ${KAUTH_BACKEND_PLUGIN_DIR}
+ ARCHIVE DESTINATION ${KAUTH_BACKEND_PLUGIN_DIR}
+ RUNTIME DESTINATION ${KAUTH_BACKEND_PLUGIN_DIR}
+)
+
+########### next target ###############
+
+# KAuth helper plugin
+
+kde4_add_library(kauth_helper_plugin SHARED ${KAUTH_HELPER_BACKEND_SRCS} auth/HelperProxy.cpp)
+target_link_libraries(kauth_helper_plugin ${KAUTH_HELPER_BACKEND_LIBS})
+install(TARGETS kauth_helper_plugin
+ LIBRARY DESTINATION ${KAUTH_HELPER_PLUGIN_DIR}
+ ARCHIVE DESTINATION ${KAUTH_HELPER_PLUGIN_DIR}
+ RUNTIME DESTINATION ${KAUTH_HELPER_PLUGIN_DIR}
+)
+
+########### next target ###############
+
configure_file(all_languages.desktop ${CMAKE_CURRENT_BINARY_DIR}/all_languages @ONLY)
kde4_add_executable(kde4-config NOGUI kde-config.cpp )
["signature.asc" (application/pgp-signature)]
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic