aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/connection.cpp37
-rw-r--r--lib/connection.h41
2 files changed, 73 insertions, 5 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index 22fa2f15..4c0fe6b8 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -274,6 +274,13 @@ void Connection::reloadCapabilities()
});
}
+bool Connection::loadingCapabilities() const
+{
+ // (Ab)use the fact that room versions cannot be omitted after
+ // the capabilities have been loaded (see reloadCapabilities() above).
+ return d->capabilities.roomVersions.omitted();
+}
+
void Connection::Private::connectWithToken(const QString& user,
const QString& accessToken,
const QString& deviceId)
@@ -1300,6 +1307,9 @@ void Connection::getTurnServers()
this, [=] { emit turnServersChanged(job->data()); });
}
+const QString Connection::SupportedRoomVersion::StableTag =
+ QStringLiteral("stable");
+
QString Connection::defaultRoomVersion() const
{
Q_ASSERT(!d->capabilities.roomVersions.omitted());
@@ -1312,13 +1322,34 @@ QStringList Connection::stableRoomVersions() const
QStringList l;
const auto& allVersions = d->capabilities.roomVersions->available;
for (auto it = allVersions.begin(); it != allVersions.end(); ++it)
- if (it.value() == "stable")
+ if (it.value() == SupportedRoomVersion::StableTag)
l.push_back(it.key());
return l;
}
-const QHash<QString, QString>& Connection::availableRoomVersions() const
+inline bool roomVersionLess(const Connection::SupportedRoomVersion& v1,
+ const Connection::SupportedRoomVersion& v2)
+{
+ bool ok1 = false, ok2 = false;
+ const auto vNum1 = v1.id.toFloat(&ok1);
+ const auto vNum2 = v2.id.toFloat(&ok2);
+ return ok1 && ok2 ? vNum1 < vNum2 : v1.id < v2.id;
+}
+
+QVector<Connection::SupportedRoomVersion> Connection::availableRoomVersions() const
{
Q_ASSERT(!d->capabilities.roomVersions.omitted());
- return d->capabilities.roomVersions->available;
+ QVector<SupportedRoomVersion> result;
+ result.reserve(d->capabilities.roomVersions->available.size());
+ for (auto it = d->capabilities.roomVersions->available.begin();
+ it != d->capabilities.roomVersions->available.end(); ++it)
+ result.push_back({ it.key(), it.value() });
+ // Put stable versions over unstable; within each group,
+ // sort numeric versions as numbers, the rest as strings.
+ const auto mid = std::partition(result.begin(), result.end(),
+ std::mem_fn(&SupportedRoomVersion::isStable));
+ std::sort(result.begin(), mid, roomVersionLess);
+ std::sort(mid, result.end(), roomVersionLess);
+
+ return result;
}
diff --git a/lib/connection.h b/lib/connection.h
index e5bce52e..1faee255 100644
--- a/lib/connection.h
+++ b/lib/connection.h
@@ -258,9 +258,43 @@ namespace QMatrixClient
Q_INVOKABLE QString token() const;
Q_INVOKABLE void getTurnServers();
+ struct SupportedRoomVersion
+ {
+ QString id;
+ QString status;
+
+ static const QString StableTag; // "stable", as of CS API 0.5
+ bool isStable() const { return status == StableTag; }
+
+ // Pretty-printing
+
+ friend QDebug operator<<(QDebug dbg,
+ const SupportedRoomVersion& v)
+ {
+ QDebugStateSaver _(dbg);
+ return dbg.nospace() << v.id << '/' << v.status;
+ }
+
+ friend QDebug operator<<(QDebug dbg,
+ const QVector<SupportedRoomVersion>& vs)
+ {
+ return QtPrivate::printSequentialContainer(
+ dbg, "", vs);
+ }
+ };
+
+ /// Get the room version recommended by the server
+ /** Only works after server capabilities have been loaded.
+ * \sa loadingCapabilities */
QString defaultRoomVersion() const;
+ /// Get the room version considered stable by the server
+ /** Only works after server capabilities have been loaded.
+ * \sa loadingCapabilities */
QStringList stableRoomVersions() const;
- const QHash<QString, QString>& availableRoomVersions() const;
+ /// Get all room versions supported by the server
+ /** Only works after server capabilities have been loaded.
+ * \sa loadingCapabilities */
+ QVector<SupportedRoomVersion> availableRoomVersions() const;
/**
* Call this before first sync to load from previously saved file.
@@ -370,9 +404,12 @@ namespace QMatrixClient
const QString& deviceId = {});
void connectWithToken(const QString& userId, const QString& accessToken,
const QString& deviceId);
- /** Explicitly request capabilities from the server */
+ /// Explicitly request capabilities from the server
void reloadCapabilities();
+ /// Find out if capabilites are still loading from the server
+ bool loadingCapabilities() const;
+
/** @deprecated Use stopSync() instead */
void disconnectFromServer() { stopSync(); }
void logout();