From a2f8546033d3250235bd849b85b9a2cda7580134 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Tue, 2 Mar 2021 03:22:27 +0400 Subject: [PATCH] Move remaining usage of dbus to glibmm in specific_linux --- .../platform/linux/specific_linux.cpp | 99 ++++++++++++------- 1 file changed, 63 insertions(+), 36 deletions(-) diff --git a/Telegram/SourceFiles/platform/linux/specific_linux.cpp b/Telegram/SourceFiles/platform/linux/specific_linux.cpp index 7ebe468569..a5bbb1a342 100644 --- a/Telegram/SourceFiles/platform/linux/specific_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/specific_linux.cpp @@ -44,22 +44,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include -#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION -#include -#include -#include -#include -#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION - #include #include #include #include #include -// must be after undefs -#include "base/platform/linux/base_linux_glibmm_helper.h" - #include #include #include @@ -83,6 +73,8 @@ constexpr auto kHandlerTypeName = "x-scheme-handler/tg"_cs; constexpr auto kXDGDesktopPortalService = "org.freedesktop.portal.Desktop"_cs; constexpr auto kXDGDesktopPortalObjectPath = "/org/freedesktop/portal/desktop"_cs; +constexpr auto kXDGDesktopPortalKDEService = "org.freedesktop.impl.portal.desktop.kde"_cs; +constexpr auto kIBusPortalService = "org.freedesktop.portal.IBus"_cs; constexpr auto kPropertiesInterface = "org.freedesktop.DBus.Properties"_cs; #ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION @@ -206,17 +198,49 @@ PortalAutostart::PortalAutostart(bool start, bool silent) { } bool IsXDGDesktopPortalPresent() { - static const auto Result = QDBusInterface( - kXDGDesktopPortalService.utf16(), - kXDGDesktopPortalObjectPath.utf16()).isValid(); + static const auto Result = [&] { + try { + const auto connection = Gio::DBus::Connection::get_sync( + Gio::DBus::BusType::BUS_TYPE_SESSION); + + const auto serviceRegistered = base::Platform::DBus::NameHasOwner( + connection, + std::string(kXDGDesktopPortalService)); + + const auto serviceActivatable = ranges::contains( + base::Platform::DBus::ListActivatableNames(connection), + Glib::ustring(std::string(kXDGDesktopPortalService))); + + return serviceRegistered || serviceActivatable; + } catch (...) { + } + + return false; + }(); return Result; } bool IsXDGDesktopPortalKDEPresent() { - static const auto Result = QDBusInterface( - qsl("org.freedesktop.impl.portal.desktop.kde"), - kXDGDesktopPortalObjectPath.utf16()).isValid(); + static const auto Result = [&] { + try { + const auto connection = Gio::DBus::Connection::get_sync( + Gio::DBus::BusType::BUS_TYPE_SESSION); + + const auto serviceRegistered = base::Platform::DBus::NameHasOwner( + connection, + std::string(kXDGDesktopPortalKDEService)); + + const auto serviceActivatable = ranges::contains( + base::Platform::DBus::ListActivatableNames(connection), + Glib::ustring(std::string(kXDGDesktopPortalKDEService))); + + return serviceRegistered || serviceActivatable; + } catch (...) { + } + + return false; + }(); return Result; } @@ -229,11 +253,11 @@ bool IsIBusPortalPresent() { const auto serviceRegistered = base::Platform::DBus::NameHasOwner( connection, - "org.freedesktop.portal.IBus"); + std::string(kIBusPortalService)); const auto serviceActivatable = ranges::contains( base::Platform::DBus::ListActivatableNames(connection), - "org.freedesktop.portal.IBus"); + Glib::ustring(std::string(kIBusPortalService))); return serviceRegistered || serviceActivatable; } catch (...) { @@ -247,28 +271,31 @@ bool IsIBusPortalPresent() { uint FileChooserPortalVersion() { static const auto Result = [&]() -> uint { - auto message = QDBusMessage::createMethodCall( - kXDGDesktopPortalService.utf16(), - kXDGDesktopPortalObjectPath.utf16(), - kPropertiesInterface.utf16(), - qsl("Get")); + try { + const auto connection = Gio::DBus::Connection::get_sync( + Gio::DBus::BusType::BUS_TYPE_SESSION); - message.setArguments({ - qsl("org.freedesktop.portal.FileChooser"), - qsl("version") - }); + auto reply = connection->call_sync( + std::string(kXDGDesktopPortalObjectPath), + std::string(kPropertiesInterface), + "Get", + base::Platform::MakeGlibVariant(std::tuple{ + Glib::ustring("org.freedesktop.portal.FileChooser"), + Glib::ustring("version"), + }), + std::string(kXDGDesktopPortalService)); - const QDBusReply reply = QDBusConnection::sessionBus().call( - message); - - if (reply.isValid()) { - return reply.value().toUInt(); + return base::Platform::GlibVariantCast( + base::Platform::GlibVariantCast( + reply.get_child(0))); + } catch (const Glib::Error &e) { + LOG(("Error getting FileChooser portal version: %1") + .arg(QString::fromStdString(e.what()))); + } catch (const std::exception &e) { + LOG(("Error getting FileChooser portal version: %1") + .arg(QString::fromStdString(e.what()))); } - LOG(("Error getting FileChooser portal version: %1: %2") - .arg(reply.error().name()) - .arg(reply.error().message())); - return 0; }();