diff -r 000000000000 -r dd21522fd290 browserutilities/connectionmanager/Src/ConnectionObservers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/connectionmanager/Src/ConnectionObservers.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,298 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* This class provides connection/session related information. +* Both the requested and the stored AP's are here. +* +* +*/ + + + +#include +#include +#include +#include + +#include "ConnectionObservers.h" +#include "ConnectionManagerLogger.h" + + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::NewL() +//-------------------------------------------------------------------------- +EXPORT_C CConnectionStageNotifierWCB* CConnectionStageNotifierWCB::NewL( TInt aPriority ) + { + CConnectionStageNotifierWCB* self = CConnectionStageNotifierWCB::NewLC( aPriority ); + CleanupStack::Pop(); + return self; + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::NewLC() +//-------------------------------------------------------------------------- +EXPORT_C CConnectionStageNotifierWCB* CConnectionStageNotifierWCB::NewLC( TInt aPriority ) + { + CConnectionStageNotifierWCB* self = new ( ELeave ) CConnectionStageNotifierWCB( aPriority ); + CleanupStack::PushL( self ); + return self; + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::StartNotificationL() +//-------------------------------------------------------------------------- +EXPORT_C void + CConnectionStageNotifierWCB::StartNotificationL( TInt /*aStageToObserve*/, + MConnectionStageObserver* /*aObserver*/, + TBool /*aCompleteIfAlreadyAtStage*/ ) + { + User::Leave( KErrNotSupported ); + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::~CConnectionStageNotifierWCB() +//-------------------------------------------------------------------------- +EXPORT_C CConnectionStageNotifierWCB::~CConnectionStageNotifierWCB() + { + CLOG_WRITE("~CConnectionStageNotifierWCB"); + + Cancel(); + + CLOG_WRITE("Canceled"); + // if there's nothing to cancel + // DoCancel is not called. + // We need to close agent manually from here + DoCloseAgent(); + + CLOG_CLOSE; + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::CConnectionStageNotifierWCB() +//-------------------------------------------------------------------------- +CConnectionStageNotifierWCB::CConnectionStageNotifierWCB( TInt aPriority ) : CActive( aPriority ) + { + CLOG_CREATE; + CLOG_NAME_1( _L("StageNotifier_%x"), this ); + + CActiveScheduler::Add( this ); + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::DoCancel() +//-------------------------------------------------------------------------- +void CConnectionStageNotifierWCB::DoCancel() + { + CLOG_ENTERFN( "DoCancel()" ); + iConnection.CancelProgressNotification(); + DoCloseAgent(); + + iMultiObserver = NULL; + iStages = NULL; + iNumOfStages = 0; + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::RunL() +//-------------------------------------------------------------------------- +void CConnectionStageNotifierWCB::RunL() + { + CLOG_ENTERFN("CConnectionStageNotifierWCB::RunL()"); + CLOG_WRITE_1( "CConnectionStageNotifierWCB Stage: %d", iProgressBuf().iStage ); + + if( !iMultiObserver ) + { + if ( iProgressBuf().iStage == iStageToObserve ) + { + CLOG_WRITE( "Stage achived" ); + DoCloseAgent(); + iObserver->ConnectionStageAchievedL(); + } + else//reissuing request + { + CLOG_WRITE( "Restarting progress notif." ); + iConnection.ProgressNotification( iProgressBuf, iStatus );//reissuing request + SetActive(); + } + } + else + { + if( IsAnyStageReached( iProgressBuf().iStage ) ) + { + iMultiObserver->ConnectionStageAchievedL( iProgressBuf().iStage ); + } + else{ + //reissuing request + iConnection.ProgressNotification( iProgressBuf, iStatus );//issuing request + SetActive(); + } + } + } + + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::StartNotificationL() +//-------------------------------------------------------------------------- +EXPORT_C void + CConnectionStageNotifierWCB::StartNotificationL( TName* aConnName, + TInt aStageToObserve, + MConnectionStageObserver* aObserver, + TBool aCompleteIfAlreadyAtStage ) + { + CLOG_ENTERFN( "StartNotificationL1" ); + + __ASSERT_DEBUG( aObserver, User::Panic( KNullDesC, KErrArgument ) ); + iObserver = aObserver; + iStageToObserve = aStageToObserve; + + + DoOpenAgentL( aConnName ); + + TNifProgress progress; + + iConnection.Progress( progress );//initial progress may be important to save whether it is unconnected now + if ( progress.iStage == aStageToObserve && aCompleteIfAlreadyAtStage ) + { + DoCloseAgent(); + TRAP_IGNORE( iObserver->ConnectionStageAchievedL() ); + } + else + { + + /* No need to call Setactive() in the case if connection is already active, that is why checking isActive + connection, if not then only activating it, For instance Incase of Connection Change from real IAP to VPN on the + same real IAP using which VPN configurations were made then the existing connection would not be disconnected + but a new VPN tunnel will be created on top of it.So connection is already active, it should not call SetActive() + if the active object request has been issued already, new request should be issued only incase of a new connection altogether*/ + if(!IsActive()) + { + iConnection.ProgressNotification( iProgressBuf, iStatus );//issuing request + SetActive(); + } + } + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::StartNotificationL() +//-------------------------------------------------------------------------- +EXPORT_C void + CConnectionStageNotifierWCB::StartNotificationL( TName* aConnName, + TInt* aStages, + TInt aNumOfStages, + MConnectionMultiStageObserver* aObserver, + TBool aCompleteIfAlreadyAtStage ) + { + CLOG_ENTERFN( "StartNotificationL2" ); + + __ASSERT_DEBUG( aStages, User::Panic( KNullDesC, KErrArgument ) ); + __ASSERT_DEBUG( aNumOfStages > 0 , User::Panic( KNullDesC, KErrArgument ) ); + __ASSERT_DEBUG( aObserver, User::Panic( KNullDesC, KErrArgument ) ); + + iStages = aStages; + iNumOfStages = aNumOfStages; + iMultiObserver = aObserver; + + DoOpenAgentL( aConnName ); + + TNifProgress progress; + iConnection.Progress( progress );//initial progress may be important to save whether it is unconnected now + if ( IsAnyStageReached( progress.iStage ) && aCompleteIfAlreadyAtStage ) + { + DoCloseAgent(); + TRAP_IGNORE( iMultiObserver->ConnectionStageAchievedL( progress.iStage ) ); + } + else + { + if(!IsActive()) + { + iConnection.ProgressNotification( iProgressBuf, iStatus );//issuing request + SetActive(); + } + } + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::DoOpenAgent +//-------------------------------------------------------------------------- +void CConnectionStageNotifierWCB::DoOpenAgentL( TName* aConnName ) + { + CLOG_ENTERFN( "CConnectionStageNotifierWCB::DoOpenAgentL" ); + TInt err( KErrNone ); + if( (err = iServer.Connect()) == KErrNone ) + { + err = iConnection.Open( iServer, *aConnName ); + if( !err ) + { + TBuf<64> query; + TUint32 apId; + TUint32 netId; + + query.Format( _L("%s\\%s"), IAP, COMMDB_ID ); + if( iConnection.GetIntSetting( query, apId ) == KErrNone ) + { + query.Format( _L("%s\\%s"), IAP, IAP_NETWORK ); + if( iConnection.GetIntSetting( query, netId ) == KErrNone ) + { + TPckgBuf connInfo; + + connInfo().iIapId = apId; + connInfo().iNetId = netId; + CLOG_WRITE_2( "IAP ID: %d, NET ID: %d", connInfo().iIapId, connInfo().iNetId ); + + iConnection.Close(); + if( iConnection.Open( iServer, KAfInet ) == KErrNone ) + { + err = iConnection.Attach( connInfo, RConnection::EAttachTypeMonitor ); + CLOG_WRITE_1( "Attach result: %d", err ); + } + } + } + } + } + + if( err ) + { + iConnection.Close(); + iServer.Close(); + User::Leave( err ); + } + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::DoCloseAgent +//-------------------------------------------------------------------------- +void CConnectionStageNotifierWCB::DoCloseAgent() + { + CLOG_ENTERFN( "CConnectionStageNotifierWCB::DoCloseAgent()" ); + iConnection.Close(); + iServer.Close(); + } + +//-------------------------------------------------------------------------- +//CConnectionStageNotifierWCB::IsAnyStageReached() +//-------------------------------------------------------------------------- +TBool CConnectionStageNotifierWCB::IsAnyStageReached( TInt aCurrentStage ) + { + for( TInt i = 0; i < iNumOfStages; ++i ) + { + if( iStages[i] == aCurrentStage ) + { + return ETrue; + } + } + + return EFalse; + } + +//EOF