--- a/qtmobility/src/bearer/qnetworksession_s60_p.cpp Thu Aug 19 10:43:30 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1428 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, 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.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qmobilityglobal.h>
-#include "qnetworksession_s60_p.h"
-#include "qnetworkconfiguration_s60_p.h"
-#include "qnetworkconfigmanager_s60_p.h"
-#include <es_enum.h>
-#include <es_sock.h>
-#include <in_sock.h>
-#include <stdapis/sys/socket.h>
-#include <stdapis/net/if.h>
-
-QTM_BEGIN_NAMESPACE
-
-QNetworkSessionPrivate::QNetworkSessionPrivate()
- : CActive(CActive::EPriorityUserInput), state(QNetworkSession::Invalid),
- isOpen(false), iDynamicUnSetdefaultif(0), ipConnectionNotifier(0),
- iHandleStateNotificationsFromManager(false), iFirstSync(true), iStoppedByUser(false),
- iClosedByUser(false), iError(QNetworkSession::UnknownSessionError), iALREnabled(0),
- iConnectInBackground(false), isOpening(false)
-{
- CActiveScheduler::Add(this);
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- iMobility = NULL;
-#endif
- // Try to load "Open C" dll dynamically and
- // try to attach to unsetdefaultif function dynamically.
- // This is to avoid build breaks with old OpenC versions.
- if (iOpenCLibrary.Load(_L("libc")) == KErrNone) {
- iDynamicUnSetdefaultif = (TOpenCUnSetdefaultifFunction)iOpenCLibrary.Lookup(597);
- }
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - ";
- if (iDynamicUnSetdefaultif)
- qDebug() << "dynamic unsetdefaultif() is present in PIPS library. ";
- else
- qDebug() << "dynamic unsetdefaultif() not present in PIPS library. ";
-#endif
-
- TRAP_IGNORE(iConnectionMonitor.ConnectL());
-}
-
-QNetworkSessionPrivate::~QNetworkSessionPrivate()
-{
- isOpen = false;
- isOpening = false;
-
- // Cancel Connection Progress Notifications first.
- // Note: ConnectionNotifier must be destroyed before Canceling RConnection::Start()
- // => deleting ipConnectionNotifier results RConnection::CancelProgressNotification()
- delete ipConnectionNotifier;
- ipConnectionNotifier = NULL;
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (iMobility) {
- delete iMobility;
- iMobility = NULL;
- }
-#endif
-
- // Cancel possible RConnection::Start()
- Cancel();
- iSocketServ.Close();
-
- // Close global 'Open C' RConnection
- // Clears also possible unsetdefaultif() flags.
- setdefaultif(0);
-
- iConnectionMonitor.Close();
- iOpenCLibrary.Close();
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - destroyed (and setdefaultif(0))";
-#endif
-}
-
-void QNetworkSessionPrivate::configurationStateChanged(TUint32 accessPointId, TUint32 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 QNetworkSessionPrivate::configurationRemoved(const QNetworkConfiguration& config)
-{
- if (!publicConfig.d.data()) {
- return;
- }
- if (config.d.data()->numericId == publicConfig.d.data()->numericId) {
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - "
- << "configurationRemoved IAP: " << QString::number(publicConfig.d.data()->numericId) << " : going to State: Invalid";
-#endif
- this->newState(QNetworkSession::Invalid, publicConfig.d.data()->numericId);
- }
-}
-
-void QNetworkSessionPrivate::configurationAdded(const QNetworkConfiguration& 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.d.data() || publicConfig.type() != QNetworkConfiguration::ServiceNetwork) {
- return;
- }
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - "
- << "configurationAdded IAP: " << QString::number(config.d.data()->numericId);
-#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 QNetworkSessionPrivate::syncStateWithInterface()
-{
- if (!publicConfig.d || !publicConfig.d.data()) {
- return;
- }
- if (iFirstSync) {
- QObject::connect(((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager), SIGNAL(configurationStateChanged(TUint32, TUint32, QNetworkSession::State)),
- this, SLOT(configurationStateChanged(TUint32, TUint32, 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(((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager),
- SIGNAL(configurationRemoved(QNetworkConfiguration)),
- this, SLOT(configurationRemoved(QNetworkConfiguration)));
- // 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(((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager),
- SIGNAL(configurationAdded(QNetworkConfiguration)),
- this, SLOT(configurationAdded(QNetworkConfiguration)));
- }
- // 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.d.data()->state;
-#endif
- switch (publicConfig.d.data()->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);
- }
-}
-
-QNetworkInterface QNetworkSessionPrivate::interface(TUint iapId) const
-{
- QString interfaceName;
-
- TSoInetInterfaceInfo ifinfo;
- TPckg<TSoInetInterfaceInfo> ifinfopkg(ifinfo);
- TSoInetIfQuery ifquery;
- TPckg<TSoInetIfQuery> 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);
-}
-
-QNetworkInterface QNetworkSessionPrivate::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;
-}
-
-QVariant QNetworkSessionPrivate::sessionProperty(const QString& key) const
-{
- if (key == "ConnectInBackground") {
- return QVariant(iConnectInBackground);
- }
- return QVariant();
-}
-
-void QNetworkSessionPrivate::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 QNetworkSessionPrivate::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 QNetworkSessionPrivate::error() const
-{
- return iError;
-}
-
-void QNetworkSessionPrivate::open()
-{
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - "
- << "open() called, session state is: " << state << " and isOpen is: "
- << isOpen;
-#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 q->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 q->error(iError);
- return;
- }
- // Clear possible previous states
- iStoppedByUser = false;
- iClosedByUser = false;
-
- TInt error = iSocketServ.Connect();
- if (error != KErrNone) {
- // Could not open RSocketServ
- newState(QNetworkSession::Invalid);
- iError = QNetworkSession::UnknownSessionError;
- emit q->error(iError);
- syncStateWithInterface();
- return;
- }
-
- error = iConnection.Open(iSocketServ);
- if (error != KErrNone) {
- // Could not open RConnection
- iSocketServ.Close();
- newState(QNetworkSession::Invalid);
- iError = QNetworkSession::UnknownSessionError;
- emit q->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) {
-#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(publicConfig.d.data()->numericId);
- if (iConnectInBackground) {
- prefs.SetNoteBehaviour( TExtendedConnPref::ENoteBehaviourConnSilent );
- }
- pref.AppendL(&prefs);
-#else
- TCommDbConnPref pref;
- pref.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
- pref.SetIapId(publicConfig.d.data()->numericId);
-#endif
- iConnection.Start(pref, iStatus);
- if (!IsActive()) {
- SetActive();
- }
- // 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) {
-#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 = ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->accessPointConfigurations.keys();
- TConnPrefList snapPref;
- TExtendedConnPref prefs;
- prefs.SetSnapId(publicConfig.d.data()->numericId);
- if (iConnectInBackground) {
- prefs.SetNoteBehaviour( TExtendedConnPref::ENoteBehaviourConnSilent );
- }
- snapPref.AppendL(&prefs);
-#else
- TConnSnapPref snapPref(publicConfig.d.data()->numericId);
-#endif
- iConnection.Start(snapPref, iStatus);
- if (!IsActive()) {
- SetActive();
- }
- // 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 = ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->accessPointConfigurations.keys();
- iConnection.Start(iStatus);
- if (!IsActive()) {
- SetActive();
- }
- newState(QNetworkSession::Connecting);
- }
-
- if (error != KErrNone) {
- isOpen = false;
- isOpening = false;
- iError = QNetworkSession::UnknownSessionError;
- emit q->error(iError);
- if (ipConnectionNotifier) {
- ipConnectionNotifier->StopNotifications();
- }
- syncStateWithInterface();
- }
-}
-
-TUint QNetworkSessionPrivate::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 QNetworkSessionPrivate::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();
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (iMobility) {
- delete iMobility;
- iMobility = NULL;
- }
-#endif
-
- if (ipConnectionNotifier && !iHandleStateNotificationsFromManager) {
- ipConnectionNotifier->StopNotifications();
- // Start handling IAP state change signals from QNetworkConfigurationManagerPrivate
- iHandleStateNotificationsFromManager = true;
- }
-
- Cancel(); // closes iConnection
- iSocketServ.Close();
-
- // Close global 'Open C' RConnection. If OpenC supports,
- // close the defaultif for good to avoid difficult timing
- // and bouncing issues of network going immediately back up
- // because of e.g. select() thread etc.
- if (iDynamicUnSetdefaultif) {
- iDynamicUnSetdefaultif();
- } else {
- setdefaultif(0);
- }
-
- // 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 q->closed();
- }
-}
-
-void QNetworkSessionPrivate::stop()
-{
-#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) {
- // See if connection Id matches with our Id. If so, stop() it.
- if (publicConfig.d.data()->connectionId == 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 q->closed();
- }
-}
-
-void QNetworkSessionPrivate::migrate()
-{
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (iMobility) {
- // Close global 'Open C' RConnection. If openC supports, use the 'heavy'
- // version to block all subsequent requests.
- if (iDynamicUnSetdefaultif) {
- iDynamicUnSetdefaultif();
- } else {
- setdefaultif(0);
- }
- // Start migrating to new IAP
- iMobility->MigrateToPreferredCarrier();
- }
-#endif
-}
-
-void QNetworkSessionPrivate::ignore()
-{
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (iMobility) {
- iMobility->IgnorePreferredCarrier();
-
- if (!iALRUpgradingConnection) {
- newState(QNetworkSession::Disconnected);
- } else {
- newState(QNetworkSession::Connected,iOldRoamingIap);
- }
- }
-#endif
-}
-
-void QNetworkSessionPrivate::accept()
-{
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (iMobility) {
- iMobility->NewCarrierAccepted();
-
- QNetworkConfiguration newActiveConfig = activeConfiguration(iNewRoamingIap);
-
- // Use name of the new IAP to open global 'Open C' RConnection
- QByteArray nameAsByteArray = newActiveConfig.name().toUtf8();
- ifreq ifr;
- memset(&ifr, 0, sizeof(struct ifreq));
- strcpy(ifr.ifr_name, nameAsByteArray.constData());
- setdefaultif(&ifr);
-
- newState(QNetworkSession::Connected, iNewRoamingIap);
- }
-#endif
-}
-
-void QNetworkSessionPrivate::reject()
-{
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (iMobility) {
- iMobility->NewCarrierRejected();
-
- if (!iALRUpgradingConnection) {
- newState(QNetworkSession::Disconnected);
- } else {
- QNetworkConfiguration newActiveConfig = activeConfiguration(iOldRoamingIap);
-
- // Use name of the old IAP to open global 'Open C' RConnection
- QByteArray nameAsByteArray = newActiveConfig.name().toUtf8();
- ifreq ifr;
- memset(&ifr, 0, sizeof(struct ifreq));
- strcpy(ifr.ifr_name, nameAsByteArray.constData());
- setdefaultif(&ifr);
-
- newState(QNetworkSession::Connected, iOldRoamingIap);
- }
- }
-#endif
-}
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
-void QNetworkSessionPrivate::PreferredCarrierAvailable(TAccessPointInfo aOldAPInfo,
- TAccessPointInfo aNewAPInfo,
- TBool aIsUpgrade,
- TBool aIsSeamless)
-{
- iOldRoamingIap = aOldAPInfo.AccessPoint();
- iNewRoamingIap = aNewAPInfo.AccessPoint();
- newState(QNetworkSession::Roaming);
- if (iALREnabled > 0) {
- iALRUpgradingConnection = aIsUpgrade;
- QList<QNetworkConfiguration> configs = publicConfig.children();
- for (int i=0; i < configs.count(); i++) {
- if (configs[i].d.data()->numericId == 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 q->preferredConfigurationChanged(configs[i],aIsSeamless);
- }
- QT_CATCH (std::exception&) {}
- }
- }
- } else {
- migrate();
- }
-}
-
-void QNetworkSessionPrivate::NewCarrierActive(TAccessPointInfo /*aNewAPInfo*/, TBool /*aIsSeamless*/)
-{
- if (iALREnabled > 0) {
- QT_TRY {
- emit q->newConfigurationActivated();
- }
- QT_CATCH (std::exception&) {}
- } else {
- accept();
- }
-}
-
-void QNetworkSessionPrivate::Error(TInt /*aError*/)
-{
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - "
- << "roaming Error() occured, isOpen is: " << isOpen;
-#endif
- if (isOpen) {
- isOpen = false;
- isOpening = false;
- activeConfig = QNetworkConfiguration();
- serviceConfig = QNetworkConfiguration();
- iError = QNetworkSession::RoamingError;
- emit q->error(iError);
- Cancel();
- if (ipConnectionNotifier) {
- ipConnectionNotifier->StopNotifications();
- }
- 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 q->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 QNetworkSessionPrivate::setALREnabled(bool enabled)
-{
- if (enabled) {
- iALREnabled++;
- } else {
- iALREnabled--;
- }
-}
-
-QNetworkConfiguration QNetworkSessionPrivate::bestConfigFromSNAP(const QNetworkConfiguration& snapConfig) const
-{
- QNetworkConfiguration config;
- QList<QNetworkConfiguration> 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 QNetworkSessionPrivate::bytesWritten() const
-{
- return transferredData(KUplinkData);
-}
-
-quint64 QNetworkSessionPrivate::bytesReceived() const
-{
- return transferredData(KDownlinkData);
-}
-
-quint64 QNetworkSessionPrivate::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<QNetworkConfiguration> configs = config.children();
- for (int i=0; i < configs.count(); i++) {
- if (configs[i].d.data()->numericId == apId) {
- configFound = true;
- break;
- }
- }
- } else if (config.d.data()->numericId == 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 QNetworkSessionPrivate::activeTime() const
-{
- if (!isOpen || startTime.isNull()) {
- return 0;
- }
- return startTime.secsTo(QDateTime::currentDateTime());
-}
-
-QNetworkConfiguration QNetworkSessionPrivate::activeConfiguration(TUint32 iapId) const
-{
- if (iapId == 0) {
- _LIT(KSetting, "IAP\\Id");
- iConnection.GetIntSetting(KSetting, iapId);
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(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):
- ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->easyWlanTrueIapId(iapId);
-#endif
- }
-
-#ifdef SNAP_FUNCTIONALITY_AVAILABLE
- if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) {
- // Try to search IAP from the used SNAP using IAP Id
- QList<QNetworkConfiguration> children = publicConfig.children();
- for (int i=0; i < children.count(); i++) {
- if (children[i].d.data()->numericId == 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;
- pt.d = ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->accessPointConfigurations.value(QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId)));
- if (pt.d) {
- for (int i=0; i < children.count(); i++) {
- if (children[i].d.data()->mappingName == pt.d.data()->mappingName) {
- return children[i];
- }
- }
- } else {
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(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.
- ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->updateConfigurations();
- // 2. Check if new configuration was created during connection creation
- QList<QString> knownConfigs = ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->accessPointConfigurations.keys();
-#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.d = ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->accessPointConfigurations.value(newIapId);
- if (pt.d) {
-#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 (publicConfig.d.data()->manager) {
- QNetworkConfiguration pt;
- // Try to found User Selected IAP from known IAPs (accessPointConfigurations)
- pt.d = ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->accessPointConfigurations.value(QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId)));
- if (pt.d) {
- return pt;
- } else {
- // Check if new (WLAN) IAP was created in IAP/SNAP dialog
- // 1. Sync internal configurations array to commsdb first
- ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->updateConfigurations();
- // 2. Check if new configuration was created during connection creation
- QList<QString> knownConfigs = ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->accessPointConfigurations.keys();
- 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.d = ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->accessPointConfigurations.value(newIapId);
- if (pt.d) {
- return pt;
- }
- }
- }
- }
- return QNetworkConfiguration();
- }
-
- return publicConfig;
-}
-
-void QNetworkSessionPrivate::RunL()
-{
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - "
- << "RConnection::RunL with status code: " << iStatus.Int();
-#endif
- TInt statusCode = iStatus.Int();
-
- switch (statusCode) {
- case KErrNone: // Connection created successfully
- {
- TInt error = KErrNone;
- QNetworkConfiguration newActiveConfig = activeConfiguration();
- if (!newActiveConfig.isValid()) {
- // RConnection startup was successfull 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 {
- // Use name of the IAP to open global 'Open C' RConnection
- ifreq ifr;
- memset(&ifr, 0, sizeof(struct ifreq));
- QByteArray nameAsByteArray = newActiveConfig.name().toUtf8();
- strcpy(ifr.ifr_name, nameAsByteArray.constData());
- error = setdefaultif(&ifr);
- }
- if (error != KErrNone) {
- isOpen = false;
- isOpening = false;
- iError = QNetworkSession::UnknownSessionError;
- QT_TRYCATCH_LEAVING(emit q->error(iError));
- if (ipConnectionNotifier) {
- ipConnectionNotifier->StopNotifications();
- }
- 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.
- iConnection.Close();
- newState(QNetworkSession::Closing);
- newState(QNetworkSession::Disconnected);
- } else {
- Cancel();
- }
- 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;
- activeInterface = interface(activeConfig.d.data()->numericId);
- if (publicConfig.type() == QNetworkConfiguration::UserChoice) {
- QNetworkConfiguration pt;
- pt.d = activeConfig.d.data()->serviceNetworkPtr;
- serviceConfig = pt;
- }
-
- 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 q->error(iError));
- Cancel();
- if (ipConnectionNotifier) {
- ipConnectionNotifier->StopNotifications();
- }
- 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 q->error(iError));
- Cancel();
- if (ipConnectionNotifier) {
- ipConnectionNotifier->StopNotifications();
- }
- QT_TRYCATCH_LEAVING(syncStateWithInterface());
- break;
- }
-}
-
-void QNetworkSessionPrivate::DoCancel()
-{
- iConnection.Close();
-}
-
-// 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 QNetworkSessionPrivate::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);
- activeInterface = interface(activeConfig.d.data()->numericId);
- }
-
- // 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 q->error(iError);
- Cancel();
- if (ipConnectionNotifier) {
- ipConnectionNotifier->StopNotifications();
- }
- // 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 q->stateChanged(state);
- retVal = true;
- } else {
- if (publicConfig.type() == QNetworkConfiguration::InternetAccessPoint) {
- if (publicConfig.d.data()->numericId == accessPointId) {
- state = newState;
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed B to: " << state;
-#endif
- emit q->stateChanged(state);
- retVal = true;
- }
- } else if (publicConfig.type() == QNetworkConfiguration::UserChoice && isOpen) {
- if (activeConfig.d.data()->numericId == accessPointId) {
- state = newState;
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed C to: " << state;
-#endif
- emit q->stateChanged(state);
- retVal = true;
- }
- } else if (publicConfig.type() == QNetworkConfiguration::ServiceNetwork) {
- QList<QNetworkConfiguration> subConfigurations = publicConfig.children();
- for (int i = 0; i < subConfigurations.count(); i++) {
- if (subConfigurations[i].d.data()->numericId == 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 q->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 q->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 q->stateChanged(state);
- retVal = true;
-#ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
- qDebug() << "QNS this : " << QString::number((uint)this) << " - " << "===> EMIT State changed F to: " << state;
-#endif
- }
- }
- }
- }
-#if defined(OCC_FUNCTIONALITY_AVAILABLE) && defined(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.d.data() && activeConfig.d.data()->numericId == 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 q->stateChanged(state);
- retVal = true;
- }
-#endif
- }
- }
- if (emitSessionClosed) {
- emit q->closed();
- }
- if (state == QNetworkSession::Disconnected) {
- // Just in case clear activeConfiguration.
- activeConfig = QNetworkConfiguration();
- }
- return retVal;
-}
-
-void QNetworkSessionPrivate::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.d.data()) {
- ((QNetworkConfigurationManagerPrivate*)publicConfig.d.data()->manager)->configurationStateChangeReport(publicConfig.d.data()->numericId, QNetworkSession::Disconnected);
- }
- break;
- // Unhandled state
- default:
- break;
- }
-}
-
-ConnectionProgressNotifier::ConnectionProgressNotifier(QNetworkSessionPrivate& 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) {
- QT_TRYCATCH_LEAVING(iOwner.handleSymbianConnectionStatusChange(iProgress().iStage, iProgress().iError));
-
- SetActive();
- iConnection.ProgressNotification(iProgress, iStatus);
- }
-}
-
-#include "moc_qnetworksession_s60_p.cpp"
-
-QTM_END_NAMESPACE