phoneclientserver/EnPolicy/Src/SosEnPolicy/CSosEnPolicySimStatusMonitor.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 19 7d48bed6ce0c
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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    <startupdomainpskeys.h> // Property values
#include    <PSVariables.h>



// 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