--- qnetworkaccessmanager.cpp 2016-01-12 04:44:48.682566314 +1000 +++ /home/phablet/qtbase-opensource-src-5.4.1+dfsg/src/network/access/qnetworkaccessmanager.cpp 2016-01-12 15:01:11.626152123 +1000 @@ -450,6 +450,9 @@ // connect(&d->networkConfigurationManager, SIGNAL(onlineStateChanged(bool)), SLOT(_q_onlineStateChanged(bool))); + connect(&d->networkConfigurationManager, SIGNAL(configurationChanged(const QNetworkConfiguration &)), + SLOT(_q_configurationChanged(const QNetworkConfiguration &))); + #endif } @@ -1582,6 +1585,15 @@ emit q->networkSessionConnected(); lastSessionState = state; + if (online && state == QNetworkSession::Disconnected) { + Q_FOREACH (const QNetworkConfiguration &cfg, networkConfigurationManager.allConfigurations()) { + if (cfg.state().testFlag(QNetworkConfiguration::Active)) { + online = true; + return; + } + } + } + if (online) { if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) { online = false; @@ -1612,8 +1624,8 @@ } else { if (online != isOnline) { if (isOnline) { - networkSessionStrongRef.clear(); - networkSessionWeakRef.clear(); + _q_networkSessionClosed(); + createSession(q->configuration()); } online = isOnline; } @@ -1638,6 +1650,30 @@ } } +void QNetworkAccessManagerPrivate::_q_configurationChanged(const QNetworkConfiguration &configuration) +{ + if (configuration.state().testFlag(QNetworkConfiguration::Active)) { + if (!onlineConfigurations.contains(configuration.identifier())) { + + QSharedPointer session(getNetworkSession()); + if (session) { + if (session->configuration().identifier() != networkConfiguration.identifier() + && online) { + + onlineConfigurations.insert(configuration.identifier()); + //this one disconnected but another one is online, + // close and create new session + _q_networkSessionClosed(); + createSession(configuration); + } + } + } + + } else if (onlineConfigurations.contains(configuration.identifier())) { + //this one is disconnecting + onlineConfigurations.remove(configuration.identifier()); + } +} #endif // QT_NO_BEARERMANAGEMENT QNetworkRequest QNetworkAccessManagerPrivate::prepareMultipart(const QNetworkRequest &request, QHttpMultiPart *multiPart) --- qnetworkaccessmanager.h 2016-01-12 04:44:48.682566314 +1000 +++ /home/phablet/qtbase-opensource-src-5.4.1+dfsg/src/network/access/qnetworkaccessmanager.h 2016-01-12 13:04:38.749383155 +1000 @@ -173,6 +173,7 @@ Q_PRIVATE_SLOT(d_func(), void _q_networkSessionClosed()) Q_PRIVATE_SLOT(d_func(), void _q_networkSessionStateChanged(QNetworkSession::State)) Q_PRIVATE_SLOT(d_func(), void _q_onlineStateChanged(bool)) + Q_PRIVATE_SLOT(d_func(), void _q_configurationChanged(const QNetworkConfiguration &)) #endif }; --- qnetworkaccessmanager_p.h 2016-01-12 04:44:48.682566314 +1000 +++ /home/phablet/qtbase-opensource-src-5.4.1+dfsg/src/network/access/qnetworkaccessmanager_p.h 2016-01-12 13:05:33.007280295 +1000 @@ -142,6 +142,9 @@ bool isSeamless); void _q_networkSessionStateChanged(QNetworkSession::State state); void _q_onlineStateChanged(bool isOnline); + void _q_configurationChanged(const QNetworkConfiguration &configuration); + QSet onlineConfigurations; + #endif QNetworkRequest prepareMultipart(const QNetworkRequest &request, QHttpMultiPart *multiPart);