From 896eee9841d771281b5e618ba4e422843ab71880 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Fri, 30 Apr 2021 06:56:19 +0400 Subject: [PATCH] Check whether portal dialog is failed to open --- .../platform/linux/file_utilities_linux.cpp | 6 ++- .../platform/linux/linux_xdp_file_dialog.cpp | 44 ++++++++++++++++++- .../platform/linux/linux_xdp_file_dialog.h | 2 +- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp b/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp index 92dc89179..7f272b9ca 100644 --- a/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp @@ -172,7 +172,7 @@ bool Get( } #ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION if (XDP::Use(type)) { - return XDP::Get( + const auto result = XDP::Get( parent, files, remoteContent, @@ -180,6 +180,10 @@ bool Get( filter, type, startFile); + + if (result.has_value()) { + return *result; + } } #endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION if (const auto integration = GtkIntegration::Instance()) { diff --git a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp index 86e652ed3..97f5e0202 100644 --- a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp @@ -180,6 +180,10 @@ public: int exec() override; + bool failedToOpen() { + return _failedToOpen; + } + private: void openPortal(); void gotResponse( @@ -219,6 +223,7 @@ private: Glib::ustring _selectedMimeTypeFilter; Glib::ustring _selectedNameFilter; std::vector _selectedFiles; + bool _failedToOpen = false; rpl::event_stream<> _accept; rpl::event_stream<> _reject; @@ -432,12 +437,40 @@ void XDPFileDialog::openPortal() { }), [=](const Glib::RefPtr &result) { try { - _dbusConnection->call_finish(result); + auto reply = _dbusConnection->call_finish(result); + + const auto handle = base::Platform::GlibVariantCast< + Glib::ustring>(reply.get_child(0)); + + if (handle != requestPath) { + crl::on_main([=] { + _failedToOpen = true; + _reject.fire({}); + }); + } } catch (const Glib::Error &e) { + static const auto NotSupportedErrors = { + "org.freedesktop.DBus.Error.ServiceUnknown", + }; + + const auto errorName = + Gio::DBus::ErrorUtils::get_remote_error(e); + + if (!ranges::contains(NotSupportedErrors, errorName)) { + LOG(("XDP File Dialog Error: %1").arg( + QString::fromStdString(e.what()))); + } + + crl::on_main([=] { + _failedToOpen = true; + _reject.fire({}); + }); + } catch (const std::exception &e) { LOG(("XDP File Dialog Error: %1").arg( QString::fromStdString(e.what()))); crl::on_main([=] { + _failedToOpen = true; _reject.fire({}); }); } @@ -445,6 +478,7 @@ void XDPFileDialog::openPortal() { _cancellable, std::string(kXDGDesktopPortalService)); } catch (...) { + _failedToOpen = true; _reject.fire({}); } } @@ -502,6 +536,9 @@ int XDPFileDialog::exec() { setResult(0); show(); + if (failedToOpen()) { + return result(); + } QPointer guard = this; @@ -651,7 +688,7 @@ bool Use(Type type) { && (type != Type::ReadFolder || *Version >= 3); } -bool Get( +std::optional Get( QPointer parent, QStringList &files, QByteArray &remoteContent, @@ -688,6 +725,9 @@ bool Get( dialog.selectFile(startFile); const auto res = dialog.exec(); + if (dialog.failedToOpen()) { + return std::nullopt; + } if (type != Type::ReadFolder) { // Save last used directory for all queries except directory choosing. diff --git a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.h b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.h index 1ded00e06..3c1cdc95a 100644 --- a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.h +++ b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.h @@ -16,7 +16,7 @@ namespace XDP { using Type = ::FileDialog::internal::Type; bool Use(Type type = Type::ReadFile); -bool Get( +std::optional Get( QPointer parent, QStringList &files, QByteArray &remoteContent,