From 09ff0fb02378fa3aca92e9141d746880e11d7938 Mon Sep 17 00:00:00 2001 From: Aaron McCarthy Date: Fri, 23 Jul 2010 15:16:30 +1000 Subject: Order network configurations in service networks in priority order. It is useful to know the priority order of the sub configurations of a service network. Task-number: QTBUG-11678 RevBy: juhvu (cherry picked from commit 959efa8daab2715d18440ed8b890b9dd2b501fc7) --- src/network/bearer/qnetworkconfiguration.cpp | 19 ++++--- src/network/bearer/qnetworkconfiguration_p.h | 3 +- src/plugins/bearer/symbian/symbianengine.cpp | 83 +++++++++++++++------------- 3 files changed, 59 insertions(+), 46 deletions(-) diff --git a/src/network/bearer/qnetworkconfiguration.cpp b/src/network/bearer/qnetworkconfiguration.cpp index 4108fee..d7fceba 100644 --- a/src/network/bearer/qnetworkconfiguration.cpp +++ b/src/network/bearer/qnetworkconfiguration.cpp @@ -343,9 +343,11 @@ bool QNetworkConfiguration::isRoamingAvailable() const } /*! - Returns all sub configurations of this network configuration. - Only network configurations of type \l ServiceNetwork can have children. Otherwise - this function returns an empty list. + Returns all sub configurations of this network configuration in priority order. The first sub + configuration in the list has the highest priority. + + Only network configurations of type \l ServiceNetwork can have children. Otherwise this + function returns an empty list. */ QList QNetworkConfiguration::children() const { @@ -356,16 +358,18 @@ QList QNetworkConfiguration::children() const QMutexLocker locker(&d->mutex); - QMutableListIterator iter(d->serviceNetworkMembers); - while (iter.hasNext()) { - QNetworkConfigurationPrivatePointer p = iter.next(); + QMutableMapIterator i(d->serviceNetworkMembers); + while (i.hasNext()) { + i.next(); + + QNetworkConfigurationPrivatePointer p = i.value(); //if we have an invalid member get rid of it -> was deleted earlier on { QMutexLocker childLocker(&p->mutex); if (!p->isValid) { - iter.remove(); + i.remove(); continue; } } @@ -428,6 +432,5 @@ QString QNetworkConfiguration::bearerName() const return d->bearerName(); } - QT_END_NAMESPACE diff --git a/src/network/bearer/qnetworkconfiguration_p.h b/src/network/bearer/qnetworkconfiguration_p.h index 6e146e0..966dfb2 100644 --- a/src/network/bearer/qnetworkconfiguration_p.h +++ b/src/network/bearer/qnetworkconfiguration_p.h @@ -57,6 +57,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -84,7 +85,7 @@ public: return bearer; } - QList serviceNetworkMembers; + QMap serviceNetworkMembers; mutable QMutex mutex; diff --git a/src/plugins/bearer/symbian/symbianengine.cpp b/src/plugins/bearer/symbian/symbianengine.cpp index 87331f7..664cb6e 100644 --- a/src/plugins/bearer/symbian/symbianengine.cpp +++ b/src/plugins/bearer/symbian/symbianengine.cpp @@ -351,55 +351,57 @@ void SymbianEngine::updateConfigurationsL() QT_TRYCATCH_LEAVING(emit configurationAdded(ptr)); mutex.lock(); } - QNetworkConfigurationPrivatePointer privSNAP = snapConfigurations.value(ident); - + + // Loop through all connection methods in this SNAP + QMap connections; for (int j=0; j < destination.ConnectionMethodCount(); j++) { RCmConnectionMethod connectionMethod = destination.ConnectionMethodL(j); CleanupClosePushL(connectionMethod); - + TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId); QString iface = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId)); // Check that IAP can be found from accessPointConfigurations list - QNetworkConfigurationPrivatePointer priv = accessPointConfigurations.value(iface); - if (!priv) { + QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface); + if (ptr) { + knownConfigs.removeOne(iface); + } else { SymbianNetworkConfigurationPrivate *cpPriv = NULL; TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod)); if (error == KErrNone) { - QNetworkConfigurationPrivatePointer ptr(cpPriv); + ptr = QNetworkConfigurationPrivatePointer(cpPriv); accessPointConfigurations.insert(ptr->id, ptr); mutex.unlock(); QT_TRYCATCH_LEAVING(emit configurationAdded(ptr)); mutex.lock(); - - QMutexLocker configLocker(&privSNAP->mutex); - privSNAP->serviceNetworkMembers.append(ptr); - } - } else { - knownConfigs.removeOne(iface); - // Check that IAP can be found from related SNAP's configuration list - bool iapFound = false; - QMutexLocker snapConfigLocker(&privSNAP->mutex); - for (int i = 0; i < privSNAP->serviceNetworkMembers.count(); i++) { - if (toSymbianConfig(privSNAP->serviceNetworkMembers[i])->numericIdentifier() == - iapId) { - iapFound = true; - break; - } } - if (!iapFound) - privSNAP->serviceNetworkMembers.append(priv); } - + + if (ptr) { + unsigned int priority; + TRAPD(error, priority = destination.PriorityL(connectionMethod)); + if (!error) + connections.insert(priority, ptr); + } + CleanupStack::PopAndDestroy(&connectionMethod); } - + + QNetworkConfigurationPrivatePointer privSNAP = snapConfigurations.value(ident); QMutexLocker snapConfigLocker(&privSNAP->mutex); - if (privSNAP->serviceNetworkMembers.count() > 1) { + + if (privSNAP->serviceNetworkMembers != connections) { + privSNAP->serviceNetworkMembers = connections; + // Roaming is supported only if SNAP contains more than one IAP - privSNAP->roamingSupported = true; + privSNAP->roamingSupported = privSNAP->serviceNetworkMembers.count() > 1; + + snapConfigLocker.unlock(); + mutex.unlock(); + QT_TRYCATCH_LEAVING(emit configurationChanged(privSNAP)); + mutex.lock(); } - + CleanupStack::PopAndDestroy(&destination); } CleanupStack::PopAndDestroy(&destinations); @@ -449,10 +451,13 @@ void SymbianEngine::updateConfigurationsL() QNetworkConfigurationPrivatePointer ptr2 = snapConfigurations.value(iface); // => Check if one of the IAPs of the SNAP is active QMutexLocker snapConfigLocker(&ptr2->mutex); - for (int i = 0; i < ptr2->serviceNetworkMembers.count(); ++i) { - if (toSymbianConfig(ptr2->serviceNetworkMembers[i])->numericIdentifier() == + QMutableMapIterator i(ptr2->serviceNetworkMembers); + while (i.hasNext()) { + i.next(); + + if (toSymbianConfig(i.value())->numericIdentifier() == toSymbianConfig(ptr)->numericIdentifier()) { - ptr2->serviceNetworkMembers.removeAt(i); + i.remove(); break; } } @@ -806,15 +811,19 @@ void SymbianEngine::updateStatesToSnaps() // => Check if one of the IAPs of the SNAP is discovered or active // => If one of IAPs is active, also SNAP is active // => If one of IAPs is discovered but none of the IAPs is active, SNAP is discovered - for (int i=0; iserviceNetworkMembers.count(); i++) { - QMutexLocker configLocker(&ptr->serviceNetworkMembers[i]->mutex); + QMapIterator i(ptr->serviceNetworkMembers); + while (i.hasNext()) { + i.next(); + + const QNetworkConfigurationPrivatePointer child = i.value(); + + QMutexLocker configLocker(&child->mutex); - if ((ptr->serviceNetworkMembers[i]->state & QNetworkConfiguration::Active) - == QNetworkConfiguration::Active) { + if ((child->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) { active = true; break; - } else if ((ptr->serviceNetworkMembers[i]->state & QNetworkConfiguration::Discovered) - == QNetworkConfiguration::Discovered) { + } else if ((child->state & QNetworkConfiguration::Discovered) == + QNetworkConfiguration::Discovered) { discovered = true; } } -- cgit v0.12