bearermanagement/mpm/src/mpmconnmonreqs.cpp
changeset 0 5a93021fdf25
child 15 4dc3bb0099b0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bearermanagement/mpm/src/mpmconnmonreqs.cpp	Thu Dec 17 08:55:21 2009 +0200
@@ -0,0 +1,454 @@
+/*
+* Copyright (c) 2005-2009 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: MPM ConnMon request handling
+*
+*/
+
+/**
+@file mpmconnmonreqs.cpp
+Mobility Policy Manager ConnMon request handling.
+*/
+
+// INCLUDE FILES
+#include "mpmconnmonreqs.h"
+#include "mpmlogger.h"
+#include "mpmserversession.h"
+#include "mpmiapselection.h"
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::NewL
+// -----------------------------------------------------------------------------
+//
+CMPMConnMonReqs* CMPMConnMonReqs::NewL(CMPMConnMonEvents& aParent,
+                                       RConnectionMonitor& aConnMon,
+                                       TUint aConnId, 
+                                       CMPMServerSession& aSession )
+    {
+    CMPMConnMonReqs* self = new (ELeave) CMPMConnMonReqs(
+                                aParent, aConnMon, aConnId, aSession );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::CMPMConnMonReqs
+// -----------------------------------------------------------------------------
+//
+CMPMConnMonReqs::CMPMConnMonReqs(CMPMConnMonEvents& aParent,
+                                 RConnectionMonitor& aConnMon,
+                                 TUint aConnId, 
+                                 CMPMServerSession& aSession )
+    : CActive(CActive::EPriorityStandard), 
+      iParent(aParent), 
+      iConnMon(aConnMon), 
+      iConnId(aConnId), 
+      iSession(aSession), 
+      iWlanScanCallback( EWlanScanCallbackNone ), 
+      iConnectionCount( 0 )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::~CMPMConnMonReqs
+// -----------------------------------------------------------------------------
+//
+CMPMConnMonReqs::~CMPMConnMonReqs()
+    {
+    MPMLOGSTRING( "CMPMConnMonReqs::~CMPMConnMonReqs" )
+    Cancel();
+    }
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMPMConnMonReqs::ConstructL()
+    {
+    MPMLOGSTRING( "CMPMConnMonReqs::ConstructL" )
+    CActiveScheduler::Add(this);
+    }
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::AvailableIapsSync
+// -----------------------------------------------------------------------------
+//
+void CMPMConnMonReqs::AvailableIapsSync()
+    {
+    MPMLOGSTRING( "CMPMConnMonReqs::AvailableIapsSync" )
+    iNextState = EGetIapAvailState;
+    iLastCancelCode = EConnMonGetPckgAttribute;
+    iConnMon.GetPckgAttribute( EBearerIdAll, 0, KIapAvailability,
+                               iIapBuf, iStatus);
+    SetActive();
+    
+    // Since CodeScanner does not recognise method IsStarted(), 
+    // it claims that here is a problem:
+    // 
+    // Problem: Active object called without checking 
+    // whether it is active or cancelling it first.
+    // 
+    if ( !iActiveSchedulerWait.IsStarted() )
+        {
+        iActiveSchedulerWait.Start();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::RefreshAvailableIAPs
+// -----------------------------------------------------------------------------
+//
+void CMPMConnMonReqs::RefreshAvailableIAPs( TWlanScanCallback aCallback, 
+                                            TInt aForceRefreshIntervalSeconds )
+    {
+    MPMLOGSTRING2( "CMPMConnMonReqs::RefreshAvailableIAPs callback %d", aCallback )
+    // set the type of callback to determine afterwards which function to call
+    iWlanScanCallback = aCallback;
+    iNextState      = EScanWLANNetworksState;   // Default value
+    iLastCancelCode = EConnMonGetPckgAttribute;
+
+    TTime time;
+    time.UniversalTime();
+    TTimeIntervalSeconds interval( 0 );
+    
+    TInt ret( KErrNone );
+        
+    // Calculate the elapsed time.
+    ret = time.SecondsFrom( iParent.GetIAPRefreshTime(), interval );
+    if ( ret != KErrNone )
+        {
+        MPMLOGSTRING2( "CMPMConnMonReqs::RefreshAvailableIAPs interval error %d ", ret )
+        // problem with interval, force iapavailability.
+        interval = 0;
+        aForceRefreshIntervalSeconds = 0;
+        }
+    // Default behavior is to query KIapAvailability from ConnMon always
+    // or if the availability information has aged at least aForceRefreshIntervalSeconds
+    //
+    if ( aForceRefreshIntervalSeconds == 0 || 
+       ( interval.Int() >= aForceRefreshIntervalSeconds ) )
+        {
+        // Discard availability notifications from Connection Monitor 
+        // until MPM initiated WLAN scan request has completed.
+        // 
+        iParent.EnableDiscarding();
+
+        MPMLOGSTRING2( "CMPMConnMonReqs::RefreshAvailableIAPs interval %d, executing scan", 
+            interval.Int() )
+        iConnMon.GetPckgAttribute( EBearerIdAll, 0, KIapAvailability,
+                                   iIapBuf, iStatus );
+        SetActive();
+        }
+    // With consecutive calls we allow MPM to use cached value.
+    //
+    else
+        {
+        MPMLOGSTRING2( "CMPMConnMonReqs::RefreshAvailableIAPs interval %d, using cached value",
+            interval.Int() )
+
+        // iIapBuf is empty, thus we need a new state.
+        iNextState = EScanWLANNetworksStateCached;
+        TRequestStatus* statusPtr;
+        statusPtr = &iStatus;
+        // We can just complete the request.
+        SetActive();
+        User::RequestComplete( statusPtr, KErrNone );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::CompareConnIds
+// -----------------------------------------------------------------------------
+//
+TBool CMPMConnMonReqs::CompareConnIds( const CMPMConnMonReqs& aReq1,
+                                       const CMPMConnMonReqs& aReq2 )
+    {
+    if ( aReq1.iConnId == aReq2.iConnId )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::MyCancel()
+// -----------------------------------------------------------------------------
+//
+void CMPMConnMonReqs::MyCancel()
+    {
+    // Handle cancellation here.
+    MPMLOGSTRING( "CMPMConnMonReqs::MyCancel()" )
+    ASSERT( iNextState != EGetIapAvailState && iNextState != EObsolete );
+    // Allow the availability update when the connmon request completes.
+    iNextState = EObsolete;
+    }
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::ErrorCallbackL()
+// -----------------------------------------------------------------------------
+//
+void CMPMConnMonReqs::ErrorCallbackL( TInt aStatus )
+    {
+    switch ( iNextState )
+        {
+        case EGetIapAvailState:
+        case EGetConnectionCountState: 
+            {
+            MPMLOGSTRING( "CMPMConnMonReqs::ErrorCallbackL: EGetIapAvailState failed" )
+            if ( iActiveSchedulerWait.IsStarted() )
+                {
+                iActiveSchedulerWait.AsyncStop();
+                }
+            break;
+            }
+        case EScanWLANNetworksState:
+        case EScanWLANNetworksStateCached:
+            {
+            MPMLOGSTRING( "CMPMConnMonReqs::ErrorCallbackL: EScanWLANNetworksState failed" )
+
+            // Disable discarding availability notifications from Connection Monitor.
+            // 
+            iParent.DisableDiscarding(); 
+
+            // check which callback function to use and continue
+            // handling the request if possible.
+            // 
+            if( iWlanScanCallback == EWlanScanCallbackChooseIap )
+                {
+                iSession.IapSelectionL()->ChooseIapWLANScanCompletedL( aStatus );
+                }
+            else if( iWlanScanCallback == EWlanScanCallbackProcessErr )
+                {
+                iSession.ProcessErrorWlanScanCompletedL();
+                }
+            else if( iWlanScanCallback == EWlanScanCallbackCarrierRejected )
+                {
+                // No fresh IAP info available but try to select new IAP
+                // based on whatever existing info there is
+                // 
+                iSession.CompleteCarrierRejected();
+                }
+            else if( iWlanScanCallback == EWlanScanCallbackSortSnap )
+                {
+                // SortSnap was called with old availability information.
+                iSession.CompleteServerSortSNAP();
+                }
+            else
+                {
+                MPMLOGSTRING(
+                    "CMPMConnMonReqs::ErrorCallbackL: iWlanScanCallback EWlanScanCallbackNone" )
+                }
+            // reset callback type
+            //
+            iWlanScanCallback = EWlanScanCallbackNone;
+            break;
+            }
+        case EObsolete:
+            MPMLOGSTRING( "CMPMConnMonReqs::ErrorCallbackL: EObsolete" )
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::RunL
+// -----------------------------------------------------------------------------
+//
+void CMPMConnMonReqs::RunL()
+    {
+    MPMLOGSTRING( "CMPMConnMonReqs::RunL" )
+    if ( iStatus != KErrNone )
+        {
+        // Nok
+        MPMLOGSTRING2( "CMPMConnMonReqs::RunL: \
+ConnMon request completed with error code = %i", iStatus.Int() )
+
+        // Does nothing if state is obsolete.
+        ErrorCallbackL( iStatus.Int() );
+
+        // RemoveReqPtr is safe if "this" doesn't exist
+        iParent.RemoveReqPtr( this );
+        delete this;
+        }
+    else
+        {
+        // Ok
+        switch (iNextState)
+            {
+            case EGetIapAvailState:
+                {
+                MPMLOGSTRING( "CMPMConnMonReqs::RunL: EGetIapAvailState" )
+                iParent.SetAvailableIAPs( iIapBuf() );
+
+                if ( iActiveSchedulerWait.IsStarted() )
+                    {
+                    iActiveSchedulerWait.AsyncStop();
+                    }
+
+                iNextState      = EGetConnectionCountState;
+                iLastCancelCode = EConnMonGetConnectionCount;
+                iConnMon.GetConnectionCount( iConnectionCount, iStatus );
+                SetActive();
+                break;
+                }
+            case EGetConnectionCountState: 
+                {
+                MPMLOGSTRING( "CMPMConnMonReqs::RunL: EGetConnectionCountState" )
+                MPMLOGSTRING2( "CMPMConnMonReqs::RunL: Connection Count: %i", 
+                    iConnectionCount )
+                iParent.SetConnectionCounter( iConnectionCount );
+                iParent.RemoveReqPtr( this );
+                delete this;
+                break;
+                }
+            case EScanWLANNetworksState:
+            case EScanWLANNetworksStateCached:
+                {
+                MPMLOGSTRING( "CMPMConnMonReqs::RunL: EScanWLANNetworksState and EScanWLANNetworksStateCached" )
+                if ( iNextState == EScanWLANNetworksState )
+                    {
+                    MPMLOGSTRING( "CMPMConnMonReqs::RunL: EScanWLANNetworksState fresh data available from ConnMon" )
+                    iParent.SetAvailableIAPs( iIapBuf() );
+
+                    // Disable discarding availability notifications from Connection Monitor.
+                    // 
+                    iParent.DisableDiscarding(); 
+
+                    // Generate event only if we got new iaps from ConnMon.
+                    // 
+                    if ( iWlanScanCallback == EWlanScanCallbackGenerateEvent )
+                        {
+                        MPMLOGSTRING( "CMPMConnMonReqs::RunL: iWlanScanCallback EWlanScanCallbackGenerateEvent" )
+                        // Generate event only if not 
+                        //
+                        iParent.IapAvailabilityChange();
+                        }
+                    }
+                // check which callback function to use
+                // 
+                if( iWlanScanCallback == EWlanScanCallbackChooseIap )
+                    {
+                    iSession.IapSelectionL()->ChooseIapWLANScanCompletedL( iStatus.Int() );
+                    }
+                else if( iWlanScanCallback == EWlanScanCallbackProcessErr )
+                    {
+                    iSession.ProcessErrorWlanScanCompletedL();
+                    }
+                else if( iWlanScanCallback == EWlanScanCallbackCarrierRejected )
+                    {
+                    iSession.CompleteCarrierRejected();
+                    }
+                else if( iWlanScanCallback == EWlanScanCallbackSortSnap )
+                    {
+                    iSession.CompleteServerSortSNAP();
+                    }
+                else
+                    {
+                    MPMLOGSTRING(
+                    "CMPMConnMonReqs::RunL: iWlanScanCallback default processing" )
+                    }
+                // reset callback type
+                //
+                iWlanScanCallback = EWlanScanCallbackNone;
+                
+                iParent.RemoveReqPtr( this );
+                delete this;
+                break;
+                }
+            case EObsolete:
+                iParent.SetAvailableIAPs( iIapBuf() );
+                delete this;
+                break;
+            default:
+                {
+                MPMLOGSTRING( "CMPMConnMonReqs::RunL: default" )
+                PanicServer( KErrNotSupported );
+                break;
+                }
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::RunError
+// -----------------------------------------------------------------------------
+//
+
+TInt CMPMConnMonReqs::RunError( TInt aError )
+    {
+    MPMLOGSTRING2(
+        "CMPMConnMonReqs::RunError: RunL made a leave with error = %i", 
+        aError )
+
+    // Disable discarding availability notifications from Connection Monitor.
+    // 
+    iParent.DisableDiscarding(); 
+
+    // check which callback function was used when leave occurred
+    // 
+    if( iWlanScanCallback == EWlanScanCallbackChooseIap )
+        {
+        iSession.ChooseIapComplete( aError, NULL );
+        }
+    else if( iWlanScanCallback == EWlanScanCallbackProcessErr )
+        {
+        TBMNeededAction neededAction( EPropagateError );
+        iSession.ProcessErrorComplete( KErrNone, &aError, &neededAction );
+        }
+    else
+        {
+        MPMLOGSTRING(
+        "CMPMConnMonReqs::RunError: iWlanScanCallback EWlanScanCallbackNone" )
+        }
+
+    // We are done
+    iParent.RemoveReqPtr( this );
+    delete this;
+
+    // Return KErrNone to prevent panic 
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CMPMConnMonReqs::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CMPMConnMonReqs::DoCancel()
+    {
+    MPMLOGSTRING( "CMPMConnMonReqs::DoCancel" )
+
+    // Disable discarding availability notifications from Connection Monitor.
+    // 
+    iParent.DisableDiscarding(); 
+
+    iConnMon.CancelAsyncRequest( iLastCancelCode );
+    
+    if ( iActiveSchedulerWait.IsStarted() )
+        {
+        iActiveSchedulerWait.AsyncStop();
+        }
+    }
+
+//  End of File