summaryrefslogtreecommitdiffstats
path: root/src/common-lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/common-lib')
-rw-r--r--src/common-lib/configure.cmake9
-rw-r--r--src/common-lib/dbus-utilities.cpp60
-rw-r--r--src/common-lib/dbus-utilities.h2
-rw-r--r--src/common-lib/qt_cmdline.cmake1
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 = [&currentPath]() {
+ 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 = [&currentPath]() {
+ 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)