aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/accountregistry.cpp73
-rw-r--r--lib/accountregistry.h49
-rw-r--r--lib/connection.cpp4
-rw-r--r--lib/networkaccessmanager.cpp2
4 files changed, 55 insertions, 73 deletions
diff --git a/lib/accountregistry.cpp b/lib/accountregistry.cpp
index a292ed45..616b54b4 100644
--- a/lib/accountregistry.cpp
+++ b/lib/accountregistry.cpp
@@ -8,90 +8,59 @@
using namespace Quotient;
-void AccountRegistry::add(Connection* c)
+void AccountRegistry::add(Connection* a)
{
- if (m_accounts.contains(c))
+ if (contains(a))
return;
- beginInsertRows(QModelIndex(), m_accounts.size(), m_accounts.size());
- m_accounts += c;
+ beginInsertRows(QModelIndex(), size(), size());
+ push_back(a);
endInsertRows();
}
-void AccountRegistry::drop(Connection* c)
+void AccountRegistry::drop(Connection* a)
{
- beginRemoveRows(QModelIndex(), m_accounts.indexOf(c), m_accounts.indexOf(c));
- m_accounts.removeOne(c);
+ const auto idx = indexOf(a);
+ beginRemoveRows(QModelIndex(), idx, idx);
+ remove(idx);
endRemoveRows();
- Q_ASSERT(!m_accounts.contains(c));
+ Q_ASSERT(!contains(a));
}
bool AccountRegistry::isLoggedIn(const QString &userId) const
{
- return std::any_of(m_accounts.cbegin(), m_accounts.cend(),
- [&userId](Connection* a) { return a->userId() == userId; });
+ return std::any_of(cbegin(), cend(), [&userId](const Connection* a) {
+ return a->userId() == userId;
+ });
}
-bool AccountRegistry::contains(Connection *c) const
+QVariant AccountRegistry::data(const QModelIndex& index, int role) const
{
- return m_accounts.contains(c);
-}
-
-AccountRegistry::AccountRegistry() = default;
-
-QVariant AccountRegistry::data(const QModelIndex &index, int role) const
-{
- if (!index.isValid()) {
- return {};
- }
-
- if (index.row() >= m_accounts.count()) {
+ if (!index.isValid() || index.row() >= count())
return {};
- }
- auto account = m_accounts[index.row()];
-
- if (role == ConnectionRole) {
- return QVariant::fromValue(account);
- }
+ if (role == AccountRole)
+ return QVariant::fromValue(at(index.row()));
return {};
}
-int AccountRegistry::rowCount(const QModelIndex &parent) const
+int AccountRegistry::rowCount(const QModelIndex& parent) const
{
- if (parent.isValid()) {
- return 0;
- }
-
- return m_accounts.count();
+ return parent.isValid() ? 0 : count();
}
QHash<int, QByteArray> AccountRegistry::roleNames() const
{
- return {{ConnectionRole, "connection"}};
+ return { { AccountRole, "connection" } };
}
-bool AccountRegistry::isEmpty() const
-{
- return m_accounts.isEmpty();
-}
-int AccountRegistry::count() const
-{
- return m_accounts.count();
-}
-
-const QVector<Connection*> AccountRegistry::accounts() const
-{
- return m_accounts;
-}
Connection* AccountRegistry::get(const QString& userId)
{
- for (const auto &connection : m_accounts) {
- if(connection->userId() == userId) {
+ for (const auto &connection : *this) {
+ if (connection->userId() == userId)
return connection;
- }
}
return nullptr;
}
diff --git a/lib/accountregistry.h b/lib/accountregistry.h
index f7a864df..2f6dffdf 100644
--- a/lib/accountregistry.h
+++ b/lib/accountregistry.h
@@ -6,42 +6,55 @@
#include "quotient_export.h"
-#include <QtCore/QObject>
-#include <QtCore/QList>
#include <QtCore/QAbstractListModel>
namespace Quotient {
class Connection;
-class QUOTIENT_API AccountRegistry : public QAbstractListModel {
+class QUOTIENT_API AccountRegistry : public QAbstractListModel,
+ private QVector<Connection*> {
Q_OBJECT
public:
+ using const_iterator = QVector::const_iterator;
+ using const_reference = QVector::const_reference;
+
enum EventRoles {
- ConnectionRole = Qt::UserRole + 1,
+ AccountRole = Qt::UserRole + 1,
+ ConnectionRole = AccountRole
};
- static AccountRegistry &instance() {
- static AccountRegistry _instance;
- return _instance;
- }
+ [[deprecated("Use Accounts variable instead")]] //
+ static AccountRegistry& instance();
+
+ // Expose most of QVector's const-API but only provide add() and drop()
+ // for changing it. In theory other changing operations could be supported
+ // too; but then boilerplate begin/end*() calls has to be tucked into each
+ // and this class gives no guarantees on the order of entries, so why care.
- const QVector<Connection*> accounts() const;
+ const QVector<Connection*>& accounts() const { return *this; }
void add(Connection* a);
void drop(Connection* a);
+ const_iterator begin() const { return QVector::begin(); }
+ const_iterator end() const { return QVector::end(); }
+ const_reference front() const { return QVector::front(); }
+ const_reference back() const { return QVector::back(); }
bool isLoggedIn(const QString& userId) const;
- bool isEmpty() const;
- int count() const;
- bool contains(Connection*) const;
Connection* get(const QString& userId);
- [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
- [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+ using QVector::isEmpty, QVector::empty;
+ using QVector::size, QVector::count, QVector::capacity;
+ using QVector::cbegin, QVector::cend, QVector::contains;
+
+ // QAbstractItemModel interface implementation
+ [[nodiscard]] QVariant data(const QModelIndex& index,
+ int role) const override;
+ [[nodiscard]] int rowCount(
+ const QModelIndex& parent = QModelIndex()) const override;
[[nodiscard]] QHash<int, QByteArray> roleNames() const override;
+};
-private:
- AccountRegistry();
+inline QUOTIENT_API AccountRegistry Accounts {};
- QVector<Connection *> m_accounts;
-};
+inline AccountRegistry& AccountRegistry::instance() { return Accounts; }
}
diff --git a/lib/connection.cpp b/lib/connection.cpp
index 1915c2a9..67bc83f9 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -258,7 +258,7 @@ Connection::~Connection()
{
qCDebug(MAIN) << "deconstructing connection object for" << userId();
stopSync();
- AccountRegistry::instance().drop(this);
+ Accounts.drop(this);
}
void Connection::resolveServer(const QString& mxid)
@@ -438,7 +438,7 @@ void Connection::Private::completeSetup(const QString& mxId)
qCDebug(MAIN) << "Using server" << data->baseUrl().toDisplayString()
<< "by user" << data->userId()
<< "from device" << data->deviceId();
- AccountRegistry::instance().add(q);
+ Accounts.add(q);
#ifndef Quotient_E2EE_ENABLED
qCWarning(E2EE) << "End-to-end encryption (E2EE) support is turned off.";
#else // Quotient_E2EE_ENABLED
diff --git a/lib/networkaccessmanager.cpp b/lib/networkaccessmanager.cpp
index 2c0f716b..58c3cc3a 100644
--- a/lib/networkaccessmanager.cpp
+++ b/lib/networkaccessmanager.cpp
@@ -97,7 +97,7 @@ QNetworkReply* NetworkAccessManager::createRequest(
// TODO: Make the best effort with a direct unauthenticated request
// to the media server
} else {
- auto* const connection = AccountRegistry::instance().get(accountId);
+ auto* const connection = Accounts.get(accountId);
if (!connection) {
qCWarning(NETWORK) << "Connection" << accountId << "not found";
return new MxcReply();