diff -r 000000000000 -r 307788aac0a8 sipplugins/sippsystemstatemonitor/src/sipsnapavailabilitymonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipplugins/sippsystemstatemonitor/src/sipsnapavailabilitymonitor.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,300 @@ +/* +* Copyright (c) 2007 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: +* +*/ + + +#include "sipsnapavailabilitymonitor.h" +#include + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::NewL +// ----------------------------------------------------------------------------- +// +CSipSnapAvailabilityMonitor* CSipSnapAvailabilityMonitor::NewL( + TUint32 aSnapId, + TBool aPermissionToUseNetwork, + MSipSystemStateObserver& aObserver ) + { + CSipSnapAvailabilityMonitor* self = + CSipSnapAvailabilityMonitor::NewLC( + aSnapId, aPermissionToUseNetwork, aObserver ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::NewL +// ----------------------------------------------------------------------------- +// +CSipSnapAvailabilityMonitor* CSipSnapAvailabilityMonitor::NewLC( + TUint32 aSnapId, + TBool aPermissionToUseNetwork, + MSipSystemStateObserver& aObserver ) + { + CSipSnapAvailabilityMonitor* self = + new( ELeave ) CSipSnapAvailabilityMonitor( + aSnapId, aPermissionToUseNetwork ); + CleanupStack::PushL( self ); + self->ConstructL( aObserver ); + return self; + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::CSipSnapAvailabilityMonitor +// ----------------------------------------------------------------------------- +// +CSipSnapAvailabilityMonitor::CSipSnapAvailabilityMonitor( + TUint32 aSnapId, + TBool aPermissionToUseNetwork ) + : CActive( EPriorityStandard ), + iSnapId( aSnapId ), + iPermissionToUseNetwork( aPermissionToUseNetwork ), + iIsConnected( EFalse ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::ConstructL +// ----------------------------------------------------------------------------- +// +void CSipSnapAvailabilityMonitor::ConstructL( + MSipSystemStateObserver& aObserver ) + { + iObservers.AppendL( &aObserver ); + + User::LeaveIfError( iConnMon.ConnectL() ); + iIsConnected = ETrue; + User::LeaveIfError( iConnMon.NotifyEventL( *this ) ); + iConnMon.GetPckgAttribute( EBearerIdAll, 0, KSNAPsAvailability, + iSnapInfoBuf, iStatus ); + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::~CSipSnapAvailabilityMonitor +// ----------------------------------------------------------------------------- +// +CSipSnapAvailabilityMonitor::~CSipSnapAvailabilityMonitor() + { + CActive::Cancel(); + + // Cancel notify events here and not in DoCancel, since they are not related + // to CSipSnapAvailabilityMonitor being active. + if ( iIsConnected ) + { + iConnMon.CancelNotifications(); + } + + iConnMon.Close(); + iObservers.Close(); + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::RunL +// ----------------------------------------------------------------------------- +// +void CSipSnapAvailabilityMonitor::RunL() + { + if ( iStatus == KErrNone ) + { + iSnapAvailable = IsSnapAvailable( iSnapInfoBuf(), iSnapId ); + NotifyObservers(); + } + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::DoCancel +// ----------------------------------------------------------------------------- +// +void CSipSnapAvailabilityMonitor::DoCancel() + { + // Cancel the asynchronous GetPckgAttribute request + iConnMon.CancelAsyncRequest( EConnMonGetPckgAttribute ); + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::EventL +// ----------------------------------------------------------------------------- +// +void CSipSnapAvailabilityMonitor::EventL( + const CConnMonEventBase& aConnMonEvent ) + { + // We're interested only on SNAP availability notifications + if( aConnMonEvent.EventType() == EConnMonSNAPsAvailabilityChange ) + { + // Typecast event to appropriate event type + const CConnMonSNAPsAvailabilityChange& event = + static_cast< const CConnMonSNAPsAvailabilityChange& >( + aConnMonEvent ); + + TBool snapAvailable = + IsSnapAvailable( event.SNAPAvailability(), iSnapId ); + + if ( SetCurrentState( iPermissionToUseNetwork, snapAvailable ) ) + { + NotifyObservers(); + } + } + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::SnapId +// ----------------------------------------------------------------------------- +// +TUint32 CSipSnapAvailabilityMonitor::SnapId() const + { + return iSnapId; + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::SnapAvailability +// ----------------------------------------------------------------------------- +// +CSipSystemStateMonitor::TSnapAvailability +CSipSnapAvailabilityMonitor::SnapAvailability() const + { + CSipSystemStateMonitor::TSnapAvailability snapAvailability = + CSipSystemStateMonitor::ESnapNotAvailable; + + if ( iSnapAvailable ) + { + snapAvailability = CSipSystemStateMonitor::ESnapAvailable; + } + + return snapAvailability; + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::AddObserverL +// ----------------------------------------------------------------------------- +// +void CSipSnapAvailabilityMonitor::AddObserverL( + MSipSystemStateObserver& aObserver ) + { + iObservers.InsertInAddressOrderL( &aObserver ); + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::RemoveObserver +// ----------------------------------------------------------------------------- +// +void CSipSnapAvailabilityMonitor::RemoveObserver( + MSipSystemStateObserver& aObserver ) + { + TInt index = iObservers.Find( &aObserver ); + if ( index >= 0 ) + { + iObservers.Remove( index ); + } + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::HasObservers +// ----------------------------------------------------------------------------- +// +TBool CSipSnapAvailabilityMonitor::HasObservers() const + { + return ( iObservers.Count() > 0 ); + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::UsagePermissionChanged +// ----------------------------------------------------------------------------- +// +void CSipSnapAvailabilityMonitor::UsagePermissionChanged( + TBool aPermissionToUse, + TInt /*aError*/ ) + { + if ( SetCurrentState( aPermissionToUse, iSnapAvailable ) ) + { + NotifyObservers(); + } + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::NotifyObservers +// ----------------------------------------------------------------------------- +// +void CSipSnapAvailabilityMonitor::NotifyObservers() const + { + CSipSystemStateMonitor::TSnapAvailability snapAvailability = + CSipSystemStateMonitor::ESnapNotAvailable; + + if ( CanSnapBeUsed() ) + { + snapAvailability = CSipSystemStateMonitor::ESnapAvailable; + } + + for ( TInt i = iObservers.Count()-1; i >= 0; i-- ) + { + iObservers[i]->SystemVariableUpdated( + CSipSystemStateMonitor::ESnapAvailability, + iSnapId, + snapAvailability ); + } + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::IsSnapAvailable +// ----------------------------------------------------------------------------- +// +TBool CSipSnapAvailabilityMonitor::IsSnapAvailable( + const TConnMonSNAPInfo& aSnapInfo, + TUint32 aSnapId ) const + { + for ( TUint32 i = 0; i < aSnapInfo.iCount; i++ ) + { + if ( aSnapInfo.iSNAP[ i ].iSNAPId == aSnapId ) + { + return ETrue; + } + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::SetCurrentState +// ----------------------------------------------------------------------------- +// +TBool CSipSnapAvailabilityMonitor::SetCurrentState( + TBool aPermissionToUseNetwork, + TBool aSnapAvailable ) + { + TBool updated( EFalse ); + if ( aPermissionToUseNetwork != iPermissionToUseNetwork ) + { + iPermissionToUseNetwork = aPermissionToUseNetwork; + updated = ETrue; + } + if ( aSnapAvailable != iSnapAvailable ) + { + iSnapAvailable = aSnapAvailable; + updated = ETrue; + } + return updated; + } + +// ----------------------------------------------------------------------------- +// CSipSnapAvailabilityMonitor::CanSnapBeUsed +// ----------------------------------------------------------------------------- +// +TBool CSipSnapAvailabilityMonitor::CanSnapBeUsed() const + { + return ( iSnapAvailable && iPermissionToUseNetwork ); + } + +// End of File