From e1bd600cffd353cc9d979effdbbb16c2c2280573 Mon Sep 17 00:00:00 2001
From: Armin Felder <armin.felder@osalliance.com>
Date: Sun, 8 Apr 2018 14:44:55 +0200
Subject: [PATCH] fixed issue with QNetworkAccessManager in wrong thread, and
 dirty hack for ios rsume with sessiontoken

---
 api/restapi.cpp      | 14 +++++++-------
 api/restapi.h        |  6 +++---
 rocketchatserver.cpp |  6 ++++++
 3 files changed, 16 insertions(+), 10 deletions(-)

diff --git a/api/restapi.cpp b/api/restapi.cpp
index d64a346..aa8aa57 100755
--- a/api/restapi.cpp
+++ b/api/restapi.cpp
@@ -24,15 +24,15 @@
 RestApi::RestApi( QObject *parent, const QString &pBaseUrl, const QString &pApiUri ) : QObject( parent ),  mApiUri( pApiUri ), mBaseUrl( pBaseUrl )
 {
     qRegisterMetaType<RestApiRequest>( "RestApiRequest" );
-    init();
 }
 
 void RestApi::init()
 {
+    mNam = new QNetworkAccessManager(this);
     mApiLogin = QStringLiteral( "/login" );
     mApiLogoff = QStringLiteral( "/logout" );
     mCookieJar = new QNetworkCookieJar;
-    mNam.setCookieJar( mCookieJar );
+    mNam->setCookieJar( mCookieJar );
     mNetworkReplies.reserve( 100 );
     mResponseBinding.reserve( 100 );
 
@@ -41,7 +41,7 @@ void RestApi::init()
     qRegisterMetaType<RestApiRequest>( "RestApiRequest" );
 
     mStorage = PersistanceLayer::instance();
-    connect( &mNam, &QNetworkAccessManager::finished, this, &RestApi::processNetworkRequest, Qt::UniqueConnection );
+    connect( mNam, &QNetworkAccessManager::finished, this, &RestApi::processNetworkRequest, Qt::UniqueConnection );
     connect( this, &RestApi::sendRequestSignal, this, &RestApi::sendRequestSlot, Qt::UniqueConnection );
 }
 
@@ -60,7 +60,7 @@ void RestApi::login( const QString &pUsername, const QString &pPassword )
         request.setHeader( QNetworkRequest::ContentTypeHeader, QString( QStringLiteral( "application/x-www-form-urlencoded" ) ) );
         request.setUrl( url );
         qDebug() << "send rest api login to " + mApiUri + mApiLogin;
-        mNetworkReplies[mNam.post( request, data )] = methods::LOGIN;
+        mNetworkReplies[mNam->post( request, data )] = methods::LOGIN;
     } else {
         mLoginErrorString = QStringLiteral( "no username or password provided" );
         emit( loginError() );
@@ -79,7 +79,7 @@ void RestApi::logout()
     request.setRawHeader( QByteArray( QByteArrayLiteral( "X-User-Id" ) ), QByteArray( mUserId.toLocal8Bit() ) );
 
 
-    // mNetworkReplies[mNam.get( request )] = methods::LOGOFF;
+    // mNetworkReplies[mNam->get( request )] = methods::LOGOFF;
 
 }
 
@@ -210,7 +210,7 @@ QNetworkReply *RestApi::post( const QString &pUrl, const QByteArray &pData, cons
     request.setAttribute( QNetworkRequest::HttpPipeliningAllowedAttribute, true );
     request.setAttribute( QNetworkRequest::HTTP2AllowedAttribute, true );
     request.setAttribute( QNetworkRequest::SpdyAllowedAttribute, true );
-    QNetworkReply *reply = mNam.post( request, pData );
+    QNetworkReply *reply = mNam->post( request, pData );
     return reply;
 }
 
@@ -225,7 +225,7 @@ QNetworkReply *RestApi::get( const QString &pUrl, const QString &pMimeType )
     request.setAttribute( QNetworkRequest::HTTP2AllowedAttribute, true );
     request.setAttribute( QNetworkRequest::SpdyAllowedAttribute, true );
 
-    QNetworkReply *reply = mNam.get( request );
+    QNetworkReply *reply = mNam->get( request );
     return reply;
 }
 
diff --git a/api/restapi.h b/api/restapi.h
index 346e479..e2f82f7 100755
--- a/api/restapi.h
+++ b/api/restapi.h
@@ -84,9 +84,9 @@ class RestApi: public QObject
         };
 
 
-        QNetworkCookieJar *mCookieJar;
+        QNetworkCookieJar *mCookieJar = nullptr;
 
-        QNetworkAccessManager mNam;
+        QNetworkAccessManager *mNam = nullptr;
 
         QHash<QNetworkReply *, methods> mNetworkReplies;
         QHash<QNetworkReply *, RestApiRequest> mResponseBinding;
@@ -113,6 +113,7 @@ class RestApi: public QObject
 
     public slots:
         void slotError( QNetworkReply::NetworkError error );
+        void init();
     signals:
         void loggedIn();
         void fileDownloaded( QString pUrl, QString pTempfile );
@@ -122,7 +123,6 @@ class RestApi: public QObject
 
     protected:
         void processDownload( QNetworkReply *pReply );
-        void init();
 };
 
 #endif // RESTAPI_H
diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp
index 0b58700..9439ea4 100755
--- a/rocketchatserver.cpp
+++ b/rocketchatserver.cpp
@@ -70,6 +70,8 @@ void RocketChatServerData::init()
 
     mChannels = new ChannelRepository( channelsModel, channelsModel, groupsModel, mMessagesModel );
 
+    QMetaObject::invokeMethod(mRestApi,"init");
+
     connect( mDdpApi, &MeteorDDP::messageReceived, this, &RocketChatServerData::onDDPMessageReceived, Qt::UniqueConnection );
     connect( mDdpApi, &MeteorDDP::ddpConnected, this, &RocketChatServerData::onDDPConnected, Qt::UniqueConnection );
     connect( mDdpApi, &MeteorDDP::ddpDisconnected, this, &RocketChatServerData::onDDPDisonnected, Qt::UniqueConnection );
@@ -657,7 +659,11 @@ void RocketChatServerData::loginWithToken( const QString &pUsername, const QStri
 
         request->setSuccess( success );
         request->setError( error );
+#ifdef Q_OS_IOS
+    mDdpApi->sendRequest(request);
+#else
         sendDdprequest( request, true, true );
+#endif
         this->mUsername = pUsername;
     } else {
         qDebug() << "empty token";
-- 
GitLab