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) { |
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; |
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(); |