aboutsummaryrefslogtreecommitdiff
path: root/room.cpp
AgeCommit message (Collapse)Author
2017-05-09LeaveRoomJob now accepts a roomId, not a Room object; Room::leaveRoom() ↵Kitsune Ral
introduced; Connection and Room cleanup Helps to better encapsulate Room
2017-05-09Code cleanup and tweaking (partially driven by clang-tidy)Kitsune Ral
Mainly it's about const-ification (in particular, passing const-refs instead of values) and deleting unneeded declarations/#includes. Since the changes alter the external interface, this is submitted as a PR for peer review. One of unneeded declarations/definitions is a virtual destructor in BaseJob descendants. Since a job object should be deleted through QObject::deleteLater() anyway (and it's the only correct way of disposing of the object), all deletions will call the stack of destructors through virtual QObject::~QObject(). Therefore even BaseJob could get on with a non-virtual destructor but for the sake of clarity BaseJob::~BaseJob() is still declared virtual.
2017-04-30Port to categorized loggingElvis Angelaccio
This greatly reduces the noise made by quaternion. To enable full logging, export the following variable: QT_LOGGING_RULES="libqmatrixclient.*.debug=true"
2017-04-18Added markAllMessagesAsRead()Kitsune Ral
2017-04-18Use localeAwareCompare() to sort room membersKitsune Ral
Because it's a recommended by Qt method to sort end-user-facing lists.
2017-04-14Enable PostMessageJob to send rich text messagesKitsune Ral
2017-04-04Don't extend the spec when calculating the display nameElvis Angelaccio
Room names conflicts should be handled at the client level, for example by displaying the canonical alias in a tooltip or in the custom delegate of the view. If we extend the display name algorithm at the lib level, we are just cluttering the display name in the most common scenario (i.e. when there are no name clashes).
2017-03-30Fixed accidental auto-promotion when read marker is out of sightKitsune Ral
2017-03-14Room: exposed findInTimeline and related things from Room::PrivateKitsune Ral
This will be used from Quaternion for a better algorithm dealing with read markers
2017-03-10Use special indices instead of iterators for persistent pointers into ↵Kitsune Ral
timeline + no more discarding read markers to events that haven't arrived yet When using deque::const_reverse_iterator for read markers and eventsIndex, I didn't realise that insertions into std::deque invalidate iterators (though preserve references and pointers). Therefore, a small TimelineItem class has been introduced that stores an event together with a persistent index that is generated upon insertion into the timeline (timeline.back()+1 for newer events, timeline.front()-1 for older events). Using such indices, we can still reach an event by it's index in constant time, while avoiding a problem with invalidating iterators. While rewriting the code, another problem has been detected with read markers to events that haven't yet arrived to the timeline (in particular, older events). The old code simply discarded such read markers. The new code stores such read markers anyway, so that when that event arrives, it could be matched against the stored last-read-event id.
2017-03-09Reduce noise in logsKitsune Ral
2017-03-08Room::getPreviousContent() gets a number of messages + Room::postMessage()Kitsune Ral
Also, Room now uses callApi<PostReceiptJob>() instead of postReceipt() (to allow further removal of postReceipt() from Connection)
2017-03-08Merge pull request #53 from Fxrh/kitsune-fix-adding-eventsKitsune Ral
Fix adding events to the timeline
2017-03-06Fixed building with MSVCKitsune Ral
2017-02-28Room: Make sure an event with the same id isn't added twice to the timeline; ↵Kitsune Ral
forbid empty event id's Added assertions and enhanced debug messages along the way
2017-02-23Receipts internal handling improvedKitsune Ral
Instead of QHash, use QVector< QPair<> > because it's more efficient and we don't really need a hashmap functions, only direct iteration over the list of event-to-receipt pairs. Also, iteration over QJsonObjects is more efficient (and better conveys the intention) than collecting keys() and then finding a value() for each of them. Also, fixed accidental allocation of empty Receipt structures instead of reserving space for them.
2017-01-17Room: Use reverse iterators internally to deal with read markersKitsune Ral
Turns out that because the read marker is positioned _after_ the last read message, a reverse iterator models it much better than the usual one. This commit switches the internal representation to reverse iterators (externally, we operate in terms of event id's, still).
2017-01-08Simplified Room::Private::readMarker() codeKitsune Ral
2016-11-26Room: provide ability to find an event in the timeline by its idKitsune Ral
A new hashmap, eventsIndex, is provided, that allows you to find the event in the timeline if you have eventId. This hashmap uses the fact that deque iterators don't invalidate upon insertion of elements to either end of the deque. Thanks to that, promoteReadMarker() and doAddNewMessageEvents() have been considerably simplified; also, it should be easier now to calculate event indices without rolling back and forth over the timeline.
2016-11-26Room: use std::deque for the timelineKitsune Ral
2016-11-26CleanupKitsune Ral
2016-11-07Fixed a crasher that slipped in the previous commitKitsune Ral
Room::Private::member() filters out non-members of the room, which is not the right thing when adding messages from a person that left the room, e.g.
2016-11-07Room::doAddNewMessages: Extend auto-promotion to all users, not only localKitsune Ral
Thanks to @maralorn for pointing out.
2016-11-06Room: extend promoteReadMarker over non-local users (again)Kitsune Ral
2016-11-03Auto-promote the read marker over locally-originated messagesKitsune Ral
2016-11-02Room: make read marker a Q_PROPERTY; markMessagesAsRead now uses eventId againKitsune Ral
The first change allows to use the read marker from QML (hint to Tensor). The second change is actually a fix for a case when markMessagesAsRead() is called with an iterator behind the last read event (in that case markMessagesAsRead() would post a receipt for that older event, which is not quite right).
2016-11-01Moved MemberNameSorter from Quaternion to libKitsune Ral
This code is useful for any client that uses the Room class and needs to display the list of room members. Also removed an unused #include.
2016-10-28Relax logging a bitKitsune Ral
Kicking markMessagesAsRead() at each mouse move is still a bad idea - I'm looking at you Quaternion.
2016-10-28Implemented unread messages indication on the lib sideKitsune Ral
The implementation allows further extension to actually counting unread messages (in their Room::isEventNotable() sense - see the code) but so far just replicates what Quaternion previously provided. The only difference from the Quaternion implementation is that last own message is not marked as read immediately - so that we can allow the local user to send messages while staying with the read marker well above. This implies, though, that the read marker won't reset to the timeline bottom at any movement of the user - rather that it resets to the bottom of the current view (which is the ultimately correct behaviour, anyway).
2016-10-23Room: Don't let the read marker (of any user) get back, only forwardKitsune Ral
2016-10-23A couple of fixes according to the PR reviewKitsune Ral
Room::markMessagesAsRead: use the iterator to the message, not after the message. Room::setLastReadEvent: moved to protected
2016-10-21Room::markMessagesAsRead correctly handles local user's messages nowKitsune Ral
setLastReadEvent() is called in any case (read marks a stored in a hashmap so it's a constant time operation anyway); postReceipt() is now called for the nearest previous non-local message.
2016-10-20Room: added setLastReadEvent accessor and a signal for it; don't post ↵Kitsune Ral
receipts for own messages to the server As discussed with Matthew in #quaternion: https://matrix.to/#/!PCzUtxtOjUySxSelof:matrix.org/$14768896199130qcJqe:matrix.org
2016-10-07Fixed massive leaks of Event objectsKitsune Ral
2016-10-05Check there are no non-members "typing" or "having read" messagesKitsune Ral
Normally, this shouldn't happen anyway - just a double-check,
2016-10-04Changed angle brackets to parentheses for user disambiguationKitsune Ral
This fixes a case when another person mentions you by disambiguated name, and this is not highlighted because Riot uses () and Quaternion uses <> to decorate disambiguated names (as well as to check mentions).
2016-09-21Room: don't emit signals if there are no message events receivedKitsune Ral
2016-09-21Fixed the order of historical messagesKitsune Ral
2016-09-16Group processing of state events as wellKitsune Ral
2016-09-16Room: change the way messages are orderedKitsune Ral
This replaces the one-by-one timestamp-ordering algorithm of adding new messages with copying the whole group of just-arrived messages to either the beginning or the end of the timeline. Since origin timestamps do not provide a reasonable order, findInsertionPos() is entirely deleted. processMessageEvent() is replaced by two functions: addNewMessageEvents() appends at messageEvents.end() while addHistoricalMessageEvents() inserts them at messageEvents.begin(). There's no official way to insert messages in the middle; cases when getPreviousContent() is called in parallel or a RoomMessagesJob runs on a gap somewhere in the middle of the timeline weren't considered before this commit and aren't considered in it. The new ordering requires you to understand where you have got your events from (or rather, where you want to insert them). In particular, updateData() that processes /sync results uses addNewMessageEvents(); getPreviousContent() calls addHistoricalMessageEvents(). In order to notify clients, a single newMessages() signal gives way to 3 new signals: 2 aboutToAdd*Messages() and a common addedMessages(). In addition, clients can derive from Room and use doAdd*Messages() virtual functions to alter/extend the behaviour.
2016-09-15Replace an array of room deconstruction log lines with a single connection ↵Kitsune Ral
deconstruction log line
2016-09-15More compact fix with the same meaningKitsune Ral
2016-09-15Correct user sorting for room name creationFelix Rohrbach
In the previous version, it was possible that u1 >= u2 and u2 >= u1: Assume u1 == me, u1->id() < u2->id() Then u1 >= u2, as u1 == me (i.e. it returns false) but also u2 >= u1, as u2->id() > u1->id() (returns false again) For me, this had the effect of having three rooms called fxrh.
2016-09-14Use Receipt by reference in a loopKitsune Ral
Thanks to Clang for pointing this out.
2016-09-14Room::messageEvents: switch to an alias instead of explicit QList<>Kitsune Ral
To facilitate a possible change of a container type.
2016-09-14Initialize Room::Private more carefullyKitsune Ral
See https://marcmutz.wordpress.com/translated-articles/pimp-my-pimpl- %E2%80%94-reloaded
2016-08-31Room: Drop unused codeKitsune Ral
2016-08-22Replaced QList<> with QVector<> where appropriate + minor code cleanupKitsune Ral
See https://marcmutz.wordpress.com/effective-qt/containers/ for the background and http://lists.qt-project.org/pipermail/development/2015-July/022283.html for the relevant flamewar in Qt dev mailing list.
2016-08-22Minor cleanupKitsune Ral
The two additional braces are due to the fact that array<> is a wrapper around a C-style array, which means I'm initializing a sub-object with a list initialization. Google -Wmissing-braces.
2016-07-29Added roomMembername() overload for userId, in addition to User*Kitsune Ral