diff options
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | CMakeLists.txt | 48 | ||||
-rw-r--r-- | connectionprivate.cpp | 64 | ||||
-rw-r--r-- | connectionprivate.h | 11 | ||||
-rw-r--r-- | jobs/basejob.cpp | 173 | ||||
-rw-r--r-- | jobs/basejob.h | 152 | ||||
-rw-r--r-- | jobs/checkauthmethods.cpp | 2 | ||||
-rw-r--r-- | jobs/checkauthmethods.h | 2 | ||||
-rw-r--r-- | jobs/joinroomjob.cpp | 15 | ||||
-rw-r--r-- | jobs/joinroomjob.h | 2 | ||||
-rw-r--r-- | jobs/mediathumbnailjob.cpp | 14 | ||||
-rw-r--r-- | jobs/mediathumbnailjob.h | 3 | ||||
-rw-r--r-- | jobs/passwordlogin.cpp | 6 | ||||
-rw-r--r-- | jobs/passwordlogin.h | 2 | ||||
-rw-r--r-- | jobs/postmessagejob.cpp | 15 | ||||
-rw-r--r-- | jobs/postmessagejob.h | 2 | ||||
-rw-r--r-- | jobs/roommembersjob.cpp | 7 | ||||
-rw-r--r-- | jobs/roommembersjob.h | 4 | ||||
-rw-r--r-- | jobs/roommessagesjob.cpp | 4 | ||||
-rw-r--r-- | jobs/roommessagesjob.h | 2 | ||||
-rw-r--r-- | jobs/syncjob.cpp | 5 | ||||
-rw-r--r-- | jobs/syncjob.h | 2 | ||||
m--------- | kcoreaddons | 0 | ||||
-rw-r--r-- | libqmatrixclient.pri | 10 |
24 files changed, 283 insertions, 265 deletions
diff --git a/.gitmodules b/.gitmodules index 3a037c31..e69de29b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "kcoreaddons"] - path = kcoreaddons - url = git://anongit.kde.org/kcoreaddons.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 3745f3c2..fa5abe56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,25 +10,6 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -# Whether to build with the bundled KCoreAddons or system KCoreAddons -set( BUNDLE_KCOREADDONS "AUTO" CACHE STRING "Build own KCoreAddons, one of ON, OFF and AUTO" ) -set( KCOREADDONS_DIR "kcoreaddons" CACHE STRING "Local path to bundled KCoreAddons sources, if own KCoreAddons is built" ) - -find_package(Qt5Core 5.2.0) # For JSON (de)serialization -find_package(Qt5Network 5.2.0) # For networking -find_package(Qt5Gui 5.2.0) # For userpics - -if ( (NOT BUNDLE_KCOREADDONS STREQUAL "ON") - AND (NOT BUNDLE_KCOREADDONS STREQUAL "OFF") - AND (NOT BUNDLE_KCOREADDONS STREQUAL "AUTO") ) - message( FATAL_ERROR "BUNDLE_KCOREADDONS must be one of ON, OFF or AUTO" ) -endif () - -if ( BUNDLE_KCOREADDONS STREQUAL "AUTO" ) - find_package(KF5CoreAddons QUIET) -elseif ( BUNDLE_KCOREADDONS STREQUAL "OFF" ) - find_package(KF5CoreAddons REQUIRED) -endif () message( STATUS ) message( STATUS "================================================================================" ) @@ -37,14 +18,6 @@ message( STATUS "=============================================================== message( STATUS "Building with: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" ) message( STATUS "Install Prefix: ${CMAKE_INSTALL_PREFIX}" ) message( STATUS "Path to Qt Core: ${Qt5Core_DIR}" ) -message( STATUS "Build own KCoreAddons (BUNDLE_KCOREADDONS): ${BUNDLE_KCOREADDONS}" ) -if ( NOT BUNDLE_KCOREADDONS STREQUAL "ON" ) - if ( KF5CoreAddons_FOUND ) - message( STATUS "'- Path to system KCoreAddons: ${KF5CoreAddons_DIR}" ) - else ( KF5CoreAddons_FOUND ) - message( STATUS "'- System KCoreAddons not found, using the bundled version at ${PROJECT_SOURCE_DIR}/${KCOREADDONS_DIR}" ) - endif ( KF5CoreAddons_FOUND ) -endif ( NOT BUNDLE_KCOREADDONS STREQUAL "ON" ) message( STATUS "================================================================================" ) message( STATUS ) @@ -80,16 +53,6 @@ set(libqmatrixclient_SRCS jobs/mediathumbnailjob.cpp jobs/logoutjob.cpp ) -# Add bundled KCoreAddons sources if we haven't found the system sources -# or if we ignore them -if ( NOT KF5CoreAddons_FOUND ) - set (libqmatrixclient_SRCS ${libqmatrixclient_SRCS} - ${KCOREADDONS_DIR}/src/lib/jobs/kjob.cpp - ${KCOREADDONS_DIR}/src/lib/jobs/kcompositejob.cpp - ${KCOREADDONS_DIR}/src/lib/jobs/kjobtrackerinterface.cpp - ${KCOREADDONS_DIR}/src/lib/jobs/kjobuidelegate.cpp - ) -endif ( NOT KF5CoreAddons_FOUND ) add_library(qmatrixclient ${libqmatrixclient_SRCS}) @@ -109,14 +72,3 @@ else ( CMAKE_VERSION VERSION_LESS "3.1" ) endif ( CMAKE_VERSION VERSION_LESS "3.1" ) target_link_libraries(qmatrixclient Qt5::Core Qt5::Network Qt5::Gui) -if ( KF5CoreAddons_FOUND ) - # The proper way of doing things would be to make a separate config.h.in - # file and use configure_file() command here to generate config.h with - # needed C++ preprocessor macros. If we have more than one or two - # dependencies like that, we should turn to that more scalable way. - # As for now, passing a macro through -D is easier to observe and maintain. - target_compile_definitions ( qmatrixclient PRIVATE USING_SYSTEM_KCOREADDONS ) - target_link_libraries(qmatrixclient KF5::CoreAddons) -else ( KF5CoreAddons_FOUND ) - include_directories( ${KCOREADDONS_DIR}/src/lib/jobs ) -endif ( KF5CoreAddons_FOUND ) diff --git a/connectionprivate.cpp b/connectionprivate.cpp index 9e16465b..0f9f4539 100644 --- a/connectionprivate.cpp +++ b/connectionprivate.cpp @@ -115,69 +115,7 @@ Room* ConnectionPrivate::provideRoom(QString id) return room; } -//void ConnectionPrivate::connectDone(KJob* job) -//{ -// PasswordLogin* realJob = static_cast<PasswordLogin*>(job); -// if( !realJob->error() ) -// { -// isConnected = true; -// userId = realJob->id(); -// qDebug() << "Our user ID: " << userId; -// emit q->connected(); -// } -// else { -// emit q->loginError( job->errorString() ); -// } -//} - -//void ConnectionPrivate::reconnectDone(KJob* job) -//{ -// PasswordLogin* realJob = static_cast<PasswordLogin*>(job); -// if( !realJob->error() ) -// { -// userId = realJob->id(); -// emit q->reconnected(); -// } -// else { -// emit q->loginError( job->errorString() ); -// isConnected = false; -// } -//} - -//void ConnectionPrivate::syncDone(KJob* job) -//{ -// SyncJob* syncJob = static_cast<SyncJob*>(job); -// if( !syncJob->error() ) -// { -// data->setLastEvent(syncJob->nextBatch()); -// processRooms(syncJob->roomData()); -// emit q->syncDone(); -// } -// else { -// if( syncJob->error() == BaseJob::NetworkError ) -// emit q->connectionError( syncJob->errorString() ); -// else -// qDebug() << "syncJob failed, error:" << syncJob->error(); -// } -//} - -//void ConnectionPrivate::gotJoinRoom(KJob* job) -//{ -// qDebug() << "gotJoinRoom"; -// JoinRoomJob* joinJob = static_cast<JoinRoomJob*>(job); -// if( !joinJob->error() ) -// { -// if ( Room* r = provideRoom(joinJob->roomId()) ) -// emit q->joinedRoom(r); -// } -// else -// { -// if( joinJob->error() == BaseJob::NetworkError ) -// emit q->connectionError( joinJob->errorString() ); -// } -//} - -void ConnectionPrivate::gotRoomMembers(KJob* job) +void ConnectionPrivate::gotRoomMembers(BaseJob* job) { RoomMembersJob* membersJob = static_cast<RoomMembersJob*>(job); if( !membersJob->error() ) diff --git a/connectionprivate.h b/connectionprivate.h index 8e37a934..d1199081 100644 --- a/connectionprivate.h +++ b/connectionprivate.h @@ -19,15 +19,12 @@ #ifndef QMATRIXCLIENT_CONNECTIONPRIVATE_H #define QMATRIXCLIENT_CONNECTIONPRIVATE_H -class KJob; - #include <QtCore/QObject> #include <QtCore/QHash> #include <QtCore/QJsonObject> #include "connection.h" #include "connectiondata.h" -#include "jobs/syncjob.h" namespace QMatrixClient { @@ -35,6 +32,8 @@ namespace QMatrixClient class Event; class State; class User; + class BaseJob; + class SyncRoomData; class ConnectionPrivate : public QObject { @@ -60,11 +59,7 @@ namespace QMatrixClient QString userId; public slots: -// void connectDone(KJob* job); -// void reconnectDone(KJob* job); -// void syncDone(KJob* job); -// void gotJoinRoom(KJob* job); - void gotRoomMembers(KJob* job); + void gotRoomMembers(BaseJob* job); }; } diff --git a/jobs/basejob.cpp b/jobs/basejob.cpp index 6c68ab66..e0dff287 100644 --- a/jobs/basejob.cpp +++ b/jobs/basejob.cpp @@ -19,50 +19,56 @@ #include "basejob.h" #include <QtNetwork/QNetworkAccessManager> -#include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkRequest> +#include <QtNetwork/QNetworkReply> +#include <QtNetwork/QSslError> #include <QtCore/QTimer> #include "../connectiondata.h" using namespace QMatrixClient; +struct NetworkReplyDeleter : public QScopedPointerDeleteLater +{ + static inline void cleanup(QNetworkReply* reply) + { + if (reply && reply->isRunning()) + reply->abort(); + QScopedPointerDeleteLater::cleanup(reply); + } +}; + class BaseJob::Private { public: Private(ConnectionData* c, JobHttpType t, bool nt) - : connection(c), reply(nullptr), type(t), needsToken(nt) {} + : connection(c), type(t), needsToken(nt) + , reply(nullptr), status(NoError) + {} ConnectionData* connection; - QNetworkReply* reply; JobHttpType type; bool needsToken; + + QScopedPointer<QNetworkReply, NetworkReplyDeleter> reply; + Status status; }; +inline QDebug operator<<(QDebug dbg, BaseJob* j) +{ + return dbg << "Job" << j->objectName(); +} + BaseJob::BaseJob(ConnectionData* connection, JobHttpType type, QString name, bool needsToken) : d(new Private(connection, type, needsToken)) { - // Work around KJob inability to separate success and failure signals - connect(this, &BaseJob::result, [this]() { - if (error() == NoError) - emit success(this); - else - emit failure(this); - }); setObjectName(name); - qDebug() << "Job" << objectName() << " created"; + qDebug() << this << "created"; } BaseJob::~BaseJob() { - if( d->reply ) - { - if( d->reply->isRunning() ) - d->reply->abort(); - d->reply->deleteLater(); - } - delete d; - qDebug() << "Job" << objectName() << " destroyed"; + qDebug() << this << "destroyed"; } ConnectionData* BaseJob::connection() const @@ -80,11 +86,6 @@ QUrlQuery BaseJob::query() const return QUrlQuery(); } -void BaseJob::parseJson(const QJsonDocument& data) -{ - emitResult(); -} - void BaseJob::start() { QUrl url = d->connection->baseUrl(); @@ -103,75 +104,127 @@ void BaseJob::start() switch( d->type ) { case JobHttpType::GetJob: - d->reply = d->connection->nam()->get(req); + d->reply.reset( d->connection->nam()->get(req) ); break; case JobHttpType::PostJob: - d->reply = d->connection->nam()->post(req, data.toJson()); + d->reply.reset( d->connection->nam()->post(req, data.toJson()) ); break; case JobHttpType::PutJob: - d->reply = d->connection->nam()->put(req, data.toJson()); + d->reply.reset( d->connection->nam()->put(req, data.toJson()) ); break; } - connect( d->reply, &QNetworkReply::sslErrors, this, &BaseJob::sslErrors ); - connect( d->reply, &QNetworkReply::finished, this, &BaseJob::gotReply ); + connect( d->reply.data(), &QNetworkReply::sslErrors, this, &BaseJob::sslErrors ); + connect( d->reply.data(), &QNetworkReply::finished, this, &BaseJob::gotReply ); QTimer::singleShot( 120*1000, this, SLOT(timeout()) ); // connect( d->reply, static_cast<void(QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), // this, &BaseJob::networkError ); // http://doc.qt.io/qt-5/qnetworkreply.html#error-1 } -void BaseJob::fail(int errorCode, QString errorString) +void BaseJob::gotReply() { - setError( errorCode ); - setErrorText( errorString ); - if( d->reply && d->reply->isRunning() ) - d->reply->abort(); - qWarning() << "Job" << objectName() << "failed:" << errorString; - emitResult(); -} + setStatus(checkReply(d->reply.data())); + if (status().good()) + setStatus(parseReply(d->reply->readAll())); -QNetworkReply* BaseJob::networkReply() const -{ - return d->reply; + finishJob(true); } -// void BaseJob::networkError(QNetworkReply::NetworkError code) -// { -// fail( KJob::UserDefinedError+1, d->reply->errorString() ); -// } - -void BaseJob::gotReply() +BaseJob::Status BaseJob::checkReply(QNetworkReply* reply) const { - switch( d->reply->error() ) + switch( reply->error() ) { case QNetworkReply::NoError: - break; // All good, go to the normal flow after the switch() + return NoError; case QNetworkReply::AuthenticationRequiredError: case QNetworkReply::ContentAccessDenied: case QNetworkReply::ContentOperationNotPermittedError: - qDebug() << "Content access error, Qt error code:" << d->reply->error(); - fail( ContentAccessError, d->reply->errorString() ); - return; + return { ContentAccessError, reply->errorString() }; default: - qDebug() << "NetworkError, Qt error code:" << d->reply->error(); - fail( NetworkError, d->reply->errorString() ); - return; + return { NetworkError, reply->errorString() }; } +} +BaseJob::Status BaseJob::parseReply(QByteArray data) +{ QJsonParseError error; - QJsonDocument data = QJsonDocument::fromJson(d->reply->readAll(), &error); - if( error.error != QJsonParseError::NoError ) + QJsonDocument json = QJsonDocument::fromJson(data, &error); + if( error.error == QJsonParseError::NoError ) + return parseJson(json); + else + return { JsonParseError, error.errorString() }; +} + +BaseJob::Status BaseJob::parseJson(const QJsonDocument&) +{ + return Success; +} + +void BaseJob::finishJob(bool emitResult) +{ + if (!d->reply) + { + qWarning() << this << "finishes with empty network reply"; + } + else if (d->reply->isRunning()) + { + qWarning() << this << "finishes without ready network reply"; + d->reply->disconnect(this); // Ignore whatever comes from the reply + } + + // Notify those that are interested in any completion of the job (including killing) + emit finished(this); + + if (emitResult) { + emit result(this); + if (error()) + emit failure(this); + else + emit success(this); + } + + deleteLater(); +} + +BaseJob::Status BaseJob::status() const +{ + return d->status; +} + +int BaseJob::error() const +{ + return d->status.code; +} + +QString BaseJob::errorString() const +{ + return d->status.message; +} + +void BaseJob::setStatus(Status s) +{ + d->status = s; + if (!s.good()) { - fail( JsonParseError, error.errorString() ); - return; + qWarning() << this << "status" << s.code << ":" << s.message; } - parseJson(data); +} + +void BaseJob::setStatus(int code, QString message) +{ + setStatus({ code, message }); +} + +void BaseJob::abandon() +{ + finishJob(false); } void BaseJob::timeout() { - fail( TimeoutError, "The job has timed out" ); + setStatus( TimeoutError, "The job has timed out" ); + finishJob(true); } void BaseJob::sslErrors(const QList<QSslError>& errors) diff --git a/jobs/basejob.h b/jobs/basejob.h index 150d39e8..07b1f1dd 100644 --- a/jobs/basejob.h +++ b/jobs/basejob.h @@ -19,16 +19,14 @@ #ifndef QMATRIXCLIENT_BASEJOB_H #define QMATRIXCLIENT_BASEJOB_H -#ifdef USING_SYSTEM_KCOREADDONS -#include <KCoreAddons/KJob> -#else -#include "kjob.h" -#endif // KCOREADDONS_FOUND - +#include <QtCore/QObject> #include <QtCore/QJsonDocument> #include <QtCore/QJsonObject> #include <QtCore/QUrlQuery> -#include <QtNetwork/QNetworkReply> +#include <QtCore/QScopedPointer> + +class QNetworkReply; +class QSslError; namespace QMatrixClient { @@ -36,28 +34,104 @@ namespace QMatrixClient enum class JobHttpType { GetJob, PutJob, PostJob }; - class BaseJob: public KJob + class BaseJob: public QObject { Q_OBJECT public: + /* Just in case, the values are compatible with KJob + * (which BaseJob used to inherit from). */ + enum StatusCode { NoError = 0 // To be compatible with Qt conventions + , Success = 0 + , ErrorLevel = 100 // Errors have codes starting from this + , NetworkError = 100 + , JsonParseError + , TimeoutError + , ContentAccessError + , UserDefinedError = 200 + }; + + /** + * This structure stores the status of a server call job. The status consists + * of a code, that is described (but not delimited) by the respective enum, + * and a freeform message. + * + * To extend the list of error codes, define an (anonymous) enum + * along the lines of StatusCode, with additional values + * starting at UserDefinedError + */ + class Status + { + public: + Status(StatusCode c) : code(c) { } + Status(int c, QString m) : code(c), message(m) { } + + bool good() const { return code < ErrorLevel; } + + int code; + QString message; + }; + + public: BaseJob(ConnectionData* connection, JobHttpType type, QString name, bool needsToken=true); virtual ~BaseJob(); - void start() override; + void start(); + + /** + * Abandons the result of this job, arrived or unarrived. + * + * This aborts waiting for a reply from the server (if there was + * any pending) and deletes the job object. It is always done quietly + * (as opposed to KJob::kill() that can trigger emitting the result). + */ + void abandon(); - enum ErrorCode { NetworkError = KJob::UserDefinedError, - JsonParseError, TimeoutError, ContentAccessError, - UserDefinedError = 512 }; + Status status() const; + int error() const; + virtual QString errorString() const; signals: /** - * Emitted together with KJob::result() but only if there's no error. + * Emitted when the job is finished, in any case. It is used to notify + * observers that the job is terminated and that progress can be hidden. + * + * This should not be emitted directly by subclasses; + * use emitResult() instead. + * + * In general, to be notified of a job's completion, client code + * should connect to success() and failure() + * rather than finished(), so that kill() is indeed quiet. + * However if you store a list of jobs and they might get killed + * silently, then you must connect to this instead of result(), + * to avoid dangling pointers in your list. + * + * @param job the job that emitted this signal + * @internal + * + * @see success, failure + */ + void finished(BaseJob* job); + + /** + * Emitted when the job is finished (except when killed). + * + * Use error to know if the job was finished with error. + * + * @param job the job that emitted this signal + * + * @see success, failure + */ + void result(BaseJob* job); + + /** + * Emitted together with result() but only if there's no error. */ void success(BaseJob*); + /** - * Emitted together with KJob::result() if there's an error. - * Same as result(), this won't be emitted in case of kill(Quietly). + * Emitted together with result() if there's an error. + * Same as result(), this won't be emitted in case of kill(). */ void failure(BaseJob*); @@ -68,23 +142,55 @@ namespace QMatrixClient virtual QString apiPath() const = 0; virtual QUrlQuery query() const; virtual QJsonObject data() const; - virtual void parseJson(const QJsonDocument& data); - - void fail( int errorCode, QString errorString ); - QNetworkReply* networkReply() const; + /** + * Used by gotReply() slot to check the received reply for general + * issues such as network errors or access denial. + * Returning anything except NoError/Success prevents + * further parseReply()/parseJson() invocation. + * + * @param reply the reply received from the server + * @return the result of checking the reply + * + * @see gotReply + */ + virtual Status checkReply(QNetworkReply* reply) const; + + /** + * Processes the reply. By default, parses the reply into + * a QJsonDocument and calls parseJson() if it's a valid JSON. + * + * @param data raw contents of a HTTP reply from the server (without headers) + * + * @see gotReply, parseJson + */ + virtual Status parseReply(QByteArray data); + + /** + * Processes the JSON document received from the Matrix server. + * By default returns succesful status without analysing the JSON. + * + * @param json valid JSON document received from the server + * + * @see parseReply + */ + virtual Status parseJson(const QJsonDocument&); + void setStatus(Status s); + void setStatus(int code, QString message); + protected slots: - virtual void gotReply(); void timeout(); void sslErrors(const QList<QSslError>& errors); - //void networkError(QNetworkReply::NetworkError code); - + private slots: + void gotReply(); private: + void finishJob(bool emitResult); + class Private; - Private* d; + QScopedPointer<Private> d; }; } diff --git a/jobs/checkauthmethods.cpp b/jobs/checkauthmethods.cpp index 55d8632a..f471c135 100644 --- a/jobs/checkauthmethods.cpp +++ b/jobs/checkauthmethods.cpp @@ -57,7 +57,7 @@ QString CheckAuthMethods::apiPath() const return "_matrix/client/r0/login"; } -void CheckAuthMethods::parseJson(const QJsonDocument& data) +BaseJob::Status CheckAuthMethods::parseJson(const QJsonDocument& data) { // TODO } diff --git a/jobs/checkauthmethods.h b/jobs/checkauthmethods.h index 2951e27f..36eaa01a 100644 --- a/jobs/checkauthmethods.h +++ b/jobs/checkauthmethods.h @@ -35,7 +35,7 @@ namespace QMatrixClient protected: QString apiPath() const override; - void parseJson(const QJsonDocument& data) override; + Status parseJson(const QJsonDocument& data) override; private: class Private; diff --git a/jobs/joinroomjob.cpp b/jobs/joinroomjob.cpp index 799d4926..8848aa70 100644 --- a/jobs/joinroomjob.cpp +++ b/jobs/joinroomjob.cpp @@ -54,18 +54,15 @@ QString JoinRoomJob::apiPath() const return QString("_matrix/client/r0/join/%1").arg(d->roomAlias); } -void JoinRoomJob::parseJson(const QJsonDocument& data) +BaseJob::Status JoinRoomJob::parseJson(const QJsonDocument& data) { QJsonObject json = data.object(); - if( !json.contains("room_id") ) - { - fail( BaseJob::UserDefinedError, "Something went wrong..." ); - qDebug() << data; - return; - } - else + if( json.contains("room_id") ) { d->roomId = json.value("room_id").toString(); + return Success; } - emitResult(); + + qDebug() << data; + return { UserDefinedError, "No room_id in the JSON response" }; } diff --git a/jobs/joinroomjob.h b/jobs/joinroomjob.h index 1329ca56..a6f4af21 100644 --- a/jobs/joinroomjob.h +++ b/jobs/joinroomjob.h @@ -35,7 +35,7 @@ namespace QMatrixClient protected: QString apiPath() const override; - void parseJson(const QJsonDocument& data) override; + Status parseJson(const QJsonDocument& data) override; private: class Private; diff --git a/jobs/mediathumbnailjob.cpp b/jobs/mediathumbnailjob.cpp index 48ed0ffb..1e434fbc 100644 --- a/jobs/mediathumbnailjob.cpp +++ b/jobs/mediathumbnailjob.cpp @@ -70,19 +70,11 @@ QUrlQuery MediaThumbnailJob::query() const return query; } -void MediaThumbnailJob::gotReply() +BaseJob::Status MediaThumbnailJob::parseReply(QByteArray data) { - if( networkReply()->error() != QNetworkReply::NoError ) - { - qDebug() << "NetworkError!!!"; - qDebug() << networkReply()->errorString(); - fail( NetworkError, networkReply()->errorString() ); - return; - } - - if( !d->thumbnail.loadFromData( networkReply()->readAll() ) ) + if( !d->thumbnail.loadFromData(data) ) { qDebug() << "MediaThumbnailJob: could not read image data"; } - emitResult(); + return Success; } diff --git a/jobs/mediathumbnailjob.h b/jobs/mediathumbnailjob.h index 541163ed..3babf845 100644 --- a/jobs/mediathumbnailjob.h +++ b/jobs/mediathumbnailjob.h @@ -40,8 +40,7 @@ namespace QMatrixClient QString apiPath() const override; QUrlQuery query() const override; - protected slots: - void gotReply() override; + Status parseReply(QByteArray data) override; private: class Private; diff --git a/jobs/passwordlogin.cpp b/jobs/passwordlogin.cpp index 231dcce5..c85e4c13 100644 --- a/jobs/passwordlogin.cpp +++ b/jobs/passwordlogin.cpp @@ -80,15 +80,15 @@ QJsonObject PasswordLogin::data() const return json; } -void PasswordLogin::parseJson(const QJsonDocument& data) +BaseJob::Status PasswordLogin::parseJson(const QJsonDocument& data) { QJsonObject json = data.object(); if( !json.contains("access_token") || !json.contains("home_server") || !json.contains("user_id") ) { - fail( BaseJob::UserDefinedError, "Unexpected data" ); + return { UserDefinedError, "No expected data" }; } d->returned_token = json.value("access_token").toString(); d->returned_server = json.value("home_server").toString(); d->returned_id = json.value("user_id").toString(); - emitResult(); + return Success; } diff --git a/jobs/passwordlogin.h b/jobs/passwordlogin.h index 75a45cae..d7e42725 100644 --- a/jobs/passwordlogin.h +++ b/jobs/passwordlogin.h @@ -38,7 +38,7 @@ namespace QMatrixClient protected: QString apiPath() const override; QJsonObject data() const override; - void parseJson(const QJsonDocument& data) override; + Status parseJson(const QJsonDocument& data) override; private: class Private; diff --git a/jobs/postmessagejob.cpp b/jobs/postmessagejob.cpp index cf9b94fd..0a38da62 100644 --- a/jobs/postmessagejob.cpp +++ b/jobs/postmessagejob.cpp @@ -61,14 +61,11 @@ QJsonObject PostMessageJob::data() const return json; } -void PostMessageJob::parseJson(const QJsonDocument& data) +BaseJob::Status PostMessageJob::parseJson(const QJsonDocument& data) { - QJsonObject json = data.object(); - if( !json.contains("event_id") ) - { - fail( BaseJob::UserDefinedError, "Something went wrong..." ); - qDebug() << data; - return; - } - emitResult(); + if( data.object().contains("event_id") ) + return Success; + + qDebug() << data; + return { UserDefinedError, "No event_id in the JSON response" }; } diff --git a/jobs/postmessagejob.h b/jobs/postmessagejob.h index 9d354240..73d72020 100644 --- a/jobs/postmessagejob.h +++ b/jobs/postmessagejob.h @@ -35,7 +35,7 @@ namespace QMatrixClient protected: QString apiPath() const override; QJsonObject data() const override; - void parseJson(const QJsonDocument& data) override; + Status parseJson(const QJsonDocument& data) override; private: class Private; diff --git a/jobs/roommembersjob.cpp b/jobs/roommembersjob.cpp index 002be75b..7fc44c63 100644 --- a/jobs/roommembersjob.cpp +++ b/jobs/roommembersjob.cpp @@ -56,10 +56,9 @@ QString RoomMembersJob::apiPath() const return QString("_matrix/client/r0/rooms/%1/members").arg(d->room->id()); } -void RoomMembersJob::parseJson(const QJsonDocument& data) +BaseJob::Status RoomMembersJob::parseJson(const QJsonDocument& data) { - QJsonObject obj = data.object(); - QJsonArray chunk = obj.value("chunk").toArray(); + QJsonArray chunk = data.object().value("chunk").toArray(); for( const QJsonValue& val : chunk ) { State* state = State::fromJson(val.toObject()); @@ -67,5 +66,5 @@ void RoomMembersJob::parseJson(const QJsonDocument& data) d->states.append(state); } qDebug() << "States: " << d->states.count(); - emitResult(); + return Success; } diff --git a/jobs/roommembersjob.h b/jobs/roommembersjob.h index ffae4309..04803d67 100644 --- a/jobs/roommembersjob.h +++ b/jobs/roommembersjob.h @@ -35,8 +35,8 @@ namespace QMatrixClient QList<State*> states(); protected: - virtual QString apiPath() const override; - virtual void parseJson(const QJsonDocument& data) override; + QString apiPath() const override; + Status parseJson(const QJsonDocument& data) override; private: class Private; diff --git a/jobs/roommessagesjob.cpp b/jobs/roommessagesjob.cpp index f1943d2c..ba075007 100644 --- a/jobs/roommessagesjob.cpp +++ b/jobs/roommessagesjob.cpp @@ -81,10 +81,10 @@ QUrlQuery RoomMessagesJob::query() const return query; } -void RoomMessagesJob::parseJson(const QJsonDocument& data) +BaseJob::Status RoomMessagesJob::parseJson(const QJsonDocument& data) { QJsonObject obj = data.object(); d->events = eventListFromJson(obj.value("chunk").toArray()); d->end = obj.value("end").toString(); - emitResult(); + return Success; } diff --git a/jobs/roommessagesjob.h b/jobs/roommessagesjob.h index c068f235..52a72f70 100644 --- a/jobs/roommessagesjob.h +++ b/jobs/roommessagesjob.h @@ -40,7 +40,7 @@ namespace QMatrixClient protected: QString apiPath() const override; QUrlQuery query() const override; - void parseJson(const QJsonDocument& data) override; + Status parseJson(const QJsonDocument& data) override; private: class Private; diff --git a/jobs/syncjob.cpp b/jobs/syncjob.cpp index 3a7573bc..3bd1f0c8 100644 --- a/jobs/syncjob.cpp +++ b/jobs/syncjob.cpp @@ -110,7 +110,7 @@ QUrlQuery SyncJob::query() const return query; } -void SyncJob::parseJson(const QJsonDocument& data) +BaseJob::Status SyncJob::parseJson(const QJsonDocument& data) { QJsonObject json = data.object(); d->nextBatch = json.value("next_batch").toString(); @@ -134,8 +134,7 @@ void SyncJob::parseJson(const QJsonDocument& data) } } - emitResult(); - qDebug() << objectName() << ": processing complete"; + return Success; } void SyncRoomData::EventList::fromJson(const QJsonObject& roomContents) diff --git a/jobs/syncjob.h b/jobs/syncjob.h index c5204c63..6e6b4f7c 100644 --- a/jobs/syncjob.h +++ b/jobs/syncjob.h @@ -73,7 +73,7 @@ namespace QMatrixClient protected: QString apiPath() const override; QUrlQuery query() const override; - void parseJson(const QJsonDocument& data) override; + Status parseJson(const QJsonDocument& data) override; private: class Private; diff --git a/kcoreaddons b/kcoreaddons deleted file mode 160000 -Subproject 7ac7a605923f0bb2f0f367f6069a101a24bead9 diff --git a/libqmatrixclient.pri b/libqmatrixclient.pri index 1290aa19..2648ac6b 100644 --- a/libqmatrixclient.pri +++ b/libqmatrixclient.pri @@ -32,10 +32,7 @@ HEADERS += \ $$PWD/jobs/roommessagesjob.h \ $$PWD/jobs/syncjob.h \ $$PWD/jobs/mediathumbnailjob.h \ - $$PWD/kcoreaddons/src/lib/jobs/kjob.h \ - $$PWD/kcoreaddons/src/lib/jobs/kcompositejob.h \ - $$PWD/kcoreaddons/src/lib/jobs/kjobtrackerinterface.h \ - $$PWD/kcoreaddons/src/lib/jobs/kjobuidelegate.h + $$PWD/jobs/logoutjob.h SOURCES += \ $$PWD/connectiondata.cpp \ @@ -66,7 +63,4 @@ SOURCES += \ $$PWD/jobs/roommessagesjob.cpp \ $$PWD/jobs/syncjob.cpp \ $$PWD/jobs/mediathumbnailjob.cpp \ - $$PWD/kcoreaddons/src/lib/jobs/kjob.cpp \ - $$PWD/kcoreaddons/src/lib/jobs/kcompositejob.cpp \ - $$PWD/kcoreaddons/src/lib/jobs/kjobtrackerinterface.cpp \ - $$PWD/kcoreaddons/src/lib/jobs/kjobuidelegate.cpp + $$PWD/jobs/logoutjob.cpp |