aboutsummaryrefslogtreecommitdiff
path: root/lib/connection.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/connection.h')
-rw-r--r--lib/connection.h150
1 files changed, 104 insertions, 46 deletions
diff --git a/lib/connection.h b/lib/connection.h
index b06fb143..ea5be51a 100644
--- a/lib/connection.h
+++ b/lib/connection.h
@@ -21,6 +21,7 @@
#include "csapi/create_room.h"
#include "joinstate.h"
#include "events/accountdataevents.h"
+#include "qt_connection_util.h"
#include <QtCore/QObject>
#include <QtCore/QUrl>
@@ -48,26 +49,7 @@ namespace QMatrixClient
class DownloadFileJob;
class SendToDeviceJob;
class SendMessageJob;
-
- /** Create a single-shot connection that triggers on the signal and
- * then self-disconnects
- *
- * Only supports DirectConnection type.
- */
- template <typename SenderT1, typename SignalT,
- typename ReceiverT2, typename SlotT>
- inline auto connectSingleShot(SenderT1* sender, SignalT signal,
- ReceiverT2* receiver, SlotT slot)
- {
- QMetaObject::Connection connection;
- connection = QObject::connect(sender, signal, receiver, slot,
- Qt::DirectConnection);
- Q_ASSERT(connection);
- QObject::connect(sender, signal, receiver,
- [connection] { QObject::disconnect(connection); },
- Qt::DirectConnection);
- return connection;
- }
+ class LeaveRoomJob;
class Connection;
@@ -120,8 +102,12 @@ namespace QMatrixClient
Q_PROPERTY(QString localUserId READ userId NOTIFY stateChanged)
Q_PROPERTY(QString deviceId READ deviceId NOTIFY stateChanged)
Q_PROPERTY(QByteArray accessToken READ accessToken NOTIFY stateChanged)
+ Q_PROPERTY(QString defaultRoomVersion READ defaultRoomVersion NOTIFY capabilitiesLoaded)
Q_PROPERTY(QUrl homeserver READ homeserver WRITE setHomeserver NOTIFY homeserverChanged)
+ Q_PROPERTY(QString domain READ domain NOTIFY homeserverChanged)
Q_PROPERTY(bool cacheState READ cacheState WRITE setCacheState NOTIFY cacheStateChanged)
+ Q_PROPERTY(bool lazyLoading READ lazyLoading WRITE setLazyLoading NOTIFY lazyLoadingChanged)
+
public:
// Room ids, rather than room pointers, are used in the direct chat
// map types because the library keeps Invite rooms separate from
@@ -246,8 +232,8 @@ namespace QMatrixClient
*/
void addToIgnoredUsers(const User* user);
- /** Remove the user from the ignore list
- * Similar to adding, the change signal is emitted synchronously.
+ /** Remove the user from the ignore list */
+ /** Similar to adding, the change signal is emitted synchronously.
*
* \sa ignoredUsersListChanged
*/
@@ -256,9 +242,22 @@ namespace QMatrixClient
/** Get the full list of users known to this account */
QMap<QString, User*> users() const;
+ /** Get the base URL of the homeserver to connect to */
QUrl homeserver() const;
+ /** Get the domain name used for ids/aliases on the server */
+ QString domain() const;
+ /** Find a room by its id and a mask of applicable states */
Q_INVOKABLE Room* room(const QString& roomId,
- JoinStates states = JoinState::Invite|JoinState::Join) const;
+ JoinStates states = JoinState::Invite|JoinState::Join) const;
+ /** Find a room by its alias and a mask of applicable states */
+ Q_INVOKABLE Room* roomByAlias(const QString& roomAlias,
+ JoinStates states = JoinState::Invite|JoinState::Join) const;
+ /** Update the internal map of room aliases to IDs */
+ /// This is used for internal bookkeeping of rooms. Do NOT use
+ /// it to try change aliases, use Room::setAliases instead
+ void updateRoomAliases(const QString& roomId,
+ const QStringList& previousRoomAliases,
+ const QStringList& roomAliases);
Q_INVOKABLE Room* invitation(const QString& roomId) const;
Q_INVOKABLE User* user(const QString& userId);
const User* user() const;
@@ -273,6 +272,35 @@ 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; }
+
+ friend QDebug operator<<(QDebug dbg,
+ const SupportedRoomVersion& v)
+ {
+ QDebugStateSaver _(dbg);
+ return dbg.nospace() << v.id << '/' << v.status;
+ }
+ };
+
+ /// 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;
+ /// 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.
*
@@ -280,7 +308,7 @@ namespace QMatrixClient
* to be QML-friendly. Empty parameter means using a path
* defined by stateCachePath().
*/
- Q_INVOKABLE void loadState(const QUrl &fromFile = {});
+ Q_INVOKABLE void loadState();
/**
* This method saves the current state of rooms (but not messages
* in them) to a local cache file, so that it could be loaded by
@@ -290,7 +318,10 @@ namespace QMatrixClient
* QML-friendly. Empty parameter means using a path defined by
* stateCachePath().
*/
- Q_INVOKABLE void saveState(const QUrl &toFile = {}) const;
+ Q_INVOKABLE void saveState() const;
+
+ /// This method saves the current state of a single room.
+ void saveRoomState(Room* r) const;
/**
* The default path to store the cached room state, defined as
@@ -305,6 +336,9 @@ namespace QMatrixClient
bool cacheState() const;
void setCacheState(bool newValue);
+ bool lazyLoading() const;
+ void setLazyLoading(bool newValue);
+
/** Start a job of a specified type with specified arguments and policy
*
* This is a universal method to start a job of a type passed
@@ -375,13 +409,21 @@ namespace QMatrixClient
const QString& deviceId = {});
void connectWithToken(const QString& userId, const QString& accessToken,
const QString& deviceId);
+ /// 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();
void sync(int timeout = -1);
+ void syncLoop(int timeout = -1);
+
void stopSync();
+ QString nextBatchToken() const;
virtual MediaThumbnailJob* getThumbnail(const QString& mediaId,
QSize requestedSize, RunningPolicy policy = BackgroundRequest) const;
@@ -393,10 +435,10 @@ namespace QMatrixClient
// QIODevice* should already be open
UploadContentJob* uploadContent(QIODevice* contentSource,
- const QString& filename = {},
- const QString& contentType = {}) const;
+ const QString& filename = {},
+ const QString& overrideContentType = {}) const;
UploadContentJob* uploadFile(const QString& fileName,
- const QString& contentType = {});
+ const QString& overrideContentType = {});
GetContentJob* getContent(const QString& mediaId) const;
GetContentJob* getContent(const QUrl& url) const;
// If localFilename is empty, a temporary file will be created
@@ -411,7 +453,7 @@ namespace QMatrixClient
CreateRoomJob* createRoom(RoomVisibility visibility,
const QString& alias, const QString& name, const QString& topic,
QStringList invites, const QString& presetName = {},
- bool isDirect = false,
+ const QString& roomVersion = {}, bool isDirect = false,
const QVector<CreateRoomJob::StateEvent>& initialState = {},
const QVector<CreateRoomJob::Invite3pid>& invite3pids = {},
const QJsonObject& creationContent = {});
@@ -485,14 +527,14 @@ namespace QMatrixClient
SendMessageJob* sendMessage(const QString& roomId,
const RoomEvent& event) const;
+ /** \deprecated Do not use this directly, use Room::leaveRoom() instead */
+ virtual LeaveRoomJob* leaveRoom( Room* room );
+
// Old API that will be abolished any time soon. DO NOT USE.
/** @deprecated Use callApi<PostReceiptJob>() or Room::postReceipt() instead */
virtual PostReceiptJob* postReceipt(Room* room,
RoomEvent* event) const;
- /** @deprecated Use callApi<LeaveRoomJob>() or Room::leaveRoom() instead */
- virtual void leaveRoom( Room* room );
-
signals:
/**
* @deprecated
@@ -508,6 +550,7 @@ namespace QMatrixClient
void resolveError(QString error);
void homeserverChanged(QUrl baseUrl);
+ void capabilitiesLoaded();
void connected();
void reconnected(); //< \deprecated Use connected() instead
@@ -519,7 +562,7 @@ namespace QMatrixClient
* a successful login and logout and are constant at other times.
*/
void stateChanged();
- void loginError(QString message, QByteArray details);
+ void loginError(QString message, QString details);
/** A network request (job) failed
*
@@ -537,11 +580,11 @@ namespace QMatrixClient
* @param retriesTaken - how many retries have already been taken
* @param nextRetryInMilliseconds - when the job will retry again
*/
- void networkError(QString message, QByteArray details,
+ void networkError(QString message, QString details,
int retriesTaken, int nextRetryInMilliseconds);
void syncDone();
- void syncError(QString message, QByteArray details);
+ void syncError(QString message, QString details);
void newUser(User* user);
@@ -652,6 +695,7 @@ namespace QMatrixClient
IgnoredUsersList removals);
void cacheStateChanged();
+ void lazyLoadingChanged();
void turnServersChanged(const QJsonObject& servers);
protected:
@@ -660,21 +704,35 @@ namespace QMatrixClient
*/
const ConnectionData* connectionData() const;
- /**
- * @brief Find a (possibly new) Room object for the specified id
- * Use this method whenever you need to find a Room object in
- * the local list of rooms. Note that this does not interact with
- * the server; in particular, does not automatically create rooms
- * on the server.
- * @return a pointer to a Room object with the specified id; nullptr
- * if roomId is empty or roomFactory() failed to create a Room object.
- */
- Room* provideRoom(const QString& roomId, JoinState joinState);
+ /** Get a Room object for the given id in the given state
+ *
+ * Use this method when you need a Room object in the local list
+ * of rooms, with the given state. Note that this does not interact
+ * with the server; in particular, does not automatically create
+ * rooms on the server. This call performs necessary join state
+ * transitions; e.g., if it finds a room in Invite but
+ * `joinState == JoinState::Join` then the Invite room object
+ * will be deleted and a new room object with Join state created.
+ * In contrast, switching between Join and Leave happens within
+ * the same object.
+ * \param roomId room id (not alias!)
+ * \param joinState desired (target) join state of the room; if
+ * omitted, any state will be found and return unchanged, or a
+ * new Join room created.
+ * @return a pointer to a Room object with the specified id and the
+ * specified state; nullptr if roomId is empty or if roomFactory()
+ * failed to create a Room object.
+ */
+ Room* provideRoom(const QString& roomId,
+ Omittable<JoinState> joinState = none);
/**
* Completes loading sync data.
*/
- void onSyncSuccess(SyncData &&data);
+ void onSyncSuccess(SyncData &&data, bool fromCache = false);
+
+ protected slots:
+ void syncLoopIteration();
private:
class Private;