diff options
Diffstat (limited to 'src/common-lib')
-rw-r--r-- | src/common-lib/configure.cmake | 9 | ||||
-rw-r--r-- | src/common-lib/dbus-utilities.cpp | 60 | ||||
-rw-r--r-- | src/common-lib/dbus-utilities.h | 2 | ||||
-rw-r--r-- | src/common-lib/qt_cmdline.cmake | 1 |
4 files changed, 71 insertions, 1 deletions
diff --git a/src/common-lib/configure.cmake b/src/common-lib/configure.cmake index c33f6ba2..11f5d8ef 100644 --- a/src/common-lib/configure.cmake +++ b/src/common-lib/configure.cmake @@ -85,6 +85,14 @@ qt_feature("am-dltlogging" PRIVATE DISABLE INPUT_dltlogging STREQUAL 'no' ) +qt_feature("am-libdbus" PRIVATE + LABEL "Compile libdbus for appman-controller" + CONDITION WIN32 OR MACOS + EMIT_IF WIN32 OR MACOS + ENABLE INPUT_libdbus STREQUAL 'yes' + DISABLE INPUT_libdbus STREQUAL 'no' +) + qt_feature("am-libbacktrace" PRIVATE LABEL "Enable support for libbacktrace" CONDITION (LINUX OR MACOS) AND (CMAKE_BUILD_TYPE STREQUAL "Debug") @@ -134,6 +142,7 @@ qt_configure_add_summary_entry(ARGS "am-widgets-support") qt_configure_add_summary_entry(ARGS "am-tools-only") qt_configure_add_summary_entry(ARGS "am-package-server") qt_configure_add_summary_entry(ARGS "am-dltlogging") +qt_configure_add_summary_entry(ARGS "am-libdbus") qt_configure_add_summary_entry(ARGS "am-libbacktrace") qt_configure_add_summary_entry(ARGS "am-stackwalker") qt_configure_end_summary_section() # end of "Qt ApplicationManger" section diff --git a/src/common-lib/dbus-utilities.cpp b/src/common-lib/dbus-utilities.cpp index 0f4522b1..fd944fe8 100644 --- a/src/common-lib/dbus-utilities.cpp +++ b/src/common-lib/dbus-utilities.cpp @@ -12,10 +12,22 @@ # include <QDBusArgument> # include <QDBusMetaType> # include <QDBusUnixFileDescriptor> +# include <QLibrary> +# include <QLibraryInfo> +# include <QDir> #endif - +#if defined(Q_OS_WIN) +# include <windows.h> +# ifdef interface +# undef interface +# endif +#endif +#include "logging.h" #include "dbus-utilities.h" +using namespace Qt::StringLiterals; + + QT_BEGIN_NAMESPACE_AM QVariant convertFromJSVariant(const QVariant &variant) @@ -132,6 +144,52 @@ void registerDBusTypes() #endif } +void ensureLibDBusIsAvailable() +{ +#if (defined(Q_OS_WINDOWS) || defined(Q_OS_MACOS)) && defined(QT_DBUS_LIB) + // On Windows and macOS, libdbus-1 is not readily available, but we need it to communicate + // between appman and appman-controller. + // We first check if the user has a custom libdbus-1 installed already. If not, we load the + // one that comes with the application manager. +# if defined(Q_OS_WINDOWS) + static const QString dbusLibName = u"dbus-1"_s; + auto dbusLoadPrepare = []() { + const QString dllPath = QLibraryInfo::path(QLibraryInfo::BinariesPath) + + u"/qtapplicationmanager"; + ::SetDllDirectoryW((LPCWSTR) dllPath.utf16()); + }; + auto dbusLoadCleanup = []() { + ::SetDllDirectoryW(nullptr); + }; + +# elif defined(Q_OS_MACOS) + static const QString dbusLibName = u"libdbus-1"_s; + QString currentPath; + auto dbusLoadPrepare = [¤tPath]() { + const QString dylibPath = QLibraryInfo::path(QLibraryInfo::LibrariesPath) + + u"/qtapplicationmanager"; + // adding to DYLD_LIBRARY_PATH has no effect on the running process + currentPath = QDir::currentPath(); + QDir::setCurrent(dylibPath); + }; + auto dbusLoadCleanup = [¤tPath]() { + QDir::setCurrent(currentPath); + }; +# endif + + static QLibrary dbusLib(dbusLibName); + if (!dbusLib.isLoaded() && !dbusLib.load()) { + dbusLoadPrepare(); + + if (!dbusLib.load() || !dbusLib.resolve("dbus_connection_open_private")) + qCCritical(LogDBus) << "WARNING: could not load the application manager's libdbus-1 for appman-controller support."; + else + qCInfo(LogDBus) << "Loaded the application manager's libdbus-1 for appman-controller support."; + dbusLoadCleanup(); + } +#endif +} + QT_END_NAMESPACE_AM #if defined(QT_DBUS_LIB) diff --git a/src/common-lib/dbus-utilities.h b/src/common-lib/dbus-utilities.h index bb5a9c4c..fc0bce8c 100644 --- a/src/common-lib/dbus-utilities.h +++ b/src/common-lib/dbus-utilities.h @@ -27,6 +27,8 @@ QVariant convertFromDBusVariant(const QVariant &variant); void registerDBusTypes(); +void ensureLibDBusIsAvailable(); + QT_END_NAMESPACE_AM #endif // DBUS_UTILITIES_H diff --git a/src/common-lib/qt_cmdline.cmake b/src/common-lib/qt_cmdline.cmake index 66dce390..6d20449d 100644 --- a/src/common-lib/qt_cmdline.cmake +++ b/src/common-lib/qt_cmdline.cmake @@ -5,6 +5,7 @@ qt_commandline_option(external-dbus-interfaces TYPE boolean) qt_commandline_option(tools-only TYPE boolean) qt_commandline_option(package-server TYPE boolean) qt_commandline_option(dltlogging TYPE boolean) +qt_commandline_option(libdbus TYPE boolean) qt_commandline_option(libbacktrace TYPE boolean) qt_commandline_option(stackwalker TYPE boolean) qt_commandline_option(libyaml TYPE enum VALUES qt system) |