diff -r 000000000000 -r ff3b6d0fd310 phoneclientserver/EnPolicy/Src/SosEnPolicy/CSosEnPolicySimStatusMonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneclientserver/EnPolicy/Src/SosEnPolicy/CSosEnPolicySimStatusMonitor.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2004-2005 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: SIM Status Monitor. +* +*/ + + + +// INCLUDES +#include "CSosEnPolicySimStatusMonitor.h" +#include // Property values +#include + + + +// CONSTANTS +const TUint KENPolicySAConnectionRetryTime = 2000000; // 2s +const TInt KENPolicySAConnectionRetries = 3; + +_LIT( KENPolicyPanicCategory, "ENPolicyFault" ); + + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::CSosEnPolicySimStatusMonitor +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSosEnPolicySimStatusMonitor::CSosEnPolicySimStatusMonitor( + CSosEmergencyNumberPolicyHandler& aObserver ) : + CActive( EPriorityStandard ), + iObserver( aObserver ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSosEnPolicySimStatusMonitor* CSosEnPolicySimStatusMonitor::NewL( + CSosEmergencyNumberPolicyHandler& aObserver ) + { + CSosEnPolicySimStatusMonitor* self = new ( ELeave ) + CSosEnPolicySimStatusMonitor( aObserver ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::~CSosEnPolicySimStatusMonitor +// Destructor. +// ----------------------------------------------------------------------------- +// +CSosEnPolicySimStatusMonitor::~CSosEnPolicySimStatusMonitor() + { + Cancel(); + + iProperty.Close(); + + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::ConstructL +// +// Construction. Creates also connection to system agent. +// ----------------------------------------------------------------------------- +// +void CSosEnPolicySimStatusMonitor::ConstructL() + { + TInt err = KErrNotSupported; + for( TInt i = 0; i < KENPolicySAConnectionRetries; i++ ) + { + err = iProperty.Attach( KPSUidStartup, KPSSimStatus ); + if( err == KErrNone ) + { + i = KENPolicySAConnectionRetries; + } + else + { + // _DPRINT( 4, "ENPolicy.SimStatus.Attach.RETRY" ); + User::After( KENPolicySAConnectionRetryTime ); + } + } + //if connection not established. + __ASSERT_ALWAYS( err == KErrNone, User::Panic( + KENPolicyPanicCategory, EEnPolicyPanicCentralRepositoryConnectionFailure ) ); + IssueRequest(); + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::DoCancel +// +// Cancellation of notify. +// ----------------------------------------------------------------------------- +// +void CSosEnPolicySimStatusMonitor::DoCancel() + { + iProperty.Cancel(); + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::RunL +// +// SIM event occurred. +// Basically events make three kinds of responses. +// If there is an error in notify, nothing is made. Othervice, event +// may indicate that SIM is accessible or not. Depending on that, action is +// send for observer. +// ----------------------------------------------------------------------------- +// +void CSosEnPolicySimStatusMonitor::RunL() + { + TInt state = KErrGeneral; + + iProperty.Get( state ); + + // _DDPRINT( 4, "ENPolicy.SimStatus.status.e.", iStatus.Int() ); + // _DDPRINT( 4, "ENPolicy.SimStatus.status.", state ); + CSosEmergencyNumberPolicyHandler::TSosEnPolicySimEmergencyNumberAction + action = CSosEmergencyNumberPolicyHandler:: + ESosEnPolicySimEmergencyNumberClear; + switch ( iStatus.Int() ) + { + case KErrNotSupported: + case KErrCancel: + return; + case KErrNone: + { + if ( TranslateState( state ) ) + { + action = + CSosEmergencyNumberPolicyHandler:: + ESosEnPolicySimEmergencyNumberRead; + } + iObserver.CpsssmHandleSimStatusEvent( action ); + } + default: + break; + } + IssueRequest(); + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::IsReadingAllowed +// +// Checks sim state from system agent +// ----------------------------------------------------------------------------- +// +TBool CSosEnPolicySimStatusMonitor::IsReadingAllowed() + { + TInt state = KErrGeneral; + + iProperty.Get( state ); + return TranslateState( state ); + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::IssueRequest +// +// Issue notify request to System agent. +// ----------------------------------------------------------------------------- +// +void CSosEnPolicySimStatusMonitor::IssueRequest() + { + iProperty.Subscribe( iStatus ); + + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CSosEnPolicySimStatusMonitor::TranslateState +// +// Translate the state information. +// ----------------------------------------------------------------------------- +// +TBool CSosEnPolicySimStatusMonitor::TranslateState( TInt aState ) + { + switch ( aState ) + { + case ESimUsable: + case ESimReadable: + return ETrue; + case ESimStatusUninitialized: + case ESimNotReady: + case ESimNotSupported: + case ESimNotPresent: + return EFalse; + default: + return EFalse; + } + } + + +// End of File