diff --git a/src/gui/accountstate.cpp b/src/gui/accountstate.cpp index 600650fa5..289717f4b 100644 --- a/src/gui/accountstate.cpp +++ b/src/gui/accountstate.cpp @@ -179,6 +179,15 @@ void AccountState::checkConnectivity() conValidator->checkAuthentication(); } else { // Check the server and then the auth. + +#ifdef Q_OS_WIN + // There seems to be a bug in Qt on Windows where QNAM sometimes stops + // working correctly after the computer woke up from sleep. See #2895 #2899 + // and #2973. + // As an attempted workaround, reset the QNAM regularly if the account is + // disconnected. + account()->resetNetworkAccessManager(); +#endif conValidator->checkServerAndAuth(); } } diff --git a/src/libsync/account.cpp b/src/libsync/account.cpp index 5d2db3475..990b482d2 100644 --- a/src/libsync/account.cpp +++ b/src/libsync/account.cpp @@ -271,6 +271,21 @@ void Account::clearCookieJar() _am->setCookieJar(new CookieJar); } +void Account::resetNetworkAccessManager() +{ + if (!_credentials || !_am) { + return; + } + + qDebug() << "Resetting QNAM"; + QNetworkCookieJar* jar = _am->cookieJar(); + _am->deleteLater(); + _am = _credentials->getQNAM(); + _am->setCookieJar(jar); // takes ownership of the old cookie jar + connect(_am, SIGNAL(sslErrors(QNetworkReply*,QList)), + SLOT(slotHandleErrors(QNetworkReply*,QList))); +} + QNetworkAccessManager *Account::networkAccessManager() { return _am; diff --git a/src/libsync/account.h b/src/libsync/account.h index 1397195dc..3d8604f2b 100644 --- a/src/libsync/account.h +++ b/src/libsync/account.h @@ -156,6 +156,7 @@ public: void clearCookieJar(); + void resetNetworkAccessManager(); QNetworkAccessManager* networkAccessManager(); /// Called by network jobs on credential errors.