summaryrefslogtreecommitdiffstats
path: root/src/plugins/bearer/symbian/symbianengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/bearer/symbian/symbianengine.cpp')
-rw-r--r--src/plugins/bearer/symbian/symbianengine.cpp1409
1 files changed, 0 insertions, 1409 deletions
diff --git a/src/plugins/bearer/symbian/symbianengine.cpp b/src/plugins/bearer/symbian/symbianengine.cpp
deleted file mode 100644
index 71687dd2db..0000000000
--- a/src/plugins/bearer/symbian/symbianengine.cpp
+++ /dev/null
@@ -1,1409 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "symbianengine.h"
-#include "qnetworksession_impl.h"
-
-#include <commdb.h>
-#include <cdbcols.h>
-#include <d32dbms.h>
-#include <nifvar.h>
-#include <QTimer>
-#include <QTime> // For randgen seeding
-#include <QtCore> // For randgen seeding
-
-
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
-#include <QDebug>
-#endif
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- #include <cmdestination.h>
- #include <cmconnectionmethod.h>
- #include <cmconnectionmethoddef.h>
- #include <cmpluginwlandef.h>
- #include <cmpluginpacketdatadef.h>
- #include <cmplugindialcommondefs.h>
-#else
- #include <ApAccessPointItem.h>
- #include <ApDataHandler.h>
- #include <ApUtils.h>
-#endif
-
-#ifndef QT_NO_BEARERMANAGEMENT
-
-QT_BEGIN_NAMESPACE
-
-static const int KUserChoiceIAPId = 0;
-
-SymbianNetworkConfigurationPrivate::SymbianNetworkConfigurationPrivate()
-: numericId(0), connectionId(0)
-{
-}
-
-SymbianNetworkConfigurationPrivate::~SymbianNetworkConfigurationPrivate()
-{
-}
-
-SymbianEngine::SymbianEngine(QObject *parent)
-: QBearerEngine(parent), CActive(CActive::EPriorityHigh), iFirstUpdate(true), ipCommsDB(0),
- iInitOk(true), iUpdatePending(false), ipAccessPointsAvailabilityScanner(0)
-{
-}
-
-void SymbianEngine::initialize()
-{
- QMutexLocker locker(&mutex);
-
- CActiveScheduler::Add(this);
-
- // Seed the randomgenerator
- qsrand(QTime(0,0,0).secsTo(QTime::currentTime()) + QCoreApplication::applicationPid());
-
- TRAPD(error, ipCommsDB = CCommsDatabase::NewL(EDatabaseTypeIAP));
- if (error != KErrNone) {
- iInitOk = false;
- return;
- }
-
- TRAP_IGNORE(iConnectionMonitor.ConnectL());
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- TRAP_IGNORE(iConnectionMonitor.SetUintAttribute(EBearerIdAll, 0, KBearerGroupThreshold, 1));
-#endif
- TRAP_IGNORE(iConnectionMonitor.NotifyEventL(*this));
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- TRAP(error, iCmManager.OpenL());
- if (error != KErrNone) {
- iInitOk = false;
- return;
- }
-#endif
-
- SymbianNetworkConfigurationPrivate *cpPriv = new SymbianNetworkConfigurationPrivate;
- cpPriv->name = "UserChoice";
- cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
- cpPriv->state = QNetworkConfiguration::Discovered;
- cpPriv->isValid = true;
- cpPriv->id = QString::number(qHash(KUserChoiceIAPId));
- cpPriv->numericId = KUserChoiceIAPId;
- cpPriv->connectionId = 0;
- cpPriv->type = QNetworkConfiguration::UserChoice;
- cpPriv->purpose = QNetworkConfiguration::UnknownPurpose;
- cpPriv->roamingSupported = false;
-
- QNetworkConfigurationPrivatePointer ptr(cpPriv);
- userChoiceConfigurations.insert(ptr->id, ptr);
-
- updateConfigurations();
- updateStatesToSnaps();
- updateAvailableAccessPoints(); // On first time updates (without WLAN scans)
- // Start monitoring IAP and/or SNAP changes in Symbian CommsDB
- startCommsDatabaseNotifications();
-}
-
-SymbianEngine::~SymbianEngine()
-{
- Cancel();
-
- //The scanner may be using the connection monitor so it needs to be
- //deleted first while the handle is still valid.
- delete ipAccessPointsAvailabilityScanner;
-
- iConnectionMonitor.CancelNotifications();
- iConnectionMonitor.Close();
-
- // CCommsDatabase destructor and RCmManager.Close() use cleanup stack. Since QNetworkConfigurationManager
- // is a global static, but the time we are here, E32Main() has been exited already and
- // the thread's default cleanup stack has been deleted. Without this line, a
- // 'E32USER-CBase 69' -panic will occur.
- CTrapCleanup* cleanup = CTrapCleanup::New();
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- iCmManager.Close();
-#endif
- delete ipCommsDB;
- delete cleanup;
-}
-
-void SymbianEngine::delayedConfigurationUpdate()
-{
- QMutexLocker locker(&mutex);
-
- if (iUpdatePending) {
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug("QNCM delayed configuration update (ECommit or ERecover occurred).");
-#endif
- TRAPD(error, updateConfigurationsL());
- if (error == KErrNone) {
- updateStatesToSnaps();
- }
- iUpdatePending = false;
- // Start monitoring again.
- if (!IsActive()) {
- SetActive();
- // Start waiting for new notification
- ipCommsDB->RequestNotification(iStatus);
- }
- }
-}
-
-bool SymbianEngine::hasIdentifier(const QString &id)
-{
- QMutexLocker locker(&mutex);
-
- return accessPointConfigurations.contains(id) ||
- snapConfigurations.contains(id) ||
- userChoiceConfigurations.contains(id);
-}
-
-QNetworkConfigurationManager::Capabilities SymbianEngine::capabilities() const
-{
- QNetworkConfigurationManager::Capabilities capFlags;
-
- capFlags = QNetworkConfigurationManager::CanStartAndStopInterfaces |
- QNetworkConfigurationManager::DirectConnectionRouting |
- QNetworkConfigurationManager::SystemSessionSupport |
- QNetworkConfigurationManager::DataStatistics |
- QNetworkConfigurationManager::NetworkSessionRequired;
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- capFlags |= QNetworkConfigurationManager::ApplicationLevelRoaming |
- QNetworkConfigurationManager::ForcedRoaming;
-#endif
-
- return capFlags;
-}
-
-QNetworkSessionPrivate *SymbianEngine::createSessionBackend()
-{
- return new QNetworkSessionPrivateImpl(this);
-}
-
-void SymbianEngine::requestUpdate()
-{
- QMutexLocker locker(&mutex);
-
- if (!iInitOk || iUpdateGoingOn) {
- return;
- }
- iUpdateGoingOn = true;
-
- stopCommsDatabaseNotifications();
- updateConfigurations(); // Synchronous call
- updateAvailableAccessPoints(); // Asynchronous call
-}
-
-void SymbianEngine::updateConfigurations()
-{
- if (!iInitOk)
- return;
-
- TRAP_IGNORE(updateConfigurationsL());
-}
-
-void SymbianEngine::updateConfigurationsL()
-{
- QList<QString> knownConfigs = accessPointConfigurations.keys();
- QList<QString> knownSnapConfigs = snapConfigurations.keys();
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- // S60 version is >= Series60 3rd Edition Feature Pack 2
- TInt error = KErrNone;
-
- // Loop through all IAPs
- RArray<TUint32> connectionMethods; // IAPs
- CleanupClosePushL(connectionMethods);
- iCmManager.ConnectionMethodL(connectionMethods);
- for(int i = 0; i < connectionMethods.Count(); i++) {
- RCmConnectionMethod connectionMethod = iCmManager.ConnectionMethodL(connectionMethods[i]);
- CleanupClosePushL(connectionMethod);
- TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId));
- if (accessPointConfigurations.contains(ident)) {
- knownConfigs.removeOne(ident);
- } else {
- SymbianNetworkConfigurationPrivate* cpPriv = NULL;
- TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod));
- if (error == KErrNone) {
- QNetworkConfigurationPrivatePointer ptr(cpPriv);
- accessPointConfigurations.insert(ptr->id, ptr);
- if (!iFirstUpdate) {
- // Emit configuration added. Connected slots may throw execptions
- // which propagate here --> must be converted to leaves (standard
- // std::exception would cause any TRAP trapping this function to terminate
- // program).
- QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
- updateStatesToSnaps();
- mutex.unlock();
- QT_TRYCATCH_LEAVING(emit configurationAdded(ptr));
- mutex.lock();
- }
- }
- }
- CleanupStack::PopAndDestroy(&connectionMethod);
- }
- CleanupStack::PopAndDestroy(&connectionMethods);
-
- // Loop through all SNAPs
- RArray<TUint32> destinations;
- CleanupClosePushL(destinations);
- iCmManager.AllDestinationsL(destinations);
- for(int i = 0; i < destinations.Count(); i++) {
- RCmDestination destination;
-
- // Some destinatsions require ReadDeviceData -capability (MMS/WAP)
- // The below function will leave in these cases. Don't. Proceed to
- // next destination (if any).
- TRAPD(error, destination = iCmManager.DestinationL(destinations[i]));
- if (error == KErrPermissionDenied) {
- continue;
- } else {
- User::LeaveIfError(error);
- }
-
- CleanupClosePushL(destination);
- QString ident = QT_BEARERMGMT_CONFIGURATION_SNAP_PREFIX +
- QString::number(qHash(destination.Id()));
- if (snapConfigurations.contains(ident)) {
- knownSnapConfigs.removeOne(ident);
- } else {
- SymbianNetworkConfigurationPrivate *cpPriv = new SymbianNetworkConfigurationPrivate;
-
- HBufC *pName = destination.NameLC();
- QT_TRYCATCH_LEAVING(cpPriv->name = QString::fromUtf16(pName->Ptr(),pName->Length()));
- CleanupStack::PopAndDestroy(pName);
- pName = NULL;
-
- cpPriv->isValid = true;
- cpPriv->id = ident;
- cpPriv->numericId = destination.Id();
- cpPriv->connectionId = 0;
- cpPriv->state = QNetworkConfiguration::Defined;
- cpPriv->type = QNetworkConfiguration::ServiceNetwork;
- cpPriv->purpose = QNetworkConfiguration::UnknownPurpose;
- cpPriv->roamingSupported = false;
-
- QNetworkConfigurationPrivatePointer ptr(cpPriv);
- snapConfigurations.insert(ident, ptr);
- if (!iFirstUpdate) {
- QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
- updateStatesToSnaps();
- mutex.unlock();
- QT_TRYCATCH_LEAVING(emit configurationAdded(ptr));
- mutex.lock();
- }
- }
-
- // Loop through all connection methods in this SNAP
- QMap<unsigned int, QNetworkConfigurationPrivatePointer> 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 ptr = accessPointConfigurations.value(iface);
- if (!ptr) {
- SymbianNetworkConfigurationPrivate *cpPriv = NULL;
- TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod));
- if (error == KErrNone) {
- ptr = QNetworkConfigurationPrivatePointer(cpPriv);
- accessPointConfigurations.insert(ptr->id, ptr);
-
- if (!iFirstUpdate) {
- QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
- updateStatesToSnaps();
- mutex.unlock();
- QT_TRYCATCH_LEAVING(emit configurationAdded(ptr));
- mutex.lock();
- }
- }
- } else {
- knownConfigs.removeOne(iface);
- }
-
- 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 != connections) {
- privSNAP->serviceNetworkMembers = connections;
-
- // Roaming is supported only if SNAP contains more than one IAP
- privSNAP->roamingSupported = privSNAP->serviceNetworkMembers.count() > 1;
-
- snapConfigLocker.unlock();
-
- updateStatesToSnaps();
-
- mutex.unlock();
- QT_TRYCATCH_LEAVING(emit configurationChanged(privSNAP));
- mutex.lock();
- }
-
- CleanupStack::PopAndDestroy(&destination);
- }
- CleanupStack::PopAndDestroy(&destinations);
-#else
- // S60 version is < Series60 3rd Edition Feature Pack 2
- CCommsDbTableView* pDbTView = ipCommsDB->OpenTableLC(TPtrC(IAP));
-
- // Loop through all IAPs
- TUint32 apId = 0;
- TInt retVal = pDbTView->GotoFirstRecord();
- while (retVal == KErrNone) {
- pDbTView->ReadUintL(TPtrC(COMMDB_ID), apId);
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
- if (accessPointConfigurations.contains(ident)) {
- knownConfigs.removeOne(ident);
- } else {
- SymbianNetworkConfigurationPrivate *cpPriv = new SymbianNetworkConfigurationPrivate;
- if (readNetworkConfigurationValuesFromCommsDb(apId, cpPriv)) {
- QNetworkConfigurationPrivatePointer ptr(cpPriv);
- accessPointConfigurations.insert(ident, ptr);
- if (!iFirstUpdate) {
- QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
- updateStatesToSnaps();
- mutex.unlock();
- QT_TRYCATCH_LEAVING(emit configurationAdded(ptr));
- mutex.lock();
- }
- } else {
- delete cpPriv;
- }
- }
- retVal = pDbTView->GotoNextRecord();
- }
- CleanupStack::PopAndDestroy(pDbTView);
-#endif
-
- QT_TRYCATCH_LEAVING(updateActiveAccessPoints());
-
- foreach (const QString &oldIface, knownConfigs) {
- //remove non existing IAP
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.take(oldIface);
-
- mutex.unlock();
- emit configurationRemoved(ptr);
- QT_TRYCATCH_LEAVING(emit configurationRemoved(ptr));
- mutex.lock();
-
- // Remove non existing IAP from SNAPs
- foreach (const QString &iface, snapConfigurations.keys()) {
- QNetworkConfigurationPrivatePointer ptr2 = snapConfigurations.value(iface);
- // => Check if one of the IAPs of the SNAP is active
- QMutexLocker snapConfigLocker(&ptr2->mutex);
- QMutableMapIterator<unsigned int, QNetworkConfigurationPrivatePointer> i(ptr2->serviceNetworkMembers);
- while (i.hasNext()) {
- i.next();
-
- if (toSymbianConfig(i.value())->numericIdentifier() ==
- toSymbianConfig(ptr)->numericIdentifier()) {
- i.remove();
- break;
- }
- }
- }
- }
-
- foreach (const QString &oldIface, knownSnapConfigs) {
- //remove non existing SNAPs
- QNetworkConfigurationPrivatePointer ptr = snapConfigurations.take(oldIface);
-
- mutex.unlock();
- emit configurationRemoved(ptr);
- QT_TRYCATCH_LEAVING(emit configurationRemoved(ptr));
- mutex.lock();
- }
-
- // find default configuration.
- stopCommsDatabaseNotifications();
- TRAP_IGNORE(defaultConfig = defaultConfigurationL());
- startCommsDatabaseNotifications();
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- updateStatesToSnaps();
-#endif
-}
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
-SymbianNetworkConfigurationPrivate *SymbianEngine::configFromConnectionMethodL(
- RCmConnectionMethod& connectionMethod)
-{
- SymbianNetworkConfigurationPrivate *cpPriv = new SymbianNetworkConfigurationPrivate;
- TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId));
-
- HBufC *pName = connectionMethod.GetStringAttributeL(CMManager::ECmName);
- CleanupStack::PushL(pName);
- QT_TRYCATCH_LEAVING(cpPriv->name = QString::fromUtf16(pName->Ptr(),pName->Length()));
- CleanupStack::PopAndDestroy(pName);
- pName = NULL;
-
- TUint32 bearerId = connectionMethod.GetIntAttributeL(CMManager::ECmCommsDBBearerType);
- switch (bearerId) {
- case KCommDbBearerCSD:
- cpPriv->bearerType = QNetworkConfiguration::Bearer2G;
- break;
- case KCommDbBearerWcdma:
- cpPriv->bearerType = QNetworkConfiguration::BearerWCDMA;
- break;
- case KCommDbBearerLAN:
- cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
- break;
- case KCommDbBearerVirtual:
- cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
- break;
- case KCommDbBearerPAN:
- cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
- break;
- case KCommDbBearerWLAN:
- cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
- break;
- default:
- cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
- break;
- }
-
- TInt error = KErrNone;
- TUint32 bearerType = connectionMethod.GetIntAttributeL(CMManager::ECmBearerType);
- switch (bearerType) {
- case KUidPacketDataBearerType:
- // "Packet data" Bearer => Mapping is done using "Access point name"
- TRAP(error, pName = connectionMethod.GetStringAttributeL(CMManager::EPacketDataAPName));
- break;
- case KUidWlanBearerType:
- // "Wireless LAN" Bearer => Mapping is done using "WLAN network name" = SSID
- TRAP(error, pName = connectionMethod.GetStringAttributeL(CMManager::EWlanSSID));
- break;
- }
- if (!pName) {
- // "Data call" Bearer or "High Speed (GSM)" Bearer => Mapping is done using "Dial-up number"
- TRAP(error, pName = connectionMethod.GetStringAttributeL(CMManager::EDialDefaultTelNum));
- }
-
- if (error == KErrNone && pName) {
- CleanupStack::PushL(pName);
- QT_TRYCATCH_LEAVING(cpPriv->mappingName = QString::fromUtf16(pName->Ptr(),pName->Length()));
- CleanupStack::PopAndDestroy(pName);
- pName = NULL;
- }
-
- cpPriv->state = QNetworkConfiguration::Defined;
- TBool isConnected = connectionMethod.GetBoolAttributeL(CMManager::ECmConnected);
- if (isConnected) {
- cpPriv->state = QNetworkConfiguration::Active;
- }
-
- cpPriv->isValid = true;
- cpPriv->id = ident;
- cpPriv->numericId = iapId;
- cpPriv->connectionId = 0;
- cpPriv->type = QNetworkConfiguration::InternetAccessPoint;
- cpPriv->purpose = QNetworkConfiguration::UnknownPurpose;
- cpPriv->roamingSupported = false;
- return cpPriv;
-}
-#else
-bool SymbianEngine::readNetworkConfigurationValuesFromCommsDb(
- TUint32 aApId, SymbianNetworkConfigurationPrivate *apNetworkConfiguration)
-{
- TRAPD(error, readNetworkConfigurationValuesFromCommsDbL(aApId,apNetworkConfiguration));
- if (error != KErrNone) {
- return false;
- }
- return true;
-}
-
-void SymbianEngine::readNetworkConfigurationValuesFromCommsDbL(
- TUint32 aApId, SymbianNetworkConfigurationPrivate *apNetworkConfiguration)
-{
- CApDataHandler* pDataHandler = CApDataHandler::NewLC(*ipCommsDB);
- CApAccessPointItem* pAPItem = CApAccessPointItem::NewLC();
- TBuf<KCommsDbSvrMaxColumnNameLength> name;
-
- CApUtils* pApUtils = CApUtils::NewLC(*ipCommsDB);
- TUint32 apId = pApUtils->WapIdFromIapIdL(aApId);
-
- pDataHandler->AccessPointDataL(apId,*pAPItem);
- pAPItem->ReadTextL(EApIapName, name);
- if (name.Compare(_L("Easy WLAN")) == 0) {
- // "Easy WLAN" won't be accepted to the Configurations list
- User::Leave(KErrNotFound);
- }
-
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(aApId));
-
- QT_TRYCATCH_LEAVING(apNetworkConfiguration->name = QString::fromUtf16(name.Ptr(),name.Length()));
- apNetworkConfiguration->isValid = true;
- apNetworkConfiguration->id = ident;
- apNetworkConfiguration->numericId = aApId;
- apNetworkConfiguration->connectionId = 0;
- apNetworkConfiguration->state = (QNetworkConfiguration::Defined);
- apNetworkConfiguration->type = QNetworkConfiguration::InternetAccessPoint;
- apNetworkConfiguration->purpose = QNetworkConfiguration::UnknownPurpose;
- apNetworkConfiguration->roamingSupported = false;
- switch (pAPItem->BearerTypeL()) {
- case EApBearerTypeCSD:
- apNetworkConfiguration->bearerType = QNetworkConfiguration::Bearer2G;
- break;
- case EApBearerTypeGPRS:
- apNetworkConfiguration->bearerType = QNetworkConfiguration::Bearer2G;
- break;
- case EApBearerTypeHSCSD:
- apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerHSPA;
- break;
- case EApBearerTypeCDMA:
- apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerCDMA2000;
- break;
- case EApBearerTypeWLAN:
- apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerWLAN;
- break;
- case EApBearerTypeLAN:
- apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerEthernet;
- break;
- case EApBearerTypeLANModem:
- apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerEthernet;
- break;
- default:
- apNetworkConfiguration->bearerType = QNetworkConfiguration::BearerUnknown;
- break;
- }
-
- CleanupStack::PopAndDestroy(pApUtils);
- CleanupStack::PopAndDestroy(pAPItem);
- CleanupStack::PopAndDestroy(pDataHandler);
-}
-#endif
-
-QNetworkConfigurationPrivatePointer SymbianEngine::defaultConfiguration()
-{
- QMutexLocker locker(&mutex);
-
- return defaultConfig;
-}
-
-QStringList SymbianEngine::accessPointConfigurationIdentifiers()
-{
- QMutexLocker locker(&mutex);
-
- return accessPointConfigurations.keys();
-}
-
-QNetworkConfigurationPrivatePointer SymbianEngine::defaultConfigurationL()
-{
- QNetworkConfigurationPrivatePointer ptr;
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- // Check Default Connection (SNAP or IAP)
- TCmDefConnValue defaultConnectionValue;
- iCmManager.ReadDefConnL(defaultConnectionValue);
- if (defaultConnectionValue.iType == ECmDefConnDestination) {
- QString iface = QT_BEARERMGMT_CONFIGURATION_SNAP_PREFIX +
- QString::number(qHash(defaultConnectionValue.iId));
- ptr = snapConfigurations.value(iface);
- } else if (defaultConnectionValue.iType == ECmDefConnConnectionMethod) {
- QString iface = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
- QString::number(qHash(defaultConnectionValue.iId));
- ptr = accessPointConfigurations.value(iface);
- }
-#endif
-
- if (ptr) {
- QMutexLocker configLocker(&ptr->mutex);
- if (ptr->isValid)
- return ptr;
- }
-
- QString iface = QString::number(qHash(KUserChoiceIAPId));
- return userChoiceConfigurations.value(iface);
-}
-
-void SymbianEngine::updateActiveAccessPoints()
-{
- bool online = false;
- QList<QString> inactiveConfigs = accessPointConfigurations.keys();
-
- TRequestStatus status;
- TUint connectionCount;
- iConnectionMonitor.GetConnectionCount(connectionCount, status);
- User::WaitForRequest(status);
-
- // Go through all connections and set state of related IAPs to Active.
- // Status needs to be checked carefully, because ConnMon lists also e.g.
- // WLAN connections that are being currently tried --> we don't want to
- // state these as active.
- TUint connectionId;
- TUint subConnectionCount;
- TUint apId;
- TInt connectionStatus;
- if (status.Int() == KErrNone) {
- for (TUint i = 1; i <= connectionCount; i++) {
- iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount);
- iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
- User::WaitForRequest(status);
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (!ptr) {
- // If IAP was not found, check if the update was about EasyWLAN
- ptr = configurationFromEasyWlan(apId, connectionId);
- // Change the ident correspondingly
- if (ptr) {
- ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
- QString::number(qHash(toSymbianConfig(ptr)->numericIdentifier()));
- }
- }
-#endif
- if (ptr) {
- iConnectionMonitor.GetIntAttribute(connectionId, subConnectionCount, KConnectionStatus, connectionStatus, status);
- User::WaitForRequest(status);
-
- if (connectionStatus == KLinkLayerOpen) {
- online = true;
- inactiveConfigs.removeOne(ident);
-
- ptr->mutex.lock();
- toSymbianConfig(ptr)->connectionId = connectionId;
- ptr->mutex.unlock();
-
- // Configuration is Active
- changeConfigurationStateTo(ptr, QNetworkConfiguration::Active);
- }
- }
- }
- }
-
- // Make sure that state of rest of the IAPs won't be Active
- foreach (const QString &iface, inactiveConfigs) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
- if (ptr) {
- // Configuration is either Defined or Discovered
- changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Discovered);
- }
- }
-
- if (iOnline != online) {
- iOnline = online;
- mutex.unlock();
- emit this->onlineStateChanged(online);
- mutex.lock();
- }
-}
-
-void SymbianEngine::updateAvailableAccessPoints()
-{
- if (!ipAccessPointsAvailabilityScanner) {
- ipAccessPointsAvailabilityScanner = new AccessPointsAvailabilityScanner(*this, iConnectionMonitor);
- }
- if (ipAccessPointsAvailabilityScanner) {
- // Scanning may take a while because WLAN scanning will be done (if device supports WLAN).
- ipAccessPointsAvailabilityScanner->StartScanning();
- }
-}
-
-void SymbianEngine::accessPointScanningReady(TBool scanSuccessful, TConnMonIapInfo iapInfo)
-{
- iUpdateGoingOn = false;
- if (scanSuccessful) {
- QList<QString> unavailableConfigs = accessPointConfigurations.keys();
-
- // Set state of returned IAPs to Discovered
- // if state is not already Active
- for(TUint i=0; i<iapInfo.iCount; i++) {
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
- QString::number(qHash(iapInfo.iIap[i].iIapId));
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
- if (ptr) {
- unavailableConfigs.removeOne(ident);
-
- QMutexLocker configLocker(&ptr->mutex);
- if (ptr->state < QNetworkConfiguration::Active) {
- // Configuration is either Discovered or Active
- changeConfigurationStateAtMinTo(ptr, QNetworkConfiguration::Discovered);
- }
- }
- }
-
- // Make sure that state of rest of the IAPs won't be Active
- foreach (const QString &iface, unavailableConfigs) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
- if (ptr) {
- // Configuration is Defined
- changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Discovered);
- }
- }
- }
-
- updateStatesToSnaps();
-
- if (!iFirstUpdate) {
- startCommsDatabaseNotifications();
- mutex.unlock();
- emit updateCompleted();
- mutex.lock();
- } else {
- iFirstUpdate = false;
- if (iScanInQueue) {
- iScanInQueue = EFalse;
- updateAvailableAccessPoints();
- }
- }
-}
-
-void SymbianEngine::updateStatesToSnaps()
-{
- // Go through SNAPs and set correct state to SNAPs
- foreach (const QString &iface, snapConfigurations.keys()) {
- bool discovered = false;
- bool active = false;
- QNetworkConfigurationPrivatePointer ptr = snapConfigurations.value(iface);
-
- QMutexLocker snapConfigLocker(&ptr->mutex);
-
- // => 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
- QMapIterator<unsigned int, QNetworkConfigurationPrivatePointer> i(ptr->serviceNetworkMembers);
- while (i.hasNext()) {
- i.next();
-
- const QNetworkConfigurationPrivatePointer child = i.value();
-
- QMutexLocker configLocker(&child->mutex);
-
- if ((child->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- active = true;
- break;
- } else if ((child->state & QNetworkConfiguration::Discovered) ==
- QNetworkConfiguration::Discovered) {
- discovered = true;
- }
- }
- snapConfigLocker.unlock();
- if (active) {
- changeConfigurationStateTo(ptr, QNetworkConfiguration::Active);
- } else if (discovered) {
- changeConfigurationStateTo(ptr, QNetworkConfiguration::Discovered);
- } else {
- changeConfigurationStateTo(ptr, QNetworkConfiguration::Defined);
- }
- }
-}
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
-void SymbianEngine::updateMobileBearerToConfigs(TConnMonBearerInfo bearerInfo)
-{
- QHash<QString, QNetworkConfigurationPrivatePointer>::const_iterator i =
- accessPointConfigurations.constBegin();
- while (i != accessPointConfigurations.constEnd()) {
- QNetworkConfigurationPrivatePointer ptr = i.value();
-
- QMutexLocker locker(&ptr->mutex);
-
- SymbianNetworkConfigurationPrivate *p = toSymbianConfig(ptr);
-
- if (p->bearerType >= QNetworkConfiguration::Bearer2G &&
- p->bearerType <= QNetworkConfiguration::BearerHSPA) {
- switch (bearerInfo) {
- case EBearerInfoCSD:
- p->bearerType = QNetworkConfiguration::Bearer2G;
- break;
- case EBearerInfoWCDMA:
- p->bearerType = QNetworkConfiguration::BearerWCDMA;
- break;
- case EBearerInfoCDMA2000:
- p->bearerType = QNetworkConfiguration::BearerCDMA2000;
- break;
- case EBearerInfoGPRS:
- p->bearerType = QNetworkConfiguration::Bearer2G;
- break;
- case EBearerInfoHSCSD:
- p->bearerType = QNetworkConfiguration::Bearer2G;
- break;
- case EBearerInfoEdgeGPRS:
- p->bearerType = QNetworkConfiguration::Bearer2G;
- break;
- case EBearerInfoWcdmaCSD:
- p->bearerType = QNetworkConfiguration::BearerWCDMA;
- break;
- case EBearerInfoHSDPA:
- p->bearerType = QNetworkConfiguration::BearerHSPA;
- break;
- case EBearerInfoHSUPA:
- p->bearerType = QNetworkConfiguration::BearerHSPA;
- break;
- case EBearerInfoHSxPA:
- p->bearerType = QNetworkConfiguration::BearerHSPA;
- break;
- }
- }
-
- ++i;
- }
-}
-#endif
-
-bool SymbianEngine::changeConfigurationStateTo(QNetworkConfigurationPrivatePointer ptr,
- QNetworkConfiguration::StateFlags newState)
-{
- ptr->mutex.lock();
- if (newState != ptr->state) {
- ptr->state = newState;
- ptr->mutex.unlock();
-
- mutex.unlock();
- emit configurationChanged(ptr);
- mutex.lock();
-
- return true;
- } else {
- ptr->mutex.unlock();
- }
- return false;
-}
-
-/* changeConfigurationStateAtMinTo function does not overwrite possible better
- * state (e.g. Discovered state does not overwrite Active state) but
- * makes sure that state is at minimum given state.
-*/
-bool SymbianEngine::changeConfigurationStateAtMinTo(QNetworkConfigurationPrivatePointer ptr,
- QNetworkConfiguration::StateFlags newState)
-{
- ptr->mutex.lock();
- if ((newState | ptr->state) != ptr->state) {
- ptr->state = (ptr->state | newState);
- ptr->mutex.unlock();
-
- mutex.unlock();
- emit configurationChanged(ptr);
- mutex.lock();
-
- return true;
- } else {
- ptr->mutex.unlock();
- }
- return false;
-}
-
-/* changeConfigurationStateAtMaxTo function overwrites possible better
- * state (e.g. Discovered state overwrites Active state) and
- * makes sure that state is at maximum given state (e.g. Discovered state
- * does not overwrite Defined state).
-*/
-bool SymbianEngine::changeConfigurationStateAtMaxTo(QNetworkConfigurationPrivatePointer ptr,
- QNetworkConfiguration::StateFlags newState)
-{
- ptr->mutex.lock();
- if ((newState & ptr->state) != ptr->state) {
- ptr->state = (newState & ptr->state);
- ptr->mutex.unlock();
-
- mutex.unlock();
- emit configurationChanged(ptr);
- mutex.lock();
-
- return true;
- } else {
- ptr->mutex.unlock();
- }
- return false;
-}
-
-void SymbianEngine::startCommsDatabaseNotifications()
-{
- if (!iWaitingCommsDatabaseNotifications) {
- iWaitingCommsDatabaseNotifications = ETrue;
- if (!IsActive()) {
- SetActive();
- // Start waiting for new notification
- ipCommsDB->RequestNotification(iStatus);
- }
- }
-}
-
-void SymbianEngine::stopCommsDatabaseNotifications()
-{
- if (iWaitingCommsDatabaseNotifications) {
- iWaitingCommsDatabaseNotifications = EFalse;
- Cancel();
- }
-}
-
-void SymbianEngine::RunL()
-{
- QMutexLocker locker(&mutex);
-
- if (iStatus != KErrCancel) {
- // By default, start relistening notifications. Stop only if interesting event occurred.
- iWaitingCommsDatabaseNotifications = true;
- RDbNotifier::TEvent event = STATIC_CAST(RDbNotifier::TEvent, iStatus.Int());
- switch (event) {
- case RDbNotifier::ECommit: /** A transaction has been committed. */
- case RDbNotifier::ERecover: /** The database has been recovered */
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug("QNCM CommsDB event (of type RDbNotifier::TEvent) received: %d", iStatus.Int());
-#endif
- // Mark that there is update pending. No need to ask more events,
- // as we know we will be updating anyway when the timer expires.
- if (!iUpdatePending) {
- iUpdatePending = true;
- iWaitingCommsDatabaseNotifications = false;
- // Update after random time, so that many processes won't
- // start updating simultaneously
- updateConfigurationsAfterRandomTime();
- }
- break;
- default:
- // Do nothing
- break;
- }
- }
-
- if (iWaitingCommsDatabaseNotifications) {
- if (!IsActive()) {
- SetActive();
- // Start waiting for new notification
- ipCommsDB->RequestNotification(iStatus);
- }
- }
-}
-
-void SymbianEngine::DoCancel()
-{
- QMutexLocker locker(&mutex);
-
- ipCommsDB->CancelRequestNotification();
-}
-
-void SymbianEngine::EventL(const CConnMonEventBase& aEvent)
-{
- QMutexLocker locker(&mutex);
-
- switch (aEvent.EventType()) {
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- case EConnMonBearerInfoChange:
- {
- CConnMonBearerInfoChange* realEvent;
- realEvent = (CConnMonBearerInfoChange*) &aEvent;
- TUint connectionId = realEvent->ConnectionId();
- if (connectionId == EBearerIdAll) {
- //Network level event
- TConnMonBearerInfo bearerInfo = (TConnMonBearerInfo)realEvent->BearerInfo();
- updateMobileBearerToConfigs(bearerInfo);
- }
- break;
- }
-#endif
- case EConnMonConnectionStatusChange:
- {
- CConnMonConnectionStatusChange* realEvent;
- realEvent = (CConnMonConnectionStatusChange*) &aEvent;
- TInt connectionStatus = realEvent->ConnectionStatus();
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNCM Connection status : " << QString::number(connectionStatus) << " , connection monitor Id : " << realEvent->ConnectionId();
-#endif
- if (connectionStatus == KConfigDaemonStartingRegistration) {
- TUint connectionId = realEvent->ConnectionId();
- TUint subConnectionCount = 0;
- TUint apId;
- TRequestStatus status;
- iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
- User::WaitForRequest(status);
-
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (!ptr) {
- // Check if status was regarding EasyWLAN
- ptr = configurationFromEasyWlan(apId, connectionId);
- }
-#endif
- if (ptr) {
- ptr->mutex.lock();
- toSymbianConfig(ptr)->connectionId = connectionId;
- ptr->mutex.unlock();
- QT_TRYCATCH_LEAVING(
- emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
- connectionId, QNetworkSession::Connecting)
- );
- }
- } else if (connectionStatus == KLinkLayerOpen) {
- // Connection has been successfully opened
- TUint connectionId = realEvent->ConnectionId();
- TUint subConnectionCount = 0;
- TUint apId;
- TRequestStatus status;
- iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
- User::WaitForRequest(status);
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (!ptr) {
- // Check for EasyWLAN
- ptr = configurationFromEasyWlan(apId, connectionId);
- }
-#endif
- if (ptr) {
- ptr->mutex.lock();
- toSymbianConfig(ptr)->connectionId = connectionId;
- ptr->mutex.unlock();
-
- // Configuration is Active
- QT_TRYCATCH_LEAVING(
- if (changeConfigurationStateTo(ptr, QNetworkConfiguration::Active)) {
- updateStatesToSnaps();
- }
- emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
- connectionId, QNetworkSession::Connected);
-
- if (!iOnline) {
- iOnline = true;
- emit this->onlineStateChanged(iOnline);
- }
- );
- }
- } else if (connectionStatus == KConfigDaemonStartingDeregistration) {
- TUint connectionId = realEvent->ConnectionId();
- QNetworkConfigurationPrivatePointer ptr = dataByConnectionId(connectionId);
- if (ptr) {
- QT_TRYCATCH_LEAVING(
- emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
- connectionId, QNetworkSession::Closing)
- );
- }
- } else if (connectionStatus == KLinkLayerClosed ||
- connectionStatus == KConnectionClosed) {
- // Connection has been closed. Which of the above events is reported, depends on the Symbian
- // platform.
- TUint connectionId = realEvent->ConnectionId();
- QNetworkConfigurationPrivatePointer ptr = dataByConnectionId(connectionId);
- if (ptr) {
- // Configuration is either Defined or Discovered
- QT_TRYCATCH_LEAVING(
- if (changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Discovered)) {
- updateStatesToSnaps();
- }
- emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
- connectionId, QNetworkSession::Disconnected);
- );
- }
-
- bool online = false;
- foreach (const QString &iface, accessPointConfigurations.keys()) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
- QMutexLocker configLocker(&ptr->mutex);
- if (ptr->state == QNetworkConfiguration::Active) {
- online = true;
- break;
- }
- }
- if (iOnline != online) {
- iOnline = online;
- QT_TRYCATCH_LEAVING(emit this->onlineStateChanged(iOnline));
- }
- }
- }
- break;
-
- case EConnMonIapAvailabilityChange:
- {
- CConnMonIapAvailabilityChange* realEvent;
- realEvent = (CConnMonIapAvailabilityChange*) &aEvent;
- TConnMonIapInfo iaps = realEvent->IapAvailability();
- QList<QString> unDiscoveredConfigs = accessPointConfigurations.keys();
- for ( TUint i = 0; i < iaps.Count(); i++ ) {
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
- QString::number(qHash(iaps.iIap[i].iIapId));
-
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
- if (ptr) {
- // Configuration is either Discovered or Active
- QT_TRYCATCH_LEAVING(changeConfigurationStateAtMinTo(ptr, QNetworkConfiguration::Discovered));
- unDiscoveredConfigs.removeOne(ident);
- }
- }
- foreach (const QString &iface, unDiscoveredConfigs) {
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(iface);
- if (ptr) {
- // Configuration is Defined
- QT_TRYCATCH_LEAVING(changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Defined));
- }
- }
- // Something has in IAPs, update states to SNAPs
- updateStatesToSnaps();
- }
- break;
-
- case EConnMonCreateConnection:
- {
- // This event is caught to keep connection monitor IDs up-to-date.
- CConnMonCreateConnection* realEvent;
- realEvent = (CConnMonCreateConnection*) &aEvent;
- TUint subConnectionCount = 0;
- TUint apId;
- TUint connectionId = realEvent->ConnectionId();
- TRequestStatus status;
- iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
- User::WaitForRequest(status);
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (!ptr) {
- // If IAP was not found, check if the update was about EasyWLAN
- ptr = configurationFromEasyWlan(apId, connectionId);
- }
-#endif
- if (ptr) {
- QMutexLocker configLocker(&ptr->mutex);
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNCM updating connection monitor ID : from, to, whose: " << toSymbianConfig(ptr)->connectionId << connectionId << ptr->name;
-#endif
- toSymbianConfig(ptr)->connectionId = connectionId;
- }
- }
- break;
- default:
- // For unrecognized events
- break;
- }
-}
-
-/*
- Returns the network configuration that matches the given SSID.
-*/
-QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromSsid(const QString &ssid)
-{
- QMutexLocker locker(&mutex);
-
- // Browser through all items and check their name for match
- QHash<QString, QNetworkConfigurationPrivatePointer>::ConstIterator i =
- accessPointConfigurations.constBegin();
- while (i != accessPointConfigurations.constEnd()) {
- QNetworkConfigurationPrivatePointer ptr = i.value();
-
- QMutexLocker configLocker(&ptr->mutex);
-
- if (ptr->name == ssid) {
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNCM EasyWlan uses real SSID: " << ssid;
-#endif
- return ptr;
- }
- ++i;
- }
-
- return QNetworkConfigurationPrivatePointer();
-}
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
-// Tries to derive configuration from EasyWLAN.
-// First checks if the interface brought up was EasyWLAN, then derives the real SSID,
-// and looks up configuration based on that one.
-QNetworkConfigurationPrivatePointer SymbianEngine::configurationFromEasyWlan(TUint32 apId,
- TUint connectionId)
-{
- if (apId == iCmManager.EasyWlanIdL()) {
- TRequestStatus status;
- TBuf<50> easyWlanNetworkName;
- iConnectionMonitor.GetStringAttribute( connectionId, 0, KNetworkName,
- easyWlanNetworkName, status );
- User::WaitForRequest(status);
- if (status.Int() == KErrNone) {
- const QString realSSID = QString::fromUtf16(easyWlanNetworkName.Ptr(),
- easyWlanNetworkName.Length());
-
- // Browser through all items and check their name for match
- QHash<QString, QNetworkConfigurationPrivatePointer>::ConstIterator i =
- accessPointConfigurations.constBegin();
- while (i != accessPointConfigurations.constEnd()) {
- QNetworkConfigurationPrivatePointer ptr = i.value();
-
- QMutexLocker configLocker(&ptr->mutex);
-
- if (ptr->name == realSSID) {
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNCM EasyWlan uses real SSID: " << realSSID;
-#endif
- return ptr;
- }
- ++i;
- }
- }
- }
- return QNetworkConfigurationPrivatePointer();
-}
-#endif
-
-// Sessions may use this function to report configuration state changes,
-// because on some Symbian platforms (especially Symbian^3) all state changes are not
-// reported by the RConnectionMonitor, in particular in relation to stop() call,
-// whereas they _are_ reported on RConnection progress notifier used by sessions --> centralize
-// this data here so that other sessions may benefit from it too (not all sessions necessarily have
-// RConnection progress notifiers available but they relay on having e.g. disconnected information from
-// manager). Currently only 'Disconnected' state is of interest because it has proven to be troublesome.
-void SymbianEngine::configurationStateChangeReport(TUint32 accessPointId, QNetworkSession::State newState)
-{
- QMutexLocker locker(&mutex);
-
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNCM A session reported state change for IAP ID: " << accessPointId << " whose new state is: " << newState;
-#endif
- switch (newState) {
- case QNetworkSession::Disconnected:
- {
- QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX +
- QString::number(qHash(accessPointId));
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(ident);
- if (ptr) {
- // Configuration is either Defined or Discovered
- if (changeConfigurationStateAtMaxTo(ptr, QNetworkConfiguration::Discovered)) {
- updateStatesToSnaps();
- }
-
- locker.unlock();
- emit configurationStateChanged(toSymbianConfig(ptr)->numericIdentifier(),
- toSymbianConfig(ptr)->connectionIdentifier(),
- QNetworkSession::Disconnected);
- locker.relock();
- }
- }
- break;
- default:
- break;
- }
-}
-
-// Waits for 2..6 seconds.
-void SymbianEngine::updateConfigurationsAfterRandomTime()
-{
- int iTimeToWait = qMax(1000, (qAbs(qrand()) % 68) * 100);
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug("QNCM waiting random time: %d ms", iTimeToWait);
-#endif
- QTimer::singleShot(iTimeToWait, this, SLOT(delayedConfigurationUpdate()));
-}
-
-QNetworkConfigurationPrivatePointer SymbianEngine::dataByConnectionId(TUint aConnectionId)
-{
- QNetworkConfiguration item;
- QHash<QString, QNetworkConfigurationPrivatePointer>::const_iterator i =
- accessPointConfigurations.constBegin();
- while (i != accessPointConfigurations.constEnd()) {
- QNetworkConfigurationPrivatePointer ptr = i.value();
- if (toSymbianConfig(ptr)->connectionIdentifier() == aConnectionId)
- return ptr;
-
- ++i;
- }
-
- return QNetworkConfigurationPrivatePointer();
-}
-
-AccessPointsAvailabilityScanner::AccessPointsAvailabilityScanner(SymbianEngine& owner,
- RConnectionMonitor& connectionMonitor)
- : CActive(CActive::EPriorityHigh), iOwner(owner), iConnectionMonitor(connectionMonitor)
-{
- CActiveScheduler::Add(this);
-}
-
-AccessPointsAvailabilityScanner::~AccessPointsAvailabilityScanner()
-{
- Cancel();
-}
-
-void AccessPointsAvailabilityScanner::DoCancel()
-{
- iConnectionMonitor.CancelAsyncRequest(EConnMonGetPckgAttribute);
- iScanActive = EFalse;
- iOwner.iScanInQueue = EFalse;
-}
-
-void AccessPointsAvailabilityScanner::StartScanning()
-{
- if (!iScanActive) {
- iScanActive = ETrue;
- if (iOwner.iFirstUpdate) {
- // On first update (the mgr is being instantiated) update only those bearers who
- // don't need time-consuming scans (WLAN).
- // Note: EBearerIdWCDMA covers also GPRS bearer
- iConnectionMonitor.GetPckgAttribute(EBearerIdWCDMA, 0, KIapAvailability, iIapBuf, iStatus);
- } else {
- iConnectionMonitor.GetPckgAttribute(EBearerIdAll, 0, KIapAvailability, iIapBuf, iStatus);
- }
-
- if (!IsActive()) {
- SetActive();
- }
- } else {
- // Queue scan for getting WLAN info after first request returns
- if (iOwner.iFirstUpdate) {
- iOwner.iScanInQueue = ETrue;
- }
- }
-}
-
-void AccessPointsAvailabilityScanner::RunL()
-{
- QMutexLocker locker(&iOwner.mutex);
-
- iScanActive = EFalse;
- if (iStatus.Int() != KErrNone) {
- iIapBuf().iCount = 0;
- QT_TRYCATCH_LEAVING(iOwner.accessPointScanningReady(false,iIapBuf()));
- } else {
- QT_TRYCATCH_LEAVING(iOwner.accessPointScanningReady(true,iIapBuf()));
- }
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_BEARERMANAGEMENT