browserutilities/connectionmanager/Src/ConnectionObservers.cpp
changeset 0 dd21522fd290
child 25 0ed94ceaa377
--- /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 <nifman.h>
+#include <nifvar.h>
+#include <es_enum.h>
+#include <in_sock.h>
+
+#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<TConnectionInfo> 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