Implement a per-room send queue. (#118)

[ci skip]
This commit is contained in:
Jani Mustonen 2017-11-15 18:38:50 +02:00 committed by mujx
parent 4a912a2dff
commit 4e1c8dd663
7 changed files with 131 additions and 61 deletions

View file

@ -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);

View file

@ -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_;
};

View file

@ -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_;