From 76241cb772bb53901cdd3308262f76ba718d9a47 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Wed, 31 Aug 2016 17:49:43 +0900 Subject: Dismiss ConnectionPrivate, long live Connection::Private Closer investigation found out that there are only two actually used member functions in ConnectionPrivate - provideRoom() and resolveServer(). These two have been transferred to Connection; and data members from ConnectionPrivate found new home in Connection::Private. Factoring out room management and user management from Connection is still a pending task. --- connection.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'connection.h') diff --git a/connection.h b/connection.h index f3a15cba..2816895e 100644 --- a/connection.h +++ b/connection.h @@ -55,7 +55,7 @@ namespace QMatrixClient Q_INVOKABLE virtual PostReceiptJob* postReceipt( Room* room, Event* event ); Q_INVOKABLE virtual void joinRoom( QString roomAlias ); Q_INVOKABLE virtual void leaveRoom( Room* room ); - Q_INVOKABLE virtual void getMembers( Room* room ); +// Q_INVOKABLE virtual void getMembers( Room* room ); Q_INVOKABLE virtual RoomMessagesJob* getMessages( Room* room, QString from ); virtual MediaThumbnailJob* getThumbnail( QUrl url, int requestedWidth, int requestedHeight ); @@ -81,10 +81,21 @@ namespace QMatrixClient protected: /** - * Access the underlying ConnectionData class + * @brief Access the underlying ConnectionData class */ ConnectionData* connectionData(); + /** + * @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 if createRoom() failed to create a Room object. + */ + Room* provideRoom(QString roomId); + /** * makes it possible for derived classes to have its own User class */ @@ -96,8 +107,8 @@ namespace QMatrixClient virtual Room* createRoom(QString roomId); private: - friend class ConnectionPrivate; - ConnectionPrivate* d; + class Private; + Private* d; }; } -- cgit v1.2.3 From 4e70dd91bb70fa2b9b338686e4d5ab2560947723 Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Tue, 6 Sep 2016 12:02:56 +0900 Subject: Connection: homeserver(); Connection and ConnectionData: accessToken(); accessors de-virtualized Details: - New: Connection::homeserver(), returns the homeserver URL from inside ConnectionData - New/Modify: Connection::accessToken() and ConnectionData::accessToken() - because we will also have refresh tokens eventually; deprecate token() for the same reason - Modify: Connection::user(), token(), accessToken() are no more virtual (they should have never been, these are plain accessors, after all) --- connection.cpp | 21 ++++++++++++++++----- connection.h | 12 ++++++++---- connectiondata.cpp | 8 ++++---- connectiondata.h | 4 ++-- jobs/basejob.cpp | 2 +- 5 files changed, 31 insertions(+), 16 deletions(-) (limited to 'connection.h') diff --git a/connection.cpp b/connection.cpp index d357599b..f7f09c04 100644 --- a/connection.cpp +++ b/connection.cpp @@ -106,7 +106,6 @@ void Connection::connectToServer(QString user, QString password) { PasswordLogin* loginJob = new PasswordLogin(d->data, user, password); connect( loginJob, &PasswordLogin::success, [=] () { - qDebug() << "Our user ID: " << loginJob->id(); connectWithToken(loginJob->id(), loginJob->token()); }); connect( loginJob, &PasswordLogin::failure, [=] () { @@ -122,7 +121,9 @@ void Connection::connectWithToken(QString userId, QString token) d->isConnected = true; d->userId = userId; d->data->setToken(token); - qDebug() << "Connected with token:"; + qDebug() << "Accessing" << d->data->baseUrl() + << "by user" << userId + << "with the following access token:"; qDebug() << token; emit connected(); } @@ -223,6 +224,11 @@ MediaThumbnailJob* Connection::getThumbnail(QUrl url, int requestedWidth, int re return job; } +QUrl Connection::homeserver() const +{ + return d->data->baseUrl(); +} + User* Connection::user(QString userId) { if( d->userMap.contains(userId) ) @@ -239,14 +245,19 @@ User *Connection::user() return user(d->userId); } -QString Connection::userId() +QString Connection::userId() const { return d->userId; } -QString Connection::token() +QString Connection::token() const +{ + return accessToken(); +} + +QString Connection::accessToken() const { - return d->data->token(); + return d->data->accessToken(); } QHash< QString, Room* > Connection::roomMap() const diff --git a/connection.h b/connection.h index 2816895e..bfb4d377 100644 --- a/connection.h +++ b/connection.h @@ -20,6 +20,7 @@ #define QMATRIXCLIENT_CONNECTION_H #include +#include namespace QMatrixClient { @@ -59,10 +60,13 @@ namespace QMatrixClient Q_INVOKABLE virtual RoomMessagesJob* getMessages( Room* room, QString from ); virtual MediaThumbnailJob* getThumbnail( QUrl url, int requestedWidth, int requestedHeight ); - Q_INVOKABLE virtual User* user(QString userId); - Q_INVOKABLE virtual User* user(); - Q_INVOKABLE virtual QString userId(); - Q_INVOKABLE virtual QString token(); + Q_INVOKABLE QUrl homeserver() const; + Q_INVOKABLE User* user(QString userId); + Q_INVOKABLE User* user(); + Q_INVOKABLE QString userId() const; + /** @deprecated Use accessToken() instead. */ + Q_INVOKABLE QString token() const; + Q_INVOKABLE QString accessToken() const; signals: void resolved(); diff --git a/connectiondata.cpp b/connectiondata.cpp index 4a3bd47f..72e8f3d8 100644 --- a/connectiondata.cpp +++ b/connectiondata.cpp @@ -29,7 +29,7 @@ class ConnectionData::Private QUrl baseUrl; //bool isConnected; - QString token; + QString accessToken; QString lastEvent; QNetworkAccessManager* nam; }; @@ -52,9 +52,9 @@ ConnectionData::~ConnectionData() // return d->isConnected; // } -QString ConnectionData::token() const +QString ConnectionData::accessToken() const { - return d->token; + return d->accessToken; } QUrl ConnectionData::baseUrl() const @@ -69,7 +69,7 @@ QNetworkAccessManager* ConnectionData::nam() const void ConnectionData::setToken(QString token) { - d->token = token; + d->accessToken = token; } void ConnectionData::setHost(QString host) diff --git a/connectiondata.h b/connectiondata.h index 6407780c..5c8342d7 100644 --- a/connectiondata.h +++ b/connectiondata.h @@ -32,11 +32,11 @@ namespace QMatrixClient virtual ~ConnectionData(); //bool isConnected() const; - QString token() const; + QString accessToken() const; QUrl baseUrl() const; QNetworkAccessManager* nam() const; - void setToken( QString token ); + void setToken( QString accessToken ); void setHost( QString host ); void setPort( int port ); diff --git a/jobs/basejob.cpp b/jobs/basejob.cpp index e0dff287..20b45a15 100644 --- a/jobs/basejob.cpp +++ b/jobs/basejob.cpp @@ -92,7 +92,7 @@ void BaseJob::start() url.setPath( url.path() + "/" + apiPath() ); QUrlQuery query = this->query(); if( d->needsToken ) - query.addQueryItem("access_token", connection()->token()); + query.addQueryItem("access_token", connection()->accessToken()); url.setQuery(query); QNetworkRequest req = QNetworkRequest(url); req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); -- cgit v1.2.3 From 866cb97668fadff50dea8d16792c3b6736d531dc Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Tue, 6 Sep 2016 16:12:11 +0900 Subject: Remember the current SyncJob and allow to explicitly abandon it --- connection.cpp | 45 ++++++++++++++++++++++++++++++++++----------- connection.h | 1 + 2 files changed, 35 insertions(+), 11 deletions(-) (limited to 'connection.h') diff --git a/connection.cpp b/connection.cpp index f13026fc..98ff914a 100644 --- a/connection.cpp +++ b/connection.cpp @@ -45,6 +45,7 @@ class Connection::Private : q(nullptr) , data(new ConnectionData(serverUrl)) , isConnected(false) + , syncJob(nullptr) { } Private(Private&) = delete; ~Private() { delete data; } @@ -57,6 +58,10 @@ class Connection::Private QString username; QString password; QString userId; + + SyncJob* syncJob; + + SyncJob* startSyncJob(const QString& filter, int timeout); }; Connection::Connection(QUrl server, QObject* parent) @@ -140,6 +145,12 @@ void Connection::reconnect() loginJob->start(); } +void Connection::disconnectFromServer() +{ + d->syncJob->abandon(); + d->isConnected = false; +} + void Connection::logout() { auto job = new LogoutJob(d->data); @@ -149,27 +160,39 @@ void Connection::logout() SyncJob* Connection::sync(int timeout) { - QString filter = "{\"room\": { \"timeline\": { \"limit\": 100 } } }"; - SyncJob* syncJob = new SyncJob(d->data, d->data->lastEvent()); - syncJob->setFilter(filter); - syncJob->setTimeout(timeout); - connect( syncJob, &SyncJob::success, [=] () { - d->data->setLastEvent(syncJob->nextBatch()); - for( const auto& roomData: syncJob->roomData() ) + if (d->syncJob) + return d->syncJob; + + const QString filter = "{\"room\": { \"timeline\": { \"limit\": 100 } } }"; + auto job = d->startSyncJob(filter, timeout); + connect( job, &SyncJob::success, [=] () { + d->data->setLastEvent(job->nextBatch()); + for( const auto& roomData: job->roomData() ) { if ( Room* r = provideRoom(roomData.roomId) ) r->updateData(roomData); } + d->syncJob = nullptr; emit syncDone(); }); - connect( syncJob, &SyncJob::failure, [=] () { - if (syncJob->error() == BaseJob::ContentAccessError) - emit loginError(syncJob->errorString()); + connect( job, &SyncJob::failure, [=] () { + d->syncJob = nullptr; + if (job->error() == BaseJob::ContentAccessError) + emit loginError(job->errorString()); else - emit connectionError(syncJob->errorString()); + emit connectionError(job->errorString()); }); + return job; +} + +SyncJob* Connection::Private::startSyncJob(const QString& filter, int timeout) +{ + syncJob = new SyncJob(data, data->lastEvent()); + syncJob->setFilter(filter); + syncJob->setTimeout(timeout); syncJob->start(); return syncJob; + } void Connection::postMessage(Room* room, QString type, QString message) diff --git a/connection.h b/connection.h index bfb4d377..c221d7eb 100644 --- a/connection.h +++ b/connection.h @@ -49,6 +49,7 @@ namespace QMatrixClient Q_INVOKABLE virtual void connectToServer( QString user, QString password ); Q_INVOKABLE virtual void connectWithToken( QString userId, QString token ); Q_INVOKABLE virtual void reconnect(); + Q_INVOKABLE virtual void disconnectFromServer(); Q_INVOKABLE virtual void logout(); Q_INVOKABLE virtual SyncJob* sync(int timeout=-1); -- cgit v1.2.3