--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchserver/src/cchconnmonhandler.cpp Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,655 @@
+/*
+* Copyright (c) 2007-2010 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: CCCHConnMonHandler implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include "cchconnmonhandler.h"
+#include "cchserverbase.h"
+#include "cchlogger.h"
+#include "cchservicehandler.h"
+#include "cchconnmonhandlernotifier.h"
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+const TInt KPeriodicTimerInterval( 5000000 ); // 5sec.
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================= LOCAL FUNCTIONS =============================
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::CCCHConnMonHandler
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CCCHConnMonHandler::CCCHConnMonHandler( CCCHServerBase& aServer ) :
+ CActive( CActive::EPriorityStandard ),
+ iState( EUninitialized ),
+ iServer( aServer )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::ConstructL()
+ {
+ User::LeaveIfError( iConnMon.ConnectL() );
+ NotifyL();
+ iConnChangeListenerTimer = CPeriodic::NewL( CActive::EPriorityIdle );
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCCHConnMonHandler* CCCHConnMonHandler::NewL( CCCHServerBase& aServer )
+ {
+ CCCHConnMonHandler* self = CCCHConnMonHandler::NewLC( aServer );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::NewLC
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CCCHConnMonHandler* CCCHConnMonHandler::NewLC( CCCHServerBase& aServer )
+ {
+ CCCHConnMonHandler* self = new (ELeave) CCCHConnMonHandler( aServer );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// Destructor
+CCCHConnMonHandler::~CCCHConnMonHandler()
+ {
+ CCHLOGSTRING( "CCCHConnMonHandler::~CCCHConnMonHandler" );
+ if ( iConnChangeListenerTimer )
+ {
+ iConnChangeListenerTimer->Cancel();
+ }
+ delete iConnChangeListenerTimer;
+ StopNotify();
+ Cancel();
+ iPendingRequests.Close();
+ iUnsolvedConnIds.Close();
+ iConnIapIds.Close();
+ iAvailableSNAPs.Close();
+ iAvailableIAPs.Close();
+ iConnMon.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::ScanNetworks
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::ScanNetworks(
+ TBool aWlanScan, MCCHConnMonHandlerNotifier* aObserver )
+ {
+ CCHLOGSTRING( "CCCHConnMonHandler::ScanNetworks: IN" );
+
+ if ( aWlanScan )
+ {
+ iNetworkScanningObserver = aObserver;
+ GetIaps( EBearerIdAll );
+ }
+
+ CCHLOGSTRING( "CCCHConnMonHandler::ScanNetworks: OUT" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::ScanNetworksCancel
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::ScanNetworksCancel()
+ {
+ Cancel();
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::IsSNAPAvailable
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CCCHConnMonHandler::IsSNAPAvailable( TUint aSNAPId ) const
+ {
+ return ( KErrNotFound == iAvailableSNAPs.Find( aSNAPId ) )
+ ? EFalse : ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::IsIapAvailable
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+TBool CCCHConnMonHandler::IsIapAvailable( TUint aIapId ) const
+ {
+ return ( KErrNotFound == iAvailableIAPs.Find( aIapId ) )
+ ? EFalse : ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::SetSNAPsAvailabilityChangeListener
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::SetSNAPsAvailabilityChangeListener(
+ MCCHConnMonHandlerNotifier* aObserver )
+ {
+ CCHLOGSTRING( "CCCHConnMonHandler::SetSNAPsAvailabilityChangeListener" );
+ iConnChangeListenerTimer->Cancel();
+ iSNAPsAvailabilityObserver = aObserver;
+ if ( iSNAPsAvailabilityObserver )
+ {
+ iConnChangeListenerTimer->Start(
+ KPeriodicTimerInterval,
+ KPeriodicTimerInterval,
+ TCallBack( PeriodicTimerCallBack, this ) );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::GetIaps
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::GetIaps( TConnMonBearerId aBearerId )
+ {
+ if ( !IsActive() )
+ {
+ iConnMon.GetPckgAttribute( aBearerId,
+ 0,
+ KIapAvailability,
+ iIapsBuf,
+ iStatus );
+ iState = EGetIAPS;
+ SetActive();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::UpdateIapArray
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::UpdateIapArray( TConnMonIapInfo aIaps )
+ {
+ CCHLOGSTRING2( "CCCHConnMonHandler::UpdateIapArray: IN count %d",
+ iAvailableIAPs.Count() );
+
+ iAvailableIAPs.Reset();
+ TUint count( 0 );
+
+ // Copy TConnMonIapInfo to RArray so we can use RArray::Find method
+ while ( count < aIaps.iCount )
+ {
+ iAvailableIAPs.Append( aIaps.iIap[ count ].iIapId );
+ count++;
+ }
+ CCHLOGSTRING2( "CCCHConnMonHandler::UpdateIapArray: OUT count %d",
+ iAvailableIAPs.Count() );
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::GetSNAPs
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::GetSNAPs()
+ {
+ CCHLOGSTRING( "CCCHConnMonHandler::GetSNAPs: IN" );
+
+ if ( !IsActive() )
+ {
+ iConnMon.GetPckgAttribute( EBearerIdAll, // some parameter
+ 0, // pass the size of buffer
+ KSNAPsAvailability, // specify the request
+ iSNAPbuf, // buffer for writing data
+ iStatus );
+ iState = EGetSNAPs;
+ SetActive();
+ }
+
+ CCHLOGSTRING( "CCCHConnMonHandler::GetSNAPs: OUT" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::UpdateSnapArray
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::UpdateSnapArray( TConnMonSNAPInfo aSNAPs )
+ {
+ CCHLOGSTRING2( "CCCHConnMonHandler::UpdateSnapArray: IN count %d",
+ iAvailableSNAPs.Count() );
+
+ iAvailableSNAPs.Reset();
+ TUint count( 0 );
+ // Copy TConnMonSNAPInfo to RArray so we can use RArray::Find method
+ while ( count < aSNAPs.iCount )
+ {
+ iAvailableSNAPs.Append( aSNAPs.iSNAP[ count ].iSNAPId );
+ count++;
+ }
+ CCHLOGSTRING2( "CCCHConnMonHandler::UpdateSnapArray: OUT count %d",
+ iAvailableSNAPs.Count() );
+
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::NotifyL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::NotifyL()
+ {
+ CCHLOGSTRING( "CCCHConnMonHandler::NotifyL: IN" );
+
+ iConnMon.NotifyEventL( *this );
+
+ // Thresholds
+ TInt err = iConnMon.SetUintAttribute( EBearerIdAll,
+ 0,
+ KBearerAvailabilityThreshold,
+ 1 );
+
+ CCHLOGSTRING2( "CCCHConnMonHandler::NotifyL: OUT", err );
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::StopNotify
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::StopNotify()
+ {
+ iConnMon.CancelNotifications();
+ }
+
+// ----------------------------------------------------------------------------
+// CCCHConnMonHandler::PeriodicTimerCallBack
+// The call back function.
+// ----------------------------------------------------------------------------
+//
+TInt CCCHConnMonHandler::PeriodicTimerCallBack( TAny* aAny )
+ {
+ CCHLOGSTRING( "CCCHConnMonHandler::PeriodicTimerCallBack" );
+
+ CCCHConnMonHandler* self = static_cast<CCCHConnMonHandler*>( aAny );
+ self->iConnChangeListenerTimer->Cancel();
+
+ if ( self->iSNAPsAvailabilityObserver )
+ {
+ self->iSNAPsAvailabilityObserver->
+ SNAPsAvailabilityChanged( KErrTimedOut );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::RunL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::RunL()
+ {
+ CCHLOGSTRING2( "CCCHConnMonHandler::RunL: IN error: %d", iStatus.Int() );
+
+ if ( KErrNone == iStatus.Int() )
+ {
+ switch ( iState )
+ {
+ case EGetIAPS:
+ {
+ UpdateIapArray( iIapsBuf() );
+ GetSNAPs();
+ }
+ break;
+
+ case EGetSNAPs:
+ {
+ UpdateSnapArray( iSNAPbuf() );
+ if ( iNetworkScanningObserver )
+ {
+ iNetworkScanningObserver->NetworkScanningCompletedL(
+ iSNAPbuf(), KErrNone );
+ iNetworkScanningObserver = NULL;
+ }
+ }
+ break;
+
+ case EGetIAP:
+ {
+ CCHLOGSTRING2( "CCCHConnMonHandler::RunL: iap: %d", iConnIapId );
+ TCCHConnectionInfo info;
+ info.iIapId = iConnIapId;
+ info.iConnId = iConnId;
+
+ if ( KErrNotFound == iConnIapIds.Find( info ) )
+ {
+ iConnIapIds.Append( info );
+ }
+ iConnId = 0;
+ iConnIapId = 0;
+
+ CCHLOGSTRING2( "CCCHConnMonHandler::RunL: unsolved conn count: %d", iUnsolvedConnIds.Count() );
+ if ( iUnsolvedConnIds.Count() )
+ {
+ GetIapId();
+ }
+ }
+ break;
+
+ case EGetConnectionCount:
+ {
+ CCHLOGSTRING2( "CCCHConnMonHandler::RunL: conn count: %d", iConnCount );
+ TBool familiar( EFalse );
+ TUint connId( KErrNone );
+ TUint subConnCount( KErrNone );
+ for ( TInt i( 1 ); i <= iConnCount; i++ )
+ {
+ if ( !iConnMon.GetConnectionInfo( i, connId, subConnCount ) )
+ {
+ familiar = EFalse;
+ for ( TInt j( 0 ); j < iConnIapIds.Count(); j++ )
+ {
+ if ( connId == iConnIapIds[ j ].iConnId )
+ {
+ CCHLOGSTRING2( "CCCHConnMonHandler::RunL: iap %d is familiar connection", iConnIapIds[ j ].iIapId );
+ familiar = ETrue;
+ break;
+ }
+ }
+
+ if ( !familiar && KErrNotFound == iUnsolvedConnIds.Find( connId ) )
+ {
+ iUnsolvedConnIds.Append( connId );
+ }
+ }
+ }
+ iConnCount = 0;
+
+ CCHLOGSTRING2( "CCCHConnMonHandler::RunL: unsolved conn count: %d", iUnsolvedConnIds.Count() );
+ if ( iUnsolvedConnIds.Count() )
+ {
+ GetIapId();
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+
+ if ( iPendingRequests.Count() && !IsActive() )
+ {
+ CCHLOGSTRING2( "CCCHConnMonHandler::RunL: request pending : %d",
+ iPendingRequests[ 0 ] );
+ switch ( iPendingRequests[ 0 ] )
+ {
+ case EGetIAP:
+ {
+ GetIapId();
+ }
+ break;
+
+ case EGetConnectionCount:
+ {
+ GetConnectionCount();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ iPendingRequests.Remove( 0 );
+ iPendingRequests.Compress();
+ }
+ }
+ else
+ {
+ if ( iNetworkScanningObserver )
+ {
+ iNetworkScanningObserver->NetworkScanningCompletedL(
+ iSNAPbuf(), iStatus.Int() );
+ iNetworkScanningObserver = NULL;
+ }
+ }
+
+ CCHLOGSTRING( "CCCHConnMonHandler::RunL: OUT" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::StartMonitoringConnectionChanges
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::StartMonitoringConnectionChanges()
+ {
+ iConnIapIds.Reset();
+
+ if ( !IsActive() )
+ {
+ GetConnectionCount();
+ }
+ else
+ {
+ iPendingRequests.Append( EGetConnectionCount );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::StopMonitoringConnectionChanges
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::StopMonitoringConnectionChanges(
+ RArray<TUint>& aIapIds )
+ {
+ aIapIds.Reset();
+ for ( TInt i( 0 ); i < iConnIapIds.Count(); i++ )
+ {
+ if ( KErrNotFound == aIapIds.Find( iConnIapIds[ i ].iIapId ) )
+ {
+ aIapIds.Append( iConnIapIds[ i ].iIapId );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::GetConnectionCount
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::GetConnectionCount()
+ {
+ iState = EGetConnectionCount;
+ iConnMon.GetConnectionCount( iConnCount, iStatus );
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::GetIapId
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::GetIapId()
+ {
+ if ( iUnsolvedConnIds.Count() )
+ {
+ iConnId = iUnsolvedConnIds[ 0 ];
+ iUnsolvedConnIds.Remove( 0 );
+ iUnsolvedConnIds.Compress();
+
+ iState = EGetIAP;
+ iConnMon.GetUintAttribute( iConnId, 0, KIAPId, iConnIapId, iStatus );
+ SetActive();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::RemoveIapId
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::RemoveIapId(
+ TUint aConnId )
+ {
+ for ( TInt i( 0 ); i < iConnIapIds.Count(); i++ )
+ {
+ if ( aConnId == iConnIapIds[ i ].iConnId )
+ {
+ iConnIapIds.Remove( i );
+ iConnIapIds.Compress();
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::DoCancel
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::DoCancel()
+ {
+ iConnMon.CancelAsyncRequest( EConnMonGetPckgAttribute );
+ if ( iNetworkScanningObserver )
+ {
+ iNetworkScanningObserver->NetworkScanningCompletedL(
+ iSNAPbuf(), KErrCancel );
+ iNetworkScanningObserver = NULL;
+ }
+ if ( iSNAPsAvailabilityObserver )
+ {
+ iConnChangeListenerTimer->Cancel();
+ iSNAPsAvailabilityObserver->SNAPsAvailabilityChanged( KErrCancel );
+ iSNAPsAvailabilityObserver = NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCCHConnMonHandler::EventL
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CCCHConnMonHandler::EventL( const CConnMonEventBase &aConnMonEvent )
+ {
+ CCHLOGSTRING3
+ ( "CCCHConnMonHandler::EventL: IN EventType = %d, ConnectionId = %d",
+ aConnMonEvent.EventType(), aConnMonEvent.ConnectionId() );
+
+ switch ( aConnMonEvent.EventType() )
+ {
+ case EConnMonIapAvailabilityChange:
+ {
+ const CConnMonIapAvailabilityChange* eventIap = NULL;
+ eventIap = static_cast< const CConnMonIapAvailabilityChange* >(
+ &aConnMonEvent );
+
+ TConnMonIapInfo iaps = eventIap->IapAvailability();
+ UpdateIapArray( iaps );
+ }
+ break;
+
+ case EConnMonSNAPsAvailabilityChange:
+ {
+ const CConnMonSNAPsAvailabilityChange* eventSNAP = NULL;
+ eventSNAP = static_cast< const CConnMonSNAPsAvailabilityChange* >(
+ &aConnMonEvent );
+
+ TConnMonSNAPInfo snaps = eventSNAP->SNAPAvailability();
+ UpdateSnapArray( snaps );
+
+ if ( iSNAPsAvailabilityObserver )
+ {
+ iConnChangeListenerTimer->Cancel();
+ iSNAPsAvailabilityObserver->SNAPsAvailabilityChanged( KErrNone );
+ }
+ }
+ break;
+
+ case EConnMonCreateConnection:
+ {
+ const CConnMonCreateConnection* eventCreate = NULL;
+ eventCreate = static_cast< const CConnMonCreateConnection* >(
+ &aConnMonEvent );
+ iUnsolvedConnIds.Append( eventCreate->ConnectionId() );
+
+ if ( !IsActive() )
+ {
+ GetIapId();
+ }
+ else
+ {
+ iPendingRequests.Append( EGetIAP );
+ }
+ }
+ break;
+
+ case EConnMonDeleteConnection:
+ {
+ const CConnMonDeleteConnection* eventDelete = NULL;
+ eventDelete = static_cast< const CConnMonDeleteConnection* >(
+ &aConnMonEvent );
+ TUint connId = eventDelete->ConnectionId();
+
+ RemoveIapId( connId );
+ }
+ break;
+
+ default:
+ break;
+ }
+ CCHLOGSTRING( "CCCHConnMonHandler::EventL: OUT" );
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =======================
+
+// End of File