summary refs log tree commit diff
path: root/include
diff options
context:
space:
mode:
authorJani Mustonen <janijohannes@kapsi.fi>2017-11-15 18:38:50 +0200
committermujx <mujx@users.noreply.github.com>2017-11-15 18:38:50 +0200
commit4e1c8dd6639c2debe1e14c94e564237fb76ef48a (patch)
treeca25b85fbc2d1b87d5bbb41390e2edce5b166932 /include
parentUpdate travis to qt5.9.2 (diff)
downloadnheko-4e1c8dd6639c2debe1e14c94e564237fb76ef48a.tar.xz
Implement a per-room send queue. (#118)
[ci skip]
Diffstat (limited to 'include')
-rw-r--r--include/MatrixClient.h4
-rw-r--r--include/TimelineView.h28
-rw-r--r--include/TimelineViewManager.h9
3 files changed, 29 insertions, 12 deletions
diff --git a/include/MatrixClient.h b/include/MatrixClient.h

index d6dd7162..b2765c01 100644 --- a/include/MatrixClient.h +++ b/include/MatrixClient.h
@@ -40,6 +40,7 @@ public: void initialSync() noexcept; void sync() noexcept; void sendRoomMessage(matrix::events::MessageEventType ty, + int txnId, const QString &roomid, const QString &msg, const QString &url = "") noexcept; @@ -61,7 +62,7 @@ public: QUrl getHomeServer() { return server_; }; int transactionId() { return txn_id_; }; - void incrementTransactionId() { txn_id_ += 1; }; + int incrementTransactionId() { return ++txn_id_; }; // It is incredibly important that it's incremented first. void reset() noexcept; @@ -103,6 +104,7 @@ signals: void syncFailed(const QString &msg); void joinFailed(const QString &msg); void messageSent(const QString &event_id, const QString &roomid, const int txn_id); + void messageSendFailed(const QString &roomid, const int txn_id); void emoteSent(const QString &event_id, const QString &roomid, const int txn_id); void messagesRetrieved(const QString &room_id, const RoomMessages &msgs); void joinedRoom(const QString &room_id); diff --git a/include/TimelineView.h b/include/TimelineView.h
index 7e44db46..af0e9386 100644 --- a/include/TimelineView.h +++ b/include/TimelineView.h
@@ -19,6 +19,7 @@ #include <QLayout> #include <QList> +#include <QQueue> #include <QScrollArea> #include "Emote.h" @@ -42,14 +43,18 @@ namespace events = matrix::events; // but not yet confirmed by the homeserver through sync. struct PendingMessage { + matrix::events::MessageEventType ty; int txn_id; QString body; + QString filename; QString event_id; TimelineItem *widget; - PendingMessage(int txn_id, QString body, QString event_id, TimelineItem *widget) - : txn_id(txn_id) + PendingMessage(matrix::events::MessageEventType ty, int txn_id, QString body, QString filename, QString event_id, TimelineItem *widget) + : ty(ty) + , txn_id(txn_id) , body(body) + , filename(filename) , event_id(event_id) , widget(widget) {} @@ -86,8 +91,8 @@ public: // Add new events at the end of the timeline. int addEvents(const Timeline &timeline); - void addUserMessage(matrix::events::MessageEventType ty, const QString &msg, int txn_id); - void addUserMessage(const QString &url, const QString &filename, int txn_id); + void addUserMessage(matrix::events::MessageEventType ty, const QString &msg); + void addUserMessage(const QString &url, const QString &filename); void updatePendingMessage(int txn_id, QString event_id); void scrollDown(); @@ -102,6 +107,11 @@ public slots: // Whether or not the initial batch has been loaded. bool hasLoaded() { return scroll_layout_->count() > 1 || isTimelineFinished; }; + void handleFailedMessage(int txnid); + +private slots: + void sendNextPendingMessage(); + signals: void updateLastTimelineMessage(const QString &user, const DescInfo &info); @@ -115,14 +125,15 @@ private: // sender's name. bool isSenderRendered(const QString &user_id, TimelineDirection direction); - bool isPendingMessage(const QString &eventid, - const QString &body, + bool isPendingMessage(const QString &txnid, const QString &sender, const QString &userid); - void removePendingMessage(const QString &eventid, const QString &body); + void removePendingMessage(const QString &txnid); bool isDuplicate(const QString &event_id) { return eventIds_.contains(event_id); }; + void handleNewUserMessage(PendingMessage msg); + // Return nullptr if the event couldn't be parsed. TimelineItem *parseMessageEvent(const QJsonObject &event, TimelineDirection direction); @@ -162,6 +173,7 @@ private: // The events currently rendered. Used for duplicate detection. QMap<QString, bool> eventIds_; - QList<PendingMessage> pending_msgs_; + QQueue<PendingMessage> pending_msgs_; + QList<PendingMessage> pending_sent_msgs_; QSharedPointer<MatrixClient> client_; }; diff --git a/include/TimelineViewManager.h b/include/TimelineViewManager.h
index 8ff49f20..5bd3054f 100644 --- a/include/TimelineViewManager.h +++ b/include/TimelineViewManager.h
@@ -21,6 +21,8 @@ #include <QSharedPointer> #include <QStackedWidget> +#include "MessageEvent.h" + class JoinedRoom; class MatrixClient; class RoomInfoListItem; @@ -61,12 +63,13 @@ signals: public slots: void setHistoryView(const QString &room_id); - void sendTextMessage(const QString &msg); - void sendEmoteMessage(const QString &msg); - void sendImageMessage(const QString &roomid, const QString &filename, const QString &url); + void queueTextMessage(const QString &msg); + void queueEmoteMessage(const QString &msg); + void queueImageMessage(const QString &roomid, const QString &filename, const QString &url); private slots: void messageSent(const QString &eventid, const QString &roomid, int txnid); + void messageSendFailed(const QString &roomid, int txnid); private: QString active_room_;