From f1e57caac169e53194111d05b16153d13a400bfb Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Fri, 27 Jul 2018 15:15:47 +0900 Subject: Make Room::postMessage and Room::postHtmlMessage return transactionId This is at least some (actually, not even that bad) identification of a message. Ideally it would probably be to return some handler that would allow to track the end-to-end status of the event - from getting sent to landing in the timeline. Right now the experience is crippled - transactionId always exists but only works for message events and Room has no way to give the event status by transactionId. pendingEvent* signals are somewhat helping, though. --- lib/room.cpp | 29 +++++++++++++++-------------- lib/room.h | 17 +++++++++-------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/lib/room.cpp b/lib/room.cpp index dc60445d..4b349f44 100644 --- a/lib/room.cpp +++ b/lib/room.cpp @@ -199,12 +199,12 @@ class Room::Private void markMessagesAsRead(rev_iter_t upToMarker); - void sendEvent(RoomEventPtr&& event); + QString sendEvent(RoomEventPtr&& event); template - void sendEvent(ArgTs&&... eventArgs) + QString sendEvent(ArgTs&&... eventArgs) { - sendEvent(makeEvent(std::forward(eventArgs)...)); + return sendEvent(makeEvent(std::forward(eventArgs)...)); } template @@ -1102,7 +1102,7 @@ void Room::updateData(SyncRoomData&& data) } } -void Room::Private::sendEvent(RoomEventPtr&& event) +QString Room::Private::sendEvent(RoomEventPtr&& event) { auto* pEvent = rawPtr(event); emit q->pendingEventAboutToAdd(); @@ -1127,39 +1127,40 @@ void Room::Private::sendEvent(RoomEventPtr&& event) pEvent->addId(call->eventId()); emit q->pendingEventChanged(it - unsyncedEvents.begin()); }); + return pEvent->transactionId(); } -void Room::postMessage(const QString& type, const QString& plainText) +QString Room::postMessage(const QString& type, const QString& plainText) { - d->sendEvent(plainText, type); + return d->sendEvent(plainText, type); } -void Room::postMessage(const QString& plainText, MessageEventType type) +QString Room::postMessage(const QString& plainText, MessageEventType type) { - d->sendEvent(plainText, type); + return d->sendEvent(plainText, type); } -void Room::postHtmlMessage(const QString& plainText, const QString& htmlText, +QString Room::postHtmlMessage(const QString& plainText, const QString& htmlText, MessageEventType type) { - d->sendEvent(plainText, type, + return d->sendEvent(plainText, type, new EventContent::TextContent(htmlText, QStringLiteral("text/html"))); } -void Room::postMessage(RoomEvent* event) +QString Room::postMessage(RoomEvent* event) { if (usesEncryption()) { qCCritical(MAIN) << "Room" << displayName() << "enforces encryption; sending encrypted messages is not supported yet"; } - d->sendEvent(RoomEventPtr(event)); + return d->sendEvent(RoomEventPtr(event)); } -void Room::postMessage(const QString& matrixType, +QString Room::postMessage(const QString& matrixType, const QJsonObject& eventContent) { - d->sendEvent(loadEvent(basicEventJson(matrixType, eventContent))); + return d->sendEvent(loadEvent(basicEventJson(matrixType, eventContent))); } void Room::setName(const QString& newName) diff --git a/lib/room.h b/lib/room.h index d72f7c7e..5cac615a 100644 --- a/lib/room.h +++ b/lib/room.h @@ -347,17 +347,18 @@ namespace QMatrixClient void setJoinState( JoinState state ); public slots: - void postMessage(const QString& plainText, - MessageEventType type = MessageEventType::Text); - void postHtmlMessage(const QString& plainText, const QString& htmlText, - MessageEventType type = MessageEventType::Text); + QString postMessage(const QString& plainText, + MessageEventType type = MessageEventType::Text); + QString postHtmlMessage( + const QString& plainText, const QString& htmlText, + MessageEventType type = MessageEventType::Text); /** Post a pre-created room message event; takes ownership of the event */ - void postMessage(RoomEvent* event); - void postMessage(const QString& matrixType, - const QJsonObject& eventContent); + QString postMessage(RoomEvent* event); + QString postMessage(const QString& matrixType, + const QJsonObject& eventContent); /** @deprecated If you have a custom event type, construct the event * and pass it as a whole to postMessage() */ - void postMessage(const QString& type, const QString& plainText); + QString postMessage(const QString& type, const QString& plainText); void setName(const QString& newName); void setCanonicalAlias(const QString& newAlias); void setTopic(const QString& newTopic); -- cgit v1.2.3