Use crl::guard in XDPFileDialog

This commit is contained in:
Ilya Fedin 2021-05-02 13:36:27 +04:00 committed by John Preston
parent d87ea056c6
commit b1c95d719a
1 changed files with 34 additions and 36 deletions

View File

@ -128,7 +128,7 @@ void ComputeFileChooserPortalVersion() {
// //
// XDP file dialog is a dialog obtained via a DBus service // XDP file dialog is a dialog obtained via a DBus service
// provided by the current desktop environment. // provided by the current desktop environment.
class XDPFileDialog : public QDialog, public sigc::trackable { class XDPFileDialog : public QDialog {
public: public:
enum ConditionType : uint { enum ConditionType : uint {
GlobalPattern = 0, GlobalPattern = 0,
@ -191,12 +191,8 @@ public:
private: private:
void openPortal(); void openPortal();
void gotResponse( void gotResponse(
const Glib::RefPtr<Gio::DBus::Connection> &connection, uint response,
const Glib::ustring &sender_name, const std::map<Glib::ustring, Glib::VariantBase> &results);
const Glib::ustring &object_path,
const Glib::ustring &interface_name,
const Glib::ustring &signal_name,
const Glib::VariantContainerBase &parameters);
void showHelper( void showHelper(
Qt::WindowFlags windowFlags, Qt::WindowFlags windowFlags,
@ -208,7 +204,6 @@ private:
rpl::producer<> rejected(); rpl::producer<> rejected();
Glib::RefPtr<Gio::DBus::Connection> _dbusConnection; Glib::RefPtr<Gio::DBus::Connection> _dbusConnection;
Glib::RefPtr<Gio::Cancellable> _cancellable;
uint _requestSignalId = 0; uint _requestSignalId = 0;
// Options // Options
@ -263,10 +258,6 @@ XDPFileDialog::XDPFileDialog(
} }
XDPFileDialog::~XDPFileDialog() { XDPFileDialog::~XDPFileDialog() {
if (_cancellable) {
_cancellable->cancel();
}
if (_dbusConnection && _requestSignalId != 0) { if (_dbusConnection && _requestSignalId != 0) {
_dbusConnection->signal_unsubscribe(_requestSignalId); _dbusConnection->signal_unsubscribe(_requestSignalId);
} }
@ -419,15 +410,38 @@ void XDPFileDialog::openPortal() {
+ handleToken; + handleToken;
_requestSignalId = _dbusConnection->signal_subscribe( _requestSignalId = _dbusConnection->signal_subscribe(
sigc::mem_fun(this, &XDPFileDialog::gotResponse), crl::guard(this, [=](
const Glib::RefPtr<Gio::DBus::Connection> &connection,
const Glib::ustring &sender_name,
const Glib::ustring &object_path,
const Glib::ustring &interface_name,
const Glib::ustring &signal_name,
const Glib::VariantContainerBase &parameters) {
try {
auto parametersCopy = parameters;
const auto response = base::Platform::GlibVariantCast<uint>(
parametersCopy.get_child(0));
const auto results = base::Platform::GlibVariantCast<
std::map<
Glib::ustring,
Glib::VariantBase
>>(parametersCopy.get_child(1));
gotResponse(response, results);
} catch (const std::exception &e) {
LOG(("XDP File Dialog Error: %1").arg(
QString::fromStdString(e.what())));
_reject.fire({});
}
}),
{}, {},
"org.freedesktop.portal.Request", "org.freedesktop.portal.Request",
"Response", "Response",
requestPath); requestPath);
// synchronize functor deletion by this cancellable
_cancellable = Gio::Cancellable::create();
_dbusConnection->call( _dbusConnection->call(
std::string(kXDGDesktopPortalObjectPath), std::string(kXDGDesktopPortalObjectPath),
std::string(kXDGDesktopPortalFileChooserInterface), std::string(kXDGDesktopPortalFileChooserInterface),
@ -439,7 +453,7 @@ void XDPFileDialog::openPortal() {
_windowTitle, _windowTitle,
options, options,
}), }),
[=](const Glib::RefPtr<Gio::AsyncResult> &result) { crl::guard(this, [=](const Glib::RefPtr<Gio::AsyncResult> &result) {
try { try {
auto reply = _dbusConnection->call_finish(result); auto reply = _dbusConnection->call_finish(result);
@ -478,8 +492,7 @@ void XDPFileDialog::openPortal() {
_reject.fire({}); _reject.fire({});
}); });
} }
}, }),
_cancellable,
std::string(kXDGDesktopPortalService)); std::string(kXDGDesktopPortalService));
} catch (...) { } catch (...) {
_failedToOpen = true; _failedToOpen = true;
@ -615,24 +628,9 @@ void XDPFileDialog::showHelper(
} }
void XDPFileDialog::gotResponse( void XDPFileDialog::gotResponse(
const Glib::RefPtr<Gio::DBus::Connection> &connection, uint response,
const Glib::ustring &sender_name, const std::map<Glib::ustring, Glib::VariantBase> &results) {
const Glib::ustring &object_path,
const Glib::ustring &interface_name,
const Glib::ustring &signal_name,
const Glib::VariantContainerBase &parameters) {
try { try {
auto parametersCopy = parameters;
const auto response = base::Platform::GlibVariantCast<uint>(
parametersCopy.get_child(0));
const auto results = base::Platform::GlibVariantCast<
std::map<
Glib::ustring,
Glib::VariantBase
>>(parametersCopy.get_child(1));
if (!response) { if (!response) {
if (const auto i = results.find("uris"); i != end(results)) { if (const auto i = results.find("uris"); i != end(results)) {
_selectedFiles = base::Platform::GlibVariantCast< _selectedFiles = base::Platform::GlibVariantCast<