From 49ad563550ba9d2d03fc7a519ccb857a6d08791c Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Fri, 23 Nov 2018 15:38:59 +0900 Subject: Room/Connection: don't save the just loaded room cache --- lib/connection.cpp | 6 +++--- lib/connection.h | 2 +- lib/room.cpp | 5 +++-- lib/room.h | 17 +++++++++-------- 4 files changed, 16 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/lib/connection.cpp b/lib/connection.cpp index 53835a80..9372acd5 100644 --- a/lib/connection.cpp +++ b/lib/connection.cpp @@ -316,7 +316,7 @@ void Connection::sync(int timeout) }); } -void Connection::onSyncSuccess(SyncData &&data) { +void Connection::onSyncSuccess(SyncData &&data, bool fromCache) { d->data->setLastEvent(data.nextBatch()); for (auto&& roomData: data.takeRoomData()) { @@ -337,7 +337,7 @@ void Connection::onSyncSuccess(SyncData &&data) { } if ( auto* r = provideRoom(roomData.roomId, roomData.joinState) ) { - r->updateData(std::move(roomData)); + r->updateData(std::move(roomData), fromCache); if (d->firstTimeRooms.removeOne(r)) emit loadedRoomState(r); } @@ -1156,7 +1156,7 @@ void Connection::loadState() // TODO: to handle load failures, instead of the above block: // 1. Do initial sync on failed rooms without saving the nextBatch token // 2. Do the sync across all rooms as normal - onSyncSuccess(std::move(sync)); + onSyncSuccess(std::move(sync), true); qCDebug(PROFILER) << "*** Cached state for" << userId() << "loaded in" << et; } diff --git a/lib/connection.h b/lib/connection.h index 20a1f47e..32533b6e 100644 --- a/lib/connection.h +++ b/lib/connection.h @@ -677,7 +677,7 @@ namespace QMatrixClient /** * Completes loading sync data. */ - void onSyncSuccess(SyncData &&data); + void onSyncSuccess(SyncData &&data, bool fromCache = false); private: class Private; diff --git a/lib/room.cpp b/lib/room.cpp index 2d958dca..22a0d585 100644 --- a/lib/room.cpp +++ b/lib/room.cpp @@ -1106,7 +1106,7 @@ QString Room::roomMembername(const QString& userId) const return roomMembername(user(userId)); } -void Room::updateData(SyncRoomData&& data) +void Room::updateData(SyncRoomData&& data, bool fromCache) { if( d->prevBatch.isEmpty() ) d->prevBatch = data.timelinePrevBatch; @@ -1172,7 +1172,8 @@ void Room::updateData(SyncRoomData&& data) if (roomChanges != Change::NoChange) { emit changed(roomChanges); - connection()->saveRoomState(this); + if (!fromCache) + connection()->saveRoomState(this); } } diff --git a/lib/room.h b/lib/room.h index ab8298d4..480de6fe 100644 --- a/lib/room.h +++ b/lib/room.h @@ -456,14 +456,6 @@ namespace QMatrixClient /// The room is about to be deleted void beforeDestruction(Room*); - public: // Used by Connection - not a part of the client API - QJsonObject toJson() const; - void updateData(SyncRoomData&& data ); - - // Clients should use Connection::joinRoom() and Room::leaveRoom() - // to change the room state - void setJoinState( JoinState state ); - protected: /// Returns true if any of room names/aliases has changed virtual Changes processStateEvent(const RoomEvent& e); @@ -473,10 +465,19 @@ namespace QMatrixClient virtual void onAddHistoricalTimelineEvents(rev_iter_t /*from*/) { } virtual void onRedaction(const RoomEvent& /*prevEvent*/, const RoomEvent& /*after*/) { } + virtual QJsonObject toJson() const; + virtual void updateData(SyncRoomData&& data, bool fromCache = false); private: + friend class Connection; + class Private; Private* d; + + // This is called from Connection, reflecting a state change that + // arrived from the server. Clients should use + // Connection::joinRoom() and Room::leaveRoom() to change the state. + void setJoinState(JoinState state); }; class MemberSorter -- cgit v1.2.3