diff options
-rw-r--r-- | src/network/bearer/qnetworkconfigmanager.cpp | 69 |
1 files changed, 51 insertions, 18 deletions
diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp index 0eb9c63..b631cf1 100644 --- a/src/network/bearer/qnetworkconfigmanager.cpp +++ b/src/network/bearer/qnetworkconfigmanager.cpp @@ -227,7 +227,7 @@ QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration() const // Engines don't have a default configuration. // Return first active snap - QNetworkConfigurationPrivatePointer firstDiscovered; + QNetworkConfigurationPrivatePointer defaultConfiguration; foreach (QBearerEngine *engine, conPriv->engines()) { QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator it; @@ -242,22 +242,35 @@ QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration() const QNetworkConfiguration config; config.d = it.value(); return config; - } else if ((it.value()->state & QNetworkConfiguration::Discovered) == - QNetworkConfiguration::Discovered) { - firstDiscovered = it.value(); + } else if (!defaultConfiguration) { + if ((it.value()->state & QNetworkConfiguration::Discovered) == + QNetworkConfiguration::Discovered) { + defaultConfiguration = it.value(); + } } } } // No Active SNAPs return first Discovered SNAP. - if (firstDiscovered) { + if (defaultConfiguration) { QNetworkConfiguration config; - config.d = firstDiscovered; + config.d = defaultConfiguration; return config; } - // No Active or Discovered SNAPs, do same for InternetAccessPoints. - firstDiscovered.reset(); + /* + No Active or Discovered SNAPs, find the perferred access point. + The following priority order is used: + + 1. Active Ethernet + 2. Active WLAN + 3. Active Other + 4. Discovered Ethernet + 5. Discovered WLAN + 6. Discovered Other + */ + + defaultConfiguration.reset(); foreach (QBearerEngine *engine, conPriv->engines()) { QHash<QString, QNetworkConfigurationPrivatePointer>::Iterator it; @@ -267,22 +280,42 @@ QNetworkConfiguration QNetworkConfigurationManager::defaultConfiguration() const for (it = engine->accessPointConfigurations.begin(), end = engine->accessPointConfigurations.end(); it != end; ++it) { - if ((it.value()->state & QNetworkConfiguration::Active) == - QNetworkConfiguration::Active) { - QNetworkConfiguration config; - config.d = it.value(); - return config; - } else if ((it.value()->state & QNetworkConfiguration::Discovered) == - QNetworkConfiguration::Discovered) { - firstDiscovered = it.value(); + + if ((it.value()->state & QNetworkConfiguration::Discovered) == + QNetworkConfiguration::Discovered) { + if (!defaultConfiguration) { + defaultConfiguration = it.value(); + } else { + if (defaultConfiguration->state == it.value()->state) { + if (defaultConfiguration->bearerName() == QLatin1String("Ethernet")) { + // do nothing + } else if (defaultConfiguration->bearerName() == QLatin1String("WLAN")) { + // ethernet beats wlan + if (it.value()->bearerName() == QLatin1String("Ethernet")) + defaultConfiguration = it.value(); + } else { + // ethernet and wlan beats other + if (it.value()->bearerName() == QLatin1String("Ethernet") || + it.value()->bearerName() == QLatin1String("WLAN")) { + defaultConfiguration = it.value(); + } + } + } else { + // active beats discovered + if ((defaultConfiguration->state & QNetworkConfiguration::Active) != + QNetworkConfiguration::Active) { + defaultConfiguration = it.value(); + } + } + } } } } // No Active InternetAccessPoint return first Discovered InternetAccessPoint. - if (firstDiscovered) { + if (defaultConfiguration) { QNetworkConfiguration config; - config.d = firstDiscovered; + config.d = defaultConfiguration; return config; } |