aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-01-23 10:32:40 +0100
committerAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-01-23 17:12:44 +0100
commit9ae0d4e45befc79f621b03dc4efe869cd4277e06 (patch)
tree70cf1dac2662b198cb749b3e54231c9d15e109d2
parenta1fcad591968ec717214a73a2dbe78f608207bc5 (diff)
downloadlibquotient-9ae0d4e45befc79f621b03dc4efe869cd4277e06.tar.gz
libquotient-9ae0d4e45befc79f621b03dc4efe869cd4277e06.zip
Refactor Room::setState()
There are two important aspects here: - Introducing Room::setState(evtType, stateKey, contentJson). These components are ultimately what is getting sent to the homeserver, so it makes sense to expose a respective `setState()` overload. Unlike setState(event) the new overload can be Q_INVOKABLE. - Room::setState() is no more const. Although it doesn't cause any changes in Room class (and only transient changes in Room::Private), it ultimately initiates a change in the room state, so calling it const has always been a bit of hypocrisy. If you relied on that, you most likely do something wrong (see the fix to User::rename() in this very commit for a simple example of such wrongness). Also: the backend is simplified by calling the original templated Room::setState() instead of calling Room::Private::requestSetState() that does exactly the same thing.
-rw-r--r--lib/room.cpp36
-rw-r--r--lib/room.h11
-rw-r--r--lib/user.cpp2
-rw-r--r--lib/user.h2
4 files changed, 30 insertions, 21 deletions
diff --git a/lib/room.cpp b/lib/room.cpp
index 1450eb3b..abd6110c 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -297,7 +297,9 @@ public:
QString doSendEvent(const RoomEvent* pEvent);
void onEventSendingFailure(const QString& txnId, BaseJob* call = nullptr);
- SetRoomStateWithKeyJob* requestSetState(const StateEventBase& event)
+ SetRoomStateWithKeyJob* requestSetState(const QString& evtType,
+ const QString& stateKey,
+ const QJsonObject& contentJson)
{
// if (event.roomId().isEmpty())
// event.setRoomId(id);
@@ -305,14 +307,8 @@ public:
// event.setSender(connection->userId());
// TODO: Queue up state events sending (see #133).
// TODO: Maybe addAsPending() as well, despite having no txnId
- return connection->callApi<SetRoomStateWithKeyJob>(
- id, event.matrixType(), event.stateKey(), event.contentJson());
- }
-
- template <typename EvT, typename... ArgTs>
- auto requestSetState(ArgTs&&... args)
- {
- return requestSetState(EvT(std::forward<ArgTs>(args)...));
+ return connection->callApi<SetRoomStateWithKeyJob>(id, evtType, stateKey,
+ contentJson);
}
/*! Apply redaction to the timeline
@@ -2126,33 +2122,41 @@ QString Room::postJson(const QString& matrixType,
return d->sendEvent(loadEvent<RoomEvent>(matrixType, eventContent));
}
-SetRoomStateWithKeyJob* Room::setState(const StateEventBase& evt) const
+SetRoomStateWithKeyJob* Room::setState(const StateEventBase& evt)
+{
+ return d->requestSetState(evt.matrixType(), evt.stateKey(),
+ evt.contentJson());
+}
+
+SetRoomStateWithKeyJob* Room::setState(const QString& evtType,
+ const QString& stateKey,
+ const QJsonObject& contentJson)
{
- return d->requestSetState(evt);
+ return d->requestSetState(evtType, stateKey, contentJson);
}
void Room::setName(const QString& newName)
{
- d->requestSetState<RoomNameEvent>(newName);
+ setState<RoomNameEvent>(newName);
}
void Room::setCanonicalAlias(const QString& newAlias)
{
- d->requestSetState<RoomCanonicalAliasEvent>(newAlias, altAliases());
+ setState<RoomCanonicalAliasEvent>(newAlias, altAliases());
}
void Room::setPinnedEvents(const QStringList& events)
{
- d->requestSetState<RoomPinnedEvent>(events);
+ setState<RoomPinnedEvent>(events);
}
void Room::setLocalAliases(const QStringList& aliases)
{
- d->requestSetState<RoomCanonicalAliasEvent>(canonicalAlias(), aliases);
+ setState<RoomCanonicalAliasEvent>(canonicalAlias(), aliases);
}
void Room::setTopic(const QString& newTopic)
{
- d->requestSetState<RoomTopicEvent>(newTopic);
+ setState<RoomTopicEvent>(newTopic);
}
bool isEchoEvent(const RoomEventPtr& le, const PendingEventItem& re)
diff --git a/lib/room.h b/lib/room.h
index d49cfb55..9f70d77a 100644
--- a/lib/room.h
+++ b/lib/room.h
@@ -781,6 +781,9 @@ public:
/// \brief Get the current room state
RoomStateView currentState() const;
+ //! Send a request to update the room state with the given event
+ SetRoomStateWithKeyJob* setState(const StateEventBase& evt);
+
//! \brief Set a state event of the given type with the given arguments
//!
//! This typesafe overload attempts to send a state event with the type
@@ -790,7 +793,7 @@ public:
//! the Matrix event type defined by \p EvT and the event content produced
//! via EvT::contentJson().
template <typename EvT, typename... ArgTs>
- auto setState(ArgTs&&... args) const
+ auto setState(ArgTs&&... args)
{
return setState(EvT(std::forward<ArgTs>(args)...));
}
@@ -824,8 +827,10 @@ public Q_SLOTS:
QString retryMessage(const QString& txnId);
void discardMessage(const QString& txnId);
- /// Send a request to update the room state with the given event
- SetRoomStateWithKeyJob* setState(const StateEventBase& evt) const;
+ //! Send a request to update the room state based on freeform inputs
+ SetRoomStateWithKeyJob* setState(const QString& evtType,
+ const QString& stateKey,
+ const QJsonObject& contentJson);
void setName(const QString& newName);
void setCanonicalAlias(const QString& newAlias);
void setPinnedEvents(const QStringList& events);
diff --git a/lib/user.cpp b/lib/user.cpp
index f7840c40..4c3fc9e2 100644
--- a/lib/user.cpp
+++ b/lib/user.cpp
@@ -110,7 +110,7 @@ void User::rename(const QString& newName)
});
}
-void User::rename(const QString& newName, const Room* r)
+void User::rename(const QString& newName, Room* r)
{
if (!r) {
qCWarning(MAIN) << "Passing a null room to two-argument User::rename()"
diff --git a/lib/user.h b/lib/user.h
index 8412b7fd..dfbff4a0 100644
--- a/lib/user.h
+++ b/lib/user.h
@@ -96,7 +96,7 @@ public Q_SLOTS:
/// Set a new name in the global user profile
void rename(const QString& newName);
/// Set a new name for the user in one room
- void rename(const QString& newName, const Room* r);
+ void rename(const QString& newName, Room* r);
/// Upload the file and use it as an avatar
bool setAvatar(const QString& fileName);
/// Upload contents of the QIODevice and set that as an avatar