[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