qtmobility/src/bearer/qnetworkconfigmanager_s60_p.cpp
branchRCL_3
changeset 13 4203353e74ea
parent 10 4ea83c148e84
child 21 885c2596c964
equal deleted inserted replaced
10:4ea83c148e84 13:4203353e74ea
    67     #include <aputils.h> 
    67     #include <aputils.h> 
    68 #endif
    68 #endif
    69 
    69 
    70 QTM_BEGIN_NAMESPACE
    70 QTM_BEGIN_NAMESPACE
    71 
    71 
    72 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
       
    73     static const int KValueThatWillBeAddedToSNAPId = 1000;
       
    74 #endif
       
    75 static const int KUserChoiceIAPId = 0;
    72 static const int KUserChoiceIAPId = 0;
    76 
    73 
    77 QNetworkConfigurationManagerPrivate::QNetworkConfigurationManagerPrivate()
    74 QNetworkConfigurationManagerPrivate::QNetworkConfigurationManagerPrivate()
    78     : QObject(0), CActive(CActive::EPriorityIdle), capFlags(0),
    75     : QObject(0), CActive(CActive::EPriorityHigh), capFlags(0),
    79     iFirstUpdate(true), iInitOk(true), iUpdatePending(false),
    76     iFirstUpdate(true), iInitOk(true), iUpdatePending(false),
    80     iTimeToWait(0)
    77     iTimeToWait(0)
    81 {
    78 {
    82     CActiveScheduler::Add(this);
    79     CActiveScheduler::Add(this);
    83 
    80 
    90         iInitOk = false;
    87         iInitOk = false;
    91         return;
    88         return;
    92     }
    89     }
    93 
    90 
    94     TRAP_IGNORE(iConnectionMonitor.ConnectL());
    91     TRAP_IGNORE(iConnectionMonitor.ConnectL());
       
    92 #ifdef SNAP_FUNCTIONALITY_AVAILABLE    
       
    93     TRAP_IGNORE(iConnectionMonitor.SetUintAttribute(EBearerIdAll, 0, KBearerGroupThreshold, 1));
       
    94 #endif    
    95     TRAP_IGNORE(iConnectionMonitor.NotifyEventL(*this));
    95     TRAP_IGNORE(iConnectionMonitor.NotifyEventL(*this));
    96 
    96 
    97 #ifdef SNAP_FUNCTIONALITY_AVAILABLE    
    97 #ifdef SNAP_FUNCTIONALITY_AVAILABLE    
    98     TRAP(error, iCmManager.OpenL());
    98     TRAP(error, iCmManager.OpenL());
    99     if (error != KErrNone) {
    99     if (error != KErrNone) {
   213 void QNetworkConfigurationManagerPrivate::updateConfigurations()
   213 void QNetworkConfigurationManagerPrivate::updateConfigurations()
   214 {
   214 {
   215     if (!iInitOk) {
   215     if (!iInitOk) {
   216         return;
   216         return;
   217     }
   217     }
   218 
       
   219     TRAP_IGNORE(updateConfigurationsL());
   218     TRAP_IGNORE(updateConfigurationsL());
   220 }
   219 }
   221 
   220 
   222 void QNetworkConfigurationManagerPrivate::updateConfigurationsL()
   221 void QNetworkConfigurationManagerPrivate::updateConfigurationsL()
   223 {
   222 {
   234     iCmManager.ConnectionMethodL(connectionMethods);
   233     iCmManager.ConnectionMethodL(connectionMethods);
   235     for(int i = 0; i < connectionMethods.Count(); i++) {
   234     for(int i = 0; i < connectionMethods.Count(); i++) {
   236         RCmConnectionMethod connectionMethod = iCmManager.ConnectionMethodL(connectionMethods[i]);
   235         RCmConnectionMethod connectionMethod = iCmManager.ConnectionMethodL(connectionMethods[i]);
   237         CleanupClosePushL(connectionMethod);
   236         CleanupClosePushL(connectionMethod);
   238         TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
   237         TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
   239         QString ident = QString::number(qHash(iapId));
   238         QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId));
   240         if (accessPointConfigurations.contains(ident)) {
   239         if (accessPointConfigurations.contains(ident)) {
   241             knownConfigs.removeOne(ident);
   240             knownConfigs.removeOne(ident);
   242         } else {
   241         } else {
   243             QNetworkConfigurationPrivate* cpPriv = NULL;
   242             QNetworkConfigurationPrivate* cpPriv = NULL;
   244             TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod));
   243             TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod));
   266     iCmManager.AllDestinationsL(destinations);
   265     iCmManager.AllDestinationsL(destinations);
   267     for(int i = 0; i < destinations.Count(); i++) {
   266     for(int i = 0; i < destinations.Count(); i++) {
   268         RCmDestination destination;
   267         RCmDestination destination;
   269         destination = iCmManager.DestinationL(destinations[i]);
   268         destination = iCmManager.DestinationL(destinations[i]);
   270         CleanupClosePushL(destination);
   269         CleanupClosePushL(destination);
   271         QString ident = QString::number(qHash(destination.Id()+KValueThatWillBeAddedToSNAPId)); //TODO: Check if it's ok to add 1000 SNAP Id to prevent SNAP ids overlapping IAP ids
   270         QString ident = QT_BEARERMGMT_CONFIGURATION_SNAP_PREFIX+QString::number(qHash(destination.Id()));
   272         if (snapConfigurations.contains(ident)) {
   271         if (snapConfigurations.contains(ident)) {
   273             knownSnapConfigs.removeOne(ident);
   272             knownSnapConfigs.removeOne(ident);
   274         } else {
   273         } else {
   275             QNetworkConfigurationPrivate* cpPriv = new QNetworkConfigurationPrivate();
   274             QNetworkConfigurationPrivate* cpPriv = new QNetworkConfigurationPrivate();
   276     
   275     
   302         for (int j=0; j < destination.ConnectionMethodCount(); j++) {
   301         for (int j=0; j < destination.ConnectionMethodCount(); j++) {
   303             RCmConnectionMethod connectionMethod = destination.ConnectionMethodL(j);
   302             RCmConnectionMethod connectionMethod = destination.ConnectionMethodL(j);
   304             CleanupClosePushL(connectionMethod);
   303             CleanupClosePushL(connectionMethod);
   305             
   304             
   306             TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
   305             TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
   307             QString iface = QString::number(qHash(iapId));
   306             QString iface = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId));
   308             // Check that IAP can be found from accessPointConfigurations list
   307             // Check that IAP can be found from accessPointConfigurations list
   309             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(iface);
   308             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(iface);
   310             if (priv.data() == 0) {
   309             if (priv.data() == 0) {
   311                 QNetworkConfigurationPrivate* cpPriv = NULL; 
   310                 QNetworkConfigurationPrivate* cpPriv = NULL; 
   312                 TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod));
   311                 TRAP(error, cpPriv = configFromConnectionMethodL(connectionMethod));
   356     // Loop through all IAPs
   355     // Loop through all IAPs
   357     TUint32 apId = 0;
   356     TUint32 apId = 0;
   358     TInt retVal = pDbTView->GotoFirstRecord();
   357     TInt retVal = pDbTView->GotoFirstRecord();
   359     while (retVal == KErrNone) {
   358     while (retVal == KErrNone) {
   360         pDbTView->ReadUintL(TPtrC(COMMDB_ID), apId);
   359         pDbTView->ReadUintL(TPtrC(COMMDB_ID), apId);
   361         QString ident = QString::number(qHash(apId));
   360         QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
   362         if (accessPointConfigurations.contains(ident)) {
   361         if (accessPointConfigurations.contains(ident)) {
   363             knownConfigs.removeOne(ident);
   362             knownConfigs.removeOne(ident);
   364         } else {
   363         } else {
   365             QNetworkConfigurationPrivate* cpPriv = new QNetworkConfigurationPrivate();
   364             QNetworkConfigurationPrivate* cpPriv = new QNetworkConfigurationPrivate();
   366             if (readNetworkConfigurationValuesFromCommsDb(apId, cpPriv)) {
   365             if (readNetworkConfigurationValuesFromCommsDb(apId, cpPriv)) {
   418 QNetworkConfigurationPrivate* QNetworkConfigurationManagerPrivate::configFromConnectionMethodL(
   417 QNetworkConfigurationPrivate* QNetworkConfigurationManagerPrivate::configFromConnectionMethodL(
   419         RCmConnectionMethod& connectionMethod)
   418         RCmConnectionMethod& connectionMethod)
   420 {
   419 {
   421     QNetworkConfigurationPrivate* cpPriv = new QNetworkConfigurationPrivate();
   420     QNetworkConfigurationPrivate* cpPriv = new QNetworkConfigurationPrivate();
   422     TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
   421     TUint32 iapId = connectionMethod.GetIntAttributeL(CMManager::ECmIapId);
   423     QString ident = QString::number(qHash(iapId));
   422     QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapId));
   424     
   423     
   425     HBufC *pName = connectionMethod.GetStringAttributeL(CMManager::ECmName);
   424     HBufC *pName = connectionMethod.GetStringAttributeL(CMManager::ECmName);
   426     CleanupStack::PushL(pName);
   425     CleanupStack::PushL(pName);
   427     QT_TRYCATCH_LEAVING(cpPriv->name = QString::fromUtf16(pName->Ptr(),pName->Length()));
   426     QT_TRYCATCH_LEAVING(cpPriv->name = QString::fromUtf16(pName->Ptr(),pName->Length()));
   428     CleanupStack::PopAndDestroy(pName);
   427     CleanupStack::PopAndDestroy(pName);
   519     if (name.Compare(_L("Easy WLAN")) == 0) {
   518     if (name.Compare(_L("Easy WLAN")) == 0) {
   520         // "Easy WLAN" won't be accepted to the Configurations list
   519         // "Easy WLAN" won't be accepted to the Configurations list
   521         User::Leave(KErrNotFound);
   520         User::Leave(KErrNotFound);
   522     }
   521     }
   523     
   522     
   524     QString ident = QString::number(qHash(aApId));
   523     QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(aApId));
   525     
   524     
   526     QT_TRYCATCH_LEAVING(apNetworkConfiguration->name = QString::fromUtf16(name.Ptr(),name.Length()));
   525     QT_TRYCATCH_LEAVING(apNetworkConfiguration->name = QString::fromUtf16(name.Ptr(),name.Length()));
   527     apNetworkConfiguration->isValid = true;
   526     apNetworkConfiguration->isValid = true;
   528     apNetworkConfiguration->id = ident;
   527     apNetworkConfiguration->id = ident;
   529     apNetworkConfiguration->numericId = aApId;
   528     apNetworkConfiguration->numericId = aApId;
   586 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
   585 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
   587     // Check Default Connection (SNAP or IAP)
   586     // Check Default Connection (SNAP or IAP)
   588     TCmDefConnValue defaultConnectionValue;
   587     TCmDefConnValue defaultConnectionValue;
   589     iCmManager.ReadDefConnL(defaultConnectionValue);
   588     iCmManager.ReadDefConnL(defaultConnectionValue);
   590     if (defaultConnectionValue.iType == ECmDefConnDestination) {
   589     if (defaultConnectionValue.iType == ECmDefConnDestination) {
   591         QString iface = QString::number(qHash(defaultConnectionValue.iId+KValueThatWillBeAddedToSNAPId));
   590         QString iface = QT_BEARERMGMT_CONFIGURATION_SNAP_PREFIX+QString::number(qHash(defaultConnectionValue.iId));
   592         QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = snapConfigurations.value(iface);
   591         QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = snapConfigurations.value(iface);
   593         if (priv.data() != 0) {
   592         if (priv.data() != 0) {
   594             item.d = priv;
   593             item.d = priv;
   595         }
   594         }
   596     } else if (defaultConnectionValue.iType == ECmDefConnConnectionMethod) {
   595     } else if (defaultConnectionValue.iType == ECmDefConnConnectionMethod) {
   597         QString iface = QString::number(qHash(defaultConnectionValue.iId));
   596         QString iface = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(defaultConnectionValue.iId));
   598         QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(iface);
   597         QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(iface);
   599         if (priv.data() != 0) {
   598         if (priv.data() != 0) {
   600             item.d = priv;
   599             item.d = priv;
   601         }
   600         }
   602     } 
   601     } 
   634     if (status.Int() == KErrNone) {
   633     if (status.Int() == KErrNone) {
   635         for (TUint i = 1; i <= connectionCount; i++) {
   634         for (TUint i = 1; i <= connectionCount; i++) {
   636             iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount);
   635             iConnectionMonitor.GetConnectionInfo(i, connectionId, subConnectionCount);
   637             iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
   636             iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
   638             User::WaitForRequest(status);
   637             User::WaitForRequest(status);
   639             QString ident = QString::number(qHash(apId));
   638             QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
   640             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
   639             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
       
   640 #ifdef OCC_FUNCTIONALITY_AVAILABLE
       
   641             if (!priv.data()) {
       
   642                 // If IAP was not found, check if the update was about EasyWLAN
       
   643                 priv = configurationFromEasyWlan(apId, connectionId);
       
   644             }
       
   645 #endif
   641             if (priv.data()) {
   646             if (priv.data()) {
   642                 iConnectionMonitor.GetIntAttribute(connectionId, subConnectionCount, KConnectionStatus, connectionStatus, status);
   647                 iConnectionMonitor.GetIntAttribute(connectionId, subConnectionCount, KConnectionStatus, connectionStatus, status);
   643                 User::WaitForRequest(status);          
   648                 User::WaitForRequest(status);          
   644                 if (connectionStatus == KLinkLayerOpen) {
   649                 if (connectionStatus == KLinkLayerOpen) {
   645                     online = true;
   650                     online = true;
   661         }
   666         }
   662     }
   667     }
   663 
   668 
   664     if (iOnline != online) {
   669     if (iOnline != online) {
   665         iOnline = online;
   670         iOnline = online;
   666         emit this->onlineStateChanged(iOnline);
   671         emit this->onlineStateChanged(online);
   667     }
   672     }
   668 }
   673 }
   669 
   674 
   670 void QNetworkConfigurationManagerPrivate::updateAvailableAccessPoints()
   675 void QNetworkConfigurationManagerPrivate::updateAvailableAccessPoints()
   671 {
   676 {
   685         QList<QString> unavailableConfigs = accessPointConfigurations.keys();
   690         QList<QString> unavailableConfigs = accessPointConfigurations.keys();
   686         
   691         
   687         // Set state of returned IAPs to Discovered
   692         // Set state of returned IAPs to Discovered
   688         // if state is not already Active
   693         // if state is not already Active
   689         for(TUint i=0; i<iapInfo.iCount; i++) {
   694         for(TUint i=0; i<iapInfo.iCount; i++) {
   690             QString ident = QString::number(qHash(iapInfo.iIap[i].iIapId));
   695             QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iapInfo.iIap[i].iIapId));
   691             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
   696             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
   692             if (priv.data()) {
   697             if (priv.data()) {
   693                 unavailableConfigs.removeOne(ident);
   698                 unavailableConfigs.removeOne(ident);
   694                 if (priv.data()->state < QNetworkConfiguration::Active) {
   699                 if (priv.data()->state < QNetworkConfiguration::Active) {
   695                     // Configuration is either Discovered or Active
   700                     // Configuration is either Discovered or Active
   745             changeConfigurationStateTo(priv, QNetworkConfiguration::Defined);
   750             changeConfigurationStateTo(priv, QNetworkConfiguration::Defined);
   746         }
   751         }
   747     }    
   752     }    
   748 }
   753 }
   749 
   754 
       
   755 #ifdef SNAP_FUNCTIONALITY_AVAILABLE
       
   756 void QNetworkConfigurationManagerPrivate::updateMobileBearerToConfigs(TConnMonBearerInfo bearerInfo)
       
   757 {
       
   758     foreach (const QString &ii, accessPointConfigurations.keys()) {
       
   759         QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> p = 
       
   760             accessPointConfigurations.value(ii);
       
   761         if (p->bearer >= QNetworkConfigurationPrivate::Bearer2G &&
       
   762             p->bearer <= QNetworkConfigurationPrivate::BearerHSPA) {
       
   763             switch (bearerInfo) {
       
   764             case EBearerInfoCSD:      p->bearer = QNetworkConfigurationPrivate::Bearer2G; break;  
       
   765             case EBearerInfoWCDMA:    p->bearer = QNetworkConfigurationPrivate::BearerWCDMA; break;
       
   766             case EBearerInfoCDMA2000: p->bearer = QNetworkConfigurationPrivate::BearerCDMA2000; break;
       
   767             case EBearerInfoGPRS:     p->bearer = QNetworkConfigurationPrivate::Bearer2G; break;
       
   768             case EBearerInfoHSCSD:    p->bearer = QNetworkConfigurationPrivate::Bearer2G; break;
       
   769             case EBearerInfoEdgeGPRS: p->bearer = QNetworkConfigurationPrivate::Bearer2G; break;
       
   770             case EBearerInfoWcdmaCSD: p->bearer = QNetworkConfigurationPrivate::BearerWCDMA; break;
       
   771             case EBearerInfoHSDPA:    p->bearer = QNetworkConfigurationPrivate::BearerHSPA; break;
       
   772             case EBearerInfoHSUPA:    p->bearer = QNetworkConfigurationPrivate::BearerHSPA; break;
       
   773             case EBearerInfoHSxPA:    p->bearer = QNetworkConfigurationPrivate::BearerHSPA; break;
       
   774             }
       
   775         }
       
   776     }
       
   777 }
       
   778 #endif
       
   779 
   750 bool QNetworkConfigurationManagerPrivate::changeConfigurationStateTo(QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>& sharedData,
   780 bool QNetworkConfigurationManagerPrivate::changeConfigurationStateTo(QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>& sharedData,
   751                                                                      QNetworkConfiguration::StateFlags newState)
   781                                                                      QNetworkConfiguration::StateFlags newState)
   752 {
   782 {
   753     if (newState != sharedData.data()->state) {
   783     if (newState != sharedData.data()->state) {
   754         sharedData.data()->state = newState;
   784         sharedData.data()->state = newState;
   830 }
   860 }
   831 
   861 
   832 void QNetworkConfigurationManagerPrivate::RunL()
   862 void QNetworkConfigurationManagerPrivate::RunL()
   833 {
   863 {
   834     if (iStatus != KErrCancel) {
   864     if (iStatus != KErrCancel) {
   835 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
       
   836         qDebug("QNCM CommsDB event (of type RDbNotifier::TEvent) received: %d", iStatus.Int());
       
   837 #endif
       
   838         // By default, start relistening notifications. Stop only if interesting event occured.
   865         // By default, start relistening notifications. Stop only if interesting event occured.
   839         iWaitingCommsDatabaseNotifications = true;
   866         iWaitingCommsDatabaseNotifications = true;
   840         RDbNotifier::TEvent event = STATIC_CAST(RDbNotifier::TEvent, iStatus.Int());
   867         RDbNotifier::TEvent event = STATIC_CAST(RDbNotifier::TEvent, iStatus.Int());
   841         switch (event) {
   868         switch (event) {
   842         case RDbNotifier::ECommit:   /** A transaction has been committed.  */ 
   869         case RDbNotifier::ECommit:   /** A transaction has been committed.  */ 
   843         case RDbNotifier::ERecover:  /** The database has been recovered    */
   870         case RDbNotifier::ERecover:  /** The database has been recovered    */
       
   871 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
       
   872             qDebug("QNCM CommsDB event (of type RDbNotifier::TEvent) received: %d", iStatus.Int());
       
   873 #endif
   844             // Mark that there is update pending. No need to ask more events,
   874             // Mark that there is update pending. No need to ask more events,
   845             // as we know we will be updating anyway when the timer expires.
   875             // as we know we will be updating anyway when the timer expires.
   846             if (!iUpdatePending) {
   876             if (!iUpdatePending) {
   847                 iUpdatePending = true;
   877                 iUpdatePending = true;
   848                 iWaitingCommsDatabaseNotifications = false;
   878                 iWaitingCommsDatabaseNotifications = false;
   871 }
   901 }
   872 
   902 
   873 void QNetworkConfigurationManagerPrivate::EventL(const CConnMonEventBase& aEvent)
   903 void QNetworkConfigurationManagerPrivate::EventL(const CConnMonEventBase& aEvent)
   874 {
   904 {
   875     switch (aEvent.EventType()) {
   905     switch (aEvent.EventType()) {
       
   906 #ifdef SNAP_FUNCTIONALITY_AVAILABLE     
       
   907     case EConnMonBearerInfoChange:
       
   908         {
       
   909         CConnMonBearerInfoChange* realEvent;
       
   910         realEvent = (CConnMonBearerInfoChange*) &aEvent;
       
   911         TUint connectionId = realEvent->ConnectionId();
       
   912         if (connectionId == EBearerIdAll) {
       
   913             //Network level event
       
   914             TConnMonBearerInfo bearerInfo = (TConnMonBearerInfo)realEvent->BearerInfo();
       
   915             updateMobileBearerToConfigs(bearerInfo);
       
   916         }
       
   917         break;
       
   918         }
       
   919 #endif        
   876     case EConnMonConnectionStatusChange:
   920     case EConnMonConnectionStatusChange:
   877         {
   921         {
   878         CConnMonConnectionStatusChange* realEvent;
   922         CConnMonConnectionStatusChange* realEvent;
   879         realEvent = (CConnMonConnectionStatusChange*) &aEvent;
   923         realEvent = (CConnMonConnectionStatusChange*) &aEvent;
   880         TInt connectionStatus = realEvent->ConnectionStatus();
   924         TInt connectionStatus = realEvent->ConnectionStatus();
   886             TUint subConnectionCount = 0;
   930             TUint subConnectionCount = 0;
   887             TUint apId;            
   931             TUint apId;            
   888             TRequestStatus status;
   932             TRequestStatus status;
   889             iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
   933             iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
   890             User::WaitForRequest(status);
   934             User::WaitForRequest(status);
   891             QString ident = QString::number(qHash(apId));
   935 
       
   936             QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
   892             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
   937             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
       
   938 #ifdef OCC_FUNCTIONALITY_AVAILABLE
       
   939             if (!priv.data()) {
       
   940                 // Check if status was regarding EasyWLAN
       
   941                 priv = configurationFromEasyWlan(apId, connectionId);
       
   942             }
       
   943 #endif
   893             if (priv.data()) {
   944             if (priv.data()) {
   894                 priv.data()->connectionId = connectionId;
   945                 priv.data()->connectionId = connectionId;                
   895                 QT_TRYCATCH_LEAVING(emit this->configurationStateChanged(priv.data()->numericId, connectionId, QNetworkSession::Connecting));
   946                 QT_TRYCATCH_LEAVING(emit this->configurationStateChanged(priv.data()->numericId, connectionId, QNetworkSession::Connecting));
   896             }
   947             }
   897         } else if (connectionStatus == KLinkLayerOpen) {
   948         } else if (connectionStatus == KLinkLayerOpen) {
   898             // Connection has been successfully opened
   949             // Connection has been successfully opened
   899             TUint connectionId = realEvent->ConnectionId();
   950             TUint connectionId = realEvent->ConnectionId();
   900             TUint subConnectionCount = 0;
   951             TUint subConnectionCount = 0;
   901             TUint apId;            
   952             TUint apId;            
   902             TRequestStatus status;
   953             TRequestStatus status;
   903             iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
   954             iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
   904             User::WaitForRequest(status);
   955             User::WaitForRequest(status);
   905             QString ident = QString::number(qHash(apId));
   956             QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
   906             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
   957             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
       
   958 #ifdef OCC_FUNCTIONALITY_AVAILABLE
       
   959             if (!priv.data()) {
       
   960                 // Check for EasyWLAN
       
   961                 priv = configurationFromEasyWlan(apId, connectionId);
       
   962             }
       
   963 #endif
   907             if (priv.data()) {
   964             if (priv.data()) {
   908                 priv.data()->connectionId = connectionId;
   965                 priv.data()->connectionId = connectionId;
   909                 // Configuration is Active
   966                 // Configuration is Active
   910                 QT_TRYCATCH_LEAVING(
   967                 QT_TRYCATCH_LEAVING(
   911                     if (changeConfigurationStateTo(priv, QNetworkConfiguration::Active)) {
   968                     if (changeConfigurationStateTo(priv, QNetworkConfiguration::Active)) {
   961         CConnMonIapAvailabilityChange* realEvent;
  1018         CConnMonIapAvailabilityChange* realEvent;
   962         realEvent = (CConnMonIapAvailabilityChange*) &aEvent;
  1019         realEvent = (CConnMonIapAvailabilityChange*) &aEvent;
   963         TConnMonIapInfo iaps = realEvent->IapAvailability();
  1020         TConnMonIapInfo iaps = realEvent->IapAvailability();
   964         QList<QString> unDiscoveredConfigs = accessPointConfigurations.keys();
  1021         QList<QString> unDiscoveredConfigs = accessPointConfigurations.keys();
   965         for ( TUint i = 0; i < iaps.Count(); i++ ) {
  1022         for ( TUint i = 0; i < iaps.Count(); i++ ) {
   966             QString ident = QString::number(qHash(iaps.iIap[i].iIapId));
  1023             QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(iaps.iIap[i].iIapId));
   967             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
  1024             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
   968             if (priv.data()) {
  1025             if (priv.data()) {
   969                 // Configuration is either Discovered or Active 
  1026                 // Configuration is either Discovered or Active 
   970                 QT_TRYCATCH_LEAVING(changeConfigurationStateAtMinTo(priv, QNetworkConfiguration::Discovered));
  1027                 QT_TRYCATCH_LEAVING(changeConfigurationStateAtMinTo(priv, QNetworkConfiguration::Discovered));
   971                 unDiscoveredConfigs.removeOne(ident);
  1028                 unDiscoveredConfigs.removeOne(ident);
   990         TUint apId;
  1047         TUint apId;
   991         TUint connectionId = realEvent->ConnectionId();
  1048         TUint connectionId = realEvent->ConnectionId();
   992         TRequestStatus status;
  1049         TRequestStatus status;
   993         iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
  1050         iConnectionMonitor.GetUintAttribute(connectionId, subConnectionCount, KIAPId, apId, status);
   994         User::WaitForRequest(status);
  1051         User::WaitForRequest(status);
   995         QString ident = QString::number(qHash(apId));
  1052         QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(apId));
   996         QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
  1053         QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
       
  1054 #ifdef OCC_FUNCTIONALITY_AVAILABLE
       
  1055         if (!priv.data()) {
       
  1056             // If IAP was not found, check if the update was about EasyWLAN
       
  1057             priv = configurationFromEasyWlan(apId, connectionId);
       
  1058         }
       
  1059 #endif
   997         if (priv.data()) {
  1060         if (priv.data()) {
   998 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
  1061 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
   999             qDebug() << "QNCM updating connection monitor ID : from, to, whose: " << priv.data()->connectionId << connectionId << priv->name;
  1062             qDebug() << "QNCM updating connection monitor ID : from, to, whose: " << priv.data()->connectionId << connectionId << priv->name;
  1000 #endif
  1063 #endif
  1001             priv.data()->connectionId = connectionId;
  1064             priv.data()->connectionId = connectionId;
  1005     default:
  1068     default:
  1006         // For unrecognized events
  1069         // For unrecognized events
  1007         break;
  1070         break;
  1008     }
  1071     }
  1009 }
  1072 }
       
  1073 
       
  1074 #ifdef OCC_FUNCTIONALITY_AVAILABLE
       
  1075 // Tries to derive configuration from EasyWLAN.
       
  1076 // First checks if the interface brought up was EasyWLAN, then derives the real SSID,
       
  1077 // and looks up configuration based on that one.
       
  1078 QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> QNetworkConfigurationManagerPrivate::configurationFromEasyWlan(TUint32 apId, TUint connectionId)
       
  1079 {
       
  1080     if (apId == iCmManager.EasyWlanIdL()) {
       
  1081         TRequestStatus status;
       
  1082         TBuf<50> easyWlanNetworkName;
       
  1083         iConnectionMonitor.GetStringAttribute( connectionId, 0, KNetworkName,
       
  1084                                                easyWlanNetworkName, status );
       
  1085         User::WaitForRequest(status);
       
  1086         if (status.Int() == KErrNone) {
       
  1087             QString realSSID = QString::fromUtf16(easyWlanNetworkName.Ptr(), easyWlanNetworkName.Length());
       
  1088 
       
  1089             // Browser through all items and check their name for match
       
  1090             QNetworkConfiguration item;
       
  1091             QHash<QString, QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> >::const_iterator i =
       
  1092                     accessPointConfigurations.constBegin();
       
  1093             while (i != accessPointConfigurations.constEnd()) {
       
  1094                 QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = i.value();
       
  1095                 if (priv.data()->name == realSSID) {
       
  1096 #ifdef QT_BEARERMGMT_SYMBIAN_DEBUG
       
  1097                     qDebug() << "QNCM EasyWlan uses real SSID: " << realSSID;
       
  1098 #endif
       
  1099                     return priv;
       
  1100                 }
       
  1101                 ++i;
       
  1102             }
       
  1103         }
       
  1104     }
       
  1105     return QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>();
       
  1106 }
       
  1107 #endif
  1010 
  1108 
  1011 // Sessions may use this function to report configuration state changes,
  1109 // Sessions may use this function to report configuration state changes,
  1012 // because on some Symbian platforms (especially Symbian^3) all state changes are not
  1110 // because on some Symbian platforms (especially Symbian^3) all state changes are not
  1013 // reported by the RConnectionMonitor, in particular in relation to stop() call,
  1111 // reported by the RConnectionMonitor, in particular in relation to stop() call,
  1014 // whereas they _are_ reported on RConnection progress notifier used by sessions --> centralize
  1112 // whereas they _are_ reported on RConnection progress notifier used by sessions --> centralize
  1021     qDebug() << "QNCM A session reported state change for IAP ID: " << accessPointId << " whose new state is: " << newState;
  1119     qDebug() << "QNCM A session reported state change for IAP ID: " << accessPointId << " whose new state is: " << newState;
  1022 #endif
  1120 #endif
  1023     switch (newState) {
  1121     switch (newState) {
  1024     case QNetworkSession::Disconnected:
  1122     case QNetworkSession::Disconnected:
  1025         {
  1123         {
  1026             QString ident = QString::number(qHash(accessPointId));
  1124             QString ident = QT_BEARERMGMT_CONFIGURATION_IAP_PREFIX+QString::number(qHash(accessPointId));
  1027             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
  1125             QExplicitlySharedDataPointer<QNetworkConfigurationPrivate> priv = accessPointConfigurations.value(ident);
  1028             if (priv.data()) {
  1126             if (priv.data()) {
  1029                 // Configuration is either Defined or Discovered
  1127                 // Configuration is either Defined or Discovered
  1030                 if (changeConfigurationStateAtMaxTo(priv, QNetworkConfiguration::Discovered)) {
  1128                 if (changeConfigurationStateAtMaxTo(priv, QNetworkConfiguration::Discovered)) {
  1031                     updateStatesToSnaps();
  1129                     updateStatesToSnaps();
  1063         if (priv.data()->connectionId == aConnectionId) {
  1161         if (priv.data()->connectionId == aConnectionId) {
  1064             return priv;
  1162             return priv;
  1065         }
  1163         }
  1066         ++i;
  1164         ++i;
  1067     }
  1165     }
  1068 
       
  1069     return QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>();
  1166     return QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>();
  1070 }
  1167 }
  1071 
  1168 
  1072 AccessPointsAvailabilityScanner::AccessPointsAvailabilityScanner(QNetworkConfigurationManagerPrivate& owner,
  1169 AccessPointsAvailabilityScanner::AccessPointsAvailabilityScanner(QNetworkConfigurationManagerPrivate& owner,
  1073                                                                RConnectionMonitor& connectionMonitor)
  1170                                                                RConnectionMonitor& connectionMonitor)