From 30fde1f8ac2112eefd4da1f18c73343a19c2632a Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 9 Oct 2022 00:56:02 +0200 Subject: [PATCH] Don't send avatars over dbus by default This should reduce payload size a lot --- src/dbus/NhekoDBusApi.cpp | 24 ++++++---- src/dbus/NhekoDBusApi.h | 11 +++-- src/dbus/NhekoDBusBackend.cpp | 87 ++++++++++++++--------------------- src/dbus/NhekoDBusBackend.h | 4 +- 4 files changed, 61 insertions(+), 65 deletions(-) diff --git a/src/dbus/NhekoDBusApi.cpp b/src/dbus/NhekoDBusApi.cpp index cc19f0a0..47fdca69 100644 --- a/src/dbus/NhekoDBusApi.cpp +++ b/src/dbus/NhekoDBusApi.cpp @@ -35,14 +35,14 @@ apiVersionIsCompatible(const QVersionNumber &clientAppVersion) RoomInfoItem::RoomInfoItem(const QString &roomId, const QString &alias, const QString &title, - const QImage &image, + const QString &avatarUrl, const int unreadNotifications, QObject *parent) : QObject{parent} , roomId_{roomId} , alias_{alias} , roomName_{title} - , image_{image} + , avatarUrl_{avatarUrl} , unreadNotifications_{unreadNotifications} { } @@ -52,7 +52,7 @@ RoomInfoItem::RoomInfoItem(const RoomInfoItem &other) , roomId_{other.roomId_} , alias_{other.alias_} , roomName_{other.roomName_} - , image_{other.image_} + , avatarUrl_{other.avatarUrl_} , unreadNotifications_{other.unreadNotifications_} { } @@ -63,7 +63,7 @@ RoomInfoItem::operator=(const RoomInfoItem &other) roomId_ = other.roomId_; alias_ = other.alias_; roomName_ = other.roomName_; - image_ = other.image_; + avatarUrl_ = other.avatarUrl_; unreadNotifications_ = other.unreadNotifications_; return *this; } @@ -72,7 +72,7 @@ QDBusArgument & operator<<(QDBusArgument &arg, const RoomInfoItem &item) { arg.beginStructure(); - arg << item.roomId_ << item.alias_ << item.roomName_ << item.image_ + arg << item.roomId_ << item.alias_ << item.roomName_ << item.avatarUrl_ << item.unreadNotifications_; arg.endStructure(); return arg; @@ -82,10 +82,8 @@ const QDBusArgument & operator>>(const QDBusArgument &arg, RoomInfoItem &item) { arg.beginStructure(); - arg >> item.roomId_ >> item.alias_ >> item.roomName_ >> item.image_ >> + arg >> item.roomId_ >> item.alias_ >> item.roomName_ >> item.avatarUrl_ >> item.unreadNotifications_; - if (item.image_.isNull()) - item.image_ = QImage{QStringLiteral(":/icons/ui/speech-bubbles.svg")}; arg.endStructure(); return arg; @@ -121,6 +119,16 @@ rooms() return {}; } +QImage +image(const QString &mxcuri) +{ + if (QDBusInterface interface{QStringLiteral(NHEKO_DBUS_SERVICE_NAME), QStringLiteral("/")}; + interface.isValid()) + return QDBusReply{interface.call(QStringLiteral("image"), mxcuri)}.value(); + else + return {}; +} + void activateRoom(const QString &alias) { diff --git a/src/dbus/NhekoDBusApi.h b/src/dbus/NhekoDBusApi.h index 984ac763..4ef8819e 100644 --- a/src/dbus/NhekoDBusApi.h +++ b/src/dbus/NhekoDBusApi.h @@ -18,7 +18,7 @@ init(); //! The nheko D-Bus API version provided by this file. The API version number follows semantic //! versioning as defined by https://semver.org. -const QVersionNumber dbusApiVersion{0, 0, 1}; +const QVersionNumber dbusApiVersion{1, 0, 0}; //! Compare the installed Nheko API to the version that your client app targets to see if they //! are compatible. @@ -33,7 +33,7 @@ public: RoomInfoItem(const QString &roomId = QString{}, const QString &alias = QString{}, const QString &title = QString{}, - const QImage &image = QImage{}, + const QString &avatarUrl = QString{}, const int unreadNotifications = 0, QObject *parent = nullptr); @@ -42,7 +42,7 @@ public: const QString &roomId() const { return roomId_; } const QString &alias() const { return alias_; } const QString &roomName() const { return roomName_; } - const QImage &image() const { return image_; } + const QString &avatarUrl() const { return avatarUrl_; } int unreadNotifications() const { return unreadNotifications_; } RoomInfoItem &operator=(const RoomInfoItem &other); @@ -54,7 +54,7 @@ private: QString roomId_; QString alias_; QString roomName_; - QImage image_; + QString avatarUrl_; int unreadNotifications_; }; @@ -67,6 +67,9 @@ nhekoVersion(); //! Call this function to get a list of all joined rooms. QVector rooms(); +//! Fetch an image using a matrix URI +QImage +image(const QString &uri); //! Activates a currently joined room. void activateRoom(const QString &alias); diff --git a/src/dbus/NhekoDBusBackend.cpp b/src/dbus/NhekoDBusBackend.cpp index 4d611122..56fdfe8d 100644 --- a/src/dbus/NhekoDBusBackend.cpp +++ b/src/dbus/NhekoDBusBackend.cpp @@ -32,67 +32,50 @@ struct RoomReplyState } QVector -NhekoDBusBackend::rooms(const QDBusMessage &message) +NhekoDBusBackend::rooms() const { - message.setDelayedReply(true); nhlog::ui()->debug("Rooms requested over D-Bus."); const auto roomListModel = m_parent->models; - - auto state = QSharedPointer::create(); - - std::vector roomids; - roomids.reserve(roomids.size()); - for (const auto &room : roomListModel) { - roomids.push_back(room->roomId().toStdString()); - } - state->roominfos = cache::getRoomInfo(roomids); + QVector model; for (const auto &room : roomListModel) { - auto addRoom = [room, roomListModelSize = roomListModel.size(), message, state]( - const QImage &image) { - const auto aliases = cache::client()->getStateEvent( - room->roomId().toStdString()); - QString alias; - if (aliases.has_value()) { - const auto &val = aliases.value().content; - if (!val.alias.empty()) - alias = QString::fromStdString(val.alias); - else if (val.alt_aliases.size() > 0) - alias = QString::fromStdString(val.alt_aliases.front()); - } + const auto aliases = cache::client()->getStateEvent( + room->roomId().toStdString()); + QString alias; + if (aliases.has_value()) { + const auto &val = aliases.value().content; + if (!val.alias.empty()) + alias = QString::fromStdString(val.alias); + else if (val.alt_aliases.size() > 0) + alias = QString::fromStdString(val.alt_aliases.front()); + } - std::lock_guard childLock(state->m); - state->model.push_back(nheko::dbus::RoomInfoItem{ - room->roomId(), - alias, - QString::fromStdString(state->roominfos[room->roomId()].name), - image, - room->notificationCount()}); - - if (state->model.size() == roomListModelSize) { - nhlog::ui()->debug("Sending {} rooms over D-Bus...", state->model.size()); - auto reply = message.createReply(); - reply << QVariant::fromValue(state->model); - QDBusConnection::sessionBus().send(reply); - nhlog::ui()->debug("Rooms successfully sent to D-Bus."); - } else { - // nhlog::ui()->debug("DBUS: {}/{}", state->model.size(), roomListModelSize); - } - }; - - if (state->roominfos[room->roomId()].avatar_url.empty()) - addRoom(QImage()); - else - MainWindow::instance()->imageProvider()->download( - QString::fromStdString(state->roominfos[room->roomId()].avatar_url).remove("mxc://"), - {96, 96}, - [addRoom](const QString &, const QSize &, const QImage &image, const QString &) { - addRoom(image); - }, - true); + model.push_back(nheko::dbus::RoomInfoItem{room->roomId(), + alias, + room->plainRoomName(), + room->roomAvatarUrl(), + room->notificationCount()}); } + nhlog::ui()->debug("Sending {} rooms over D-Bus...", model.size()); + return model; +} + +QImage +NhekoDBusBackend::image(const QString &uri, const QDBusMessage &message) const +{ + message.setDelayedReply(true); + nhlog::ui()->debug("Rooms requested over D-Bus."); + MainWindow::instance()->imageProvider()->download( + QString(uri).remove("mxc://"), + {96, 96}, + [message](const QString &, const QSize &, const QImage &image, const QString &) { + auto reply = message.createReply(); + reply << QVariant::fromValue(image); + QDBusConnection::sessionBus().send(reply); + }, + true); return {}; } diff --git a/src/dbus/NhekoDBusBackend.h b/src/dbus/NhekoDBusBackend.h index 05d686ca..6a7606bd 100644 --- a/src/dbus/NhekoDBusBackend.h +++ b/src/dbus/NhekoDBusBackend.h @@ -27,7 +27,9 @@ public slots: //! Get the nheko version. Q_SCRIPTABLE QString nhekoVersion() const { return nheko::version; } //! Call this function to get a list of all joined rooms. - Q_SCRIPTABLE QVector rooms(const QDBusMessage &message); + Q_SCRIPTABLE QVector rooms() const; + //! Call this function to convert a URI into an image + Q_SCRIPTABLE QImage image(const QString &uri, const QDBusMessage &message) const; //! Activates a currently joined room. Q_SCRIPTABLE void activateRoom(const QString &alias) const; //! Joins a room. It is your responsibility to ask for confirmation (if desired).