diff -r 63be7eb3fc78 -r f28ada11abbf wlanutilities/wlansniffer/engine/server/src/wsfict.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanutilities/wlansniffer/engine/server/src/wsfict.cpp Wed Sep 01 12:20:32 2010 +0100 @@ -0,0 +1,371 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation of CWsfIct +* +*/ + + +// EXTERNAL INCLUDES +#include +#include +#include +#include +#include +#include + +// CLASS HEADER +#include "wsfict.h" +#include "wsflogger.h" + +// INTERNAL INCLUDES + +using namespace CMManager; + +/** +* UID of Wlan Login application (hsbrowser) +* used when launching WLAN Login application +*/ +static const TInt KBrowserUid = { 0x2000AFCC }; + +/** +* Length of a needed separators +* used when launching WLAN Login application +*/ +const TInt KSeparatorsLength = 4; + + +// ---------------------------------------------------------------------------- +// CWsfIct::NewL +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfIct* CWsfIct::NewL() + { + CWsfIct* self = CWsfIct::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +// ---------------------------------------------------------------------------- +// CWsfIct::NewLC +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfIct* CWsfIct::NewLC() + { + CWsfIct* self = new( ELeave ) CWsfIct; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// ---------------------------------------------------------------------------- +// CWsfIct::~CWsfIct +// ---------------------------------------------------------------------------- +// +EXPORT_C CWsfIct::~CWsfIct() + { + LOG_ENTERFN( "CWsfIct::~CWsfIct" ); + if ( iIct ) + { + LOG_WRITE( "ict cancel" ); + TRAP_IGNORE( iIct->CancelStartL() ); + delete iIct; + iIct = NULL; + } + } + + +// ---------------------------------------------------------------------------- +// CWsfIct::CWsfIct +// ---------------------------------------------------------------------------- +// +CWsfIct::CWsfIct(): iConnectOnly( EFalse ) + { + } + + +// ---------------------------------------------------------------------------- +// CWsfIct::ConstructL +// ---------------------------------------------------------------------------- +// +void CWsfIct::ConstructL() + { + } + + +// ---------------------------------------------------------------------------- +// CWsfIct::ConnectivityObserver +// ---------------------------------------------------------------------------- +// +void CWsfIct::ConnectivityObserver( TIctsTestResult aResult, + const TDesC& aString ) + { + LOG_ENTERFN( "CWsfIct::ConnectivityObserver" ); + LOG_WRITEF( "ICTS result: %d", aResult ); + + // check the result + switch ( aResult ) + { + case EConnectionOk: + { + // test succeeded + TRAP_IGNORE( MoveToInternetSnapL( iIapId ) ); + LOG_WRITE( "ICT: EConnectionOk" ); + break; + } + + case EConnectionNotOk: + { + // test was run but it failed + LOG_WRITE( "ICT: EConnectionNotOk" ); + break; + } + case EHttpAuthenticationNeeded: + { + // test was run but HTTP authentication is required + LOG_WRITE( "ICT: EHttpAuthenticationNeeded" ); + if ( iConnectOnly ) + { + // Connect selected. WLAN Login needed. + TRAP_IGNORE( LaunchWlanLoginL(aString) ); + } + break; + } + case ETimeout: + { + LOG_WRITE( "ICT: ETimeout" ); + break; + } + + default: + { + _LIT( KIctPanic, "ICT result" ); + User::Panic( KIctPanic, aResult ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CWsfIct::LaunchWlanLoginL() +// ----------------------------------------------------------------------------- +// +void CWsfIct::LaunchWlanLoginL( const TDesC& aString ) + { + LOG_ENTERFN( "CWsfIct::LaunchWlanLoginL" ); + + // Count IAP Id length + TInt iapIdLength ( 1 ); + TInt iapId = iIapId; + while ( iapId >= 10 ) + { + iapId = iapId/10; + iapIdLength++; + } + + // Count Network Id length + TInt netIdLength ( 1 ); + TInt netId = iNetId; + while ( netId >= 10 ) + { + netId = netId/10; + netIdLength++; + } + + TInt length = aString.Length() + + iapIdLength + + netIdLength + + KSeparatorsLength; + HBufC* param = HBufC::NewLC( length ); + _LIT(tmpString, "%d, %d, %S"); + param->Des().Format( tmpString, + iIapId, + iNetId, + &aString ); + TUid uid( TUid::Uid( KBrowserUid ) ); + TThreadId id; + + RApaLsSession appArcSession; + User::LeaveIfError( appArcSession.Connect() ); + CleanupClosePushL( appArcSession ); + + TInt err = appArcSession.StartDocument( *param, TUid::Uid( KBrowserUid ), id ); + if ( err != KErrNone ) + { + LOG_ENTERFN( "CWsfIct::LaunchWlanLoginL failed" ); + } + CleanupStack::PopAndDestroy( &appArcSession ); + CleanupStack::PopAndDestroy( param ); + } + + +// ---------------------------------------------------------------------------- +// CWsfIct::MoveToInternetSnapL +// ---------------------------------------------------------------------------- +// +void CWsfIct::MoveToInternetSnapL( const TUint32 aIapId ) + { + LOG_ENTERFN( "CWsfIct::MoveToInternetSnapL" ); + RCmManagerExt cmManager; + cmManager.OpenL(); + CleanupClosePushL( cmManager ); + + // Check that is IAP uncategorized + RArray cmIds; + CleanupClosePushL( cmIds ); + cmManager.ConnectionMethodL( cmIds, ETrue, ETrue, EFalse ); + TBool foundFromUncategorized = EFalse; + + for ( TInt k = 0; k < cmIds.Count(); k++ ) + { + RCmConnectionMethodExt cm; + TRAPD( error, cm = cmManager.ConnectionMethodL( cmIds[k] ) ); + if ( KErrNone == error ) + { + CleanupClosePushL( cm ); + + TUint iapId = cm.GetIntAttributeL( CMManager::ECmIapId ); + if ( iapId == aIapId ) + { + LOG_WRITE( "IAP is uncategorized" ); + foundFromUncategorized = ETrue; + } + CleanupStack::PopAndDestroy( &cm ); + } + } + + CleanupStack::PopAndDestroy( &cmIds ); + + if ( !foundFromUncategorized ) + { + LOG_WRITE( "Not moving IAP since it is in SNAP" ); + CleanupStack::PopAndDestroy( &cmManager ); + return; + } + + // Read all destination(SNAP) settings into an array + RArray destinations; + CleanupClosePushL( destinations ); + + cmManager.AllDestinationsL( destinations ); + RCmDestinationExt destination; + // Loop through each destination + for( TInt i = 0; i < destinations.Count(); i++ ) + { + destination = cmManager.DestinationL( destinations[i] ); + CleanupClosePushL( destination ); + // Internet destination will always exist in the system. + // Internet destination will have ESnapPurposeInternet + // set in its metadata. + if ( destination.MetadataL( CMManager::ESnapMetadataPurpose ) == + CMManager::ESnapPurposeInternet ) + { + RCmConnectionMethodExt iap = cmManager.ConnectionMethodL( aIapId ); + CleanupClosePushL( iap ); + LOG_WRITE( "Move Iap to internet destination" ); + destination.AddConnectionMethodL( iap ); + destination.UpdateL(); + CleanupStack::PopAndDestroy( &iap ); + } + CleanupStack::PopAndDestroy( &destination ); + } + CleanupStack::PopAndDestroy( &destinations ); + CleanupStack::PopAndDestroy( &cmManager ); + } + + +// ---------------------------------------------------------------------------- +// CWsfIct::TestConnectedAccessPointL +// ---------------------------------------------------------------------------- +// +void CWsfIct::TestConnectedAccessPointL( TUint aIapId ) + { + LOG_ENTERFN( "CWsfIct::TestConnectedAccessPointL" ); + if ( !aIapId || aIapId != iIapId ) + { + // the wlaninfo must already contain a valid IAP id + LOG_WRITE( "invalid IAP id" ); + return; + } + + if ( iIct ) + { + iIct->CancelStartL(); + delete iIct; + iIct = NULL; + } + + LOG_WRITE( "starting ICT test..." ); + + iIct = CIctsClientInterface::NewL( iIapId, iNetId, *this ); + LOG_WRITE( "ICT created" ); + iIct->StartL(); + LOG_WRITE( "ICT: started" ); + } + + +// ---------------------------------------------------------------------------- +// CWsfIct::InitializeIctL +// ---------------------------------------------------------------------------- +// +void CWsfIct::InitializeIctL( TBool aTestAccessPoint, + TUint aIapId, + TBool aConnectOnly ) + { + LOG_ENTERFN( "CWsfIct::InitializeIct" ); + + LOG_WRITEF( "IAP id = %d aTestAccessPoint = %d aConnectOnly = %d", + aIapId, aTestAccessPoint, aConnectOnly ); + + if ( !aIapId || !aTestAccessPoint ) + { + // the wlaninfo must already contain a valid IAP id + // and check that IAP needs testing + LOG_WRITE( "ICT not initialized" ); + iConnectOnly = EFalse; + iIapId = 0; + iNetId = 0; + return; + } + + // set variables + iConnectOnly = aConnectOnly; + iIapId = aIapId; + + if ( iIct ) + { + iIct->CancelStartL(); + delete iIct; + iIct = NULL; + } + + // get network Id + RCmManagerExt cmManager; + cmManager.OpenL(); + CleanupClosePushL(cmManager); + + RCmConnectionMethodExt cm = cmManager.ConnectionMethodL(iIapId); + CleanupClosePushL(cm); + + iNetId = cm.GetIntAttributeL(CMManager::ECmNetworkId); + + LOG_WRITEF( "Network Id=%d ", iNetId ); + + CleanupStack::PopAndDestroy(&cm); + CleanupStack::PopAndDestroy(&cmManager); + } + +// End of file +