diff -r 51a71243e562 -r e0f767079796 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp --- a/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp Fri Mar 12 15:51:11 2010 +0200 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmserver.cpp Mon Mar 15 12:46:48 2010 +0200 @@ -16,7 +16,7 @@ */ /* -* %version: 99 % +* %version: 102 % */ #include @@ -478,8 +478,9 @@ return; } - DEBUG4( "CWlmServer::Connect() - SecurityMode: %u, WPAKeyLength: %u, EnableWpaPsk: %u, PresharedKeyFormat: %u", - iapData.SecurityMode, iapData.WPAKeyLength, iapData.EnableWpaPsk, iapData.PresharedKeyFormat ); + DEBUG5( "CWlmServer::Connect() - SecurityMode: %u, WPAKeyLength: %u, WPAPreSharedKey: %u, EnableWpaPsk: %u, PresharedKeyFormat: %u", + iapData.SecurityMode, iapData.WPAKeyLength, iapData.WPAPreSharedKey.Length(), + iapData.EnableWpaPsk, iapData.PresharedKeyFormat ); // Check whether WAPI is supported if( iapData.SecurityMode == Wapi && @@ -1127,7 +1128,7 @@ mapEntry.iParam1 = coreSsid; mapEntry.iTime = scanTime; iRequestMap.Append( mapEntry ); - + // Scan scheduling timer needs to be set again if this request needs the results earlier or // if this is the only timed pending request if( scanTime != NULL && ( IsOnlyTimedScanRequestInRequestMap( mapEntry ) || *scanTime < iScanSchedulingTimerExpiration ) ) @@ -1798,9 +1799,10 @@ iAggressiveScanningAfterLinkLoss = EFalse; } - // if background scan is on, this call will cause a background scan - // when the background scan is completed, the icon is updated - iBgScanProvider->NotConnected(); + // If background scan is on, this call will cause a background scan to occur. + // The icon is updated after the background scan is completed. + iBgScanProvider->WlanStateChanged( MWlanBgScanProvider::EWlanStateDisconnected ); + break; case EWlanStateInfrastructure: DEBUG( "CWlmServer::notify() - STATE: EWlanStateInfrastructure" ); @@ -2225,9 +2227,9 @@ DEBUG( "CWlmServer::request_complete() - also additional requests can be completed" ); /* - * Request can be completed using other the results of another request if + * Request can be completed using the results of another request if * this method is related to scan scheduling and results of the triggering request can - * be used also to completed this request + * be used also to complete this request * * Following rules apply: * - GetAvailableIaps results can be used to complete another GetAvailableIaps request, @@ -2251,12 +2253,12 @@ if( iRequestMap[i].iRequestId == KWlanIntCmdBackgroundScan ) { - CompleteInternalRequest( i, status, EFalse ); + CompleteInternalRequest( iRequestMap[i], status, EFalse ); bgScanCompleted = ETrue; } else { - CompleteExternalRequest( i, status, &completedMapEntry ); + CompleteExternalRequest( iRequestMap[i], status, &completedMapEntry ); if( IsSessionActive( iRequestMap[i] ) ) { iRequestMap[i].iMessage.Complete( @@ -2272,34 +2274,28 @@ } } - // clear completedMapEntry as it is not needed anymore - completedMapEntry = SRequestMapEntry(); - - // complete the request which Core has actually handled - TInt triggerIndex = FindRequestIndex( request_id ); - - DEBUG1( "CWlmServer::request_complete() - completing triggering request (ID %u)", iRequestMap[triggerIndex].iRequestId ); + DEBUG1( "CWlmServer::request_complete() - completing triggering request (ID %u)", completedMapEntry.iRequestId ); if( request_id < KWlanExtCmdBase ) { - CompleteInternalRequest( triggerIndex, status ); + CompleteInternalRequest( completedMapEntry, status ); } - else if( iRequestMap[triggerIndex].iFunction == EJoinByProfileId ) + else if( completedMapEntry.iFunction == EJoinByProfileId ) { core_iap_data_s* coreIapData = - reinterpret_cast( iRequestMap[triggerIndex].iParam0 ); + reinterpret_cast( completedMapEntry.iParam0 ); core_type_list_c* coreSsidList = - reinterpret_cast*>( iRequestMap[triggerIndex].iParam1 ); + reinterpret_cast*>( completedMapEntry.iParam1 ); core_connect_status_e* connectionStatus = - reinterpret_cast( iRequestMap[triggerIndex].iParam2 ); - - if( status == core_error_ok && IsSessionActive( iRequestMap[triggerIndex] ) ) + reinterpret_cast( completedMapEntry.iParam2 ); + + if( status == core_error_ok && IsSessionActive( completedMapEntry ) ) { DEBUG2("CONNECT COMPLETED WITH status == %u -> adapt == %d", *connectionStatus, TWlanConversionUtil::ConvertConnectStatus( *connectionStatus, coreIapData->security_mode ) ); - iRequestMap[triggerIndex].iMessage.Complete( + completedMapEntry.iMessage.Complete( TWlanConversionUtil::ConvertConnectStatus( *connectionStatus, coreIapData->security_mode ) ); @@ -2309,14 +2305,21 @@ // aggressive background scanning has to be carried out // in case the connection drops iAggressiveScanningAfterLinkLoss = ETrue; + + // Inform BgScan provider about successful connection. + // If background scan is currently on, background scan + // will be disabled and it's request will be removed + // from the request map. + iBgScanProvider->WlanStateChanged( MWlanBgScanProvider::EWlanStateConnected ); + } } - else if ( IsSessionActive( iRequestMap[triggerIndex] ) ) + else if ( IsSessionActive( completedMapEntry ) ) { DEBUG2("CONNECT COMPLETED WITH error == %u -> adapt == %d", status, TWlanConversionUtil::ConvertErrorCode( status ) ); - iRequestMap[triggerIndex].iMessage.Complete( + completedMapEntry.iMessage.Complete( TWlanConversionUtil::ConvertErrorCode( status ) ); } else @@ -2326,16 +2329,21 @@ delete coreIapData; delete coreSsidList; delete connectionStatus; - iRequestMap.Remove( triggerIndex ); + // re-use idx variable + idx = FindRequestIndex( completedMapEntry.iRequestId ); + if( idx < iRequestMap.Count() ) + { + iRequestMap.Remove( idx ); + } } - else if ( iRequestMap[triggerIndex].iFunction == ERunProtectedSetup ) + else if ( completedMapEntry.iFunction == ERunProtectedSetup ) { core_iap_data_s* iapData = - reinterpret_cast( iRequestMap[triggerIndex].iParam0 ); + reinterpret_cast( completedMapEntry.iParam0 ); core_type_list_c* iapDataList = - reinterpret_cast*>( iRequestMap[triggerIndex].iParam1 ); + reinterpret_cast*>( completedMapEntry.iParam1 ); core_protected_setup_status_e* protectedSetupStatus = - reinterpret_cast( iRequestMap[triggerIndex].iParam2 ); + reinterpret_cast( completedMapEntry.iParam2 ); // Convert the received credentials. TWlmProtectedSetupCredentials tmp; @@ -2353,26 +2361,26 @@ DEBUG1( "CWlmServer::request_complete() - converted %u Protected Setup credential attributes", tmp.count ); - if( IsSessionActive( iRequestMap[triggerIndex] ) ) + if( IsSessionActive( completedMapEntry ) ) { TPckg outPckg( tmp ); - iRequestMap[triggerIndex].iMessage.Write( 1, outPckg ); + completedMapEntry.iMessage.Write( 1, outPckg ); } - if( status == core_error_ok && IsSessionActive( iRequestMap[triggerIndex] ) ) + if( status == core_error_ok && IsSessionActive( completedMapEntry ) ) { - DEBUG2("PROTECTED SETUP COMPLETED WITH status == %d -> adapt == %d", + DEBUG2("PROTECTED SETUP COMPLETED WITH status == %u -> adapt == %d", *protectedSetupStatus, TWlanConversionUtil::ConvertProtectedSetupStatus( *protectedSetupStatus ) ); - iRequestMap[triggerIndex].iMessage.Complete( + completedMapEntry.iMessage.Complete( TWlanConversionUtil::ConvertProtectedSetupStatus( *protectedSetupStatus ) ); } - else if ( IsSessionActive( iRequestMap[triggerIndex] ) ) + else if ( IsSessionActive( completedMapEntry ) ) { - DEBUG2("PROTECTED SETUP COMPLETED WITH error == %d -> adapt == %d", + DEBUG2("PROTECTED SETUP COMPLETED WITH error == %u -> adapt == %d", status, TWlanConversionUtil::ConvertErrorCode( status ) ); - iRequestMap[triggerIndex].iMessage.Complete( + completedMapEntry.iMessage.Complete( TWlanConversionUtil::ConvertErrorCode( status ) ); } else @@ -2383,17 +2391,27 @@ delete iapData; delete iapDataList; delete protectedSetupStatus; - iRequestMap.Remove( triggerIndex ); + // re-use idx variable + idx = FindRequestIndex( completedMapEntry.iRequestId ); + if( idx < iRequestMap.Count() ) + { + iRequestMap.Remove( idx ); + } } else { - CompleteExternalRequest( triggerIndex, status ); - if( IsSessionActive( iRequestMap[triggerIndex] ) ) + CompleteExternalRequest( completedMapEntry, status ); + if( IsSessionActive( completedMapEntry ) ) { - iRequestMap[triggerIndex].iMessage.Complete( + completedMapEntry.iMessage.Complete( TWlanConversionUtil::ConvertErrorCode( status ) ); } - iRequestMap.Remove( triggerIndex ); + // re-use idx variable + idx = FindRequestIndex( completedMapEntry.iRequestId ); + if( idx < iRequestMap.Count() ) + { + iRequestMap.Remove( idx ); + } } // Background scan request needs to be updated only after all the other request have been completed @@ -2420,7 +2438,8 @@ if( requestMapCount ) { DEBUG( "CWlmServer::request_complete() - remaining requests:" ); - for ( TInt idx( 0 ); idx < requestMapCount; ++idx ) + // re-use idx variable + for ( idx = 0; idx < requestMapCount; ++idx ) { DEBUG1( "CWlmServer::request_complete() - ID %u", iRequestMap[idx].iRequestId ); DEBUG1( "CWlmServer::request_complete() - function %d", iRequestMap[idx].iFunction ); @@ -2546,37 +2565,43 @@ // --------------------------------------------------------- // void CWlmServer::CompleteInternalRequest( - TUint32 aIndex, + const SRequestMapEntry& aRequest, core_error_e aStatus, TBool aCompletedWasTriggering ) { - DEBUG1( "CWlmServer::CompleteInternalRequest() - index (%d)", aIndex ); + + TInt idx = FindRequestIndex( aRequest.iRequestId ); - // Take the entry out from queue - SRequestMapEntry requestEntry = iRequestMap[ aIndex ]; - - iRequestMap.Remove( aIndex ); - - switch( requestEntry.iRequestId ) + if( idx >= iRequestMap.Count() ) + { + DEBUG1("CWlmServer::CompleteInternalRequest() - request (ID %u) not in request map", idx ); + return; + } + + DEBUG1( "CWlmServer::CompleteInternalRequest() - index (%d)", idx ); + + iRequestMap.Remove( idx ); + + switch( aRequest.iRequestId ) { case KWlanIntCmdBackgroundScan: { core_type_list_c* iapSsidList = - reinterpret_cast*>( requestEntry.iParam3 ); + reinterpret_cast*>( aRequest.iParam3 ); delete iapSsidList; iapSsidList = NULL; ScanList* scanList = - reinterpret_cast( requestEntry.iParam2 ); + reinterpret_cast( aRequest.iParam2 ); core_type_list_c* idList = - reinterpret_cast*>( requestEntry.iParam1 ); + reinterpret_cast*>( aRequest.iParam1 ); core_type_list_c* iapDataList = - reinterpret_cast*>( requestEntry.iParam0 ); + reinterpret_cast*>( aRequest.iParam0 ); delete iapDataList; iapDataList = NULL; - TTime* completedScanTime = reinterpret_cast( requestEntry.iTime ); + TTime* completedScanTime = reinterpret_cast( aRequest.iTime ); delete completedScanTime; completedScanTime = NULL; @@ -2615,31 +2640,37 @@ // --------------------------------------------------------- // void CWlmServer::CompleteExternalRequest( - TUint32 aIndex, + const SRequestMapEntry& aRequest, core_error_e aStatus, SRequestMapEntry* aTriggerRequest ) { - DEBUG1( "CWlmServer::CompleteExternalRequest() - index (%d)", aIndex ); - - // Take the entry out from queue - SRequestMapEntry requestEntry = iRequestMap[ aIndex ]; + + TInt idx = FindRequestIndex( aRequest.iRequestId ); + + if( idx >= iRequestMap.Count() ) + { + DEBUG1("CWlmServer::CompleteExternalRequest() - request (ID %u) not in request map", idx ); + return; + } + + DEBUG1( "CWlmServer::CompleteExternalRequest() - index (%d)", idx ); // Find out the request type // in order to handle possible return parameters - switch( requestEntry.iFunction ) + switch( aRequest.iFunction ) { case EGetScanResults: { ScanList* tmp( NULL ); - core_ssid_s* ssid = reinterpret_cast( requestEntry.iParam1 ); - TTime* completedScanTime = reinterpret_cast( requestEntry.iTime ); - ScanList* completedScanList = reinterpret_cast( requestEntry.iParam0 ); + core_ssid_s* ssid = reinterpret_cast( aRequest.iParam1 ); + TTime* completedScanTime = reinterpret_cast( aRequest.iTime ); + ScanList* completedScanList = reinterpret_cast( aRequest.iParam0 ); if( aTriggerRequest == NULL ) { DEBUG( "CWlmServer::CompleteExternalRequest() - GetScanResults request handled by core" ); - tmp = reinterpret_cast( requestEntry.iParam0); + tmp = reinterpret_cast( aRequest.iParam0); } else { @@ -2672,10 +2703,10 @@ DEBUG2( "CWlmServer::CompleteExternalRequest() - scan results count is %u, size is %u", tmp->Count(), tmp->Size() ); - if( requestEntry.iSessionId != 0 ) + if( IsSessionActive( aRequest ) ) { - requestEntry.iMessage.Write( 0, ptrScanList ); - requestEntry.iMessage.Write( 2, pckgDynamicScanList ); + aRequest.iMessage.Write( 0, ptrScanList ); + aRequest.iMessage.Write( 2, pckgDynamicScanList ); } // Check whether to cache the results or not @@ -2729,19 +2760,19 @@ core_type_list_c* coreIdList; core_type_list_c* iapDataList; - iapSsidList = reinterpret_cast*>( requestEntry.iParam3 ); - iapDataList = reinterpret_cast*>( requestEntry.iParam0 ); + iapSsidList = reinterpret_cast*>( aRequest.iParam3 ); + iapDataList = reinterpret_cast*>( aRequest.iParam0 ); - TTime* completedScanTime = reinterpret_cast( requestEntry.iTime ); - ScanList* completedScanList = reinterpret_cast( requestEntry.iParam2); - core_type_list_c* completedIdList = reinterpret_cast*>( requestEntry.iParam1 ); + TTime* completedScanTime = reinterpret_cast( aRequest.iTime ); + ScanList* completedScanList = reinterpret_cast( aRequest.iParam2); + core_type_list_c* completedIdList = reinterpret_cast*>( aRequest.iParam1 ); if( aTriggerRequest == NULL ) { DEBUG( "CWlmServer::CompleteExternalRequest() - GetAvailableIaps request handled by core" ); - scanList = reinterpret_cast( requestEntry.iParam2); - coreIdList = reinterpret_cast*>( requestEntry.iParam1 ); + scanList = reinterpret_cast( aRequest.iParam2); + coreIdList = reinterpret_cast*>( aRequest.iParam1 ); } else { @@ -2789,15 +2820,14 @@ tmp.count = idx; - if( requestEntry.iSessionId != 0 ) + if( IsSessionActive( aRequest ) ) { TPckg outPckg( tmp ); - requestEntry.iMessage.Write( 0, outPckg ); + aRequest.iMessage.Write( 0, outPckg ); } if( aTriggerRequest == NULL ) { - DEBUG1("CWlmServer::CompleteExternalRequest() - delete iapIdList (%d)", coreIdList); - + DEBUG("CWlmServer::CompleteExternalRequest() - delete iapIdList" ); delete coreIdList; } else @@ -2841,16 +2871,14 @@ } case EGetCurrentRSSI: { - TUint32 tmp - = *( reinterpret_cast - ( requestEntry.iParam0 ) ); - if( requestEntry.iSessionId != 0 ) + TUint32 tmp = *( reinterpret_cast( aRequest.iParam0 ) ); + if( IsSessionActive( aRequest ) ) { TPckg outPckg( tmp ); - requestEntry.iMessage.Write( 0, outPckg ); + aRequest.iMessage.Write( 0, outPckg ); } iPrevRcpiValue = tmp; - delete reinterpret_cast( requestEntry.iParam0 ); + delete reinterpret_cast( aRequest.iParam0 ); break; } case EGetSystemMode: @@ -2861,39 +2889,38 @@ case EConfigureMulticastGroup: { // no parameters to return - delete reinterpret_cast( requestEntry.iParam0 ); + delete reinterpret_cast( aRequest.iParam0 ); break; } case EGetPacketStatistics: { core_packet_statistics_s* coreStatistics = - reinterpret_cast( requestEntry.iParam0 ); - if( requestEntry.iSessionId != 0 ) + reinterpret_cast( aRequest.iParam0 ); + if( IsSessionActive( aRequest ) ) { TPckgBuf statisticPckg; TWlanConversionUtil::ConvertPacketStatistics( statisticPckg(), *coreStatistics ); - requestEntry.iMessage.Write( 0, statisticPckg ); + aRequest.iMessage.Write( 0, statisticPckg ); } delete coreStatistics; break; } case ECreateTrafficStream: { - u32_t* coreStreamId = - reinterpret_cast( requestEntry.iParam0 ); + u32_t* coreStreamId = reinterpret_cast( aRequest.iParam0 ); core_traffic_stream_status_e* coreStreamStatus = - reinterpret_cast( requestEntry.iParam1 ); - if( requestEntry.iSessionId != 0 && + reinterpret_cast( aRequest.iParam1 ); + if( IsSessionActive( aRequest ) && aStatus == core_error_ok ) { TPckgBuf streamIdPckg( *coreStreamId ); TPckgBuf streamStatusPckg( TWlanConversionUtil::ConvertTrafficStreamStatus( *coreStreamStatus ) ); - requestEntry.iMessage.Write( 2, streamIdPckg ); - requestEntry.iMessage.Write( 3, streamStatusPckg ); + aRequest.iMessage.Write( 2, streamIdPckg ); + aRequest.iMessage.Write( 3, streamStatusPckg ); } delete coreStreamId; delete coreStreamStatus; @@ -2912,7 +2939,7 @@ default: { DEBUG1( "CWlmServer::CompleteExternalRequest() - ERROR: unknown request type (%d)!", - requestEntry.iFunction ); + aRequest.iFunction ); break; } } @@ -3120,7 +3147,7 @@ DEBUG( "CWlmServer::CancelExternalRequest() - this request is not the scan scheduling triggering request" ); DEBUG( "CWlmServer::CancelExternalRequest() - remove the cancelled request" ); - CompleteExternalRequest( i, core_error_cancel ); + CompleteExternalRequest( iRequestMap[i], core_error_cancel ); if( IsSessionActive( iRequestMap[i] ) ) { iRequestMap[i].iMessage.Complete( @@ -5099,6 +5126,7 @@ } } + wlanIapIds.Close(); wlanSettings.Disconnect(); DEBUG( "CWlmServer::GetCurrentIapId() - all done" );