aboutsummaryrefslogtreecommitdiff
path: root/lib/connection.cpp
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2019-01-13 13:34:31 +0900
committerKitsune Ral <Kitsune-Ral@users.sf.net>2019-01-13 14:01:45 +0900
commit8dc2a3273ac3a5bb518fa987b25e3df15106c4d2 (patch)
treeb97d290df7a19959764146f0656e42ab4b7b732d /lib/connection.cpp
parentd5c07b98cd708d0bf4590e7fd249aa972b090461 (diff)
downloadlibquotient-8dc2a3273ac3a5bb518fa987b25e3df15106c4d2.tar.gz
libquotient-8dc2a3273ac3a5bb518fa987b25e3df15106c4d2.zip
Connection::provideRoom: allow omitting join state
Diffstat (limited to 'lib/connection.cpp')
-rw-r--r--lib/connection.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index c17cbffc..18fa91e7 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -981,11 +981,12 @@ const ConnectionData* Connection::connectionData() const
return d->data.get();
}
-Room* Connection::provideRoom(const QString& id, JoinState joinState)
+Room* Connection::provideRoom(const QString& id, Omittable<JoinState> joinState)
{
// TODO: This whole function is a strong case for a RoomManager class.
Q_ASSERT_X(!id.isEmpty(), __FUNCTION__, "Empty room id");
+ // If joinState.omitted(), all joinState == comparisons below are false.
const auto roomKey = qMakePair(id, joinState == JoinState::Invite);
auto* room = d->roomMap.value(roomKey, nullptr);
if (room)
@@ -995,10 +996,19 @@ Room* Connection::provideRoom(const QString& id, JoinState joinState)
// and emit a signal. For Invite and Join, there's no such problem.
if (room->joinState() == joinState && joinState != JoinState::Leave)
return room;
+ } else if (joinState.omitted())
+ {
+ // No Join and Leave, maybe Invite?
+ room = d->roomMap.value({id, true}, nullptr);
+ if (room)
+ return room;
+ // No Invite either, setup a new room object below
}
- else
+
+ if (!room)
{
- room = roomFactory()(this, id, joinState);
+ room = roomFactory()(this, id,
+ joinState.omitted() ? JoinState::Join : joinState.value());
if (!room)
{
qCCritical(MAIN) << "Failed to create a room" << id;
@@ -1010,6 +1020,9 @@ Room* Connection::provideRoom(const QString& id, JoinState joinState)
this, &Connection::aboutToDeleteRoom);
emit newRoom(room);
}
+ if (joinState.omitted())
+ return room;
+
if (joinState == JoinState::Invite)
{
// prev is either Leave or nullptr
@@ -1018,7 +1031,7 @@ Room* Connection::provideRoom(const QString& id, JoinState joinState)
}
else
{
- room->setJoinState(joinState);
+ room->setJoinState(joinState.value());
// Preempt the Invite room (if any) with a room in Join/Leave state.
auto* prevInvite = d->roomMap.take({id, true});
if (joinState == JoinState::Join)