From 1365d290c670f1f082b1286637d67f516f41d726 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Mon, 31 Oct 2011 13:44:01 +0100 Subject: Remove S60/symbian specific code in plugins/bearer Clean up and remove Symbian specific code and data. Change-Id: Icef41c22f143278a66f6a46ca80c495d083bf9a9 Reviewed-by: Alex --- src/plugins/bearer/symbian/3_1/3_1.pro | 9 - src/plugins/bearer/symbian/3_2/3_2.pro | 17 - src/plugins/bearer/symbian/main.cpp | 88 -- .../bearer/symbian/qnetworksession_impl.cpp | 1549 -------------------- src/plugins/bearer/symbian/qnetworksession_impl.h | 237 --- src/plugins/bearer/symbian/symbian.pri | 32 - src/plugins/bearer/symbian/symbian.pro | 8 - src/plugins/bearer/symbian/symbian_3/symbian_3.pro | 21 - src/plugins/bearer/symbian/symbianengine.cpp | 1409 ------------------ src/plugins/bearer/symbian/symbianengine.h | 246 ---- 10 files changed, 3616 deletions(-) delete mode 100644 src/plugins/bearer/symbian/3_1/3_1.pro delete mode 100644 src/plugins/bearer/symbian/3_2/3_2.pro delete mode 100644 src/plugins/bearer/symbian/main.cpp delete mode 100644 src/plugins/bearer/symbian/qnetworksession_impl.cpp delete mode 100644 src/plugins/bearer/symbian/qnetworksession_impl.h delete mode 100644 src/plugins/bearer/symbian/symbian.pri delete mode 100644 src/plugins/bearer/symbian/symbian.pro delete mode 100644 src/plugins/bearer/symbian/symbian_3/symbian_3.pro delete mode 100644 src/plugins/bearer/symbian/symbianengine.cpp delete mode 100644 src/plugins/bearer/symbian/symbianengine.h (limited to 'src/plugins/bearer/symbian') diff --git a/src/plugins/bearer/symbian/3_1/3_1.pro b/src/plugins/bearer/symbian/3_1/3_1.pro deleted file mode 100644 index b7c6aef913..0000000000 --- a/src/plugins/bearer/symbian/3_1/3_1.pro +++ /dev/null @@ -1,9 +0,0 @@ -include(../symbian.pri) - -is_using_gnupoc { - LIBS += -lapengine -} else { - LIBS += -lAPEngine -} -TARGET = $${TARGET}_3_1 -TARGET.UID3 = 0x2002131C diff --git a/src/plugins/bearer/symbian/3_2/3_2.pro b/src/plugins/bearer/symbian/3_2/3_2.pro deleted file mode 100644 index ac3b3f898f..0000000000 --- a/src/plugins/bearer/symbian/3_2/3_2.pro +++ /dev/null @@ -1,17 +0,0 @@ -include(../symbian.pri) - -symbian { - contains(S60_VERSION, 3.1) { - is_using_gnupoc { - LIBS += -lapengine - } else { - LIBS += -lAPEngine - } - } else { - DEFINES += SNAP_FUNCTIONALITY_AVAILABLE - LIBS += -lcmmanager - } -} - -TARGET = $${TARGET}_3_2 -TARGET.UID3 = 0x2002131D diff --git a/src/plugins/bearer/symbian/main.cpp b/src/plugins/bearer/symbian/main.cpp deleted file mode 100644 index 0740e1f45a..0000000000 --- a/src/plugins/bearer/symbian/main.cpp +++ /dev/null @@ -1,88 +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 - -#include - -#ifndef QT_NO_BEARERMANAGEMENT - -QT_BEGIN_NAMESPACE - -class QSymbianEnginePlugin : public QBearerEnginePlugin -{ -public: - QSymbianEnginePlugin(); - ~QSymbianEnginePlugin(); - - QStringList keys() const; - QBearerEngine *create(const QString &key) const; -}; - -QSymbianEnginePlugin::QSymbianEnginePlugin() -{ -} - -QSymbianEnginePlugin::~QSymbianEnginePlugin() -{ -} - -QStringList QSymbianEnginePlugin::keys() const -{ - return QStringList() << QLatin1String("symbian"); -} - -QBearerEngine *QSymbianEnginePlugin::create(const QString &key) const -{ - if (key == QLatin1String("symbian")) - return new SymbianEngine; - else - return 0; -} - -Q_EXPORT_STATIC_PLUGIN(QSymbianEnginePlugin) -Q_EXPORT_PLUGIN2(qsymbianbearer, QSymbianEnginePlugin) - -QT_END_NAMESPACE - -#endif // QT_NO_BEARERMANAGEMENT diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.cpp b/src/plugins/bearer/symbian/qnetworksession_impl.cpp deleted file mode 100644 index 107f3475c9..0000000000 --- a/src/plugins/bearer/symbian/qnetworksession_impl.cpp +++ /dev/null @@ -1,1549 +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 "qnetworksession_impl.h" -#include "symbianengine.h" - -#include -#include -#include -#include - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE -#include -#endif - -#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE) -#include -#endif - -#ifndef QT_NO_BEARERMANAGEMENT - -QT_BEGIN_NAMESPACE - -QNetworkSessionPrivateImpl::QNetworkSessionPrivateImpl(SymbianEngine *engine) -: engine(engine), iSocketServ(qt_symbianGetSocketServer()), - ipConnectionNotifier(0), ipConnectionStarter(0), - iHandleStateNotificationsFromManager(false), iFirstSync(true), iStoppedByUser(false), - iClosedByUser(false), iError(QNetworkSession::UnknownSessionError), iALREnabled(0), - iConnectInBackground(false), isOpening(false) -{ - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - iMobility = NULL; -#endif - - TRAP_IGNORE(iConnectionMonitor.ConnectL()); -} - -void QNetworkSessionPrivateImpl::closeHandles() -{ - QMutexLocker lock(&mutex); - // Cancel Connection Progress Notifications first. - // Note: ConnectionNotifier must be destroyed before RConnection::Close() - // => deleting ipConnectionNotifier results RConnection::CancelProgressNotification() - delete ipConnectionNotifier; - ipConnectionNotifier = NULL; - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - // mobility monitor must be deleted before RConnection is closed - delete iMobility; - iMobility = NULL; -#endif - - // Cancel possible RConnection::Start() - may call RConnection::Close if Start was in progress - delete ipConnectionStarter; - ipConnectionStarter = 0; - //close any open connection (note Close twice is safe in case Cancel did it above) - iConnection.Close(); - - QSymbianSocketManager::instance().setDefaultConnection(0); - - iConnectionMonitor.Close(); -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) - << " - handles closed"; -#endif - -} - -QNetworkSessionPrivateImpl::~QNetworkSessionPrivateImpl() -{ - isOpen = false; - isOpening = false; - - closeHandles(); -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) - << " - destroyed"; -#endif -} - -void QNetworkSessionPrivateImpl::configurationStateChanged(quint32 accessPointId, quint32 connMonId, QNetworkSession::State newState) -{ - if (iHandleStateNotificationsFromManager) { -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "configurationStateChanged from manager for IAP : " << QString::number(accessPointId) - << "connMon ID : " << QString::number(connMonId) << " : to a state: " << newState - << "whereas my current state is: " << state; -#else - Q_UNUSED(connMonId); -#endif - this->newState(newState, accessPointId); - } -} - -void QNetworkSessionPrivateImpl::configurationRemoved(QNetworkConfigurationPrivatePointer config) -{ - if (!publicConfig.isValid()) - return; - - TUint32 publicNumericId = - toSymbianConfig(privateConfiguration(publicConfig))->numericIdentifier(); - - if (toSymbianConfig(config)->numericIdentifier() == publicNumericId) { -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "configurationRemoved IAP: " << QString::number(publicNumericId) << " : going to State: Invalid"; -#endif - this->newState(QNetworkSession::Invalid, publicNumericId); - } -} - -void QNetworkSessionPrivateImpl::configurationAdded(QNetworkConfigurationPrivatePointer config) -{ - Q_UNUSED(config); - // If session is based on service network, some other app may create new access points - // to the SNAP --> synchronize session's state with that of interface's. - if (!publicConfig.isValid() || publicConfig.type() != QNetworkConfiguration::ServiceNetwork) - return; - -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "configurationAdded IAP: " - << toSymbianConfig(config)->numericIdentifier(); -#endif - - syncStateWithInterface(); -} - -// Function sets the state of the session to match the state -// of the underlying interface (the configuration this session is based on) -void QNetworkSessionPrivateImpl::syncStateWithInterface() -{ - if (!publicConfig.isValid()) - return; - - if (iFirstSync) { - QObject::connect(engine, - SIGNAL(configurationStateChanged(quint32,quint32,QNetworkSession::State)), - this, - SLOT(configurationStateChanged(quint32,quint32,QNetworkSession::State))); - // Listen to configuration removals, so that in case the configuration - // this session is based on is removed, session knows to enter Invalid -state. - QObject::connect(engine, SIGNAL(configurationRemoved(QNetworkConfigurationPrivatePointer)), - this, SLOT(configurationRemoved(QNetworkConfigurationPrivatePointer))); - // Connect to configuration additions, so that in case a configuration is added - // in a SNAP this session is based on, the session knows to synch its state with its - // interface. - QObject::connect(engine, SIGNAL(configurationAdded(QNetworkConfigurationPrivatePointer)), - this, SLOT(configurationAdded(QNetworkConfigurationPrivatePointer))); - } - // Start listening IAP state changes from QNetworkConfigurationManagerPrivate - iHandleStateNotificationsFromManager = true; - - // Check what is the state of the configuration this session is based on - // and set the session in appropriate state. -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "syncStateWithInterface() state of publicConfig is: " << publicConfig.state(); -#endif - switch (publicConfig.state()) { - case QNetworkConfiguration::Active: - newState(QNetworkSession::Connected); - break; - case QNetworkConfiguration::Discovered: - newState(QNetworkSession::Disconnected); - break; - case QNetworkConfiguration::Defined: - newState(QNetworkSession::NotAvailable); - break; - case QNetworkConfiguration::Undefined: - default: - newState(QNetworkSession::Invalid); - } -} - -#ifndef QT_NO_NETWORKINTERFACE -QNetworkInterface QNetworkSessionPrivateImpl::interface(TUint iapId) const -{ - QString interfaceName; - - TSoInetInterfaceInfo ifinfo; - TPckg ifinfopkg(ifinfo); - TSoInetIfQuery ifquery; - TPckg ifquerypkg(ifquery); - - // Open dummy socket for interface queries - RSocket socket; - TInt retVal = socket.Open(iSocketServ, _L("udp")); - if (retVal != KErrNone) { - return QNetworkInterface(); - } - - // Start enumerating interfaces - socket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl); - while(socket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, ifinfopkg) == KErrNone) { - ifquery.iName = ifinfo.iName; - TInt err = socket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, ifquerypkg); - if(err == KErrNone && ifquery.iZone[1] == iapId) { // IAP ID is index 1 of iZone - if(ifinfo.iAddress.Address() > 0) { - interfaceName = QString::fromUtf16(ifinfo.iName.Ptr(),ifinfo.iName.Length()); - break; - } - } - } - - socket.Close(); - - if (interfaceName.isEmpty()) { - return QNetworkInterface(); - } - - return QNetworkInterface::interfaceFromName(interfaceName); -} -#endif - -#ifndef QT_NO_NETWORKINTERFACE -QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const -{ -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "currentInterface() requested, state: " << state - << "publicConfig validity: " << publicConfig.isValid(); - if (activeInterface.isValid()) - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "interface is: " << activeInterface.humanReadableName(); -#endif - - if (!publicConfig.isValid() || state != QNetworkSession::Connected) { - return QNetworkInterface(); - } - - return activeInterface; -} -#endif - -QVariant QNetworkSessionPrivateImpl::sessionProperty(const QString& key) const -{ - if (key == "ConnectInBackground") { - return QVariant(iConnectInBackground); - } - return QVariant(); -} - -void QNetworkSessionPrivateImpl::setSessionProperty(const QString& key, const QVariant& value) -{ - // Valid value means adding property, invalid means removing it. - if (key == "ConnectInBackground") { - if (value.isValid()) { - iConnectInBackground = value.toBool(); - } else { - iConnectInBackground = EFalse; - } - } -} - -QString QNetworkSessionPrivateImpl::errorString() const -{ - switch (iError) { - case QNetworkSession::UnknownSessionError: - return tr("Unknown session error."); - case QNetworkSession::SessionAbortedError: - return tr("The session was aborted by the user or system."); - case QNetworkSession::OperationNotSupportedError: - return tr("The requested operation is not supported by the system."); - case QNetworkSession::InvalidConfigurationError: - return tr("The specified configuration cannot be used."); - case QNetworkSession::RoamingError: - return tr("Roaming was aborted or is not possible."); - } - - return QString(); -} - -QNetworkSession::SessionError QNetworkSessionPrivateImpl::error() const -{ - return iError; -} - -void QNetworkSessionPrivateImpl::open() -{ - QMutexLocker lock(&mutex); -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "open() called, session state is: " << state << " and isOpen is: " - << isOpen << isOpening; -#endif - - if (isOpen || isOpening) - return; - - isOpening = true; - - // Stop handling IAP state change signals from QNetworkConfigurationManagerPrivate - // => RConnection::ProgressNotification will be used for IAP/SNAP monitoring - iHandleStateNotificationsFromManager = false; - - // Configuration may have been invalidated after session creation by platform - // (e.g. configuration has been deleted). - if (!publicConfig.isValid()) { - newState(QNetworkSession::Invalid); - iError = QNetworkSession::InvalidConfigurationError; - emit QNetworkSessionPrivate::error(iError); - return; - } - // If opening a undefined configuration, session emits error and enters - // NotAvailable -state. Note that we will try ones in 'defined' state to avoid excessive - // need for WLAN scans (via updateConfigurations()), because user may have walked - // into a WLAN range, but periodic background scan has not occurred yet --> - // we don't want to force application to make frequent updateConfigurations() calls - // to be able to try if e.g. home WLAN is available. - if (publicConfig.state() == QNetworkConfiguration::Undefined) { - newState(QNetworkSession::NotAvailable); - iError = QNetworkSession::InvalidConfigurationError; - emit QNetworkSessionPrivate::error(iError); - return; - } - // Clear possible previous states - iStoppedByUser = false; - iClosedByUser = false; - - Q_ASSERT(!iConnection.SubSessionHandle()); - TInt error = iConnection.Open(iSocketServ); - if (error != KErrNone) { - // Could not open RConnection - newState(QNetworkSession::Invalid); - iError = QNetworkSession::UnknownSessionError; - emit QNetworkSessionPrivate::error(iError); - syncStateWithInterface(); - return; - } - - // Use RConnection::ProgressNotification for IAP/SNAP monitoring - // (<=> ConnectionProgressNotifier uses RConnection::ProgressNotification) - if (!ipConnectionNotifier) { - ipConnectionNotifier = new ConnectionProgressNotifier(*this,iConnection); - } - if (ipConnectionNotifier) { - ipConnectionNotifier->StartNotifications(); - } - - if (publicConfig.type() == QNetworkConfiguration::InternetAccessPoint) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(publicConfig)); - -#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE) - // With One Click Connectivity (Symbian^3 onwards) it is possible - // to connect silently, without any popups. - TConnPrefList pref; - TExtendedConnPref prefs; - - prefs.SetIapId(symbianConfig->numericIdentifier()); - if (iConnectInBackground) { - prefs.SetNoteBehaviour( TExtendedConnPref::ENoteBehaviourConnSilent ); - } - pref.AppendL(&prefs); -#else - TCommDbConnPref pref; - pref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt); - - pref.SetIapId(symbianConfig->numericIdentifier()); -#endif - if (!ipConnectionStarter) { - ipConnectionStarter = new ConnectionStarter(*this, iConnection); - ipConnectionStarter->Start(pref); - } - // Avoid flip flop of states if the configuration is already - // active. IsOpen/opened() will indicate when ready. - if (state != QNetworkSession::Connected) { - newState(QNetworkSession::Connecting); - } - } else if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(publicConfig)); - -#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(SNAP_FUNCTIONALITY_AVAILABLE) - // On Symbian^3 if service network is not reachable, it triggers a UI (aka EasyWLAN) where - // user can create new IAPs. To detect this, we need to store the number of IAPs - // there was before connection was started. - iKnownConfigsBeforeConnectionStart = engine->accessPointConfigurationIdentifiers(); - TConnPrefList snapPref; - TExtendedConnPref prefs; - prefs.SetSnapId(symbianConfig->numericIdentifier()); - if (iConnectInBackground) { - prefs.SetNoteBehaviour( TExtendedConnPref::ENoteBehaviourConnSilent ); - } - snapPref.AppendL(&prefs); -#else - TConnSnapPref snapPref(symbianConfig->numericIdentifier()); -#endif - if (!ipConnectionStarter) { - ipConnectionStarter = new ConnectionStarter(*this, iConnection); - ipConnectionStarter->Start(snapPref); - } - // Avoid flip flop of states if the configuration is already - // active. IsOpen/opened() will indicate when ready. - if (state != QNetworkSession::Connected) { - newState(QNetworkSession::Connecting); - } - } else if (publicConfig.type() == QNetworkConfiguration::UserChoice) { - iKnownConfigsBeforeConnectionStart = engine->accessPointConfigurationIdentifiers(); - if (!ipConnectionStarter) { - ipConnectionStarter = new ConnectionStarter(*this, iConnection); - ipConnectionStarter->Start(); - } - newState(QNetworkSession::Connecting); - } - - if (error != KErrNone) { - isOpen = false; - isOpening = false; - iError = QNetworkSession::UnknownSessionError; - emit QNetworkSessionPrivate::error(iError); - closeHandles(); - syncStateWithInterface(); - } -} - -TUint QNetworkSessionPrivateImpl::iapClientCount(TUint aIAPId) const -{ - TRequestStatus status; - TUint connectionCount; - iConnectionMonitor.GetConnectionCount(connectionCount, status); - User::WaitForRequest(status); - if (status.Int() == KErrNone) { - for (TUint i = 1; i <= connectionCount; i++) { - TUint connectionId; - TUint subConnectionCount; - iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount); - TUint apId; - iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status); - User::WaitForRequest(status); - if (apId == aIAPId) { - TConnMonClientEnumBuf buf; - iConnectionMonitor.GetPckgAttribute(connectionId, 0, KClientInfo, buf, status); - User::WaitForRequest(status); - if (status.Int() == KErrNone) { - return buf().iCount; - } - } - } - } - return 0; -} - -void QNetworkSessionPrivateImpl::close(bool allowSignals) -{ -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "close() called, session state is: " << state << " and isOpen is : " - << isOpen; -#endif - - if (!isOpen && state != QNetworkSession::Connecting) { - return; - } - // Mark this session as closed-by-user so that we are able to report - // distinguish between stop() and close() state transitions - // when reporting. - iClosedByUser = true; - isOpen = false; - isOpening = false; - - serviceConfig = QNetworkConfiguration(); - - closeHandles(); - - // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate - iHandleStateNotificationsFromManager = true; - - // If UserChoice, go down immediately. If some other configuration, - // go down immediately if there is no reports expected from the platform; - // in practice Connection Monitor is aware of connections only after - // KFinishedSelection event, and hence reports only after that event, but - // that does not seem to be trusted on all Symbian versions --> safest - // to go down. - if (publicConfig.type() == QNetworkConfiguration::UserChoice || state == QNetworkSession::Connecting) { -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "going disconnected right away, since either UserChoice or Connecting"; -#endif - newState(QNetworkSession::Closing); - newState(QNetworkSession::Disconnected); - } - if (allowSignals) { - emit closed(); - } -} - -void QNetworkSessionPrivateImpl::stop() -{ - QMutexLocker lock(&mutex); -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "stop() called, session state is: " << state << " and isOpen is : " - << isOpen; -#endif - if (!isOpen && - publicConfig.isValid() && - publicConfig.type() == QNetworkConfiguration::InternetAccessPoint) { -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "since session is not open, using RConnectionMonitor to stop() the interface"; -#endif - iStoppedByUser = true; - // If the publicConfig is type of IAP, enumerate through connections at - // connection monitor. If publicConfig is active in that list, stop it. - // Otherwise there is nothing to stop. Note: because this QNetworkSession is not open, - // activeConfig is not usable. - TUint count; - TRequestStatus status; - iConnectionMonitor.GetConnectionCount(count, status); - User::WaitForRequest(status); - if (status.Int() != KErrNone) { - return; - } - TUint numSubConnections; // Not used but needed by GetConnectionInfo i/f - TUint connectionId; - for (TUint i = 1; i <= count; ++i) { - // Get (connection monitor's assigned) connection ID - TInt ret = iConnectionMonitor.GetConnectionInfo(i, connectionId, numSubConnections); - if (ret == KErrNone) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(publicConfig)); - - // See if connection Id matches with our Id. If so, stop() it. - if (symbianConfig->connectionIdentifier() == connectionId) { - ret = iConnectionMonitor.SetBoolAttribute(connectionId, - 0, // subConnectionId don't care - KConnectionStop, - ETrue); - } - } - // Enter disconnected state right away since the session is not even open. - // Symbian^3 connection monitor does not emit KLinkLayerClosed when - // connection is stopped via connection monitor. - newState(QNetworkSession::Disconnected); - } - } else if (isOpen) { -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "since session is open, using RConnection to stop() the interface"; -#endif - // Since we are open, use RConnection to stop the interface - isOpen = false; - isOpening = false; - iStoppedByUser = true; - newState(QNetworkSession::Closing); - if (ipConnectionNotifier) { - ipConnectionNotifier->StopNotifications(); - // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate - iHandleStateNotificationsFromManager = true; - } - iConnection.Stop(RConnection::EStopAuthoritative); - isOpen = true; - isOpening = false; - close(false); - emit closed(); - } -} - -void QNetworkSessionPrivateImpl::migrate() -{ -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - if (iMobility) { - QSymbianSocketManager::instance().setDefaultConnection(0); - // Start migrating to new IAP - iMobility->MigrateToPreferredCarrier(); - } -#endif -} - -void QNetworkSessionPrivateImpl::ignore() -{ -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - if (iMobility) { - iMobility->IgnorePreferredCarrier(); - - if (!iALRUpgradingConnection) { - newState(QNetworkSession::Disconnected); - } else { - newState(QNetworkSession::Connected,iOldRoamingIap); - } - } -#endif -} - -void QNetworkSessionPrivateImpl::accept() -{ -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - if (iMobility) { - iMobility->NewCarrierAccepted(); - - QNetworkConfiguration newActiveConfig = activeConfiguration(iNewRoamingIap); - - QSymbianSocketManager::instance().setDefaultConnection(&iConnection); - - newState(QNetworkSession::Connected, iNewRoamingIap); - } -#endif -} - -void QNetworkSessionPrivateImpl::reject() -{ -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - if (iMobility) { - iMobility->NewCarrierRejected(); - - if (!iALRUpgradingConnection) { - newState(QNetworkSession::Disconnected); - } else { - QNetworkConfiguration newActiveConfig = activeConfiguration(iOldRoamingIap); - - QSymbianSocketManager::instance().setDefaultConnection(&iConnection); - - newState(QNetworkSession::Connected, iOldRoamingIap); - } - } -#endif -} - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE -void QNetworkSessionPrivateImpl::PreferredCarrierAvailable(TAccessPointInfo aOldAPInfo, - TAccessPointInfo aNewAPInfo, - TBool aIsUpgrade, - TBool aIsSeamless) -{ - iOldRoamingIap = aOldAPInfo.AccessPoint(); - iNewRoamingIap = aNewAPInfo.AccessPoint(); - newState(QNetworkSession::Roaming); - if (iALREnabled > 0) { - iALRUpgradingConnection = aIsUpgrade; - QList configs = publicConfig.children(); - for (int i=0; i < configs.count(); i++) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(configs[i])); - - if (symbianConfig->numericIdentifier() == aNewAPInfo.AccessPoint()) { - // Any slot connected to the signal might throw an std::exception, - // which must not propagate into Symbian code (this function is a callback - // from platform). We could convert exception to a symbian Leave, but since the - // prototype of this function bans this (no trailing 'L'), we just catch - // and drop. - QT_TRY { - emit preferredConfigurationChanged(configs[i], aIsSeamless); - } - QT_CATCH (std::exception&) {} - } - } - } else { - migrate(); - } -} - -void QNetworkSessionPrivateImpl::NewCarrierActive(TAccessPointInfo /*aNewAPInfo*/, TBool /*aIsSeamless*/) -{ - if (iALREnabled > 0) { - QT_TRY { - emit newConfigurationActivated(); - } - QT_CATCH (std::exception&) {} - } else { - accept(); - } -} - -void QNetworkSessionPrivateImpl::Error(TInt aError) -{ -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "roaming Error() occurred" << aError << ", isOpen is: " << isOpen; -#endif - if (aError == KErrCancel) - return; //avoid recursive deletion - if (isOpen) { - isOpen = false; - isOpening = false; - activeConfig = QNetworkConfiguration(); - serviceConfig = QNetworkConfiguration(); - iError = QNetworkSession::RoamingError; - emit QNetworkSessionPrivate::error(iError); - closeHandles(); - QT_TRY { - syncStateWithInterface(); - // In some cases IAP is still in Connected state when - // syncStateWithInterface(); is called - // => Following call makes sure that Session state - // changes immediately to Disconnected. - newState(QNetworkSession::Disconnected); - emit closed(); - } - QT_CATCH (std::exception&) {} - } else if (iStoppedByUser) { - // If the user of this session has called the stop() and - // configuration is based on internet SNAP, this needs to be - // done here because platform might roam. - QT_TRY { - newState(QNetworkSession::Disconnected); - } - QT_CATCH (std::exception&) {} - } -} -#endif - -void QNetworkSessionPrivateImpl::setALREnabled(bool enabled) -{ - if (enabled) { - iALREnabled++; - } else { - iALREnabled--; - } -} - -QNetworkConfiguration QNetworkSessionPrivateImpl::bestConfigFromSNAP(const QNetworkConfiguration& snapConfig) const -{ - QNetworkConfiguration config; - QList subConfigurations = snapConfig.children(); - for (int i = 0; i < subConfigurations.count(); i++ ) { - if (subConfigurations[i].state() == QNetworkConfiguration::Active) { - config = subConfigurations[i]; - break; - } else if (!config.isValid() && subConfigurations[i].state() == QNetworkConfiguration::Discovered) { - config = subConfigurations[i]; - } - } - if (!config.isValid() && subConfigurations.count() > 0) { - config = subConfigurations[0]; - } - return config; -} - -quint64 QNetworkSessionPrivateImpl::bytesWritten() const -{ - return transferredData(KUplinkData); -} - -quint64 QNetworkSessionPrivateImpl::bytesReceived() const -{ - return transferredData(KDownlinkData); -} - -quint64 QNetworkSessionPrivateImpl::transferredData(TUint dataType) const -{ - if (!publicConfig.isValid()) { - return 0; - } - - QNetworkConfiguration config; - if (publicConfig.type() == QNetworkConfiguration::UserChoice) { - if (serviceConfig.isValid()) { - config = serviceConfig; - } else { - if (activeConfig.isValid()) { - config = activeConfig; - } - } - } else { - config = publicConfig; - } - - if (!config.isValid()) { - return 0; - } - - TUint count; - TRequestStatus status; - iConnectionMonitor.GetConnectionCount(count, status); - User::WaitForRequest(status); - if (status.Int() != KErrNone) { - return 0; - } - - TUint transferredData = 0; - TUint numSubConnections; - TUint connectionId; - bool configFound; - for (TUint i = 1; i <= count; i++) { - TInt ret = iConnectionMonitor.GetConnectionInfo(i, connectionId, numSubConnections); - if (ret == KErrNone) { - TUint apId; - iConnectionMonitor.GetUintAttribute(connectionId, 0, KIAPId, apId, status); - User::WaitForRequest(status); - if (status.Int() == KErrNone) { - configFound = false; - if (config.type() == QNetworkConfiguration::ServiceNetwork) { - QList configs = config.children(); - for (int i=0; i < configs.count(); i++) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(configs[i])); - - if (symbianConfig->numericIdentifier() == apId) { - configFound = true; - break; - } - } - } else { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(config)); - - if (symbianConfig->numericIdentifier() == apId) - configFound = true; - } - if (configFound) { - TUint tData; - iConnectionMonitor.GetUintAttribute(connectionId, 0, dataType, tData, status ); - User::WaitForRequest(status); - if (status.Int() == KErrNone) { - transferredData += tData; - } - } - } - } - } - - return transferredData; -} - -quint64 QNetworkSessionPrivateImpl::activeTime() const -{ - if (!isOpen || startTime.isNull()) { - return 0; - } - return startTime.secsTo(QDateTime::currentDateTime()); -} - -QNetworkConfiguration QNetworkSessionPrivateImpl::activeConfiguration(TUint32 iapId) const -{ - if (iapId == 0) { - _LIT(KSetting, "IAP\\Id"); - iConnection.GetIntSetting(KSetting, iapId); -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - // Check if this is an Easy WLAN configuration. On Symbian^3 RConnection may report - // the used configuration as 'EasyWLAN' IAP ID if someone has just opened the configuration - // from WLAN Scan dialog, _and_ that connection is still up. We need to find the - // real matching configuration. Function alters the Easy WLAN ID to real IAP ID (only if - // easy WLAN): - easyWlanTrueIapId(iapId); -#endif - } - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) { - // Try to search IAP from the used SNAP using IAP Id - QList children = publicConfig.children(); - for (int i=0; i < children.count(); i++) { - SymbianNetworkConfigurationPrivate *childConfig = - toSymbianConfig(privateConfiguration(children[i])); - - if (childConfig->numericIdentifier() == iapId) - return children[i]; - } - - // Given IAP Id was not found from the used SNAP - // => Try to search matching IAP using mappingName - // mappingName contains: - // 1. "Access point name" for "Packet data" Bearer - // 2. "WLAN network name" (= SSID) for "Wireless LAN" Bearer - // 3. "Dial-up number" for "Data call Bearer" or "High Speed (GSM)" Bearer - // <=> Note: It's possible that in this case reported IAP is - // clone of the one of the IAPs of the used SNAP - // => If mappingName matches, clone has been found - QNetworkConfiguration pt = QNetworkConfigurationManager().configurationFromIdentifier( - QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId))); - - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(pt)); - if (symbianConfig) { - for (int i=0; i < children.count(); i++) { - SymbianNetworkConfigurationPrivate *childConfig = - toSymbianConfig(privateConfiguration(children[i])); - - if (childConfig->configMappingName() == symbianConfig->configMappingName()) { - return children[i]; - } - } - } else { -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - // On Symbian^3 (only, not earlier or Symbian^4) if the SNAP was not reachable, it - // triggers user choice type of activity (EasyWLAN). As a result, a new IAP may be - // created, and hence if was not found yet. Therefore update configurations and see if - // there is something new. - - // 1. Update knowledge from the databases. - if (thread() != engine->thread()) - QMetaObject::invokeMethod(engine, "requestUpdate", Qt::BlockingQueuedConnection); - else - engine->requestUpdate(); - - // 2. Check if new configuration was created during connection creation - QList knownConfigs = engine->accessPointConfigurationIdentifiers(); -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "opened configuration was not known beforehand, looking for new."; -#endif - if (knownConfigs.count() > iKnownConfigsBeforeConnectionStart.count()) { - // Configuration count increased => new configuration was created - // => Search new, created configuration - QString newIapId; - for (int i=0; i < iKnownConfigsBeforeConnectionStart.count(); i++) { - if (knownConfigs[i] != iKnownConfigsBeforeConnectionStart[i]) { - newIapId = knownConfigs[i]; - break; - } - } - if (newIapId.isEmpty()) { - newIapId = knownConfigs[knownConfigs.count()-1]; - } - pt = QNetworkConfigurationManager().configurationFromIdentifier(newIapId); - if (pt.isValid()) { -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "new configuration was found, name, IAP id: " << pt.name() << pt.identifier(); -#endif - return pt; - } - } -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "configuration was not found, returning invalid."; -#endif -#endif - // Given IAP Id was not found from known IAPs array - return QNetworkConfiguration(); - } - // Matching IAP was not found from used SNAP - // => IAP from another SNAP is returned - // (Note: Returned IAP matches to given IAP Id) - return pt; - } -#endif - if (publicConfig.type() == QNetworkConfiguration::UserChoice) { - if (engine) { - QNetworkConfiguration pt = QNetworkConfigurationManager().configurationFromIdentifier( - QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId))); - // Try to found User Selected IAP from known IAPs (accessPointConfigurations) - if (pt.isValid()) { - return pt; - } else { - // Check if new (WLAN) IAP was created in IAP/SNAP dialog - // 1. Sync internal configurations array to commsdb first - if (thread() != engine->thread()) { - QMetaObject::invokeMethod(engine, "requestUpdate", - Qt::BlockingQueuedConnection); - } else { - engine->requestUpdate(); - } - // 2. Check if new configuration was created during connection creation - QStringList knownConfigs = engine->accessPointConfigurationIdentifiers(); - if (knownConfigs.count() > iKnownConfigsBeforeConnectionStart.count()) { - // Configuration count increased => new configuration was created - // => Search new, created configuration - QString newIapId; - for (int i=0; i < iKnownConfigsBeforeConnectionStart.count(); i++) { - if (knownConfigs[i] != iKnownConfigsBeforeConnectionStart[i]) { - newIapId = knownConfigs[i]; - break; - } - } - if (newIapId.isEmpty()) { - newIapId = knownConfigs[knownConfigs.count()-1]; - } - pt = QNetworkConfigurationManager().configurationFromIdentifier(newIapId); - if (pt.isValid()) - return pt; - } - } - } - return QNetworkConfiguration(); - } - - return publicConfig; -} - -void QNetworkSessionPrivateImpl::ConnectionStartComplete(TInt statusCode) -{ -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "RConnection::Start completed with status code: " << statusCode; -#endif - delete ipConnectionStarter; - ipConnectionStarter = 0; - - switch (statusCode) { - case KErrNone: // Connection created successfully - { - TInt error = KErrNone; - QNetworkConfiguration newActiveConfig = activeConfiguration(); - if (!newActiveConfig.isValid()) { - // RConnection startup was successful but no configuration - // was found. That indicates that user has chosen to create a - // new WLAN configuration (from scan results), but that new - // configuration does not have access to Internet (Internet - // Connectivity Test, ICT, failed). - error = KErrGeneral; - } else { - QSymbianSocketManager::instance().setDefaultConnection(&iConnection); - } - if (error != KErrNone) { - isOpen = false; - isOpening = false; - iError = QNetworkSession::UnknownSessionError; - QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError)); - closeHandles(); - if (!newActiveConfig.isValid()) { - // No valid configuration, bail out. - // Status updates from QNCM won't be received correctly - // because there is no configuration to associate them with so transit here. - newState(QNetworkSession::Closing); - newState(QNetworkSession::Disconnected); - } - QT_TRYCATCH_LEAVING(syncStateWithInterface()); - return; - } - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) { - // Activate ALR monitoring - iMobility = CActiveCommsMobilityApiExt::NewL(iConnection, *this); - } -#endif - - isOpen = true; - isOpening = false; - activeConfig = newActiveConfig; - - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(activeConfig)); - -#ifndef QT_NO_NETWORKINTERFACE - activeInterface = interface(symbianConfig->numericIdentifier()); -#endif - if (publicConfig.type() == QNetworkConfiguration::UserChoice) { - serviceConfig = QNetworkConfigurationManager() - .configurationFromIdentifier(activeConfig.identifier()); - } - - startTime = QDateTime::currentDateTime(); - - QT_TRYCATCH_LEAVING({ - newState(QNetworkSession::Connected); - emit quitPendingWaitsForOpened(); - }); - } - break; - case KErrNotFound: // Connection failed - isOpen = false; - isOpening = false; - activeConfig = QNetworkConfiguration(); - serviceConfig = QNetworkConfiguration(); - iError = QNetworkSession::InvalidConfigurationError; - QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError)); - closeHandles(); - QT_TRYCATCH_LEAVING(syncStateWithInterface()); - break; - case KErrCancel: // Connection attempt cancelled - case KErrAlreadyExists: // Connection already exists - default: - isOpen = false; - isOpening = false; - activeConfig = QNetworkConfiguration(); - serviceConfig = QNetworkConfiguration(); - if (statusCode == KErrCancel) { - iError = QNetworkSession::SessionAbortedError; - } else if (publicConfig.state() == QNetworkConfiguration::Undefined || - publicConfig.state() == QNetworkConfiguration::Defined) { - iError = QNetworkSession::InvalidConfigurationError; - } else { - iError = QNetworkSession::UnknownSessionError; - } - QT_TRYCATCH_LEAVING(emit QNetworkSessionPrivate::error(iError)); - closeHandles(); - QT_TRYCATCH_LEAVING(syncStateWithInterface()); - break; - } -} - -// Enters newState if feasible according to current state. -// AccessPointId may be given as parameter. If it is zero, state-change is assumed to -// concern this session's configuration. If non-zero, the configuration is looked up -// and checked if it matches the configuration this session is based on. -bool QNetworkSessionPrivateImpl::newState(QNetworkSession::State newState, TUint accessPointId) -{ -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " - << "NEW STATE, IAP ID : " << QString::number(accessPointId) << " , newState : " << QString::number(newState); -#endif - // Make sure that activeConfig is always updated when SNAP is signaled to be - // connected. - if (isOpen && publicConfig.type() == QNetworkConfiguration::ServiceNetwork && - newState == QNetworkSession::Connected) { - activeConfig = activeConfiguration(accessPointId); - -#ifndef QT_NO_NETWORKINTERFACE - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(activeConfig)); - - activeInterface = interface(symbianConfig->numericIdentifier()); -#endif - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - QSymbianSocketManager::instance().setDefaultConnection(&iConnection); -#endif - } - - // Make sure that same state is not signaled twice in a row. - if (state == newState) { - return true; - } - - // Make sure that Connecting state does not overwrite Roaming state - if (state == QNetworkSession::Roaming && newState == QNetworkSession::Connecting) { - return false; - } - - // Make sure that Connected state is not reported when Connection is - // already Closing. - // Note: Stopping connection results sometimes KLinkLayerOpen - // to be reported first (just before KLinkLayerClosed). - if (state == QNetworkSession::Closing && newState == QNetworkSession::Connected) { - return false; - } - - // Make sure that some lagging 'closing' state-changes do not overwrite - // if we are already disconnected or closed. - if (state == QNetworkSession::Disconnected && newState == QNetworkSession::Closing) { - return false; - } - - // Make sure that some lagging 'connecting' state-changes do not overwrite - // if we are already connected (may righfully still happen with roaming though). - if (state == QNetworkSession::Connected && newState == QNetworkSession::Connecting) { - return false; - } - - bool emitSessionClosed = false; - - // If we abruptly go down and user hasn't closed the session, we've been aborted. - // Note that session may be in 'closing' state and not in 'connected' state, because - // depending on platform the platform may report KConfigDaemonStartingDeregistration - // event before KLinkLayerClosed - if ((isOpen && state == QNetworkSession::Connected && newState == QNetworkSession::Disconnected) || - (isOpen && !iClosedByUser && newState == QNetworkSession::Disconnected)) { - // Active & Connected state should change directly to Disconnected state - // only when something forces connection to close (eg. when another - // application or session stops connection or when network drops - // unexpectedly). - isOpen = false; - isOpening = false; - activeConfig = QNetworkConfiguration(); - serviceConfig = QNetworkConfiguration(); - iError = QNetworkSession::SessionAbortedError; - emit QNetworkSessionPrivate::error(iError); - closeHandles(); - // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate - iHandleStateNotificationsFromManager = true; - emitSessionClosed = true; // Emit SessionClosed after state change has been reported - } - - bool retVal = false; - if (accessPointId == 0) { - state = newState; -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed A to: " << state; -#endif - emit stateChanged(state); - retVal = true; - } else { - if (publicConfig.type() == QNetworkConfiguration::InternetAccessPoint) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(publicConfig)); - - if (symbianConfig->numericIdentifier() == accessPointId) { - state = newState; -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed B to: " << state; -#endif - emit stateChanged(state); - retVal = true; - } - } else if (publicConfig.type() == QNetworkConfiguration::UserChoice && isOpen) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(activeConfig)); - - if (symbianConfig->numericIdentifier() == accessPointId) { - state = newState; -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed C to: " << state; -#endif - emit stateChanged(state); - retVal = true; - } - } else if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) { - QList subConfigurations = publicConfig.children(); - for (int i = 0; i < subConfigurations.count(); i++) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(subConfigurations[i])); - - if (symbianConfig->numericIdentifier() == accessPointId) { - if (newState != QNetworkSession::Disconnected) { - state = newState; -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed D to: " << state; -#endif - emit stateChanged(state); - retVal = true; - } else { - QNetworkConfiguration config = bestConfigFromSNAP(publicConfig); - if ((config.state() == QNetworkConfiguration::Defined) || - (config.state() == QNetworkConfiguration::Discovered)) { - activeConfig = QNetworkConfiguration(); - state = newState; -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed E to: " << state; -#endif - emit stateChanged(state); - retVal = true; - } else if (config.state() == QNetworkConfiguration::Active) { - // Connection to used IAP was closed, but there is another - // IAP that's active in used SNAP - // => Change state back to Connected - state = QNetworkSession::Connected; - emit stateChanged(state); - retVal = true; -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed F to: " << state; -#endif - } - } - } - } -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - // If the retVal is not true here, it means that the status update may apply to an IAP outside of - // SNAP (session is based on SNAP but follows IAP outside of it), which may occur on Symbian^3 EasyWlan. - if (retVal == false && activeConfig.isValid() && - toSymbianConfig(privateConfiguration(activeConfig))->numericIdentifier() == accessPointId) { -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed G to: " << state; -#endif - if (newState == QNetworkSession::Disconnected) { - activeConfig = QNetworkConfiguration(); - } - state = newState; - emit stateChanged(state); - retVal = true; - } -#endif - } - } - if (emitSessionClosed) { - emit closed(); - } - if (state == QNetworkSession::Disconnected) { - // Just in case clear activeConfiguration. - activeConfig = QNetworkConfiguration(); - } - return retVal; -} - -void QNetworkSessionPrivateImpl::handleSymbianConnectionStatusChange(TInt aConnectionStatus, - TInt aError, - TUint accessPointId) -{ -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << QString::number(accessPointId) << " , status : " << QString::number(aConnectionStatus); -#endif - switch (aConnectionStatus) - { - // Connection unitialised - case KConnectionUninitialised: - break; - - // Starting connetion selection - case KStartingSelection: - break; - - // Selection finished - case KFinishedSelection: - if (aError == KErrNone) - { - break; - } - else - { - // The user pressed e.g. "Cancel" and did not select an IAP - newState(QNetworkSession::Disconnected,accessPointId); - } - break; - - // Connection failure - case KConnectionFailure: - newState(QNetworkSession::NotAvailable); - break; - - // Prepearing connection (e.g. dialing) - case KPsdStartingConfiguration: - case KPsdFinishedConfiguration: - case KCsdFinishedDialling: - case KCsdScanningScript: - case KCsdGettingLoginInfo: - case KCsdGotLoginInfo: - break; - - case KConfigDaemonStartingRegistration: - // Creating connection (e.g. GPRS activation) - case KCsdStartingConnect: - case KCsdFinishedConnect: - newState(QNetworkSession::Connecting,accessPointId); - break; - - // Starting log in - case KCsdStartingLogIn: - break; - - // Finished login - case KCsdFinishedLogIn: - break; - - // Connection open - case KConnectionOpen: - break; - - case KLinkLayerOpen: - newState(QNetworkSession::Connected,accessPointId); - break; - - // Connection blocked or suspended - case KDataTransferTemporarilyBlocked: - break; - - case KConfigDaemonStartingDeregistration: - // Hangup or GRPS deactivation - case KConnectionStartingClose: - newState(QNetworkSession::Closing,accessPointId); - break; - - // Connection closed - case KConnectionClosed: - case KLinkLayerClosed: - newState(QNetworkSession::Disconnected,accessPointId); - // Report manager about this to make sure this event - // is received by all interseted parties (mediated by - // manager because it does always receive all events from - // connection monitor). -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "reporting disconnection to manager."; -#endif - if (publicConfig.isValid()) { - SymbianNetworkConfigurationPrivate *symbianConfig = - toSymbianConfig(privateConfiguration(publicConfig)); - - engine->configurationStateChangeReport(symbianConfig->numericIdentifier(), - QNetworkSession::Disconnected); - } - break; - // Unhandled state - default: - break; - } -} - -#if defined(SNAP_FUNCTIONALITY_AVAILABLE) -bool QNetworkSessionPrivateImpl::easyWlanTrueIapId(TUint32 &trueIapId) const -{ - RCmManager iCmManager; - TRAPD(err, iCmManager.OpenL()); - if (err != KErrNone) - return false; - - // Check if this is easy wlan id in the first place - if (trueIapId != iCmManager.EasyWlanIdL()) { - iCmManager.Close(); - return false; - } - - iCmManager.Close(); - - // Loop through all connections that connection monitor is aware - // and check for IAPs based on easy WLAN - TRequestStatus status; - TUint connectionCount; - iConnectionMonitor.GetConnectionCount(connectionCount, status); - User::WaitForRequest(status); - TUint connectionId; - TUint subConnectionCount; - TUint apId; - 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); - if (apId == trueIapId) { - TBuf<50>easyWlanNetworkName; - iConnectionMonitor.GetStringAttribute(connectionId, 0, KNetworkName, - easyWlanNetworkName, status); - User::WaitForRequest(status); - if (status.Int() != KErrNone) - continue; - - const QString ssid = QString::fromUtf16(easyWlanNetworkName.Ptr(), - easyWlanNetworkName.Length()); - - QNetworkConfigurationPrivatePointer ptr = engine->configurationFromSsid(ssid); - if (ptr) { -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG - qDebug() << "QNCM easyWlanTrueIapId(), found true IAP ID: " - << toSymbianConfig(ptr)->numericIdentifier(); -#endif - trueIapId = toSymbianConfig(ptr)->numericIdentifier(); - return true; - } - } - } - } - return false; -} -#endif - -RConnection* QNetworkSessionPrivateImpl::nativeSession() -{ - return &iConnection; -} - -ConnectionProgressNotifier::ConnectionProgressNotifier(QNetworkSessionPrivateImpl& owner, RConnection& connection) - : CActive(CActive::EPriorityUserInput), iOwner(owner), iConnection(connection) -{ - CActiveScheduler::Add(this); -} - -ConnectionProgressNotifier::~ConnectionProgressNotifier() -{ - Cancel(); -} - -void ConnectionProgressNotifier::StartNotifications() -{ - if (!IsActive()) { - SetActive(); - iConnection.ProgressNotification(iProgress, iStatus); - } -} - -void ConnectionProgressNotifier::StopNotifications() -{ - Cancel(); -} - -void ConnectionProgressNotifier::DoCancel() -{ - iConnection.CancelProgressNotification(); -} - -void ConnectionProgressNotifier::RunL() -{ - if (iStatus == KErrNone) { - SetActive(); - iConnection.ProgressNotification(iProgress, iStatus); - // warning, this object may be deleted in the callback - do nothing after handleSymbianConnectionStatusChange - QT_TRYCATCH_LEAVING(iOwner.handleSymbianConnectionStatusChange(iProgress().iStage, iProgress().iError)); - } -} - -ConnectionStarter::ConnectionStarter(QNetworkSessionPrivateImpl &owner, RConnection &connection) - : CActive(CActive::EPriorityUserInput), iOwner(owner), iConnection(connection) -{ - CActiveScheduler::Add(this); -} - -ConnectionStarter::~ConnectionStarter() -{ - Cancel(); -} - -void ConnectionStarter::Start() -{ - if (!IsActive()) { - iConnection.Start(iStatus); - SetActive(); - } -} - -void ConnectionStarter::Start(TConnPref &pref) -{ - if (!IsActive()) { - iConnection.Start(pref, iStatus); - SetActive(); - } -} - -void ConnectionStarter::RunL() -{ - iOwner.ConnectionStartComplete(iStatus.Int()); - //note owner deletes on callback -} - -TInt ConnectionStarter::RunError(TInt err) -{ - qWarning() << "ConnectionStarter::RunError" << err; - return KErrNone; -} - -void ConnectionStarter::DoCancel() -{ - iConnection.Close(); -} - -QT_END_NAMESPACE - -#endif //QT_NO_BEARERMANAGEMENT - diff --git a/src/plugins/bearer/symbian/qnetworksession_impl.h b/src/plugins/bearer/symbian/qnetworksession_impl.h deleted file mode 100644 index 17a051e34f..0000000000 --- a/src/plugins/bearer/symbian/qnetworksession_impl.h +++ /dev/null @@ -1,237 +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$ -** -****************************************************************************/ - -#ifndef QNETWORKSESSION_IMPL_H -#define QNETWORKSESSION_IMPL_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include - -#include - -#include -#include -#include -#include -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - #include -#endif - -QT_BEGIN_NAMESPACE - -class ConnectionProgressNotifier; -class ConnectionStarter; -class SymbianEngine; - -typedef void (*TOpenCUnSetdefaultifFunction)(); - -class QNetworkSessionPrivateImpl : public QNetworkSessionPrivate -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - , public MMobilityProtocolResp -#endif -{ - Q_OBJECT -public: - QNetworkSessionPrivateImpl(SymbianEngine *engine); - ~QNetworkSessionPrivateImpl(); - - //called by QNetworkSession constructor and ensures - //that the state is immediately updated (w/o actually opening - //a session). Also this function should take care of - //notification hooks to discover future state changes. - void syncStateWithInterface(); - -#ifndef QT_NO_NETWORKINTERFACE - QNetworkInterface currentInterface() const; -#endif - QVariant sessionProperty(const QString& key) const; - void setSessionProperty(const QString& key, const QVariant& value); - - void setALREnabled(bool enabled); - - void open(); - inline void close() { close(true); } - void close(bool allowSignals); - void stop(); - void migrate(); - void accept(); - void ignore(); - void reject(); - - QString errorString() const; //must return translated string - QNetworkSession::SessionError error() const; - - quint64 bytesWritten() const; - quint64 bytesReceived() const; - quint64 activeTime() const; - - RConnection* nativeSession(); -#ifdef SNAP_FUNCTIONALITY_AVAILABLE -public: // From MMobilityProtocolResp - void PreferredCarrierAvailable(TAccessPointInfo aOldAPInfo, - TAccessPointInfo aNewAPInfo, - TBool aIsUpgrade, - TBool aIsSeamless); - - void NewCarrierActive(TAccessPointInfo aNewAPInfo, TBool aIsSeamless); - - void Error(TInt aError); -#endif - -protected: // From CActive - void ConnectionStartComplete(TInt statusCode); - void DoCancel(); - -private Q_SLOTS: - void configurationStateChanged(quint32 accessPointId, quint32 connMonId, - QNetworkSession::State newState); - void configurationRemoved(QNetworkConfigurationPrivatePointer config); - void configurationAdded(QNetworkConfigurationPrivatePointer config); - -private: - TUint iapClientCount(TUint aIAPId) const; - quint64 transferredData(TUint dataType) const; - bool newState(QNetworkSession::State newState, TUint accessPointId = 0); - void handleSymbianConnectionStatusChange(TInt aConnectionStatus, TInt aError, TUint accessPointId = 0); - QNetworkConfiguration bestConfigFromSNAP(const QNetworkConfiguration& snapConfig) const; - QNetworkConfiguration activeConfiguration(TUint32 iapId = 0) const; -#ifndef QT_NO_NETWORKINTERFACE - QNetworkInterface interface(TUint iapId) const; -#endif - -#if defined(SNAP_FUNCTIONALITY_AVAILABLE) - bool easyWlanTrueIapId(TUint32 &trueIapId) const; -#endif - - void closeHandles(); - -private: // data - SymbianEngine *engine; - -#ifndef QT_NO_NETWORKINTERFACE - mutable QNetworkInterface activeInterface; -#endif - - QDateTime startTime; - - mutable RSocketServ &iSocketServ; //not owned, shared from QtCore - mutable RConnection iConnection; - mutable RConnectionMonitor iConnectionMonitor; - ConnectionProgressNotifier* ipConnectionNotifier; - ConnectionStarter* ipConnectionStarter; - - bool iHandleStateNotificationsFromManager; - bool iFirstSync; - bool iStoppedByUser; - bool iClosedByUser; - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - CActiveCommsMobilityApiExt* iMobility; -#endif - - QNetworkSession::SessionError iError; - TInt iALREnabled; - TBool iALRUpgradingConnection; - TBool iConnectInBackground; - - QList iKnownConfigsBeforeConnectionStart; - - TUint32 iOldRoamingIap; - TUint32 iNewRoamingIap; - - bool isOpening; - - friend class ConnectionProgressNotifier; - friend class ConnectionStarter; -}; - -class ConnectionProgressNotifier : public CActive -{ -public: - ConnectionProgressNotifier(QNetworkSessionPrivateImpl &owner, RConnection &connection); - ~ConnectionProgressNotifier(); - - void StartNotifications(); - void StopNotifications(); - -protected: // From CActive - void RunL(); - void DoCancel(); - -private: // Data - QNetworkSessionPrivateImpl &iOwner; - RConnection& iConnection; - TNifProgressBuf iProgress; - -}; - -class ConnectionStarter : public CActive -{ -public: - ConnectionStarter(QNetworkSessionPrivateImpl &owner, RConnection &connection); - ~ConnectionStarter(); - - void Start(); - void Start(TConnPref &pref); -protected: - void RunL(); - TInt RunError(TInt err); - void DoCancel(); - -private: // Data - QNetworkSessionPrivateImpl &iOwner; - RConnection& iConnection; -}; - -QT_END_NAMESPACE - -#endif //QNETWORKSESSION_IMPL_H - diff --git a/src/plugins/bearer/symbian/symbian.pri b/src/plugins/bearer/symbian/symbian.pri deleted file mode 100644 index c4b3c6d09d..0000000000 --- a/src/plugins/bearer/symbian/symbian.pri +++ /dev/null @@ -1,32 +0,0 @@ -TARGET = qsymbianbearer -load(qt_plugin) - -QT = core network - -HEADERS += ../symbianengine.h \ - ../qnetworksession_impl.h - -SOURCES += ../symbianengine.cpp \ - ../qnetworksession_impl.cpp \ - ../main.cpp - -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -symbian-abld:INCLUDEPATH += $$QT_BUILD_TREE/include/QtNetwork/private - -LIBS += -lcommdb \ - -lcentralrepository \ - -lesock \ - -linsock \ - -lecom \ - -lefsrv \ - -lnetmeta - -is_using_gnupoc { - LIBS += -lconnmon -} else { - LIBS += -lConnMon -} - -DESTDIR = $$QT.network.plugins/bearer -target.path += $$[QT_INSTALL_PLUGINS]/bearer -INSTALLS += target diff --git a/src/plugins/bearer/symbian/symbian.pro b/src/plugins/bearer/symbian/symbian.pro deleted file mode 100644 index 91f8217b2e..0000000000 --- a/src/plugins/bearer/symbian/symbian.pro +++ /dev/null @@ -1,8 +0,0 @@ -TEMPLATE = subdirs - -contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) { - SUBDIRS += 3_1 3_2 -} - -# Symbian3 builds the default plugin for winscw so it is always needed -SUBDIRS += symbian_3 \ No newline at end of file diff --git a/src/plugins/bearer/symbian/symbian_3/symbian_3.pro b/src/plugins/bearer/symbian/symbian_3/symbian_3.pro deleted file mode 100644 index ef90ad2b73..0000000000 --- a/src/plugins/bearer/symbian/symbian_3/symbian_3.pro +++ /dev/null @@ -1,21 +0,0 @@ -include(../symbian.pri) - -symbian { - contains(S60_VERSION, 3.1) { - is_using_gnupoc { - LIBS += -lapengine - } else { - LIBS += -lAPEngine - } - } else { - DEFINES += SNAP_FUNCTIONALITY_AVAILABLE - LIBS += -lcmmanager - - !contains(S60_VERSION, 3.2):!contains(S60_VERSION, 5.0) { - DEFINES += OCC_FUNCTIONALITY_AVAILABLE - LIBS += -lextendedconnpref - } - } -} - -TARGET.UID3 = 0x20021319 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 -#include -#include -#include -#include -#include // For randgen seeding -#include // For randgen seeding - - -#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG -#include -#endif - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - #include - #include - #include - #include - #include - #include -#else - #include - #include - #include -#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 knownConfigs = accessPointConfigurations.keys(); - QList knownSnapConfigs = snapConfigurations.keys(); - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - // S60 version is >= Series60 3rd Edition Feature Pack 2 - TInt error = KErrNone; - - // Loop through all IAPs - RArray 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 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 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 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 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 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 unavailableConfigs = accessPointConfigurations.keys(); - - // Set state of returned IAPs to Discovered - // if state is not already Active - for(TUint i=0; imutex); - 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 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::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 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::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::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::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 diff --git a/src/plugins/bearer/symbian/symbianengine.h b/src/plugins/bearer/symbian/symbianengine.h deleted file mode 100644 index 3b3a78ace6..0000000000 --- a/src/plugins/bearer/symbian/symbianengine.h +++ /dev/null @@ -1,246 +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$ -** -****************************************************************************/ - -#ifndef SYMBIANENGINE_H -#define SYMBIANENGINE_H - -#include -#include -#include - -#include -#include -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - #include -#endif - -// Uncomment and compile QtBearer to gain detailed state tracing -// #define QT_BEARERMGMT_SYMBIAN_DEBUG - -#define QT_BEARERMGMT_CONFIGURATION_SNAP_PREFIX QLatin1String("S_") -#define QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX QLatin1String("I_") - -class CCommsDatabase; -class QEventLoop; - -QT_BEGIN_NAMESPACE -class QTimer; -QT_END_NAMESPACE - -QT_BEGIN_NAMESPACE - -class QNetworkSessionPrivate; -class AccessPointsAvailabilityScanner; - -class SymbianNetworkConfigurationPrivate : public QNetworkConfigurationPrivate -{ -public: - SymbianNetworkConfigurationPrivate(); - ~SymbianNetworkConfigurationPrivate(); - - inline TUint32 numericIdentifier() const - { - QMutexLocker locker(&mutex); - return numericId; - } - - inline TUint connectionIdentifier() const - { - QMutexLocker locker(&mutex); - return connectionId; - } - - inline QString configMappingName() const - { - QMutexLocker locker(&mutex); - return mappingName; - } - - QString mappingName; - - // So called IAP id from the platform. Remains constant as long as the - // platform is aware of the configuration ie. it is stored in the databases - // --> does not depend on whether connections are currently open or not. - // In practice is the same for the lifetime of the QNetworkConfiguration. - TUint32 numericId; - // So called connection id, or connection monitor ID. A dynamic ID assigned - // by RConnectionMonitor whenever a new connection is opened. ConnectionID and - // numericId/IAP id have 1-to-1 mapping during the lifetime of the connection at - // connection monitor. Notably however it changes whenever a new connection to - // a given IAP is created. In a sense it is constant during the time the - // configuration remains between states Discovered..Active..Discovered, do not - // however relay on this. - TUint connectionId; -}; - -inline SymbianNetworkConfigurationPrivate *toSymbianConfig(QNetworkConfigurationPrivatePointer ptr) -{ - return static_cast(ptr.data()); -} - -class SymbianEngine : public QBearerEngine, public CActive, - public MConnectionMonitorObserver -{ - Q_OBJECT - -public: - SymbianEngine(QObject *parent = 0); - virtual ~SymbianEngine(); - - bool hasIdentifier(const QString &id); - - Q_INVOKABLE void initialize(); - Q_INVOKABLE void requestUpdate(); - - QNetworkConfigurationManager::Capabilities capabilities() const; - - QNetworkSessionPrivate *createSessionBackend(); - - QNetworkConfigurationPrivatePointer defaultConfiguration(); - - QStringList accessPointConfigurationIdentifiers(); - - QNetworkConfigurationPrivatePointer configurationFromSsid(const QString &ssid); - - // For QNetworkSessionPrivateImpl to indicate about state changes - void configurationStateChangeReport(TUint32 accessPointId, QNetworkSession::State newState); - -Q_SIGNALS: - void onlineStateChanged(bool isOnline); - - void configurationStateChanged(quint32 accessPointId, quint32 connMonId, - QNetworkSession::State newState); - -public Q_SLOTS: - void updateConfigurations(); - void delayedConfigurationUpdate(); - -private: - void updateStatesToSnaps(); - bool changeConfigurationStateTo(QNetworkConfigurationPrivatePointer ptr, - QNetworkConfiguration::StateFlags newState); - bool changeConfigurationStateAtMinTo(QNetworkConfigurationPrivatePointer ptr, - QNetworkConfiguration::StateFlags newState); - bool changeConfigurationStateAtMaxTo(QNetworkConfigurationPrivatePointer ptr, - QNetworkConfiguration::StateFlags newState); -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - void updateMobileBearerToConfigs(TConnMonBearerInfo bearerInfo); - SymbianNetworkConfigurationPrivate *configFromConnectionMethodL(RCmConnectionMethod& connectionMethod); -#else - bool readNetworkConfigurationValuesFromCommsDb( - TUint32 aApId, SymbianNetworkConfigurationPrivate *apNetworkConfiguration); - void readNetworkConfigurationValuesFromCommsDbL( - TUint32 aApId, SymbianNetworkConfigurationPrivate *apNetworkConfiguration); -#endif - - void updateConfigurationsL(); - void updateActiveAccessPoints(); - void updateAvailableAccessPoints(); - void accessPointScanningReady(TBool scanSuccessful, TConnMonIapInfo iapInfo); - void startCommsDatabaseNotifications(); - void stopCommsDatabaseNotifications(); - void updateConfigurationsAfterRandomTime(); - - QNetworkConfigurationPrivatePointer defaultConfigurationL(); - TBool GetS60PlatformVersion(TUint& aMajor, TUint& aMinor) const; - void startMonitoringIAPData(TUint32 aIapId); - QNetworkConfigurationPrivatePointer dataByConnectionId(TUint aConnectionId); - -protected: - // From CActive - void RunL(); - void DoCancel(); - -private: - // MConnectionMonitorObserver - void EventL(const CConnMonEventBase& aEvent); -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - QNetworkConfigurationPrivatePointer configurationFromEasyWlan(TUint32 apId, - TUint connectionId); -#endif - -private: // Data - bool iFirstUpdate; - CCommsDatabase* ipCommsDB; - RConnectionMonitor iConnectionMonitor; - - TBool iWaitingCommsDatabaseNotifications; - TBool iOnline; - TBool iInitOk; - TBool iUpdateGoingOn; - TBool iUpdatePending; - TBool iScanInQueue; - - AccessPointsAvailabilityScanner* ipAccessPointsAvailabilityScanner; - - QNetworkConfigurationPrivatePointer defaultConfig; - - friend class QNetworkSessionPrivate; - friend class AccessPointsAvailabilityScanner; - -#ifdef SNAP_FUNCTIONALITY_AVAILABLE - RCmManager iCmManager; -#endif -}; - -class AccessPointsAvailabilityScanner : public CActive -{ -public: - AccessPointsAvailabilityScanner(SymbianEngine& owner, - RConnectionMonitor& connectionMonitor); - ~AccessPointsAvailabilityScanner(); - - void StartScanning(); - -protected: // From CActive - void RunL(); - void DoCancel(); - -private: // Data - SymbianEngine& iOwner; - RConnectionMonitor& iConnectionMonitor; - TConnMonIapInfoBuf iIapBuf; - TBool iScanActive; -}; - -QT_END_NAMESPACE - -#endif -- cgit v1.2.3